summaryrefslogtreecommitdiff
path: root/read-cache.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2007-10-18 06:31:30 (GMT)
committerShawn O. Pearce <spearce@spearce.org>2007-10-18 06:31:30 (GMT)
commitcd8ae20195ae09c06d0854f1ebf92d1f1164c927 (patch)
treeed65d9843eac52619f5d696b865e2e2e14697d61 /read-cache.c
parent93a56c2cf7c8b29ca4c5e0740fe1e487324ffc73 (diff)
downloadgit-cd8ae20195ae09c06d0854f1ebf92d1f1164c927.zip
git-cd8ae20195ae09c06d0854f1ebf92d1f1164c927.tar.gz
git-cd8ae20195ae09c06d0854f1ebf92d1f1164c927.tar.bz2
git-blame shouldn't crash if run in an unmerged tree
If we are in the middle of resolving a merge conflict there may be one or more files whose entries in the index represent an unmerged state (index entries in the higher-order stages). Attempting to run git-blame on any file in such a working directory resulted in "fatal: internal error: ce_mode is 0" as we use the magic marker for an unmerged entry is 0 (set up by things like diff-lib.c's do_diff_cache() and builtin-read-tree.c's read_tree_unmerged()) and the ce_match_stat_basic() function gets upset about this. I'm not entirely sure that the whole "ce_mode = 0" case is a good idea to begin with, and maybe the right thing to do is to remove that horrid freakish special case, but removing the internal error seems to be the simplest fix for now. Linus [sp: Thanks to Björn Steinbrink for the test case] Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
Diffstat (limited to 'read-cache.c')
-rw-r--r--read-cache.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/read-cache.c b/read-cache.c
index 536f4d0..928e8fa 100644
--- a/read-cache.c
+++ b/read-cache.c
@@ -149,6 +149,8 @@ static int ce_match_stat_basic(struct cache_entry *ce, struct stat *st)
else if (ce_compare_gitlink(ce))
changed |= DATA_CHANGED;
return changed;
+ case 0: /* Special case: unmerged file in index */
+ return MODE_CHANGED | DATA_CHANGED | TYPE_CHANGED;
default:
die("internal error: ce_mode is %o", ntohl(ce->ce_mode));
}