summaryrefslogtreecommitdiff
path: root/tag.c
diff options
context:
space:
mode:
authorShawn O. Pearce <spearce@spearce.org>2010-04-12 23:25:28 (GMT)
committerJunio C Hamano <gitster@pobox.com>2010-04-13 04:45:17 (GMT)
commite451d06bf39df35d1106ad9bde5e38505533d805 (patch)
tree9fe1f7b4015e3fa24f51eed98166edbb7df384a3 /tag.c
parent28de5b6b400fcdbd2d0665bc0cec7d7e4b813b43 (diff)
downloadgit-e451d06bf39df35d1106ad9bde5e38505533d805.zip
git-e451d06bf39df35d1106ad9bde5e38505533d805.tar.gz
git-e451d06bf39df35d1106ad9bde5e38505533d805.tar.bz2
tag.c: Parse tagger date (if present)
Just like with committer dates, we parse the tagger date into the struct tag so its available for further downstream processing. However since the tagger header was not introduced until Git 0.99.1 we must consider it optional. For tags missing this header we use the default date of 0. Signed-off-by: Shawn O. Pearce <spearce@spearce.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'tag.c')
-rw-r--r--tag.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/tag.c b/tag.c
index ceb8655..85607c2 100644
--- a/tag.c
+++ b/tag.c
@@ -36,6 +36,23 @@ struct tag *lookup_tag(const unsigned char *sha1)
return (struct tag *) obj;
}
+static unsigned long parse_tag_date(const char *buf, const char *tail)
+{
+ const char *dateptr;
+
+ while (buf < tail && *buf++ != '>')
+ /* nada */;
+ if (buf >= tail)
+ return 0;
+ dateptr = buf;
+ while (buf < tail && *buf++ != '\n')
+ /* nada */;
+ if (buf >= tail)
+ return 0;
+ /* dateptr < buf && buf[-1] == '\n', so strtoul will stop at buf-1 */
+ return strtoul(dateptr, NULL, 10);
+}
+
int parse_tag_buffer(struct tag *item, void *data, unsigned long size)
{
unsigned char sha1[20];
@@ -86,6 +103,11 @@ int parse_tag_buffer(struct tag *item, void *data, unsigned long size)
item->tag = xmemdupz(bufptr, nl - bufptr);
bufptr = nl + 1;
+ if (!prefixcmp(bufptr, "tagger "))
+ item->date = parse_tag_date(bufptr, tail);
+ else
+ item->date = 0;
+
return 0;
}