Re: [PATCH v2 28/29] blame: emit a better error on 'git blame directory'
- From
Elijah Newren <newren@gmail.com>
- Date
- Mar 16, 2021, 06:55 UTC
- Message-ID
- <CABPp-BGsGsq93Zw7aSqDQVSrBvc+VGu91JZh-foFpuCNqJt5_Q@mail.gmail.com>
- In-Reply-To
- <20210316021312.13927-29-avarab@gmail.com>
On Mon, Mar 15, 2021 at 7:13 PM Ævar Arnfjörð Bjarmason <avarab@gmail.com> wrote:
Show 67 quoted lines
>
> Change an early check for non-blobs in verify_working_tree_path() to
> let any such objects pass, and instead die shortly thereafter in the
> fake_working_tree_commit() caller's type check.
>
> Now e.g. doing "git blame t" in git.git emits:
>
> fatal: unsupported file type t
>
> Instead of:
>
> fatal: no such path 't' in HEAD
>
> Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
> ---
> blame.c | 8 ++------
> t/t8004-blame-with-conflicts.sh | 20 ++++++++++++++++++++
> 2 files changed, 22 insertions(+), 6 deletions(-)
>
> diff --git a/blame.c b/blame.c
> index 9e0543e13d4..7da162cd582 100644
> --- a/blame.c
> +++ b/blame.c
> @@ -100,12 +100,8 @@ static void verify_working_tree_path(struct repository *r,
>
> for (parents = work_tree->parents; parents; parents = parents->next) {
> const struct object_id *commit_oid = &parents->item->object.oid;
> - struct object_id blob_oid;
> - unsigned short mode;
> - int ret = get_tree_entry_mode(r, commit_oid, path, &blob_oid,
> - &mode);
> -
> - if (!ret && oid_object_info(r, &blob_oid, NULL) == OBJ_BLOB)
> + struct object_id oid;
> + if (!get_tree_entry_path(r, commit_oid, path, &oid))
> return;
> }
>
> diff --git a/t/t8004-blame-with-conflicts.sh b/t/t8004-blame-with-conflicts.sh
> index 35414a53363..6caa504a0ea 100755
> --- a/t/t8004-blame-with-conflicts.sh
> +++ b/t/t8004-blame-with-conflicts.sh
> @@ -73,4 +73,24 @@ test_expect_success 'blame does not crash with conflicted file in stages 1,3' '
> git blame file1
> '
>
> +test_expect_success 'setup second case' '
> + git merge --abort
> +'
> +
> +test_expect_success 'blame on directory/file conflict' '
> + mkdir d &&
> + test_commit second &&
> + test_commit d/file &&
> + test_must_fail git blame d 2>expected &&
> +
> + git reset --hard second &&
> + >d &&
> + git add d &&
> + git commit -m"a not-a-dir" &&
> + test_must_fail git merge d/file &&
> +
> + test_must_fail git blame d 2>actual &&
> + test_cmp expected actual
> +'
> +
> test_doneGiven that the commit message says the change was about modifying the error message shown, why does the new test not check for the error message?