Thread (193 messages) flat view 193 messages, 3 authors, 2021-03-21

Re: [PATCH v2 28/29] blame: emit a better error on 'git blame directory'

From: Elijah Newren <hidden>
Date: 2021-03-16 06:56:41

On Mon, Mar 15, 2021 at 7:13 PM Ævar Arnfjörð Bjarmason
[off-list ref] wrote:
quoted hunk ↗ jump to hunk
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 <redacted>
---
 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_done
Given 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?
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help