git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
From: Antoine Pelisse <apelisse@gmail.com>
To: git@vger.kernel.org
Cc: "Junio C Hamano" <gitster@pobox.com>,
	"Felipe Contreras" <felipe.contreras@gmail.com>,
	"Jörn Hees" <dev@joernhees.de>,
	"Antoine Pelisse" <apelisse@gmail.com>
Subject: [PATCH] remote-hg: Fix cloning and sharing bug
Date: Sun,  4 Aug 2013 12:38:03 +0200	[thread overview]
Message-ID: <1375612683-9104-1-git-send-email-apelisse@gmail.com> (raw)
In-Reply-To: <1A5ABD76-D3D9-400E-AC8F-26C0DEF43723@joernhees.de>

6796d49 (remote-hg: use a shared repository store) introduced sharing
repository capability, but it broke backward-compatibility with already
existing repositories.

Indeed, 6796d49 assumes that .git/hg/.hg (the shared repository) will
exist if .git/hg exists.
This can be false for already existing clones. It can also be false for
local repository that are not cloned.

Fixes the compatibility break by always cloning into .git/hg/.shared
(even for local repositories). In order to avoid expensive clone
retrieval from slow remotes, also look for already existing clones in
.git/hg/$aliases/clone.

Reported-by: Joern Hees <dev@joernhees.de>
Suggested-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Antoine Pelisse <apelisse@gmail.com>
---
Hey,

OK, I think this version will work in all cases.
Either you clone local and then remote, or remote and then local,
or old version local and then remote, or old version remote and then local:
You will always either have .shared repo already cloned, or will find a way to
create it: either by using an already existing clone, or by cloning the given
url (and that last step can't be done if we don't use .shared).

I also decided to always clone local repositories because what Jörn Hees
said makes sense:
If you have a local clone of a big repository, and then want to add a slow
remote, you would have to reclone everything.
I think the trade-off is good, because clone from local should not be that
time expensive (maybe it can be on disk-space though).

As I changed indentation, the patch may deserve a second look with -w.

Cheers,
Antoine

 contrib/remote-helpers/git-remote-hg |   47 ++++++++++++++++++++--------------
 1 file changed, 28 insertions(+), 19 deletions(-)

diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg
index 0194c67..487c13d 100755
--- a/contrib/remote-helpers/git-remote-hg
+++ b/contrib/remote-helpers/git-remote-hg
@@ -385,33 +385,42 @@ def get_repo(url, alias):

     extensions.loadall(myui)

-    if hg.islocal(url) and not os.environ.get('GIT_REMOTE_HG_TEST_REMOTE'):
-        repo = hg.repository(myui, url)
-        if not os.path.exists(dirname):
-            os.makedirs(dirname)
-    else:
-        shared_path = os.path.join(gitdir, 'hg')
-        if not os.path.exists(shared_path):
+    hgdir = os.path.join(gitdir, 'hg')
+    try:
+        os.mkdir(hgdir)
+    except OSError:
+        pass
+
+    shared_path = os.path.join(hgdir, '.shared')
+    if not os.path.exists(shared_path):
+        for remote in os.listdir(hgdir):
+            try:
+                hg.clone(myui, {}, os.path.join(hgdir, remote, 'clone'),
+                         shared_path, update=False, pull=True)
+                break
+            except error.RepoError:
+                pass
+        else:
             try:
                 hg.clone(myui, {}, url, shared_path, update=False, pull=True)
             except:
                 die('Repository error')

-        if not os.path.exists(dirname):
-            os.makedirs(dirname)
+    if not os.path.exists(dirname):
+        os.makedirs(dirname)

-        local_path = os.path.join(dirname, 'clone')
-        if not os.path.exists(local_path):
-            hg.share(myui, shared_path, local_path, update=False)
+    local_path = os.path.join(dirname, 'clone')
+    if not os.path.exists(local_path):
+        hg.share(myui, shared_path, local_path, update=False)

-        repo = hg.repository(myui, local_path)
-        try:
-            peer = hg.peer(myui, {}, url)
-        except:
-            die('Repository error')
-        repo.pull(peer, heads=None, force=True)
+    repo = hg.repository(myui, local_path)
+    try:
+        peer = hg.peer(myui, {}, url)
+    except:
+        die('Repository error')
+    repo.pull(peer, heads=None, force=True)

-        updatebookmarks(repo, peer)
+    updatebookmarks(repo, peer)

     return repo

--
1.7.9.5

  reply	other threads:[~2013-08-04 10:39 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-25  0:42 [PATCH v3] remotes-hg: bugfix for fetching non local remotes Joern Hees
2013-07-25 19:12 ` Felipe Contreras
2013-07-25 19:53   ` Antoine Pelisse
2013-07-25 20:40     ` Felipe Contreras
2013-07-25 21:10       ` Antoine Pelisse
2013-07-26  1:30         ` Junio C Hamano
2013-07-26 12:17         ` Jörn Hees
2013-08-04 10:38           ` Antoine Pelisse [this message]
2013-08-04 12:17             ` [PATCH] remote-hg: Fix cloning and sharing bug Jörn Hees
2013-08-04 13:31               ` Felipe Contreras
2013-08-04 13:51                 ` Jörn Hees
2013-08-04 14:00                   ` Felipe Contreras
2013-08-04 13:59                 ` Antoine Pelisse
2013-08-04 14:24                   ` Felipe Contreras
2013-08-04 13:22             ` Felipe Contreras
2013-07-26 12:16   ` [PATCH v3] remotes-hg: bugfix for fetching non local remotes Jörn Hees

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: http://vger.kernel.org/majordomo-info.html

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1375612683-9104-1-git-send-email-apelisse@gmail.com \
    --to=apelisse@gmail.com \
    --cc=dev@joernhees.de \
    --cc=felipe.contreras@gmail.com \
    --cc=git@vger.kernel.org \
    --cc=gitster@pobox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://80x24.org/mirrors/git.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).