git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v4 42/45] add tests for rebasing merged history

From
Felipe Contreras <felipe.contreras@gmail.com>
Date
Jun 9, 2013, 16:40 UTC
Message-ID
<1370796057-25312-43-git-send-email-felipe.contreras@gmail.com>
In-Reply-To
<1370796057-25312-1-git-send-email-felipe.contreras@gmail.com>
From: Martin von Zweigbergk <martinvonz@gmail.com>
Signed-off-by: Martin von Zweigbergk <martinvonz@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
---
 t/t3400-rebase.sh                 |  31 +----
 t/t3401-rebase-partial.sh         |  45 -------
 t/t3404-rebase-interactive.sh     |  10 +-
 t/t3409-rebase-preserve-merges.sh |  53 --------
 t/t3425-rebase-topology-merges.sh | 258 ++++++++++++++++++++++++++++++++++++++
 5 files changed, 260 insertions(+), 137 deletions(-)
 delete mode 100755 t/t3401-rebase-partial.sh
 create mode 100755 t/t3425-rebase-topology-merges.sh
diff --git a/t/t3400-rebase.sh b/t/t3400-rebase.sh
index b58fa1a..b436ef4 100755
--- a/t/t3400-rebase.sh
+++ b/t/t3400-rebase.sh
@@ -40,13 +40,6 @@ test_expect_success 'prepare repository with topic branches' '
 	echo Side >>C &&
 	git add C &&
 	git commit -m "Add C" &&
-	git checkout -b nonlinear my-topic-branch &&
-	echo Edit >>B &&
-	git add B &&
-	git commit -m "Modify B" &&
-	git merge side &&
-	git checkout -b upstream-merged-nonlinear &&
-	git merge master &&
 	git checkout -f my-topic-branch &&
 	git tag topic
 '
@@ -106,31 +99,9 @@ test_expect_success 'rebase from ambiguous branch name' '
 	git rebase master
 '
 
-test_expect_success 'rebase after merge master' '
-	git checkout --detach refs/tags/topic &&
-	git branch -D topic &&
-	git reset --hard topic &&
-	git merge master &&
-	git rebase master &&
-	! (git show | grep "^Merge:")
-'
-
-test_expect_success 'rebase of history with merges is linearized' '
-	git checkout nonlinear &&
-	test 4 = $(git rev-list master.. | wc -l) &&
-	git rebase master &&
-	test 3 = $(git rev-list master.. | wc -l)
-'
-
-test_expect_success 'rebase of history with merges after upstream merge is linearized' '
-	git checkout upstream-merged-nonlinear &&
-	test 5 = $(git rev-list master.. | wc -l) &&
-	git rebase master &&
-	test 3 = $(git rev-list master.. | wc -l)
-'
-
 test_expect_success 'rebase a single mode change' '
 	git checkout master &&
+	git branch -D topic &&
 	echo 1 >X &&
 	git add X &&
 	test_tick &&
diff --git a/t/t3401-rebase-partial.sh b/t/t3401-rebase-partial.sh
deleted file mode 100755
index 7ba1797..0000000
--- a/t/t3401-rebase-partial.sh
+++ /dev/null
@@ -1,45 +0,0 @@
-#!/bin/sh
-#
-# Copyright (c) 2006 Yann Dirson, based on t3400 by Amos Waterland
-#
-
-test_description='git rebase should detect patches integrated upstream
-
-This test cherry-picks one local change of two into master branch, and
-checks that git rebase succeeds with only the second patch in the
-local branch.
-'
-. ./test-lib.sh
-
-test_expect_success 'prepare repository with topic branch' '
-	test_commit A &&
-	git checkout -b my-topic-branch &&
-	test_commit B &&
-	test_commit C &&
-	git checkout -f master &&
-	test_commit A2 A.t
-'
-
-test_expect_success 'pick top patch from topic branch into master' '
-	git cherry-pick C &&
-	git checkout -f my-topic-branch
-'
-
-test_debug '
-	git cherry master &&
-	git format-patch -k --stdout --full-index master >/dev/null &&
-	gitk --all & sleep 1
-'
-
-test_expect_success 'rebase topic branch against new master and check git am did not get halted' '
-	git rebase master &&
-	test_path_is_missing .git/rebase-apply
-'
-
-test_expect_success 'rebase --merge topic branch that was partially merged upstream' '
-	git reset --hard C &&
-	git rebase --merge master &&
-	test_path_is_missing .git/rebase-merge
-'
-
-test_done
diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh
index 79e8d3c..0d3c573 100755
--- a/t/t3404-rebase-interactive.sh
+++ b/t/t3404-rebase-interactive.sh
@@ -477,19 +477,11 @@ test_expect_success 'interrupted squash works as expected (case 2)' '
 	test $one = $(git rev-parse HEAD~2)
 '
 
-test_expect_success 'ignore patch if in upstream' '
-	HEAD=$(git rev-parse HEAD) &&
-	git checkout -b has-cherry-picked HEAD^ &&
+test_expect_success '--continue tries to commit, even for "edit"' '
 	echo unrelated > file7 &&
 	git add file7 &&
 	test_tick &&
 	git commit -m "unrelated change" &&
-	git cherry-pick $HEAD &&
-	EXPECT_COUNT=1 git rebase -i $HEAD &&
-	test $HEAD = $(git rev-parse HEAD^)
-'
-
-test_expect_success '--continue tries to commit, even for "edit"' '
 	parent=$(git rev-parse HEAD^) &&
 	test_tick &&
 	FAKE_LINES="edit 1" git rebase -i HEAD^ &&
diff --git a/t/t3409-rebase-preserve-merges.sh b/t/t3409-rebase-preserve-merges.sh
index 6de4e22..2e0c364 100755
--- a/t/t3409-rebase-preserve-merges.sh
+++ b/t/t3409-rebase-preserve-merges.sh
@@ -11,14 +11,6 @@ Run "git rebase -p" and check that merges are properly carried along
 GIT_AUTHOR_EMAIL=bogus_email_address
 export GIT_AUTHOR_EMAIL
 
-# Clone 1 (trivial merge):
-#
-# A1--A2  <-- origin/master
-#  \   \
-#   B1--M  <-- topic
-#    \
-#     B2  <-- origin/topic
-#
 # Clone 2 (conflicting merge):
 #
 # A1--A2--B3   <-- origin/master
@@ -36,16 +28,6 @@ export GIT_AUTHOR_EMAIL
 #     \--A3    <-- topic2
 #      \
 #       B2     <-- origin/topic
-#
-# Clone 4 (merge using second parent as base):
-#
-# A1--A2--B3   <-- origin/master
-#  \
-#   B1--A3--M  <-- topic
-#    \     /
-#     \--A4    <-- topic2
-#      \
-#       B2     <-- origin/topic
 
 test_expect_success 'setup for merge-preserving rebase' \
 	'echo First > A &&
@@ -58,20 +40,6 @@ test_expect_success 'setup for merge-preserving rebase' \
 	git checkout -f master &&
 	echo Third >> A &&
 	git commit -a -m "Modify A2" &&
-
-	git clone ./. clone1 &&
-	(cd clone1 &&
-	git checkout -b topic origin/topic &&
-	git merge origin/master
-	) &&
-
-	git clone ./. clone4 &&
-	(
-		cd clone4 &&
-		git checkout -b topic origin/topic &&
-		git merge origin/master
-	) &&
-
 	echo Fifth > B &&
 	git add B &&
 	git commit -m "Add different B" &&
@@ -101,16 +69,6 @@ test_expect_success 'setup for merge-preserving rebase' \
 	git commit -a -m "Modify B2"
 '
 
-test_expect_success 'rebase -p fakes interactive rebase' '
-	(
-	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 remote-tracking branch " | wc -l)
-	)
-'
-
 test_expect_success '--continue works after a conflict' '
 	(
 	cd clone2 &&
@@ -138,15 +96,4 @@ test_expect_success 'rebase -p preserves no-ff merges' '
 	)
 '
 
-test_expect_success 'rebase -p works when base inside second parent' '
-	(
-	cd clone4 &&
-	git fetch &&
-	git rebase -p HEAD^2 &&
-	test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) &&
-	test 1 = $(git rev-list --all --pretty=oneline | grep "Modify B" | wc -l) &&
-	test 1 = $(git rev-list --all --pretty=oneline | grep "Merge remote-tracking branch " | wc -l)
-	)
-'
-
 test_done
diff --git a/t/t3425-rebase-topology-merges.sh b/t/t3425-rebase-topology-merges.sh
new file mode 100755
index 0000000..5400a05
--- /dev/null
+++ b/t/t3425-rebase-topology-merges.sh
@@ -0,0 +1,258 @@
+#!/bin/sh
+
+test_description='rebase topology tests with merges'
+. ./test-lib.sh
+. "$TEST_DIRECTORY"/lib-rebase.sh
+
+test_revision_subjects () {
+	expected="$1"
+	shift
+	set -- $(git log --format=%s --no-walk=unsorted "$@")
+	test "$expected" = "$*"
+}
+
+# a---b-----------c
+#      \           \
+#       d-------e   \
+#        \       \   \
+#         n---o---w---v
+#              \
+#               z
+test_expect_success 'setup of non-linear-history' '
+	test_commit a &&
+	test_commit b &&
+	test_commit c &&
+	git checkout b &&
+	test_commit d &&
+	test_commit e
+
+	git checkout c &&
+	test_commit g &&
+	revert h g &&
+	git checkout d &&
+	cherry_pick G g &&
+	test_commit i &&
+	git checkout b &&
+	test_commit f
+
+	git checkout d &&
+	test_commit n &&
+	test_commit o &&
+	test_merge w e &&
+	test_merge v c &&
+	git checkout o &&
+	test_commit z
+'
+
+test_run_rebase () {
+	result=$1
+	shift
+	test_expect_$result "rebase $* after merge from upstream" "
+		reset_rebase &&
+		git rebase $* e w &&
+		test_cmp_rev e HEAD~2 &&
+		test_linear_range 'n o' e..
+	"
+}
+test_run_rebase success ''
+test_run_rebase success -m
+test_run_rebase success -i
+
+test_run_rebase () {
+	result=$1
+	shift
+	expected=$1
+	shift
+	test_expect_$result "rebase $* of non-linear history is linearized in place" "
+		reset_rebase &&
+		git rebase $* d w &&
+		test_cmp_rev d HEAD~3 &&
+		test_linear_range "\'"$expected"\'" d..
+	"
+}
+#TODO: make order consistent across all flavors of rebase
+test_run_rebase success 'e n o' ''
+test_run_rebase success 'e n o' -m
+test_run_rebase success 'n o e' -i
+
+test_run_rebase () {
+	result=$1
+	shift
+	expected=$1
+	shift
+	test_expect_$result "rebase $* of non-linear history is linearized upstream" "
+		reset_rebase &&
+		git rebase $* c w &&
+		test_cmp_rev c HEAD~4 &&
+		test_linear_range "\'"$expected"\'" c..
+	"
+}
+#TODO: make order consistent across all flavors of rebase
+test_run_rebase success 'd e n o' ''
+test_run_rebase success 'd e n o' -m
+test_run_rebase success 'd n o e' -i
+
+test_run_rebase () {
+	result=$1
+	shift
+	expected=$1
+	shift
+	test_expect_$result "rebase $* of non-linear history with merges after upstream merge is linearized" "
+		reset_rebase &&
+		git rebase $* c v &&
+		test_cmp_rev c HEAD~4 &&
+		test_linear_range "\'"$expected"\'" c..
+	"
+}
+#TODO: make order consistent across all flavors of rebase
+test_run_rebase success 'd e n o' ''
+test_run_rebase success 'd e n o' -m
+test_run_rebase success 'd n o e' -i
+
+test_expect_success "rebase -p is no-op in non-linear history" "
+	reset_rebase &&
+	git rebase -p d w &&
+	test_cmp_rev w HEAD
+"
+
+test_expect_success "rebase -p is no-op when base inside second parent" "
+	reset_rebase &&
+	git rebase -p e w &&
+	test_cmp_rev w HEAD
+"
+
+test_expect_failure "rebase -p --root on non-linear history is a no-op" "
+	reset_rebase &&
+	git rebase -p --root w &&
+	test_cmp_rev w HEAD
+"
+
+test_expect_success "rebase -p re-creates merge from side branch" "
+	reset_rebase &&
+	git rebase -p z w &&
+	test_cmp_rev z HEAD^ &&
+	test_cmp_rev w^2 HEAD^2
+"
+
+test_expect_success "rebase -p re-creates internal merge" "
+	reset_rebase &&
+	git rebase -p c w &&
+	test_cmp_rev c HEAD~4 &&
+	test_cmp_rev HEAD^2^ HEAD~3 &&
+	test_revision_subjects 'd n e o w' HEAD~3 HEAD~2 HEAD^2 HEAD^ HEAD
+"
+
+test_expect_success "rebase -p can re-create two branches on onto" "
+	reset_rebase &&
+	git rebase -p --onto c d w &&
+	test_cmp_rev c HEAD~3 &&
+	test_cmp_rev c HEAD^2^ &&
+	test_revision_subjects 'n e o w' HEAD~2 HEAD^2 HEAD^ HEAD
+"
+
+#       f
+#      /
+# a---b---c---g---h
+#      \
+#       d---G---i
+#        \       \
+#         e-------u
+#
+# uppercase = cherry-picked
+# h = reverted g
+test_expect_success 'setup of non-linear-history for patch-equivalence tests' '
+	git checkout e &&
+	test_merge u i
+'
+
+test_expect_success "rebase -p re-creates history around dropped commit matching upstream" "
+	reset_rebase &&
+	git rebase -p h u &&
+	test_cmp_rev h HEAD~3 &&
+	test_cmp_rev HEAD^2^ HEAD~2 &&
+	test_revision_subjects 'd i e u' HEAD~2 HEAD^2 HEAD^ HEAD
+"
+
+test_expect_success "rebase -p --onto in merged history drops patches in upstream" "
+	reset_rebase &&
+	git rebase -p --onto f h u &&
+	test_cmp_rev f HEAD~3 &&
+	test_cmp_rev HEAD^2^ HEAD~2 &&
+	test_revision_subjects 'd i e u' HEAD~2 HEAD^2 HEAD^ HEAD
+"
+
+test_expect_success "rebase -p --onto in merged history does not drop patches in onto" "
+	reset_rebase &&
+	git rebase -p --onto h f u &&
+	test_cmp_rev h HEAD~3 &&
+	test_cmp_rev HEAD^2~2 HEAD~2 &&
+	test_revision_subjects 'd G i e u' HEAD~2 HEAD^2^ HEAD^2 HEAD^ HEAD
+"
+
+# a---b---c---g---h
+#      \
+#       d---G---s
+#        \   \ /
+#         \   X
+#          \ / \
+#           e---t
+#
+# uppercase = cherry-picked
+# h = reverted g
+test_expect_success 'setup of non-linear-history for dropping whole side' '
+	git checkout G &&
+	test_merge s e &&
+	git checkout e &&
+	test_merge t G
+'
+
+test_expect_failure "rebase -p drops merge commit when entire first-parent side is dropped" "
+	reset_rebase &&
+	git rebase -p h s &&
+	test_cmp_rev h HEAD~2 &&
+	test_linear_range 'd e' h..
+"
+
+test_expect_success "rebase -p drops merge commit when entire second-parent side is dropped" "
+	reset_rebase &&
+	git rebase -p h t &&
+	test_cmp_rev h HEAD~2 &&
+	test_linear_range 'd e' h..
+"
+
+# a---b---c
+#      \
+#       d---e
+#        \   \
+#         n---r
+#          \
+#           o
+#
+# r = tree-same with n
+test_expect_success 'setup of non-linear-history for empty commits' '
+	git checkout n &&
+	git merge --no-commit e &&
+	git reset n . &&
+	git commit -m r &&
+	git reset --hard &&
+	git clean -f &&
+	git tag r
+'
+
+test_expect_success "rebase -p re-creates empty internal merge commit" "
+	reset_rebase &&
+	git rebase -p c r &&
+	test_cmp_rev c HEAD~3 &&
+	test_cmp_rev HEAD^2^ HEAD~2 &&
+	test_revision_subjects 'd e n r' HEAD~2 HEAD^2 HEAD^ HEAD
+"
+
+test_expect_success "rebase -p re-creates empty merge commit" "
+	reset_rebase &&
+	git rebase -p o r &&
+	test_cmp_rev e HEAD^2 &&
+	test_cmp_rev o HEAD^ &&
+	test_revision_subjects 'r' HEAD
+"
+
+test_done
-- 
1.8.3.698.g079b096
Previous: Felipe ContrerasNext: Thomas Rast
Message 77 of 86 in “Massive improvents to rebase and cherry-pick”
  1. 00/45 Massive improvents to rebase and cherry-pickFelipe Contreras, Jun 9, 2013
  2. 01/45 build: generate and clean test scriptsFelipe Contreras, Jun 9, 2013
  3. 02/45 build: do not install git-remote-testgitFelipe Contreras, Jun 9, 2013
  4. 03/45 build: trivial cleanupFelipe Contreras, Jun 9, 2013
  5. SZEDER GáborJun 9, 2013
  6. 04/45 build: add builtin libFelipe Contreras, Jun 9, 2013
  7. 05/45 log-tree: remove dependency from sequencerFelipe Contreras, Jun 9, 2013
  8. 06/45 Move sequencer to builtinFelipe Contreras, Jun 9, 2013
  9. Antoine PelisseJun 9, 2013
  10. Felipe ContrerasJun 9, 2013
  11. Ramkumar RamachandraJun 9, 2013
  12. Antoine PelisseJun 9, 2013
  13. 07/45 unpack-trees: plug a memory leakFelipe Contreras, Jun 9, 2013
  14. 08/45 read-cache: plug a few leaksFelipe Contreras, Jun 9, 2013
  15. 09/45 sequencer: remove useless indentationFelipe Contreras, Jun 9, 2013
  16. Fredrik GustafssonJun 9, 2013
  17. Felipe ContrerasJun 9, 2013
  18. Fredrik GustafssonJun 9, 2013
  19. Felipe ContrerasJun 9, 2013
  20. Fredrik GustafssonJun 9, 2013
  21. 10/45 sequencer: trivial fixFelipe Contreras, Jun 9, 2013
  22. SZEDER GáborJun 9, 2013
  23. Felipe ContrerasJun 9, 2013
  24. SZEDER GáborJun 9, 2013
  25. John KeepingJun 9, 2013
  26. Felipe ContrerasJun 9, 2013
  27. John KeepingJun 9, 2013
  28. Felipe ContrerasJun 9, 2013
  29. SZEDER GáborJun 9, 2013
  30. Felipe ContrerasJun 9, 2013
  31. SZEDER GáborJun 9, 2013
  32. Felipe ContrerasJun 9, 2013
  33. Philip OakleyJun 9, 2013
  34. 11/45 cherry-pick: don't barf when there's nothing to doFelipe Contreras, Jun 9, 2013
  35. Fredrik GustafssonJun 9, 2013
  36. Felipe ContrerasJun 9, 2013
  37. 12/45 cherry-pick: add --skip-empty optionFelipe Contreras, Jun 9, 2013
  38. 13/45 revert/cherry-pick: add --quiet optionFelipe Contreras, Jun 9, 2013
  39. 14/45 revert/cherry-pick: add --skip optionFelipe Contreras, Jun 9, 2013
  40. 15/45 builtin: add rewrite helperFelipe Contreras, Jun 9, 2013
  41. 16/45 cherry-pick: store rewritten commitsFelipe Contreras, Jun 9, 2013
  42. 17/45 cherry-pick: don't store skipped commitFelipe Contreras, Jun 9, 2013
  43. 18/45 builtin: move run_rewrite_hook() to rewrite.cFelipe Contreras, Jun 9, 2013
  44. 19/45 builtin: add copy_rewrite_notes()Felipe Contreras, Jun 9, 2013
  45. 20/45 cherry-pick: copy notes and run hooksFelipe Contreras, Jun 9, 2013
  46. Thomas RastJun 9, 2013
  47. Felipe ContrerasJun 9, 2013
  48. 21/45 cherry-pick: add --action-name optionFelipe Contreras, Jun 9, 2013
  49. 22/45 cherry-pick: remember rerere-autoupdateFelipe Contreras, Jun 9, 2013
  50. 23/45 rebase: split the cherry-pick stuffFelipe Contreras, Jun 9, 2013
  51. 24/45 rebase: cherry-pick: fix mode storageFelipe Contreras, Jun 9, 2013
  52. 25/45 rebase: cherry-pick: fix sequence continuationFelipe Contreras, Jun 9, 2013
  53. 26/45 rebase: cherry-pick: fix abort of cherry modeFelipe Contreras, Jun 9, 2013
  54. 27/45 rebase: cherry-pick: fix command invocationsFelipe Contreras, Jun 9, 2013
  55. 28/45 rebase: cherry-pick: fix status messagesFelipe Contreras, Jun 9, 2013
  56. 29/45 rebase: cherry-pick: automatically commit stageFelipe Contreras, Jun 9, 2013
  57. 30/45 rebase: cherry-pick: set correct action-nameFelipe Contreras, Jun 9, 2013
  58. 31/45 rebase: trivial cleanupFelipe Contreras, Jun 9, 2013
  59. Fredrik GustafssonJun 9, 2013
  60. Junio C HamanoJun 11, 2013
  61. Fredrik GustafssonJun 11, 2013
  62. Felipe ContrerasJun 11, 2013
  63. Fredrik GustafssonJun 11, 2013
  64. Felipe ContrerasJun 11, 2013
  65. Fredrik GustafssonJun 11, 2013
  66. Felipe ContrerasJun 11, 2013
  67. 32/45 rebase: use 'cherrypick' mode instead of 'am'Felipe Contreras, Jun 9, 2013
  68. 33/45 rebase: cherry-pick: fix for shell promptFelipe Contreras, Jun 9, 2013
  69. 34/45 rebase: cherry-pick: add merge optionsFelipe Contreras, Jun 9, 2013
  70. 35/45 rebase: remove merge modeFelipe Contreras, Jun 9, 2013
  71. 36/45 rebase: cherry-pick: add copyrightFelipe Contreras, Jun 9, 2013
  72. 37/45 tests: fix autostashFelipe Contreras, Jun 9, 2013
  73. 38/45 add simple tests of consistency across rebase typesFelipe Contreras, Jun 9, 2013
  74. 39/45 add tests for rebasing with patch-equivalence presentFelipe Contreras, Jun 9, 2013
  75. 40/45 add tests for rebasing of empty commitsFelipe Contreras, Jun 9, 2013
  76. 41/45 add tests for rebasing rootFelipe Contreras, Jun 9, 2013
  77. 42/45 add tests for rebasing merged historyFelipe Contreras, Jun 9, 2013
  78. Thomas RastJun 9, 2013
  79. Felipe ContrerasJun 9, 2013
  80. Thomas RastJun 9, 2013
  81. Felipe ContrerasJun 9, 2013
  82. 43/45 t3406: modernize styleFelipe Contreras, Jun 9, 2013
  83. 44/45 tests: move test for rebase messages from t3400 to t3406Felipe Contreras, Jun 9, 2013
  84. 45/45 tests: update topology testsFelipe Contreras, Jun 9, 2013
  85. Martin von ZweigbergkJun 11, 2013
  86. Felipe ContrerasJun 11, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.