summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--builtin/blame.c16
-rwxr-xr-xt/t8004-blame-with-conflicts.sh4
2 files changed, 16 insertions, 4 deletions
diff --git a/builtin/blame.c b/builtin/blame.c
index 324d476abf..83683b8287 100644
--- a/builtin/blame.c
+++ b/builtin/blame.c
@@ -2044,6 +2044,19 @@ static int git_blame_config(const char *var, const char *value, void *cb)
return git_default_config(var, value, cb);
}
+static void verify_working_tree_path(unsigned char *head_sha1, const char *path)
+{
+ unsigned char blob_sha1[20];
+ unsigned mode;
+
+ if (!resolve_ref_unsafe("HEAD", head_sha1, 1, NULL))
+ die("no such ref: HEAD");
+ if (get_tree_entry(head_sha1, path, blob_sha1, &mode))
+ die("no such path '%s' in HEAD", path);
+ if (sha1_object_info(blob_sha1, NULL) != OBJ_BLOB)
+ die("path '%s' in HEAD is not a blob", path);
+}
+
/*
* Prepare a dummy commit that represents the work tree (or staged) item.
* Note that annotating work tree item never works in the reverse.
@@ -2062,8 +2075,7 @@ static struct commit *fake_working_tree_commit(struct diff_options *opt,
struct cache_entry *ce;
unsigned mode;
- if (get_sha1("HEAD", head_sha1))
- die("No such ref: HEAD");
+ verify_working_tree_path(head_sha1, path);
time(&now);
commit = xcalloc(1, sizeof(*commit));
diff --git a/t/t8004-blame-with-conflicts.sh b/t/t8004-blame-with-conflicts.sh
index ba19ac127e..b4a260a0fc 100755
--- a/t/t8004-blame-with-conflicts.sh
+++ b/t/t8004-blame-with-conflicts.sh
@@ -66,8 +66,8 @@ test_expect_success \
git blame file2
'
-test_expect_success 'blame runs on conflicted file in stages 1,3' '
- git blame file1
+test_expect_success 'blame does not crash with conflicted file in stages 1,3' '
+ test_must_fail git blame file1
'
test_done