aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2011-08-16 11:41:28 -0700
committerJunio C Hamano <gitster@pobox.com>2011-08-16 11:41:28 -0700
commit7aa50897dda0360b9cbbe23e723a5aee461e1d71 (patch)
treefaa92da7147f6ffee7057a9e3afeaa2a6fca398c
parentb5e104a0e69f224b89a849fa1e9b4064a36c2f4b (diff)
parentff00b682f203eb39876b57404916b4c54b6032c6 (diff)
downloadgit-7aa50897dda0360b9cbbe23e723a5aee461e1d71.tar.gz
git-7aa50897dda0360b9cbbe23e723a5aee461e1d71.tar.xz
Merge branch 'jc/maint-reset-unmerged-path' into maint
* jc/maint-reset-unmerged-path: reset [<commit>] paths...: do not mishandle unmerged paths
-rw-r--r--builtin/reset.c2
-rw-r--r--diff-lib.c3
-rwxr-xr-xt/t7102-reset.sh15
3 files changed, 18 insertions, 2 deletions
diff --git a/builtin/reset.c b/builtin/reset.c
index 98bca044c..777e7c612 100644
--- a/builtin/reset.c
+++ b/builtin/reset.c
@@ -162,7 +162,7 @@ static void update_index_from_diff(struct diff_queue_struct *q,
for (i = 0; i < q->nr; i++) {
struct diff_filespec *one = q->queue[i]->one;
- if (one->mode) {
+ if (one->mode && !is_null_sha1(one->sha1)) {
struct cache_entry *ce;
ce = make_cache_entry(one->mode, one->sha1, one->path,
0, 0);
diff --git a/diff-lib.c b/diff-lib.c
index 2e09500c8..b3797592c 100644
--- a/diff-lib.c
+++ b/diff-lib.c
@@ -379,7 +379,8 @@ static void do_oneway_diff(struct unpack_trees_options *o,
if (cached && idx && ce_stage(idx)) {
struct diff_filepair *pair;
pair = diff_unmerge(&revs->diffopt, idx->name);
- fill_filespec(pair->one, idx->sha1, idx->ce_mode);
+ if (tree)
+ fill_filespec(pair->one, tree->sha1, tree->ce_mode);
return;
}
diff --git a/t/t7102-reset.sh b/t/t7102-reset.sh
index f1cfc9ac9..b096dc88c 100755
--- a/t/t7102-reset.sh
+++ b/t/t7102-reset.sh
@@ -429,6 +429,21 @@ test_expect_success '--mixed refreshes the index' '
test_i18ncmp expect output
'
+test_expect_success 'resetting specific path that is unmerged' '
+ git rm --cached file2 &&
+ F1=$(git rev-parse HEAD:file1) &&
+ F2=$(git rev-parse HEAD:file2) &&
+ F3=$(git rev-parse HEAD:secondfile) &&
+ {
+ echo "100644 $F1 1 file2" &&
+ echo "100644 $F2 2 file2" &&
+ echo "100644 $F3 3 file2"
+ } | git update-index --index-info &&
+ git ls-files -u &&
+ test_must_fail git reset HEAD file2 &&
+ git diff-index --exit-code --cached HEAD
+'
+
test_expect_success 'disambiguation (1)' '
git reset --hard &&