Code

Merge branch 'jc/maint-reset-unmerged-path'
authorJunio C Hamano <gitster@pobox.com>
Mon, 1 Aug 2011 22:00:08 +0000 (15:00 -0700)
committerJunio C Hamano <gitster@pobox.com>
Mon, 1 Aug 2011 22:00:08 +0000 (15:00 -0700)
* jc/maint-reset-unmerged-path:
  reset [<commit>] paths...: do not mishandle unmerged paths

builtin/reset.c
diff-lib.c
t/t7102-reset.sh

index 98bca044c1267fa63cb084a45aaf621e85f7d9b6..777e7c612900f867c5a52723ebdd56c9db793489 100644 (file)
@@ -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);
index 2e09500c8210e22d6c81484aa198f1d811a9933d..b3797592c63a86b46a3af0d875b6fe04ea43f536 100644 (file)
@@ -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;
        }
 
index f1cfc9ac959ee281d50f7b8a51fdcefd2d0670e7..b096dc88c2f4caf28887cf8fea5d700f0132f5a3 100755 (executable)
@@ -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 &&