Setting the config option `blame.ignoreRevsFile` globally to eg `.git-blame-ignore-revs` causes `git blame` to error when the file doesn't exist in the current repository: ``` fatal: could not open object name list: .git-blame-ignore-revs ``` Instead, just skip over ignore-rev files that don't exist. Signed-off-by: Noah Pendleton <noah.pendleton@xxxxxxxxx> --- Documentation/blame-options.txt | 2 +- Documentation/config/blame.txt | 3 ++- builtin/blame.c | 2 +- t/t8013-blame-ignore-revs.sh | 10 ++++++---- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Documentation/blame-options.txt b/Documentation/blame-options.txt index 117f4cf806..2a8f54cc9c 100644 --- a/Documentation/blame-options.txt +++ b/Documentation/blame-options.txt @@ -134,7 +134,7 @@ take effect. `fsck.skipList`. This option may be repeated, and these files will be processed after any files specified with the `blame.ignoreRevsFile` config option. An empty file name, `""`, will clear the list of revs from - previously processed files. + previously processed files. Any files that do not exist will be skipped. -h:: Show help message. diff --git a/Documentation/config/blame.txt b/Documentation/config/blame.txt index 4d047c1790..f7f49a4ac2 100644 --- a/Documentation/config/blame.txt +++ b/Documentation/config/blame.txt @@ -25,7 +25,8 @@ blame.ignoreRevsFile:: line, in linkgit:git-blame[1]. Whitespace and comments beginning with `#` are ignored. This option may be repeated multiple times. Empty file names will reset the list of ignored revisions. This option will - be handled before the command line option `--ignore-revs-file`. + be handled before the command line option `--ignore-revs-file`. If the + specified file does not exist it will be skipped. blame.markUnblamableLines:: Mark lines that were changed by an ignored revision that we could not diff --git a/builtin/blame.c b/builtin/blame.c index 641523ff9a..e5b45eddf4 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -835,7 +835,7 @@ static void build_ignorelist(struct blame_scoreboard *sb, for_each_string_list_item(i, ignore_revs_file_list) { if (!strcmp(i->string, "")) oidset_clear(&sb->ignore_list); - else + else if (file_exists(i->string)) oidset_parse_file_carefully(&sb->ignore_list, i->string, peel_to_commit_oid, sb); } diff --git a/t/t8013-blame-ignore-revs.sh b/t/t8013-blame-ignore-revs.sh index b18633dee1..56956adb14 100755 --- a/t/t8013-blame-ignore-revs.sh +++ b/t/t8013-blame-ignore-revs.sh @@ -127,18 +127,20 @@ test_expect_success override_ignore_revs_file ' grep -E "^[0-9a-f]+ [0-9]+ 2" blame_raw | sed -e "s/ .*//" >actual && test_cmp expect actual ' -test_expect_success bad_files_and_revs ' +test_expect_success bad_revs ' test_must_fail git blame file --ignore-rev NOREV 2>err && test_i18ngrep "cannot find revision NOREV to ignore" err && - test_must_fail git blame file --ignore-revs-file NOFILE 2>err && - test_i18ngrep "could not open.*: NOFILE" err && - echo NOREV >ignore_norev && test_must_fail git blame file --ignore-revs-file ignore_norev 2>err && test_i18ngrep "invalid object name: NOREV" err ' +# Non-existent ignore-revs-file should be ignored. +test_expect_success bad_file ' + git blame file --ignore-revs-file NOFILE +' + # For ignored revs that have added 'unblamable' lines, mark those lines with a # '*' # A--B--X--Y -- 2.32.0