Skip to content

Commit

Permalink
Reuse previous annotation when overwriting a tag
Browse files Browse the repository at this point in the history
When forcing to overwrite an annotated tag, there are good chances one
wants to keep the old annotation, or modify it, not start from scratch.

This is obviously only triggered for annotated tagging (-a or -s).

Signed-off-by: Mike Hommey <mh@glandium.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
  • Loading branch information
Mike Hommey authored and Junio C Hamano committed Nov 6, 2007
1 parent fe61935 commit bab8118
Showing 1 changed file with 35 additions and 3 deletions.
38 changes: 35 additions & 3 deletions builtin-tag.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,9 +247,37 @@ static int git_tag_config(const char *var, const char *value)
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];
Expand Down Expand Up @@ -282,7 +310,11 @@ static void create_tag(const unsigned char *object, const char *tag,
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);
Expand Down Expand Up @@ -419,7 +451,7 @@ int cmd_tag(int argc, const char **argv, const char *prefix)
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)
Expand Down

0 comments on commit bab8118

Please sign in to comment.