]> git.ipfire.org Git - thirdparty/git.git/blame - t/t6111-rev-list-treesame.sh
t6[0-3]*: adjust the references to the default branch name "main"
[thirdparty/git.git] / t / t6111-rev-list-treesame.sh
CommitLineData
abdea96e
KB
1#!/bin/sh
2#
3# ,---E--. *H----------. * marks !TREESAME parent paths
4# / \ / \*
5# *A--*B---D--*F-*G---------K-*L-*M
6# \ /* \ /
7# `-C-' `-*I-*J
8#
9# A creates "file", B and F change it.
10# Odd merge G takes the old version from B.
11# I changes it, but J reverts it, so K is TREESAME to both parents.
12# H and L both change "file", and M merges those changes.
13
14test_description='TREESAME and limiting'
15
1550bb6e 16GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
334afbc7
JS
17export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
18
abdea96e
KB
19. ./test-lib.sh
20
21note () {
22 git tag "$1"
23}
24
25unnote () {
2ece6ad2 26 git name-rev --tags --stdin | sed -e "s|$OID_REGEX (tags/\([^)]*\))\([ ]\)|\1\2|g"
abdea96e
KB
27}
28
29test_expect_success setup '
30 test_commit "Initial file" file "Hi there" A &&
31 git branch other-branch &&
32
33 test_commit "file=Hello" file "Hello" B &&
34 git branch third-branch &&
35
36 git checkout other-branch &&
37 test_commit "Added other" other "Hello" C &&
38
1550bb6e 39 git checkout main &&
abdea96e
KB
40 test_merge D other-branch &&
41
42 git checkout third-branch &&
43 test_commit "Third file" third "Nothing" E &&
44
1550bb6e 45 git checkout main &&
abdea96e
KB
46 test_commit "file=Blah" file "Blah" F &&
47
48 test_tick && git merge --no-commit third-branch &&
49 git checkout third-branch file &&
50 git commit &&
51 note G &&
52 git branch fiddler-branch &&
53
54 git checkout -b part2-branch &&
55 test_commit "file=Part 2" file "Part 2" H &&
56
57 git checkout fiddler-branch &&
58 test_commit "Bad commit" file "Silly" I &&
59
60 test_tick && git revert I && note J &&
61
1550bb6e 62 git checkout main &&
abdea96e 63 test_tick && git merge --no-ff fiddler-branch &&
99094a7a 64 note K &&
abdea96e
KB
65
66 test_commit "file=Part 1" file "Part 1" L &&
67
68 test_tick && test_must_fail git merge part2-branch &&
69 test_commit M file "Parts 1+2"
70'
71
abdea96e
KB
72check_outcome () {
73 outcome=$1
74 shift
e16f434a
JH
75
76 case "$1" in
77 *"("*)
78 FMT="%P %H | %s"
79 munge_actual="
80 s/^\([^ ]*\) \([^ ]*\) .*/(\1)\2/
81 s/ //g
82 s/()//
83 "
84 ;;
85 *)
86 FMT="%H | %s"
87 munge_actual="s/^\([^ ]*\) .*/\1/"
88 ;;
89 esac &&
90 printf "%s\n" $1 >expect &&
91 shift
92
abdea96e
KB
93 param="$*" &&
94 test_expect_$outcome "log $param" '
95 git log --format="$FMT" $param |
96 unnote >actual &&
e16f434a 97 sed -e "$munge_actual" <actual >check &&
5ca812a1 98 test_cmp expect check
abdea96e
KB
99 '
100}
101
102check_result () {
103 check_outcome success "$@"
104}
105
106# Odd merge G drops a change in F. Important that G is listed in all
107# except the most basic list. Achieving this means normal merge D will also be
108# shown in normal full-history, as we can't distinguish unless we do a
109# simplification pass. After simplification, D is dropped but G remains.
53e38358
KB
110# Also, merge simplification of G should not drop the parent B that the default
111# simple history follows.
abdea96e 112check_result 'M L K J I H G F E D C B A'
e16f434a 113check_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'
abdea96e
KB
114check_result 'M H L K J I G E F D C B A' --topo-order
115check_result 'M L H B A' -- file
53e38358 116check_result '(LH)M (B)L (B)H (A)B A' --parents -- file
d0af663e 117check_result 'M L J I H G F D B A' --full-history -- file
53e38358 118check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FB)G (D)F (BA)D (A)B A' --full-history --parents -- file
9c129eab 119check_result '(LH)M (G)H (J)L (I)J (G)I (FB)G (B)F (A)B A' --simplify-merges -- file
abdea96e
KB
120check_result 'M L K G F D B A' --first-parent
121check_result 'M L G F B A' --first-parent -- file
122
123# Check that odd merge G remains shown when F is the bottom.
124check_result 'M L K J I H G E' F..M
125check_result 'M H L K J I G E' F..M --topo-order
126check_result 'M L H' F..M -- file
53e38358 127check_result '(LH)M (B)L (B)H' --parents F..M -- file
d0af663e 128check_result 'M L J I H G' F..M --full-history -- file
53e38358 129check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FB)G' F..M --full-history --parents -- file
9c129eab 130check_result '(LH)M (G)H (J)L (I)J (G)I (FB)G' F..M --simplify-merges -- file
abdea96e 131check_result 'M L K J I H G' F..M --ancestry-path
d0af663e 132check_result 'M L J I H G' F..M --ancestry-path -- file
53e38358
KB
133check_result '(LH)M (K)L (GJ)K (I)J (G)I (G)H (FE)G' F..M --ancestry-path --parents -- file
134check_result '(LH)M (G)H (J)L (I)J (G)I (FE)G' F..M --ancestry-path --simplify-merges -- file
abdea96e
KB
135check_result 'M L K G' F..M --first-parent
136check_result 'M L G' F..M --first-parent -- file
137
138# Note that G is pruned when E is the bottom, even if it's the same commit list
139# If we want history since E, then we're quite happy to ignore G that took E.
140check_result 'M L K J I H G' E..M --ancestry-path
4d826608 141check_result 'M L J I H' E..M --ancestry-path -- file
bf3418b0 142check_result '(LH)M (K)L (EJ)K (I)J (E)I (E)H' E..M --ancestry-path --parents -- file
4d826608 143check_result '(LH)M (E)H (J)L (I)J (E)I' E..M --ancestry-path --simplify-merges -- file
abdea96e
KB
144
145# Should still be able to ignore I-J branch in simple log, despite limiting
146# to G.
147check_result 'M L K J I H' G..M
148check_result 'M H L K J I' G..M --topo-order
141efdba
KB
149check_result 'M L H' G..M -- file
150check_result '(LH)M (G)L (G)H' G..M --parents -- file
abdea96e
KB
151check_result 'M L J I H' G..M --full-history -- file
152check_result 'M L K J I H' G..M --full-history --parents -- file
153check_result 'M H L J I' G..M --simplify-merges -- file
154check_result 'M L K J I H' G..M --ancestry-path
155check_result 'M L J I H' G..M --ancestry-path -- file
156check_result 'M L K J I H' G..M --ancestry-path --parents -- file
157check_result 'M H L J I' G..M --ancestry-path --simplify-merges -- file
158
159# B..F should be able to simplify the merge D from irrelevant side branch C.
160# Default log should also be free to follow B-D, and ignore C.
161# But --full-history shouldn't drop D on its own - without simplification,
162# we can't decide if the merge from INTERESTING commit C was sensible.
163check_result 'F D C' B..F
141efdba
KB
164check_result 'F' B..F -- file
165check_result '(B)F' B..F --parents -- file
d0af663e 166check_result 'F D' B..F --full-history -- file
53e38358
KB
167check_result '(D)F (BA)D' B..F --full-history --parents -- file
168check_result '(B)F' B..F --simplify-merges -- file
abdea96e 169check_result 'F D' B..F --ancestry-path
4d826608 170check_result 'F' B..F --ancestry-path -- file
bf3418b0 171check_result 'F' B..F --ancestry-path --parents -- file
4d826608 172check_result 'F' B..F --ancestry-path --simplify-merges -- file
abdea96e
KB
173check_result 'F D' B..F --first-parent
174check_result 'F' B..F --first-parent -- file
175
176# E...F should be equivalent to E F ^B, and be able to drop D as above.
141efdba
KB
177check_result 'F' E F ^B -- file # includes D
178check_result 'F' E...F -- file # includes D
abdea96e
KB
179
180# Any sort of full history of C..F should show D, as it's the connection to C,
181# and it differs from it.
182check_result 'F D B' C..F
183check_result 'F B' C..F -- file
53e38358 184check_result '(B)F (A)B' C..F --parents -- file
d0af663e 185check_result 'F D B' C..F --full-history -- file
53e38358
KB
186check_result '(D)F (BC)D (A)B' C..F --full-history --parents -- file
187check_result '(D)F (BC)D (A)B' C..F --simplify-merges -- file
abdea96e 188check_result 'F D' C..F --ancestry-path
d0af663e 189check_result 'F D' C..F --ancestry-path -- file
abdea96e
KB
190check_result 'F D' C..F --ancestry-path --parents -- file
191check_result 'F D' C..F --ancestry-path --simplify-merges -- file
192check_result 'F D B' C..F --first-parent
193check_result 'F B' C..F --first-parent -- file
194
195
196test_done