From: Johannes Schindelin Date: Thu, 29 Sep 2005 08:42:32 GMT Subject: Re: [PATCH] fetch-pack should not ask for a ref which is already there Message-ID: In-Reply-To: <7vll1gl4ms.fsf@assigned-by-dhcp.cox.net> Hi, On Thu, 29 Sep 2005, Junio C Hamano wrote: > Johannes Schindelin writes: > > > With this patch, instead of blindly asking for every remote ref, fetch-pack > > first looks in the local repository if that ref is already there. > > This patch breaks things. git-fetch-pack is supposed to report > the resulting SHA1 and refs on its standard output. If you are > up to date with this patch you would lose that. Yeah, sorry. I did not test that one. Maybe an automated test for git-fetch-pack would be useful after all... How about the following? (I avoided an ugly goto, but had to duplicate code :-( ) --- [PATCH] fetch-pack should not ask for a ref which is already there With this patch, instead of blindly asking for every remote ref, fetch-pack first looks in the local repository if that ref is already there. Signed-off-by: Johannes Schindelin --- fetch-pack.c | 36 ++++++++++++++++++++++++++---------- 1 files changed, 26 insertions(+), 10 deletions(-) fbef982e4c5c4591b8d5517ef1694ab71e29c9e5 diff --git a/fetch-pack.c b/fetch-pack.c --- a/fetch-pack.c +++ b/fetch-pack.c @@ -16,20 +16,27 @@ static int find_common(int fd[2], unsign int count = 0, flushes = 0, retval; FILE *revs; - revs = popen("git-rev-list $(git-rev-parse --all)", "r"); - if (!revs) - die("unable to run 'git-rev-list'"); - while (refs) { unsigned char *remote = refs->old_sha1; - if (verbose) - fprintf(stderr, - "want %s (%s)\n", sha1_to_hex(remote), - refs->name); - packet_write(fd[1], "want %s\n", sha1_to_hex(remote)); + if(!has_sha1_file(remote)) { + if (verbose) + fprintf(stderr, + "want %s (%s)\n", sha1_to_hex(remote), + refs->name); + packet_write(fd[1], "want %s\n", sha1_to_hex(remote)); + count++; + } refs = refs->next; } packet_flush(fd[1]); + + if(count==0) + return 1; + + revs = popen("git-rev-list $(git-rev-parse --all)", "r"); + if (!revs) + die("unable to run 'git-rev-list'"); + flushes = 1; retval = -1; while (fgets(line, sizeof(line), revs) != NULL) { @@ -86,7 +93,16 @@ static int fetch_pack(int fd[2], int nr_ packet_flush(fd[1]); die("no matching remote head"); } - if (find_common(fd, sha1, ref) < 0) + status = find_common(fd, sha1, ref); + if(status > 0) { + while (ref) { + printf("%s %s\n", + sha1_to_hex(ref->old_sha1), ref->name); + ref = ref->next; + } + return 0; + } + if(status < 0) fprintf(stderr, "warning: no common commits\n"); pid = fork(); if (pid < 0)