Teach "apply --index-info" to handle rename patches
With v1.5.3.2~14 (apply --index-info: fall back to current index for mode changes, 2007-09-17), git apply learned to stop worrying about the lack of diff index line when a file already present in the current index had no content change. But it still worries too much: for rename patches, it is checking that both the old and new filename are present in the current index. This makes no sense, since a file rename generally involves creating a file there was none before. So just check the old filename. Noticed while trying to use “git rebase” with diff.renames = copies. [jn: add tests] Reported-by: David D. Kilzer <ddkilzer@kilzer.net> Signed-off-by: Jonathan Nieder <jrnieder@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
parent
5d27485944
commit
18cdf802ca
|
@ -2979,8 +2979,7 @@ static void build_fake_ancestor(struct patch *list, const char *filename)
|
||||||
else if (get_sha1(patch->old_sha1_prefix, sha1))
|
else if (get_sha1(patch->old_sha1_prefix, sha1))
|
||||||
/* git diff has no index line for mode/type changes */
|
/* git diff has no index line for mode/type changes */
|
||||||
if (!patch->lines_added && !patch->lines_deleted) {
|
if (!patch->lines_added && !patch->lines_deleted) {
|
||||||
if (get_current_sha1(patch->new_name, sha1) ||
|
if (get_current_sha1(patch->old_name, sha1))
|
||||||
get_current_sha1(patch->old_name, sha1))
|
|
||||||
die("mode change for %s, which is not "
|
die("mode change for %s, which is not "
|
||||||
"in current HEAD", name);
|
"in current HEAD", name);
|
||||||
sha1_ptr = sha1;
|
sha1_ptr = sha1;
|
||||||
|
|
|
@ -116,6 +116,18 @@ test_expect_success setup '
|
||||||
git commit -m "added another file" &&
|
git commit -m "added another file" &&
|
||||||
|
|
||||||
git format-patch --stdout master >lorem-move.patch &&
|
git format-patch --stdout master >lorem-move.patch &&
|
||||||
|
|
||||||
|
git checkout -b rename &&
|
||||||
|
git mv file renamed &&
|
||||||
|
git commit -m "renamed a file" &&
|
||||||
|
|
||||||
|
git format-patch -M --stdout lorem >rename.patch &&
|
||||||
|
|
||||||
|
git reset --soft lorem^ &&
|
||||||
|
git commit -m "renamed a file and added another" &&
|
||||||
|
|
||||||
|
git format-patch -M --stdout lorem^ >rename-add.patch &&
|
||||||
|
|
||||||
# reset time
|
# reset time
|
||||||
unset test_tick &&
|
unset test_tick &&
|
||||||
test_tick
|
test_tick
|
||||||
|
@ -246,8 +258,42 @@ test_expect_success 'am -3 falls back to 3-way merge' '
|
||||||
git diff --exit-code lorem
|
git diff --exit-code lorem
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'am can rename a file' '
|
||||||
|
grep "^rename from" rename.patch &&
|
||||||
|
rm -fr .git/rebase-apply &&
|
||||||
|
git reset --hard &&
|
||||||
|
git checkout lorem^0 &&
|
||||||
|
git am rename.patch &&
|
||||||
|
! test -d .git/rebase-apply &&
|
||||||
|
git update-index --refresh &&
|
||||||
|
git diff --exit-code rename
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'am -3 can rename a file' '
|
||||||
|
grep "^rename from" rename.patch &&
|
||||||
|
rm -fr .git/rebase-apply &&
|
||||||
|
git reset --hard &&
|
||||||
|
git checkout lorem^0 &&
|
||||||
|
git am -3 rename.patch &&
|
||||||
|
! test -d .git/rebase-apply &&
|
||||||
|
git update-index --refresh &&
|
||||||
|
git diff --exit-code rename
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'am -3 can rename a file after falling back to 3-way merge' '
|
||||||
|
grep "^rename from" rename-add.patch &&
|
||||||
|
rm -fr .git/rebase-apply &&
|
||||||
|
git reset --hard &&
|
||||||
|
git checkout lorem^0 &&
|
||||||
|
git am -3 rename-add.patch &&
|
||||||
|
! test -d .git/rebase-apply &&
|
||||||
|
git update-index --refresh &&
|
||||||
|
git diff --exit-code rename
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success 'am -3 -q is quiet' '
|
test_expect_success 'am -3 -q is quiet' '
|
||||||
rm -fr .git/rebase-apply &&
|
rm -fr .git/rebase-apply &&
|
||||||
|
git checkout -f lorem2 &&
|
||||||
git reset master2 --hard &&
|
git reset master2 --hard &&
|
||||||
sed -n -e "3,\$p" msg >file &&
|
sed -n -e "3,\$p" msg >file &&
|
||||||
head -n 9 msg >>file &&
|
head -n 9 msg >>file &&
|
||||||
|
|
Loading…
Reference in New Issue