summaryrefslogtreecommitdiff
path: root/builtin/blame.c
diff options
context:
space:
mode:
Diffstat (limited to 'builtin/blame.c')
-rw-r--r--builtin/blame.c16
1 files changed, 14 insertions, 2 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));