mirror of
https://github.com/git/git.git
synced 2024-11-24 18:33:43 +08:00
Merge branch 'jk/maint-tag-show-fixes'
* jk/maint-tag-show-fixes: tag: do not show non-tag contents with "-n" tag: die when listing missing or corrupt objects tag: fix output of "tag -n" when errors occur Conflicts: t/t7004-tag.sh
This commit is contained in:
commit
1efb73322a
@ -83,18 +83,51 @@ 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)
|
||||
die_errno("unable to read object %s", sha1_to_hex(sha1));
|
||||
if (type != OBJ_COMMIT && type != OBJ_TAG)
|
||||
goto free_return;
|
||||
if (!size)
|
||||
die("an empty %s object %s?",
|
||||
typename(type), sha1_to_hex(sha1));
|
||||
|
||||
/* skip header */
|
||||
sp = strstr(buf, "\n\n");
|
||||
if (!sp)
|
||||
goto free_return;
|
||||
|
||||
/* only take up to "lines" lines, and strip the signature from a tag */
|
||||
if (type == OBJ_TAG)
|
||||
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_return:
|
||||
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;
|
||||
|
||||
@ -110,33 +143,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;
|
||||
|
@ -586,6 +586,19 @@ test_expect_success \
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success 'annotations for blobs are empty' '
|
||||
blob=$(git hash-object -w --stdin <<-\EOF
|
||||
Blob paragraph 1.
|
||||
|
||||
Blob paragraph 2.
|
||||
EOF
|
||||
) &&
|
||||
git tag tag-blob $blob &&
|
||||
echo "tag-blob " >expect &&
|
||||
git tag -n1 -l tag-blob >actual &&
|
||||
test_cmp expect actual
|
||||
'
|
||||
|
||||
# trying to verify annotated non-signed tags:
|
||||
|
||||
test_expect_success GPG \
|
||||
|
Loading…
Reference in New Issue
Block a user