diff options
author | Jeff King <peff@peff.net> | 2012-02-06 03:13:12 -0500 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2012-02-06 10:00:42 -0800 |
commit | ca51699961664890fdaabd276af539e6b3514053 (patch) | |
tree | 8ba79c2a018508e338d0fee3885fda0f562cda53 /builtin | |
parent | f174a2583c9f42315b60205890fa67a79a1f1669 (diff) | |
download | git-ca51699961664890fdaabd276af539e6b3514053.tar.gz git-ca51699961664890fdaabd276af539e6b3514053.tar.xz |
tag: fix output of "tag -n" when errors occur
When "git tag" is instructed to print lines from annotated
tags via "-n", it first prints the tag name, then attempts
to parse and print the lines of the tag object, and then
finally adds a trailing newline.
If an error occurs, we return early from the function and
never print the newline, screwing up the output for the next
tag. Let's factor the line-printing into its own function so
we can manage the early returns better, and make sure that
we always terminate the line.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/tag.c | 66 |
1 files changed, 34 insertions, 32 deletions
diff --git a/builtin/tag.c b/builtin/tag.c index 667515e52..391160cf8 100644 --- a/builtin/tag.c +++ b/builtin/tag.c @@ -84,18 +84,45 @@ static int contains(struct commit *candidate, const struct commit_list *want) return contains_recurse(candidate, want); } +static void show_tag_lines(const unsigned char *sha1, int lines) +{ + int i; + unsigned long size; + enum object_type type; + char *buf, *sp, *eol; + size_t len; + + buf = read_sha1_file(sha1, &type, &size); + if (!buf || !size) + return; + + /* skip header */ + sp = strstr(buf, "\n\n"); + if (!sp) { + free(buf); + return; + } + /* only take up to "lines" lines, and strip the signature */ + size = parse_signature(buf, size); + for (i = 0, sp += 2; i < lines && sp < buf + size; i++) { + if (i) + printf("\n "); + eol = memchr(sp, '\n', size - (sp - buf)); + len = eol ? eol - sp : size - (sp - buf); + fwrite(sp, len, 1, stdout); + if (!eol) + break; + sp = eol + 1; + } + free(buf); +} + static int show_reference(const char *refname, const unsigned char *sha1, int flag, void *cb_data) { struct tag_filter *filter = cb_data; if (match_pattern(filter->patterns, refname)) { - int i; - unsigned long size; - enum object_type type; - char *buf, *sp, *eol; - size_t len; - if (filter->with_commit) { struct commit *commit; @@ -111,33 +138,8 @@ static int show_reference(const char *refname, const unsigned char *sha1, return 0; } printf("%-15s ", refname); - - buf = read_sha1_file(sha1, &type, &size); - if (!buf || !size) - return 0; - - /* skip header */ - sp = strstr(buf, "\n\n"); - if (!sp) { - free(buf); - return 0; - } - /* only take up to "lines" lines, and strip the signature */ - size = parse_signature(buf, size); - for (i = 0, sp += 2; - i < filter->lines && sp < buf + size; - i++) { - if (i) - printf("\n "); - eol = memchr(sp, '\n', size - (sp - buf)); - len = eol ? eol - sp : size - (sp - buf); - fwrite(sp, len, 1, stdout); - if (!eol) - break; - sp = eol + 1; - } + show_tag_lines(sha1, filter->lines); putchar('\n'); - free(buf); } return 0; |