From 03c4829347e26c844e589c61567a77a77c0658a9 Mon Sep 17 00:00:00 2001 From: Johannes Sixt Date: Mon, 15 Dec 2008 11:05:30 +0100 Subject: [PATCH 1/5] Show a failure of rebase -p if the merge had a conflict This extends t3409-rebase-preserve-merges by a case where the merge that is rebased has a conflict. Therefore, the rebase stops and expects that the user resolves the conflict. However, currently rebase --continue fails because .git/rebase-merge/author-script is missing. The test script had allocated two identical clones, but only one of them (clone2) was used. Now we use both as indicated in the comment. Also, two instances of && was missing in the setup part. Signed-off-by: Johannes Sixt Signed-off-by: Junio C Hamano --- t/t3409-rebase-preserve-merges.sh | 55 ++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/t/t3409-rebase-preserve-merges.sh b/t/t3409-rebase-preserve-merges.sh index 8cde40f8e8..5ddd1d1a93 100755 --- a/t/t3409-rebase-preserve-merges.sh +++ b/t/t3409-rebase-preserve-merges.sh @@ -11,15 +11,23 @@ Run "git rebase -p" and check that merges are properly carried along GIT_AUTHOR_EMAIL=bogus_email_address export GIT_AUTHOR_EMAIL -#echo 'Setting up: +# Clone 1 (trivial merge): # -#A1--A2 <-- origin/master -# \ \ -# B1--M <-- topic -# \ -# B2 <-- origin/topic +# A1--A2 <-- origin/master +# \ \ +# B1--M <-- topic +# \ +# B2 <-- origin/topic # -#' +# Clone 2 (conflicting merge): +# +# A1--A2--B3 <-- origin/master +# \ \ +# B1------M <-- topic +# \ +# B2 <-- origin/topic +# +# In both cases, 'topic' is rebased onto 'origin/topic'. test_expect_success 'setup for merge-preserving rebase' \ 'echo First > A && @@ -37,12 +45,19 @@ test_expect_success 'setup for merge-preserving rebase' \ cd clone1 && git checkout -b topic origin/topic && git merge origin/master && - cd .. + cd .. && - git clone ./. clone2 + echo Fifth > B && + git add B && + git commit -m "Add different B" && + + git clone ./. clone2 && cd clone2 && git checkout -b topic origin/topic && - git merge origin/master && + test_must_fail git merge origin/master && + echo Resolved > B && + git add B && + git commit -m "Merge origin/master into topic" && cd .. && git checkout topic && @@ -51,11 +66,29 @@ test_expect_success 'setup for merge-preserving rebase' \ ' test_expect_success 'rebase -p fakes interactive rebase' ' - cd clone2 && + ( + cd clone1 && git fetch && git rebase -p origin/topic && test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) && test 1 = $(git rev-list --all --pretty=oneline | grep "Merge commit" | wc -l) + ) +' + +test_expect_failure '--continue works after a conflict' ' + ( + cd clone2 && + git fetch && + test_must_fail git rebase -p origin/topic && + test 2 = $(git ls-files B | wc -l) && + echo Resolved again > B && + test_must_fail git rebase --continue && + git add B && + git rebase --continue && + test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) && + test 1 = $(git rev-list --all --pretty=oneline | grep "Add different" | wc -l) && + test 1 = $(git rev-list --all --pretty=oneline | grep "Merge origin" | wc -l) + ) ' test_done From f5b49ea6191c2d631d1d70305b25d5db3bf05c92 Mon Sep 17 00:00:00 2001 From: Johannes Sixt Date: Mon, 15 Dec 2008 11:05:31 +0100 Subject: [PATCH 2/5] rebase -i -p: Fix --continue after a merge could not be redone When a merge that has a conflict was rebased, then rebase stopped to let the user resolve the conflicts. However, thereafter --continue failed because the author-script was not saved. (This is rebase -i's way to preserve a commit's authorship.) This fixes it by doing taking the same failure route after a merge that is also taken after a normal cherry-pick. Signed-off-by: Johannes Sixt Signed-off-by: Junio C Hamano --- git-rebase--interactive.sh | 3 +-- t/t3409-rebase-preserve-merges.sh | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 1172e47571..89c39ebc9d 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -256,9 +256,8 @@ pick_one_preserving_merges () { output git merge $STRATEGY -m "$msg" \ $new_parents then - git rerere printf "%s\n" "$msg" > "$GIT_DIR"/MERGE_MSG - die Error redoing merge $sha1 + die_with_patch $sha1 "Error redoing merge $sha1" fi ;; *) diff --git a/t/t3409-rebase-preserve-merges.sh b/t/t3409-rebase-preserve-merges.sh index 5ddd1d1a93..820e0105d2 100755 --- a/t/t3409-rebase-preserve-merges.sh +++ b/t/t3409-rebase-preserve-merges.sh @@ -75,7 +75,7 @@ test_expect_success 'rebase -p fakes interactive rebase' ' ) ' -test_expect_failure '--continue works after a conflict' ' +test_expect_success '--continue works after a conflict' ' ( cd clone2 && git fetch && From c66c0cbc7e55409ac934b7c6e89aa7aafa74ede4 Mon Sep 17 00:00:00 2001 From: Miklos Vajna Date: Tue, 23 Dec 2008 02:09:24 +0100 Subject: [PATCH 3/5] t9129: skip the last three tests if UTF-8 locale is not available Signed-off-by: Miklos Vajna Signed-off-by: Junio C Hamano --- t/t9129-git-svn-i18n-commitencoding.sh | 30 +++++++++++++++----------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/t/t9129-git-svn-i18n-commitencoding.sh b/t/t9129-git-svn-i18n-commitencoding.sh index 938b7fe4b4..8a9dde44d5 100755 --- a/t/t9129-git-svn-i18n-commitencoding.sh +++ b/t/t9129-git-svn-i18n-commitencoding.sh @@ -60,21 +60,25 @@ do ' done -test_expect_success 'ISO-8859-1 should match UTF-8 in svn' ' -( - cd ISO-8859-1 && - compare_svn_head_with "$TEST_DIRECTORY"/t3900/1-UTF-8.txt -) -' - -for H in EUCJP ISO-2022-JP -do - test_expect_success '$H should match UTF-8 in svn' ' +if locale -a |grep -q en_US.utf8; then + test_expect_success 'ISO-8859-1 should match UTF-8 in svn' ' ( - cd $H && - compare_svn_head_with "$TEST_DIRECTORY"/t3900/2-UTF-8.txt + cd ISO-8859-1 && + compare_svn_head_with "$TEST_DIRECTORY"/t3900/1-UTF-8.txt ) ' -done + + for H in EUCJP ISO-2022-JP + do + test_expect_success '$H should match UTF-8 in svn' ' + ( + cd $H && + compare_svn_head_with "$TEST_DIRECTORY"/t3900/2-UTF-8.txt + ) + ' + done +else + say "UTF-8 locale not available, test skipped" +fi test_done From 4fb1a19d502f4a2ca47bfb75cce605f3447819e6 Mon Sep 17 00:00:00 2001 From: Johannes Schindelin Date: Mon, 22 Dec 2008 22:16:51 +0100 Subject: [PATCH 4/5] rebase -i -p: leave a --cc patch when a merge could not be redone The result is easier to review this way, and the merge resolution has to be done inside the work tree, not by adjusting "the patch" anyway. --- git-rebase--interactive.sh | 15 ++++++++++++--- t/t3409-rebase-preserve-merges.sh | 1 + 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/git-rebase--interactive.sh b/git-rebase--interactive.sh index 89c39ebc9d..c8b0861c08 100755 --- a/git-rebase--interactive.sh +++ b/git-rebase--interactive.sh @@ -115,9 +115,18 @@ mark_action_done () { } make_patch () { - parent_sha1=$(git rev-parse --verify "$1"^) || - die "Cannot get patch for $1^" - git diff-tree -p "$parent_sha1".."$1" > "$DOTEST"/patch + sha1_and_parents="$(git rev-list --parents -1 "$1")" + case "$sha1_and_parents" in + ?*' '?*' '?*) + git diff --cc $sha1_and_parents + ;; + ?*' '?*) + git diff-tree -p "$1^!" + ;; + *) + echo "Root commit" + ;; + esac > "$DOTEST"/patch test -f "$DOTEST"/message || git cat-file commit "$1" | sed "1,/^$/d" > "$DOTEST"/message test -f "$DOTEST"/author-script || diff --git a/t/t3409-rebase-preserve-merges.sh b/t/t3409-rebase-preserve-merges.sh index 820e0105d2..e6c832780f 100755 --- a/t/t3409-rebase-preserve-merges.sh +++ b/t/t3409-rebase-preserve-merges.sh @@ -83,6 +83,7 @@ test_expect_success '--continue works after a conflict' ' test 2 = $(git ls-files B | wc -l) && echo Resolved again > B && test_must_fail git rebase --continue && + grep "^@@@ " .git/rebase-merge/patch && git add B && git rebase --continue && test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) && From 8104ebfe8276657ee803cca7eb8665a78cf3ef83 Mon Sep 17 00:00:00 2001 From: Junio C Hamano Date: Wed, 24 Dec 2008 19:41:08 -0800 Subject: [PATCH 5/5] GIT 1.6.1 Signed-off-by: Junio C Hamano --- Documentation/RelNotes-1.6.1.txt | 4 ++++ Documentation/git.txt | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/Documentation/RelNotes-1.6.1.txt b/Documentation/RelNotes-1.6.1.txt index 002d9ec681..adb7ccab0a 100644 --- a/Documentation/RelNotes-1.6.1.txt +++ b/Documentation/RelNotes-1.6.1.txt @@ -255,6 +255,10 @@ release, unless otherwise noted. when acquiring a lock from the server (this may need to be backported to older releases later). +* After "git rebase -p" stopped with conflicts while replaying a merge, + "git rebase --continue" did not work (may need to be backported to older + releases). + * "git revert" records relative to which parent a revert was made when reverting a merge. Together with new documentation that explains issues around reverting a merge and merging from the updated branch later, this diff --git a/Documentation/git.txt b/Documentation/git.txt index 2c0c23003f..17dc8b2019 100644 --- a/Documentation/git.txt +++ b/Documentation/git.txt @@ -43,6 +43,11 @@ unreleased) version of git, that is available from 'master' branch of the `git.git` repository. Documentation for older releases are available here: +* link:v1.6.1/git.html[documentation for release 1.6.1] + +* release notes for + link:RelNotes-1.6.1.txt[1.6.1]. + * link:v1.6.0.6/git.html[documentation for release 1.6.0.6] * release notes for