threads / patch / 2157

patchcg-fetch will now retrieve commits related to tags if missing.

Subject: [PATCH] cg-fetch will now retrieve commits related to tags if missing.

## tl;dr

7 messages between Oct 20, 2005 and Oct 20, 2005. Diffs are folded; open one to read it.

replies: 6people: 3as markdown or json

Martin Langhoff· Oct 20, 2005, 00:55 UTC · lore
Signed-off-by: Martin Langhoff <martin@catalyst.net.nz>
---
 cg-fetch |    3 ++-
 1 files changed, 2 insertions(+), 1 deletions(-)

applies-to: 38ed7981343a8e2bb734d64e019186a8a482dbef 48cb643964910a058881307513cb63aeee28a1de

Show changes to cg-fetch +2 −1
diff --git a/cg-fetch b/cg-fetch
index 7694584..d4650e5 100755
--- a/cg-fetch
+++ b/cg-fetch
@@ -417,7 +417,8 @@ $get -i -s -u -d "$uri/refs/tags" "$_git
 	for tag in *; do
 		[ "$tag" = "*" ] && break
 		tagid=$(cat $tag)
-		GIT_DIR=../.. git-cat-file -t "$tagid" >/dev/null 2>&1 && continue
+		GIT_DIR=../.. [ "`git-cat-file -t $tagid 2>/dev/null`" = "commit" ] && continue
+		GIT_DIR=../.. git-cat-file commit `git-rev-parse $tag^{commit}  2>/dev/null` 2>&1 >> /dev/null && continue
 		echo -n "Missing object of tag $tag... "
 		if [ "$fetch" != "fetch_rsync" ] && GIT_DIR=../.. $fetch "$tagid" "$uri" 2>/dev/null >&2; then
 			echo "retrieved"
---
0.99.8.GIT
Junio C Hamano· Oct 20, 2005, 01:25 UTC · re: Martin Langhoff · lore

Re: [PATCH] cg-fetch will now retrieve commits related to tags if missing.

Martin Langhoff <martin@catalyst.net.nz> writes:
Show 8 quoted lines
> diff --git a/cg-fetch b/cg-fetch
> index 7694584..d4650e5 100755
> --- a/cg-fetch
> +++ b/cg-fetch
> @@ -417,7 +417,8 @@ $get -i -s -u -d "$uri/refs/tags" "$_git
>  	for tag in *; do
>  		[ "$tag" = "*" ] && break
>  		tagid=$(cat $tag)
You just reported this $tag needs quoting ;-).
> +		GIT_DIR=../.. [ "`git-cat-file -t $tagid 2>/dev/null`" = "commit" ] && continue
> +		GIT_DIR=../.. git-cat-file commit `git-rev-parse $tag^{commit}  2>/dev/null` 2>&1 >> /dev/null && continue
You are saying:
	if "$tagid" is already commit then continue;
        if "$tagid" dereferences to a commit and if you have it
	then continue
If that is the case, then this might be more efficient.
	GIT_DIR=../.. git-rev-parse --verify "$tagid^0" >/dev/null 2>&1 && continue

You can say ^{commit} instead of ^0 if you like that newer style, of course.

Martin Langhoff· Oct 20, 2005, 04:15 UTC · re: Junio C Hamano · lore

Re: [PATCH] cg-fetch will now retrieve commits related to tags if missing.

On 10/20/05, Junio C Hamano <junkio@cox.net> wrote:
> You just reported this $tag needs quoting ;-).

I thought I had seen a post from you to Petr, mentioning that he had just fixed it. I didn't see any fix when I updated, but I thought it may have been due to mirroring issues. In any case, it obviously needs quoting.

Show 14 quoted lines
> > +             GIT_DIR=../.. [ "`git-cat-file -t $tagid 2>/dev/null`" = "commit" ] && continue
> > +             GIT_DIR=../.. git-cat-file commit `git-rev-parse $tag^{commit}  2>/dev/null` 2>&1 >> /dev/null && continue
>
> You are saying:
>         if "$tagid" is already commit then continue;
>         if "$tagid" dereferences to a commit and if you have it
>         then continue
>
> If that is the case, then this might be more efficient.
>
>         GIT_DIR=../.. git-rev-parse --verify "$tagid^0" >/dev/null 2>&1 && continue
>
> You can say ^{commit} instead of ^0 if you like that newer
> style, of course.

I tried, and failed to get it to work 100% so I reverted to the double check you've seen. Must have been PEBKAC for now it works correctly -- possibly related to the unquoted tagnames.

Ok -- too many problems with that patch. Let's try it again...
martin
Martin Langhoff· Oct 20, 2005, 04:18 UTC · re: Junio C Hamano · lore

Re: [PATCH] cg-fetch will now retrieve commits related to tags if missing.

On 10/20/05, Junio C Hamano <junkio@cox.net> wrote:
Show 8 quoted lines
> You are saying:
>         if "$tagid" is already commit then continue;
>         if "$tagid" dereferences to a commit and if you have it
>         then continue
>
> If that is the case, then this might be more efficient.
>
>         GIT_DIR=../.. git-rev-parse --verify "$tagid^0" >/dev/null 2>&1 && continue

Note however that git-rev-parse is lazy and won't check that the commit is there. I have to call git-cat-file and check whether it succeeds to know if we have the object.

cheers,
martin
Junio C Hamano· Oct 20, 2005, 04:44 UTC · re: Martin Langhoff · lore

Re: [PATCH] cg-fetch will now retrieve commits related to tags if missing.

Martin Langhoff <martin.langhoff@gmail.com> writes:
Show 5 quoted lines
>>         GIT_DIR=../.. git-rev-parse --verify "$tagid^0" >/dev/null 2>&1 && continue
>
> Note however that git-rev-parse is lazy and won't check that the
> commit is there. I have to call git-cat-file and check whether it
> succeeds to know if we have the object.
Are you sure?
What "rev^0" does is:
    1. parse "rev"; make sure it can deref to commit and read
       it (otherwise give up and say the whole thing is not an
       SHA1 expression);
    2. grab the nth parent SHA1.  If N>0, it is lazy and does
       not check if the parent object exists, but still 0th
       parent is the commit object itself and if we came this
       far you know that commit is available already.

Together with --verify, it barfs if the above does not say "rev^0" is a valid SHA1 expression. So this should work without cat-file. No?

BTW, I just got a SEGV while pulling Cogito repository over git-fetch-pack after interrupting rsync transfer (I wanted to switch to git transfer). I am running with Johaness patch from today so the cause may be different from yours, but now I have something to look at, which is better than before.

Fetching with rsync (and interrupting in the middle) is a good way to simulate a broken repository ;-).

Martin Langhoff· Oct 20, 2005, 04:59 UTC · re: Junio C Hamano · lore

Re: [PATCH] cg-fetch will now retrieve commits related to tags if missing.

On 10/20/05, Junio C Hamano <junkio@cox.net> wrote:
Show 11 quoted lines
> Martin Langhoff <martin.langhoff@gmail.com> writes:
>
> >>         GIT_DIR=../.. git-rev-parse --verify "$tagid^0" >/dev/null 2>&1 && continue
> >
> > Note however that git-rev-parse is lazy and won't check that the
> > commit is there. I have to call git-cat-file and check whether it
> > succeeds to know if we have the object.
>
> Are you sure?
>
> What "rev^0" does is:
Ok -- I was using ^{commit} which _is_ lazy, but you are right, ^0 isn't lazy.
Show 8 quoted lines
> BTW, I just got a SEGV while pulling Cogito repository over
> git-fetch-pack after interrupting rsync transfer (I wanted to
> switch to git transfer).  I am running with Johaness patch from
> today so the cause may be different from yours, but now I have
> something to look at, which is better than before.
>
> Fetching with rsync (and interrupting in the middle) is a good
> way to simulate a broken repository ;-).

Cool. That's something for you to play with I guess, to tell you the truth, I'm not useful with gdb ;)

martin
Junio C Hamano· Oct 20, 2005, 05:23 UTC · re: Martin Langhoff · lore

Re: [PATCH] cg-fetch will now retrieve commits related to tags if missing.

Martin Langhoff <martin.langhoff@gmail.com> writes:
> Ok -- I was using ^{commit} which _is_ lazy, but you are
> right, ^0 isn't lazy.
Ah, my mistake.  We would need something like this.
---
Show changes to sha1_name.c +3 −1
diff --git a/sha1_name.c b/sha1_name.c
index 75c688e..cc320d3 100644
--- a/sha1_name.c
+++ b/sha1_name.c
@@ -323,6 +323,8 @@ static int peel_onion(const char *name, 
 		return -1;
 	if (!type_string) {
 		o = deref_tag(o);
+		if (!o || (!o->parsed && !parse_object(o->sha1)))
+			return -1;
 		memcpy(sha1, o->sha1, 20);
 	}
 	else {
@@ -332,7 +334,7 @@ static int peel_onion(const char *name, 
 		 */
 
 		while (1) {
-			if (!o)
+			if (!o || (!o->parsed && !parse_object(o->sha1)))
 				return -1;
 			if (o->type == type_string) {
 				memcpy(sha1, o->sha1, 20);

← back to recent threads