提交 3b75ee93 编写于 作者: M Mike Hommey 提交者: Junio C Hamano

blame: allow to blame paths freshly added to the index

When blaming files, changes in the work tree are taken into account
and displayed as being "Not Committed Yet".

However, when blaming a file that is not known to the current HEAD,
git blame fails with `no such path 'foo' in HEAD`, even when the file
was git add'ed.

Allowing such a blame is useful when the new file added to the index
(not yet committed) was created by renaming an existing file.  It
also is useful when the new file was created from pieces already in
HEAD, moved or copied from other files and blaming with copy
detection (i.e. "-C").
Signed-off-by: NMike Hommey <mh@glandium.org>
Signed-off-by: NJunio C Hamano <gitster@pobox.com>
上级 0b65a8db
......@@ -2230,6 +2230,7 @@ static int git_blame_config(const char *var, const char *value, void *cb)
static void verify_working_tree_path(struct commit *work_tree, const char *path)
{
struct commit_list *parents;
int pos;
for (parents = work_tree->parents; parents; parents = parents->next) {
const unsigned char *commit_sha1 = parents->item->object.oid.hash;
......@@ -2240,7 +2241,14 @@ static void verify_working_tree_path(struct commit *work_tree, const char *path)
sha1_object_info(blob_sha1, NULL) == OBJ_BLOB)
return;
}
die("no such path '%s' in HEAD", path);
pos = cache_name_pos(path, strlen(path));
if (pos >= 0)
; /* path is in the index */
else if (!strcmp(active_cache[-1 - pos]->name, path))
; /* path is in the index, unmerged */
else
die("no such path '%s' in HEAD", path);
}
static struct commit_list **append_parent(struct commit_list **tail, const unsigned char *sha1)
......
......@@ -137,6 +137,51 @@ test_expect_success 'blame wholesale copy and more' '
'
test_expect_success 'blame wholesale copy and more in the index' '
cat >horse <<-\EOF &&
ABC
DEF
XXXX
YYYY
GHIJK
EOF
git add horse &&
test_when_finished "git rm -f horse" &&
git blame -f -C -C1 -- horse | sed -e "$pick_fc" >current &&
cat >expected <<-\EOF &&
mouse-Initial
mouse-Second
cow-Fifth
horse-Not
mouse-Third
EOF
test_cmp expected current
'
test_expect_success 'blame during cherry-pick with file rename conflict' '
test_when_finished "git reset --hard && git checkout master" &&
git checkout HEAD~3 &&
echo MOUSE >> mouse &&
git mv mouse rodent &&
git add rodent &&
GIT_AUTHOR_NAME=Rodent git commit -m "rodent" &&
git checkout --detach master &&
(git cherry-pick HEAD@{1} || test $? -eq 1) &&
git show HEAD@{1}:rodent > rodent &&
git add rodent &&
git blame -f -C -C1 rodent | sed -e "$pick_fc" >current &&
cat current &&
cat >expected <<-\EOF &&
mouse-Initial
mouse-Second
rodent-Not
EOF
test_cmp expected current
'
test_expect_success 'blame path that used to be a directory' '
mkdir path &&
echo A A A A A >path/file &&
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册