git@vger.kernel.org mailing list mirror (one of many)
 help / color / mirror / code / Atom feed
* [PATCH] remote-hg: add shared repo upgrade
@ 2013-08-05 19:22 Antoine Pelisse
  2013-08-05 19:31 ` Felipe Contreras
  2013-08-05 21:02 ` Junio C Hamano
  0 siblings, 2 replies; 8+ messages in thread
From: Antoine Pelisse @ 2013-08-05 19:22 UTC (permalink / raw)
  To: git; +Cc: Joern Hees, Felipe Contreras

From: Felipe Contreras <felipe.contreras@gmail.com>

6796d49 (remote-hg: use a shared repository store) introduced a bug by
making the shared repository '.git/hg', which is already used before
that patch, so clones that happened before that patch, fail after that
patch, because there's no shared Mercurial repo.

It's trivial to upgrade to the new organization by copying the Mercurial
repo from one of the remotes (e.g. 'origin'), so let's do so.

Reported-by: Joern Hees <dev@joernhees.de>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
---
 contrib/remote-helpers/git-remote-hg |   21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg
index 0194c67..02404dc 100755
--- a/contrib/remote-helpers/git-remote-hg
+++ b/contrib/remote-helpers/git-remote-hg
@@ -391,11 +391,22 @@ def get_repo(url, alias):
             os.makedirs(dirname)
     else:
         shared_path = os.path.join(gitdir, 'hg')
-        if not os.path.exists(shared_path):
-            try:
-                hg.clone(myui, {}, url, shared_path, update=False, pull=True)
-            except:
-                die('Repository error')
+
+        # check and upgrade old organization
+        hg_path = os.path.join(shared_path, '.hg')
+        if os.path.exists(shared_path) and not os.path.exists(hg_path):
+            repos = os.listdir(shared_path)
+            for x in repos:
+                local_hg = os.path.join(shared_path, x, 'clone', '.hg')
+                if not os.path.exists(local_hg):
+                    continue
+                shutil.copytree(local_hg, hg_path)
+
+        # setup shared repo (if not there)
+        try:
+            hg.peer(myui, {}, shared_path, create=True)
+        except error.RepoError:
+            pass
 
         if not os.path.exists(dirname):
             os.makedirs(dirname)
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH] remote-hg: add shared repo upgrade
@ 2013-08-05 19:29 Antoine Pelisse
  0 siblings, 0 replies; 8+ messages in thread
From: Antoine Pelisse @ 2013-08-05 19:29 UTC (permalink / raw)
  To: git; +Cc: Joern Hees, Felipe Contreras, Antoine Pelisse

From: Felipe Contreras <felipe.contreras@gmail.com>

6796d49 (remote-hg: use a shared repository store) introduced a bug by
making the shared repository '.git/hg', which is already used before
that patch, so clones that happened before that patch, fail after that
patch, because there's no shared Mercurial repo.

It's trivial to upgrade to the new organization by copying the Mercurial
repo from one of the remotes (e.g. 'origin'), so let's do so.

Reported-by: Joern Hees <dev@joernhees.de>
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Antoine Pelisse <apelisse@gmail.com>
---
 contrib/remote-helpers/git-remote-hg |   21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/contrib/remote-helpers/git-remote-hg b/contrib/remote-helpers/git-remote-hg
index 0194c67..02404dc 100755
--- a/contrib/remote-helpers/git-remote-hg
+++ b/contrib/remote-helpers/git-remote-hg
@@ -391,11 +391,22 @@ def get_repo(url, alias):
             os.makedirs(dirname)
     else:
         shared_path = os.path.join(gitdir, 'hg')
-        if not os.path.exists(shared_path):
-            try:
-                hg.clone(myui, {}, url, shared_path, update=False, pull=True)
-            except:
-                die('Repository error')
+
+        # check and upgrade old organization
+        hg_path = os.path.join(shared_path, '.hg')
+        if os.path.exists(shared_path) and not os.path.exists(hg_path):
+            repos = os.listdir(shared_path)
+            for x in repos:
+                local_hg = os.path.join(shared_path, x, 'clone', '.hg')
+                if not os.path.exists(local_hg):
+                    continue
+                shutil.copytree(local_hg, hg_path)
+
+        # setup shared repo (if not there)
+        try:
+            hg.peer(myui, {}, shared_path, create=True)
+        except error.RepoError:
+            pass
 
         if not os.path.exists(dirname):
             os.makedirs(dirname)
-- 
1.7.9.5

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH] remote-hg: add shared repo upgrade
  2013-08-05 19:22 Antoine Pelisse
@ 2013-08-05 19:31 ` Felipe Contreras
  2013-08-05 19:54   ` Antoine Pelisse
  2013-08-05 21:02 ` Junio C Hamano
  1 sibling, 1 reply; 8+ messages in thread
From: Felipe Contreras @ 2013-08-05 19:31 UTC (permalink / raw)
  To: Antoine Pelisse; +Cc: git, Joern Hees

On Mon, Aug 5, 2013 at 2:22 PM, Antoine Pelisse <apelisse@gmail.com> wrote:
> From: Felipe Contreras <felipe.contreras@gmail.com>
>
> 6796d49 (remote-hg: use a shared repository store) introduced a bug by
> making the shared repository '.git/hg', which is already used before
> that patch, so clones that happened before that patch, fail after that
> patch, because there's no shared Mercurial repo.
>
> It's trivial to upgrade to the new organization by copying the Mercurial
> repo from one of the remotes (e.g. 'origin'), so let's do so.

In addition to that, simplify the shared repo initialization; if the
repository is shared, the pull on the child will use the parent's
storage, so there's no need for the initial clone.

And make sure the shared repository is always present.

It seems pretty clear to me that we are talking about multiple patches here.

-- 
Felipe Contreras

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] remote-hg: add shared repo upgrade
  2013-08-05 19:31 ` Felipe Contreras
@ 2013-08-05 19:54   ` Antoine Pelisse
  0 siblings, 0 replies; 8+ messages in thread
From: Antoine Pelisse @ 2013-08-05 19:54 UTC (permalink / raw)
  To: Felipe Contreras; +Cc: git, Joern Hees

On Mon, Aug 5, 2013 at 9:31 PM, Felipe Contreras
<felipe.contreras@gmail.com> wrote:
> On Mon, Aug 5, 2013 at 2:22 PM, Antoine Pelisse <apelisse@gmail.com> wrote:
>> From: Felipe Contreras <felipe.contreras@gmail.com>
>>
>> 6796d49 (remote-hg: use a shared repository store) introduced a bug by
>> making the shared repository '.git/hg', which is already used before
>> that patch, so clones that happened before that patch, fail after that
>> patch, because there's no shared Mercurial repo.
>>
>> It's trivial to upgrade to the new organization by copying the Mercurial
>> repo from one of the remotes (e.g. 'origin'), so let's do so.
>
> In addition to that, simplify the shared repo initialization; if the
> repository is shared, the pull on the child will use the parent's
> storage, so there's no need for the initial clone.
>
> And make sure the shared repository is always present.

It comes without saying that you can change this description if you want to :-)

> It seems pretty clear to me that we are talking about multiple patches here.

I'm not sure that's necessary. But I may be missing something.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] remote-hg: add shared repo upgrade
  2013-08-05 19:22 Antoine Pelisse
  2013-08-05 19:31 ` Felipe Contreras
@ 2013-08-05 21:02 ` Junio C Hamano
  2013-08-06  6:22   ` Antoine Pelisse
  1 sibling, 1 reply; 8+ messages in thread
From: Junio C Hamano @ 2013-08-05 21:02 UTC (permalink / raw)
  To: Antoine Pelisse; +Cc: git, Joern Hees, Felipe Contreras

Antoine Pelisse <apelisse@gmail.com> writes:

> From: Felipe Contreras <felipe.contreras@gmail.com>
>
> 6796d49 (remote-hg: use a shared repository store) introduced a bug by
> making the shared repository '.git/hg', which is already used before
> that patch, so clones that happened before that patch, fail after that
> patch, because there's no shared Mercurial repo.
>
> It's trivial to upgrade to the new organization by copying the Mercurial
> repo from one of the remotes (e.g. 'origin'), so let's do so.
>
> ...
> +        # check and upgrade old organization
> +        hg_path = os.path.join(shared_path, '.hg')
> +        if os.path.exists(shared_path) and not os.path.exists(hg_path):
> +            repos = os.listdir(shared_path)
> +            for x in repos:
> +                local_hg = os.path.join(shared_path, x, 'clone', '.hg')
> +                if not os.path.exists(local_hg):
> +                    continue
> +                shutil.copytree(local_hg, hg_path)

The log message talks about "one of the remotes (e.g. 'origin')" and
you are creating a copy of one that you encounter in os.listdir(); I
may be missing some underlying assumptions but I wonder what happens
after you copy and create hg_path directory, which does not change
in the loop, to the remaining iterations of the loop.  Is the untold
and obvious-to-those-who-are-familiar-with-this-codepath assumption
that it is guaranteed that there is at most one "*/clone/.hg" under
shared_path?

> +        # setup shared repo (if not there)
> +        try:
> +            hg.peer(myui, {}, shared_path, create=True)
> +        except error.RepoError:
> +            pass
>  
>          if not os.path.exists(dirname):
>              os.makedirs(dirname)

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] remote-hg: add shared repo upgrade
  2013-08-05 21:02 ` Junio C Hamano
@ 2013-08-06  6:22   ` Antoine Pelisse
  2013-08-06  6:36     ` Junio C Hamano
  0 siblings, 1 reply; 8+ messages in thread
From: Antoine Pelisse @ 2013-08-06  6:22 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Joern Hees, Felipe Contreras

On Mon, Aug 5, 2013 at 11:02 PM, Junio C Hamano <gitster@pobox.com> wrote:
> Antoine Pelisse <apelisse@gmail.com> writes:
> Is the untold
> and obvious-to-those-who-are-familiar-with-this-codepath assumption
> that it is guaranteed that there is at most one "*/clone/.hg" under
> shared_path?

No, there is no such assumption.
That is why we create a repository just below if it doesn't exist (no
copy was found).
That's also why I don't see how we could split the patch.

We could improve that part of the commit message:

    It's trivial to upgrade to the new organization by copying the Mercurial
    repo from one of the remotes (e.g. 'origin'), so let's do so. If
we can't find
    any existing repo, we create an empty one.

>> +        # setup shared repo (if not there)
>> +        try:
>> +            hg.peer(myui, {}, shared_path, create=True)
>> +        except error.RepoError:
>> +            pass
>>
>>          if not os.path.exists(dirname):
>>              os.makedirs(dirname)

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] remote-hg: add shared repo upgrade
  2013-08-06  6:22   ` Antoine Pelisse
@ 2013-08-06  6:36     ` Junio C Hamano
  2013-08-06  6:53       ` Antoine Pelisse
  0 siblings, 1 reply; 8+ messages in thread
From: Junio C Hamano @ 2013-08-06  6:36 UTC (permalink / raw)
  To: Antoine Pelisse; +Cc: git, Joern Hees, Felipe Contreras

Antoine Pelisse <apelisse@gmail.com> writes:

> On Mon, Aug 5, 2013 at 11:02 PM, Junio C Hamano <gitster@pobox.com> wrote:
>> Antoine Pelisse <apelisse@gmail.com> writes:
>> Is the untold
>> and obvious-to-those-who-are-familiar-with-this-codepath assumption
>> that it is guaranteed that there is at most one "*/clone/.hg" under
>> shared_path?
>
> No, there is no such assumption.
> That is why we create a repository just below if it doesn't exist (no
> copy was found).
> That's also why I don't see how we could split the patch.
>
> We could improve that part of the commit message:
>
>     It's trivial to upgrade to the new organization by copying the Mercurial
>     repo from one of the remotes (e.g. 'origin'), so let's do so. If
>     we can't find
>     any existing repo, we create an empty one.

That is fine, and I do not (yet) have an opinion on this patch
needing to be further split.

Quoting that part I was asking about again:

> +        # check and upgrade old organization
> +        hg_path = os.path.join(shared_path, '.hg')
> +        if os.path.exists(shared_path) and not os.path.exists(hg_path):
> +            repos = os.listdir(shared_path)
> +            for x in repos:
> +                local_hg = os.path.join(shared_path, x, 'clone', '.hg')
> +                if not os.path.exists(local_hg):
> +                    continue
> +                shutil.copytree(local_hg, hg_path)

if you can have more than one 'x' such that

    local_hg = os.path.join(shared_path, x, 'clone', '.hg')

exists, that means in repos[], there are two (or more) x1,and x2,
and in this loop you will run

	shutil.copytree(local_hg, hg_path)

twice, once for local_hg derived from x1 and another time from x2,
both to the same hg_path directory that does not change inside the
loop.  shutil.copytree(src, dst) however creates leading paths down
to dst and it would barf when dst already exists, no?

That is what I was puzzled about the code.  The log message says "we
can copy from one of them if exists, so let's do so", which makes
sense, and a code structure that may match would have looked like
so:

	for x in repos:
        	'''pick one at random, copy it and leave'''
                copytree()
                break
	else:
        	'''nothing to be copied, do it the hard way by cloning'''

but that is not what I saw so that is where my confusion came from.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH] remote-hg: add shared repo upgrade
  2013-08-06  6:36     ` Junio C Hamano
@ 2013-08-06  6:53       ` Antoine Pelisse
  0 siblings, 0 replies; 8+ messages in thread
From: Antoine Pelisse @ 2013-08-06  6:53 UTC (permalink / raw)
  To: Junio C Hamano; +Cc: git, Joern Hees, Felipe Contreras

On Tue, Aug 6, 2013 at 8:36 AM, Junio C Hamano <gitster@pobox.com> wrote:
> Antoine Pelisse <apelisse@gmail.com> writes:
> Quoting that part I was asking about again:
>
>> +        # check and upgrade old organization
>> +        hg_path = os.path.join(shared_path, '.hg')
>> +        if os.path.exists(shared_path) and not os.path.exists(hg_path):
>> +            repos = os.listdir(shared_path)
>> +            for x in repos:
>> +                local_hg = os.path.join(shared_path, x, 'clone', '.hg')
>> +                if not os.path.exists(local_hg):
>> +                    continue
>> +                shutil.copytree(local_hg, hg_path)
>
> if you can have more than one 'x' such that

OK, Sorry for the misunderstanding, I read "at least one", instead of
"at most one".
Yes, I think "break" is missing right after copytree().

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2013-08-06  6:53 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-08-05 19:29 [PATCH] remote-hg: add shared repo upgrade Antoine Pelisse
  -- strict thread matches above, loose matches on Subject: below --
2013-08-05 19:22 Antoine Pelisse
2013-08-05 19:31 ` Felipe Contreras
2013-08-05 19:54   ` Antoine Pelisse
2013-08-05 21:02 ` Junio C Hamano
2013-08-06  6:22   ` Antoine Pelisse
2013-08-06  6:36     ` Junio C Hamano
2013-08-06  6:53       ` Antoine Pelisse

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).