Show peeled onion from upload-pack and server-info.
authorJunio C Hamano <junkio@cox.net>
Fri, 14 Oct 2005 01:57:40 +0000 (18:57 -0700)
committerJunio C Hamano <junkio@cox.net>
Sat, 15 Oct 2005 18:23:41 +0000 (11:23 -0700)
This updates git-ls-remote to show SHA1 names of objects that are
referred by tags, in the "ref^{}" notation.

This would make git-findtags (without -t flag) almost trivial.

    git-peek-remote . |
    sed -ne "s:^$target "'refs/tags/\(.*\)^{}$:\1:p'

Also Pasky could do:

    git-ls-remote --tags $remote |
    sed -ne 's:\( refs/tags/.*\)^{}$:\1:p'

to find out what object each of the remote tags refers to, and
if he has one locally, run "git-fetch $remote tag $tagname" to
automatically catch up with the upstream tags.

Signed-off-by: Junio C Hamano <junkio@cox.net>
git-fetch.sh
server-info.c
upload-pack.c

index 7c05880..0cb1596 100755 (executable)
@@ -176,6 +176,7 @@ if test "$tags"
 then
        taglist=$(git-ls-remote --tags "$remote" |
                sed -e '
+                       /\^{}$/d
                        s/^[^   ]*      //
                        s/.*/&:&/')
        if test "$#" -gt 1
index 3c08a28..ba53591 100644 (file)
@@ -9,7 +9,14 @@ static FILE *info_ref_fp;
 
 static int add_info_ref(const char *path, const unsigned char *sha1)
 {
+       struct object *o = parse_object(sha1);
+
        fprintf(info_ref_fp, "%s        %s\n", sha1_to_hex(sha1), path);
+       if (o->type == tag_type) {
+               o = deref_tag(o);
+               fprintf(info_ref_fp, "%s        %s^{}\n",
+                       sha1_to_hex(o->sha1), path);
+       }
        return 0;
 }
 
index 83f5a35..21b4b8b 100644 (file)
@@ -1,6 +1,8 @@
 #include "cache.h"
 #include "refs.h"
 #include "pkt-line.h"
+#include "tag.h"
+#include "object.h"
 
 static const char upload_pack_usage[] = "git-upload-pack <dir>";
 
@@ -165,7 +167,13 @@ static int receive_needs(void)
 
 static int send_ref(const char *refname, const unsigned char *sha1)
 {
+       struct object *o = parse_object(sha1);
+
        packet_write(1, "%s %s\n", sha1_to_hex(sha1), refname);
+       if (o->type == tag_type) {
+               o = deref_tag(o);
+               packet_write(1, "%s %s^{}\n", sha1_to_hex(o->sha1), refname);
+       }
        return 0;
 }