Martin von Zweigbergk <martinvonz@xxxxxxxxx> writes: > Helped-by: Johannes Sixt <j6t@xxxxxxxx> > --- > t/lib-rebase.sh | 15 ++++++++ > t/t3421-rebase-topology-linear.sh | 78 +++++++++++++++++++++++++++++++++++++++ > 2 files changed, 93 insertions(+) > create mode 100755 t/t3421-rebase-topology-linear.sh > > diff --git a/t/lib-rebase.sh b/t/lib-rebase.sh > index 6ccf797..62b3887 100644 > --- a/t/lib-rebase.sh > +++ b/t/lib-rebase.sh > @@ -65,3 +65,18 @@ EOF > test_set_editor "$(pwd)/fake-editor.sh" > chmod a+x fake-editor.sh > } > + > +# checks that the revisions in "$2" represent a linear range with the > +# subjects in "$1" > +test_linear_range () { > + ! { git log --format=%p "$2" | sane_grep " " ;} && An interesting way to spell: test $(git rev-list --merges "$2" | wc -l) = 0 I think I am fine with either, though. > + expected=$1 > + set -- $(git log --reverse --format=%s "$2") > + test "$expected" = "$*" OK. > +} > + > +reset_rebase () { > + git rebase --abort # may fail; ignore exit code test_might_fail to catch unusual exit codes? > + git reset --hard && > + git clean -f > +} > diff --git a/t/t3421-rebase-topology-linear.sh b/t/t3421-rebase-topology-linear.sh > new file mode 100755 > index 0000000..c4b32db > --- /dev/null > +++ b/t/t3421-rebase-topology-linear.sh > @@ -0,0 +1,78 @@ > +#!/bin/sh > + > +test_description='basic rebase topology tests' > +. ./test-lib.sh > +. "$TEST_DIRECTORY"/lib-rebase.sh > + > +# a---b---c > +# \ > +# d---e > +test_expect_success 'setup' ' > + test_commit a && > + test_commit b && > + test_commit c && > + git checkout b && > + test_commit d && > + test_commit e > +' > + > +test_run_rebase () { > + result=$1 > + shift > + test_expect_$result "simple rebase $*" " > + reset_rebase && > + git rebase $* c e && > + test_cmp_rev c HEAD~2 && > + test_linear_range 'd e' c.. > + " > +} > +test_run_rebase success '' > +test_run_rebase success -m > +test_run_rebase success -i > +test_run_rebase success -p > + > +test_run_rebase () { > + result=$1 > + shift > + test_expect_$result "rebase $* is no-op if upstream is an ancestor" " > + reset_rebase && > + git rebase $* b e && > + test_cmp_rev e HEAD > + " > +} > +test_run_rebase success '' > +test_run_rebase success -m > +test_run_rebase success -i > +test_run_rebase success -p > + > +test_run_rebase () { > + result=$1 > + shift > + test_expect_$result "rebase $* -f rewrites even if upstream is an ancestor" " > + reset_rebase && > + git rebase $* -f b e && Asking to rebase the history leading to e from b on top of the merge base (which happens to be b) may be no-op or force-create a new history that is parallel. OK. > + ! test_cmp_rev e HEAD && > + test_cmp_rev b HEAD~2 && > + test_linear_range 'd e' b.. > + " > +} > +test_run_rebase success '' > +test_run_rebase success -m > +test_run_rebase success -i > +test_run_rebase failure -p > + > +test_run_rebase () { > + result=$1 > + shift > + test_expect_$result "rebase $* fast-forwards if an ancestor of upstream" " The description is a non-sentence, and while I can tell what it wants to say, I do not have a good suggestion for rephrasing this. This is asking to rebase the history leading to b on top of e, but e already includes everything in b, so it just turns into a no-op of not moving from e. So it is not even a fast-forward. > + reset_rebase && > + git rebase $* e b && > + test_cmp_rev e HEAD > + " > +} > +test_run_rebase success '' > +test_run_rebase success -m > +test_run_rebase success -i > +test_run_rebase success -p > + > +test_done -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html