Merge branch 'mh/retag'
authorJunio C Hamano <gitster@pobox.com>
Wed, 14 Nov 2007 22:06:09 +0000 (14:06 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 14 Nov 2007 22:06:09 +0000 (14:06 -0800)
* mh/retag:
Add tests for git tag
Reuse previous annotation when overwriting a tag

1  2 
builtin-tag.c
diff --combined builtin-tag.c
index 4aca3dc79b2a3d28f158ff61c01363244bfd7637,566d123a8db1a3da70d261acd8cf3fdcbc2e469f..cbb0f04e85627a5509bb2ba8cbf04a54d4d20c41
@@@ -81,16 -81,17 +81,16 @@@ static int show_reference(const char *r
                }
                printf("%-15s ", refname);
  
 -              sp = buf = read_sha1_file(sha1, &type, &size);
 -              if (!buf)
 +              buf = read_sha1_file(sha1, &type, &size);
 +              if (!buf || !size)
                        return 0;
 -              if (!size) {
 +
 +              /* skip header */
 +              sp = strstr(buf, "\n\n");
 +              if (!sp) {
                        free(buf);
                        return 0;
                }
 -              /* skip header */
 -              while (sp + 1 < buf + size &&
 -                              !(sp[0] == '\n' && sp[1] == '\n'))
 -                      sp++;
                /* only take up to "lines" lines, and strip the signature */
                for (i = 0, sp += 2;
                                i < filter->lines && sp < buf + size &&
@@@ -246,9 -247,37 +246,37 @@@ static int git_tag_config(const char *v
        return git_default_config(var, value);
  }
  
+ static void write_tag_body(int fd, const unsigned char *sha1)
+ {
+       unsigned long size;
+       enum object_type type;
+       char *buf, *sp, *eob;
+       size_t len;
+       buf = read_sha1_file(sha1, &type, &size);
+       if (!buf)
+               return;
+       /* skip header */
+       sp = strstr(buf, "\n\n");
+       if (!sp || !size || type != OBJ_TAG) {
+               free(buf);
+               return;
+       }
+       sp += 2; /* skip the 2 LFs */
+       eob = strstr(sp, "\n" PGP_SIGNATURE "\n");
+       if (eob)
+               len = eob - sp;
+       else
+               len = buf + size - sp;
+       write_or_die(fd, sp, len);
+       free(buf);
+ }
  static void create_tag(const unsigned char *object, const char *tag,
                       struct strbuf *buf, int message, int sign,
-                          unsigned char *result)
+                          unsigned char *prev, unsigned char *result)
  {
        enum object_type type;
        char header_buf[1024];
                if (fd < 0)
                        die("could not create file '%s': %s",
                                                path, strerror(errno));
-               write_or_die(fd, tag_template, strlen(tag_template));
+               if (!is_null_sha1(prev))
+                       write_tag_body(fd, prev);
+               else
+                       write_or_die(fd, tag_template, strlen(tag_template));
                close(fd);
  
                launch_editor(path, buf);
@@@ -418,7 -451,7 +450,7 @@@ int cmd_tag(int argc, const char **argv
                die("tag '%s' already exists", tag);
  
        if (annotate)
-               create_tag(object, tag, &buf, message, sign, object);
+               create_tag(object, tag, &buf, message, sign, prev, object);
  
        lock = lock_any_ref_for_update(ref, prev, 0);
        if (!lock)