On Fri, Jun 5, 2015 at 11:36 PM, Junio C Hamano <[email protected]> wrote:
> Paul Tan <[email protected]> writes:
>
>> Hmm, actually git-am.sh doesn't seem to do that even when we have a
>> history to apply patches to. This is okay in the non-3way case, as
>> git-apply will check to see if the patch applies before it modifies
>> the index, but if we fall back on 3-way merge, any new files the
>> failed merge added will not be deleted in the "git read-tree --reset
>> -u HEAD HEAD".
>>
>> Should we do that?
>
> That sounds like the right thing to do; I agree that fixing it may
> or may not be outside the scope of the immediate series.
Hmm, thinking about it, the equivalent C code would be greatly
affected by whatever behavior we go with, so I think we should try
fixing the behavior first.
This was done really quickly, but I think this may fix it:
diff --git a/git-am.sh b/git-am.sh
index 761befb..f7d54bf 100755
--- a/git-am.sh
+++ b/git-am.sh
@@ -502,7 +502,9 @@ then
;;
t,)
git rerere clear
- git read-tree --reset -u HEAD HEAD
+ git read-tree --reset HEAD HEAD &&
+ our_tree=$(git write-tree) &&
+ git read-tree -m -u $our_tree HEAD
orig_head=$(cat "$GIT_DIR/ORIG_HEAD")
git reset HEAD
git update-ref ORIG_HEAD $orig_head
diff --git a/t/t4153-am-clean-index.sh b/t/t4153-am-clean-index.sh
new file mode 100755
index 0000000..6d696db
--- /dev/null
+++ b/t/t4153-am-clean-index.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+
+test_description='test clean index with am'
+. ./test-lib.sh
+
+test_expect_success setup '
+ test_commit initial file &&
+ test_commit master-commit file &&
+ git checkout -b conflict master^ &&
+ echo conflict-commit >file &&
+ echo newfile >newfile &&
+ git add newfile &&
+ test_tick &&
+ git commit -a -m conflict-commit &&
+ git format-patch --stdout initial >conflict.patch &&
+ git checkout master
+'
+
+test_expect_success 'am -3 pauses on conflict' '
+ test_must_fail git am -3 conflict.patch &&
+ echo newfile >expected &&
+ test_cmp newfile expected
+'
+
+test_expect_success 'am --skip removes newfile' '
+ git am --skip &&
+ test_path_is_missing newfile
+'
+
+test_done
However, it assumes that the contents of the index are from the failed
merge. If the user modified the index before running git-am --skip,
e.g. the user added a file, then that file would be deleted, which may
not be desired...
Thanks,
Paul
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html