Skip to content

Commit c91c944

Browse files
newrengitster
authored andcommitted
rebase: define linearization ordering and enforce it
Ever since commit 3f21398 ("add tests for rebasing merged history", 2013-06-06), t3425 has had tests which included the rebasing of merged history and whose order of applied commits was checked. Unfortunately, the tests expected different behavior depending on which backend was in use. Implementing these checks was the following four lines (including the TODO message) which were repeated verbatim three times in t3425: #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 As part of the effort to reduce differences between the rebase backends so that users get more uniform behavior, let's define the correct behavior and modify the different backends so they all get the right answer. It turns out that the difference in behavior here is entirely due to topological sorting; since some backends require topological sorting (particularly when --rebase-merges is specified), require it for all modes. Modify the am and merge backends to implement this. Performance Considerations: I was unable to measure any appreciable performance difference with this change. Trying to control the run-to-run variation was difficult; I eventually found a headless beefy box that I could ssh into, which seemed to help. Using git.git, I ran the following testcase: $ git reset --hard v2.20.0-rc1~2 $ time git rebase --quiet v2.20.0-rc0~16 I first ran once to warm any disk caches, then ran five subsequent runs and recorded the times of those five. I observed the following results for the average time: Before this change: "real" timing: 1.340s (standard deviation: 0.040s) "user" timing: 1.050s (standard deviation: 0.041s) "sys" timing: 0.270s (standard deviation: 0.011s) After this change: "real" timing: 1.327s (standard deviation: 0.065s) "user" timing: 1.031s (standard deviation: 0.061s) "sys" timing: 0.280s (standard deviation: 0.014s) Measurements aside, I would expect the timing for walking revisions to be dwarfed by the work involved in creating and applying patches, so this isn't too surprising. Further, while somewhat counter-intuitive, it is possible that turning on topological sorting is actually a performance improvement: by way of comparison, turning on --topo-order made fast-export faster (see https://public-inbox.org/git/[email protected]/). Signed-off-by: Elijah Newren <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 7b76ac6 commit c91c944

File tree

3 files changed

+8
-11
lines changed

3 files changed

+8
-11
lines changed

git-rebase--am.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ rm -f "$GIT_DIR/rebased-patches"
3636

3737
git format-patch -k --stdout --full-index --cherry-pick --right-only \
3838
--src-prefix=a/ --dst-prefix=b/ --no-renames --no-cover-letter \
39-
--pretty=mboxrd \
39+
--pretty=mboxrd --topo-order \
4040
$git_format_patch_opt \
4141
"$revisions" ${restrict_revision+^$restrict_revision} \
4242
>"$GIT_DIR/rebased-patches"

git-rebase--merge.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ write_basic_state
143143
rm -f "$(git rev-parse --git-path REBASE_HEAD)"
144144

145145
msgnum=0
146-
for cmt in $(git rev-list --reverse --no-merges "$revisions")
146+
for cmt in $(git rev-list --topo-order --reverse --no-merges "$revisions")
147147
do
148148
msgnum=$(($msgnum + 1))
149149
echo "$cmt" > "$state_dir/cmt.$msgnum"

t/t3425-rebase-topology-merges.sh

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,8 @@ test_run_rebase () {
7070
test_linear_range "\'"$expected"\'" d..
7171
"
7272
}
73-
#TODO: make order consistent across all flavors of rebase
74-
test_run_rebase success 'e n o' ''
75-
test_run_rebase success 'e n o' -m
73+
test_run_rebase success 'n o e' ''
74+
test_run_rebase success 'n o e' -m
7675
test_run_rebase success 'n o e' -i
7776

7877
test_run_rebase () {
@@ -87,9 +86,8 @@ test_run_rebase () {
8786
test_linear_range "\'"$expected"\'" c..
8887
"
8988
}
90-
#TODO: make order consistent across all flavors of rebase
91-
test_run_rebase success 'd e n o' ''
92-
test_run_rebase success 'd e n o' -m
89+
test_run_rebase success 'd n o e' ''
90+
test_run_rebase success 'd n o e' -m
9391
test_run_rebase success 'd n o e' -i
9492

9593
test_run_rebase () {
@@ -104,9 +102,8 @@ test_run_rebase () {
104102
test_linear_range "\'"$expected"\'" c..
105103
"
106104
}
107-
#TODO: make order consistent across all flavors of rebase
108-
test_run_rebase success 'd e n o' ''
109-
test_run_rebase success 'd e n o' -m
105+
test_run_rebase success 'd n o e' ''
106+
test_run_rebase success 'd n o e' -m
110107
test_run_rebase success 'd n o e' -i
111108

112109
if ! test_have_prereq REBASE_P; then

0 commit comments

Comments
 (0)