Kevin Bracey <kevin@xxxxxxxxx> writes: > Some side branching and odd merging to illustrate various flaws in > revision list scans, particularly when limiting the list. > > Many expected failures, which will be gone by the end of the "history > traversal refinements" series. > > Signed-off-by: Kevin Bracey <kevin@xxxxxxxxx> > --- > t/t6111-rev-list-treesame.sh | 180 +++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 180 insertions(+) > create mode 100755 t/t6111-rev-list-treesame.sh > > diff --git a/t/t6111-rev-list-treesame.sh b/t/t6111-rev-list-treesame.sh > new file mode 100755 > index 0000000..602c02d > --- /dev/null > +++ b/t/t6111-rev-list-treesame.sh > @@ -0,0 +1,180 @@ > +#!/bin/sh > +# > +# ,---E--. *H----------. * marks !TREESAME parent paths > +# / \ / \* > +# *A--*B---D--*F-*G---------K-*L-*M > +# \ /* \ / > +# `-C-' `-*I-*J > +# > +# A creates "file", B and F change it. > +# Odd merge G takes the old version from B. > +# I changes it, but J reverts it. > +# H and L both change it, and M merges those changes. ... and because J is a revert of I, K ends up merging the same and being the same with both G and J. > +test_description='TREESAME and limiting' > + > +. ./test-lib.sh > + > +note () { > + git tag "$1" > +} > + > +unnote () { > + git name-rev --tags --stdin | sed -e "s|$_x40 (tags/\([^)]*\)) |\1 |g" > +} > + > +test_expect_success setup ' > + test_commit "Initial file" file "Hi there" A && > + git branch other-branch && > + > + test_commit "file=Hello" file "Hello" B && > + git branch third-branch && > + > + git checkout other-branch && > + test_commit "Added other" other "Hello" C && > + > + git checkout master && > + test_merge D other-branch && > + > + git checkout third-branch && > + test_commit "Third file" third "Nothing" E && > + > + git checkout master && > + test_commit "file=Blah" file "Blah" F && > + > + test_tick && git merge --no-commit third-branch && > + git checkout third-branch file && > + git commit && > + note G && > + git branch fiddler-branch && > + > + git checkout -b part2-branch && > + test_commit "file=Part 2" file "Part 2" H && > + > + git checkout fiddler-branch && > + test_commit "Bad commit" file "Silly" I && > + > + test_tick && git revert I && note J && > + > + git checkout master && > + test_tick && git merge --no-ff fiddler-branch && > + note K > + > + test_commit "file=Part 1" file "Part 1" L && > + > + test_tick && test_must_fail git merge part2-branch && > + test_commit M file "Parts 1+2" > +' > + > +FMT='tformat:%P %H | %s' > + > +# could we soup this up to optionally check parents? So "(BA)C" would check > +# that C is shown and has parents B A. Sounds like a good thing to do, especially given that some of the earlier issues you brought up triggered only when --parents is not used, so... Perhaps something like the attached. > +check_outcome () { > + outcome=$1 > + shift > + for c in $1 > + do > + echo "$c" > + done >expect && Maybe printf "%s\n" $1 >expect is more fashionable these days? > +# Odd merge G drops a change in F. Important that G is listed in all > +# except the most basic list. Achieving this means normal merge D will also be > +# shown in normal full-history, as we can't distinguish unless we do a > +# simplification pass. After simplification, D is dropped but G remains. > +check_result 'M L K J I H G F E D C B A' I'll read the expectation and comment on them in a separate message. t/t6111-rev-list-treesame.sh | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/t/t6111-rev-list-treesame.sh b/t/t6111-rev-list-treesame.sh index 602c02d..f4c9cac 100755 --- a/t/t6111-rev-list-treesame.sh +++ b/t/t6111-rev-list-treesame.sh @@ -20,7 +20,7 @@ note () { } unnote () { - git name-rev --tags --stdin | sed -e "s|$_x40 (tags/\([^)]*\)) |\1 |g" + git name-rev --tags --stdin | sed -e "s|$_x40 (tags/\([^)]*\))\([ ]\)|\1\2|g" } test_expect_success setup ' @@ -66,23 +66,34 @@ test_expect_success setup ' test_commit M file "Parts 1+2" ' -FMT='tformat:%P %H | %s' - # could we soup this up to optionally check parents? So "(BA)C" would check # that C is shown and has parents B A. check_outcome () { outcome=$1 shift - for c in $1 - do - echo "$c" - done >expect && - shift && + + case "$1" in + *"("*) + FMT="%P %H | %s" + munge_actual=" + s/^\([^ ]*\) \([^ ]*\) .*/(\1)\2/ + s/ //g + s/()// + " + ;; + *) + FMT="%H | %s" + munge_actual="s/^\([^ ]*\) .*/\1/" + ;; + esac && + printf "%s\n" $1 >expect && + shift + param="$*" && test_expect_$outcome "log $param" ' git log --format="$FMT" $param | unnote >actual && - sed -e "s/^.* \([^ ]*\) .*/\1/" >check <actual && + sed -e "$munge_actual" <actual >check && test_cmp expect check || { cat actual false @@ -99,6 +110,7 @@ check_result () { # shown in normal full-history, as we can't distinguish unless we do a # simplification pass. After simplification, D is dropped but G remains. check_result 'M L K J I H G F E D C B A' +check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FE)G (D)F (B)E (BC)D (A)C (A)B A' check_result 'M H L K J I G E F D C B A' --topo-order check_result 'M L H B A' -- file check_result 'M L H B A' --parents -- file -- 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