diff options
author | Junio C Hamano <gitster@pobox.com> | 2020-10-04 12:49:07 -0700 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2020-10-04 12:49:07 -0700 |
commit | 230ff3e9970755fe4ba2e69165eab1f61752f1d1 (patch) | |
tree | cc263e9c30b5a2ec7d13f94a7b93704fd13d5324 /builtin | |
parent | 86cca370e1989e0cbcd412f8770883a20d86eee8 (diff) | |
parent | 610e2b924020fe2d6a55e7ca6651f309b85c2d1d (diff) | |
download | git-230ff3e9970755fe4ba2e69165eab1f61752f1d1.tar.gz |
Merge branch 'jc/blame-ignore-fix'
"git blame --ignore-rev/--ignore-revs-file" failed to validate
their input are valid revision, and failed to take into account
that the user may want to give an annotated tag instead of a
commit, which has been corrected.
* jc/blame-ignore-fix:
blame: validate and peel the object names on the ignore list
t8013: minimum preparatory clean-up
Diffstat (limited to 'builtin')
-rw-r--r-- | builtin/blame.c | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/builtin/blame.c b/builtin/blame.c index eb513fbe60..bb0f29300e 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -27,6 +27,7 @@ #include "object-store.h" #include "blame.h" #include "refs.h" +#include "tag.h" static char blame_usage[] = N_("git blame [<options>] [<rev-opts>] [<rev>] [--] <file>"); @@ -803,6 +804,26 @@ static int is_a_rev(const char *name) return OBJ_NONE < oid_object_info(the_repository, &oid, NULL); } +static int peel_to_commit_oid(struct object_id *oid_ret, void *cbdata) +{ + struct repository *r = ((struct blame_scoreboard *)cbdata)->repo; + struct object_id oid; + + oidcpy(&oid, oid_ret); + while (1) { + struct object *obj; + int kind = oid_object_info(r, &oid, NULL); + if (kind == OBJ_COMMIT) { + oidcpy(oid_ret, &oid); + return 0; + } + if (kind != OBJ_TAG) + return -1; + obj = deref_tag(r, parse_object(r, &oid), NULL, 0); + oidcpy(&oid, &obj->oid); + } +} + static void build_ignorelist(struct blame_scoreboard *sb, struct string_list *ignore_revs_file_list, struct string_list *ignore_rev_list) @@ -815,10 +836,12 @@ static void build_ignorelist(struct blame_scoreboard *sb, if (!strcmp(i->string, "")) oidset_clear(&sb->ignore_list); else - oidset_parse_file(&sb->ignore_list, i->string); + oidset_parse_file_carefully(&sb->ignore_list, i->string, + peel_to_commit_oid, sb); } for_each_string_list_item(i, ignore_rev_list) { - if (get_oid_committish(i->string, &oid)) + if (get_oid_committish(i->string, &oid) || + peel_to_commit_oid(&oid, sb)) die(_("cannot find revision %s to ignore"), i->string); oidset_insert(&sb->ignore_list, &oid); } |