Show More
@@ -0,0 +1,73 b'' | |||
|
1 | # genmerges is the workhorse of the test-merge-combination.t tests. | |
|
2 | ||
|
3 | # Given: | |
|
4 | # - a `range` function describing the possible values for file a | |
|
5 | # - a `isgood` function to filter out uninteresting combination | |
|
6 | # - a `createfile` function to actually write the values for file a on the | |
|
7 | # filesystem | |
|
8 | # | |
|
9 | # it print a series of lines that look like: abcd C: output of -T {files} | |
|
10 | # describing the file a at respectively the base, p2, p1, merge | |
|
11 | # revision. "C" indicates that hg merge had conflicts. | |
|
12 | ||
|
13 | genmerges () { | |
|
14 | ||
|
15 | (LC_ALL=C type range | grep -q 'function') || (echo >&2 "missing function: range") | |
|
16 | (LC_ALL=C type isgood | grep -q 'function') || (echo >&2 "missing function: isgood") | |
|
17 | (LC_ALL=C type createfile | grep -q 'function') || (echo >&2 "missing function: createfile") | |
|
18 | ||
|
19 | for base in `range` -; do | |
|
20 | for r1 in `range $base` -; do | |
|
21 | for r2 in `range $base $r1` -; do | |
|
22 | for m in `range $base $r1 $r2` -; do | |
|
23 | line="$base$r1$r2$m" | |
|
24 | isgood $line || continue | |
|
25 | hg init repo | |
|
26 | cd repo | |
|
27 | make_commit () { | |
|
28 | v=$1; msg=$2; file=$3; | |
|
29 | if [ $v != - ]; then | |
|
30 | createfile $v | |
|
31 | else | |
|
32 | if [ -f a ] | |
|
33 | then rm a | |
|
34 | else touch $file | |
|
35 | fi | |
|
36 | fi | |
|
37 | hg commit -q -Am $msg || exit 123 | |
|
38 | } | |
|
39 | echo foo > foo | |
|
40 | make_commit $base base b | |
|
41 | make_commit $r1 r1 c | |
|
42 | hg up -r 0 -q | |
|
43 | make_commit $r2 r2 d | |
|
44 | hg merge -q -r 1 > ../output 2>&1 | |
|
45 | if [ $? -ne 0 ]; then rm -f *.orig; hg resolve -m --all -q; fi | |
|
46 | if [ -s ../output ]; then conflicts=" C"; else conflicts=" "; fi | |
|
47 | make_commit $m m e | |
|
48 | if [ $m = $r1 ] && [ $m = $r2 ] | |
|
49 | then expected= | |
|
50 | elif [ $m = $r1 ] | |
|
51 | then if [ $base = $r2 ] | |
|
52 | then expected= | |
|
53 | else expected=a | |
|
54 | fi | |
|
55 | elif [ $m = $r2 ] | |
|
56 | then if [ $base = $r1 ] | |
|
57 | then expected= | |
|
58 | else expected=a | |
|
59 | fi | |
|
60 | else expected=a | |
|
61 | fi | |
|
62 | got=`hg log -r 3 --template '{files}\n' | tr -d 'e '` | |
|
63 | if [ "$got" = "$expected" ] | |
|
64 | then echo "$line$conflicts: agree on \"$got\"" | |
|
65 | else echo "$line$conflicts: hg said \"$got\", expected \"$expected\"" | |
|
66 | fi | |
|
67 | cd ../ | |
|
68 | rm -rf repo | |
|
69 | done | |
|
70 | done | |
|
71 | done | |
|
72 | done | |
|
73 | } |
@@ -1,220 +1,157 b'' | |||
|
1 | 1 | This file shows what hg says are "modified" files for a merge commit |
|
2 | 2 | (hg log -T {files}), somewhat exhaustively. |
|
3 | 3 | It shows merges that involves files contents changing, and merges that |
|
4 | 4 | involve executable bit changing, but not merges with multiple or zero |
|
5 | 5 | merge ancestors, nor copies/renames, and nor identical file contents |
|
6 | 6 | with different filelog revisions. |
|
7 | 7 | |
|
8 | genmerges is the workhorse. Given: | |
|
9 | - a range function describing the possible values for file a | |
|
10 | - a isgood function to filter out uninteresting combination | |
|
11 | - a createfile function to actually write the values for file a on the | |
|
12 | filesystem | |
|
13 | it print a series of lines that look like: abcd C: output of -T {files} | |
|
14 | describing the file a at respectively the base, p2, p1, merge | |
|
15 | revision. "C" indicates that hg merge had conflicts. | |
|
16 | $ genmerges () { | |
|
17 | > for base in `range` -; do | |
|
18 | > for r1 in `range $base` -; do | |
|
19 | > for r2 in `range $base $r1` -; do | |
|
20 | > for m in `range $base $r1 $r2` -; do | |
|
21 | > line="$base$r1$r2$m" | |
|
22 | > isgood $line || continue | |
|
23 | > hg init repo | |
|
24 | > cd repo | |
|
25 | > make_commit () { | |
|
26 | > v=$1; msg=$2; file=$3; | |
|
27 | > if [ $v != - ]; then | |
|
28 | > createfile $v | |
|
29 | > else | |
|
30 | > if [ -f a ] | |
|
31 | > then rm a | |
|
32 | > else touch $file | |
|
33 | > fi | |
|
34 | > fi | |
|
35 | > hg commit -q -Am $msg || exit 123 | |
|
36 | > } | |
|
37 | > echo foo > foo | |
|
38 | > make_commit $base base b | |
|
39 | > make_commit $r1 r1 c | |
|
40 | > hg up -r 0 -q | |
|
41 | > make_commit $r2 r2 d | |
|
42 | > hg merge -q -r 1 > ../output 2>&1 | |
|
43 | > if [ $? -ne 0 ]; then rm -f *.orig; hg resolve -m --all -q; fi | |
|
44 | > if [ -s ../output ]; then conflicts=" C"; else conflicts=" "; fi | |
|
45 | > make_commit $m m e | |
|
46 | > if [ $m = $r1 ] && [ $m = $r2 ] | |
|
47 | > then expected= | |
|
48 | > elif [ $m = $r1 ] | |
|
49 | > then if [ $base = $r2 ] | |
|
50 | > then expected= | |
|
51 | > else expected=a | |
|
52 | > fi | |
|
53 | > elif [ $m = $r2 ] | |
|
54 | > then if [ $base = $r1 ] | |
|
55 | > then expected= | |
|
56 | > else expected=a | |
|
57 | > fi | |
|
58 | > else expected=a | |
|
59 | > fi | |
|
60 | > got=`hg log -r 3 --template '{files}\n' | tr -d 'e '` | |
|
61 | > if [ "$got" = "$expected" ] | |
|
62 | > then echo "$line$conflicts: agree on \"$got\"" | |
|
63 | > else echo "$line$conflicts: hg said \"$got\", expected \"$expected\"" | |
|
64 | > fi | |
|
65 | > cd ../ | |
|
66 | > rm -rf repo | |
|
67 | > done | |
|
68 | > done | |
|
69 | > done | |
|
70 | > done | |
|
71 | > } | |
|
8 | $ . $TESTDIR/testlib/merge-combination-util.sh | |
|
72 | 9 | |
|
73 | 10 | All the merges of various file contents. |
|
74 | 11 | |
|
75 | 12 | $ range () { |
|
76 | 13 | > max=0 |
|
77 | 14 | > for i in $@; do |
|
78 | 15 | > if [ $i = - ]; then continue; fi |
|
79 | 16 | > if [ $i -gt $max ]; then max=$i; fi |
|
80 | 17 | > done |
|
81 | 18 | > $TESTDIR/seq.py `expr $max + 1` |
|
82 | 19 | > } |
|
83 | 20 | $ isgood () { true; } |
|
84 | 21 | $ createfile () { |
|
85 | 22 | > if [ -f a ] && [ "`cat a`" = $1 ] |
|
86 | 23 | > then touch $file |
|
87 | 24 | > else echo $v > a |
|
88 | 25 | > fi |
|
89 | 26 | > } |
|
90 | 27 | |
|
91 | 28 | $ genmerges |
|
92 | 29 | 1111 : agree on "" |
|
93 | 30 | 1112 : agree on "a" |
|
94 | 31 | 111- : agree on "a" |
|
95 | 32 | 1121 : agree on "a" |
|
96 | 33 | 1122 : agree on "" |
|
97 | 34 | 1123 : agree on "a" |
|
98 | 35 | 112- : agree on "a" |
|
99 | 36 | 11-1 : hg said "", expected "a" |
|
100 | 37 | 11-2 : agree on "a" |
|
101 | 38 | 11-- : agree on "" |
|
102 | 39 | 1211 : agree on "a" |
|
103 | 40 | 1212 : agree on "" |
|
104 | 41 | 1213 : agree on "a" |
|
105 | 42 | 121- : agree on "a" |
|
106 | 43 | 1221 : agree on "a" |
|
107 | 44 | 1222 : agree on "" |
|
108 | 45 | 1223 : agree on "a" |
|
109 | 46 | 122- : agree on "a" |
|
110 | 47 | 1231 C: agree on "a" |
|
111 | 48 | 1232 C: agree on "a" |
|
112 | 49 | 1233 C: agree on "a" |
|
113 | 50 | 1234 C: agree on "a" |
|
114 | 51 | 123- C: agree on "a" |
|
115 | 52 | 12-1 C: agree on "a" |
|
116 | 53 | 12-2 C: hg said "", expected "a" |
|
117 | 54 | 12-3 C: agree on "a" |
|
118 | 55 | 12-- C: agree on "a" |
|
119 | 56 | 1-11 : hg said "", expected "a" |
|
120 | 57 | 1-12 : agree on "a" |
|
121 | 58 | 1-1- : agree on "" |
|
122 | 59 | 1-21 C: agree on "a" |
|
123 | 60 | 1-22 C: hg said "", expected "a" |
|
124 | 61 | 1-23 C: agree on "a" |
|
125 | 62 | 1-2- C: agree on "a" |
|
126 | 63 | 1--1 : agree on "a" |
|
127 | 64 | 1--2 : agree on "a" |
|
128 | 65 | 1--- : agree on "" |
|
129 | 66 | -111 : agree on "" |
|
130 | 67 | -112 : agree on "a" |
|
131 | 68 | -11- : agree on "a" |
|
132 | 69 | -121 C: agree on "a" |
|
133 | 70 | -122 C: agree on "a" |
|
134 | 71 | -123 C: agree on "a" |
|
135 | 72 | -12- C: agree on "a" |
|
136 | 73 | -1-1 : agree on "" |
|
137 | 74 | -1-2 : agree on "a" |
|
138 | 75 | -1-- : agree on "a" |
|
139 | 76 | --11 : agree on "" |
|
140 | 77 | --12 : agree on "a" |
|
141 | 78 | --1- : agree on "a" |
|
142 | 79 | ---1 : agree on "a" |
|
143 | 80 | ---- : agree on "" |
|
144 | 81 | |
|
145 | 82 | All the merges of executable bit. |
|
146 | 83 | |
|
147 | 84 | $ range () { |
|
148 | 85 | > max=a |
|
149 | 86 | > for i in $@; do |
|
150 | 87 | > if [ $i = - ]; then continue; fi |
|
151 | 88 | > if [ $i > $max ]; then max=$i; fi |
|
152 | 89 | > done |
|
153 | 90 | > if [ $max = a ]; then echo f; else echo f x; fi |
|
154 | 91 | > } |
|
155 | 92 | $ isgood () { case $line in *f*x*) true;; *) false;; esac; } |
|
156 | 93 | $ createfile () { |
|
157 | 94 | > if [ -f a ] && (([ -x a ] && [ $v = x ]) || (! [ -x a ] && [ $v != x ])) |
|
158 | 95 | > then touch $file |
|
159 | 96 | > else touch a; if [ $v = x ]; then chmod +x a; else chmod -x a; fi |
|
160 | 97 | > fi |
|
161 | 98 | > } |
|
162 | 99 | |
|
163 | 100 | #if execbit |
|
164 | 101 | $ genmerges |
|
165 | 102 | fffx : agree on "a" |
|
166 | 103 | ffxf : agree on "a" |
|
167 | 104 | ffxx : agree on "" |
|
168 | 105 | ffx- : agree on "a" |
|
169 | 106 | ff-x : hg said "", expected "a" |
|
170 | 107 | fxff : hg said "", expected "a" |
|
171 | 108 | fxfx : hg said "a", expected "" |
|
172 | 109 | fxf- : agree on "a" |
|
173 | 110 | fxxf : agree on "a" |
|
174 | 111 | fxxx : agree on "" |
|
175 | 112 | fxx- : agree on "a" |
|
176 | 113 | fx-f : hg said "", expected "a" |
|
177 | 114 | fx-x : hg said "", expected "a" |
|
178 | 115 | fx-- : hg said "", expected "a" |
|
179 | 116 | f-fx : agree on "a" |
|
180 | 117 | f-xf : agree on "a" |
|
181 | 118 | f-xx : hg said "", expected "a" |
|
182 | 119 | f-x- : agree on "a" |
|
183 | 120 | f--x : agree on "a" |
|
184 | 121 | -ffx : agree on "a" |
|
185 | 122 | -fxf C: agree on "a" |
|
186 | 123 | -fxx C: hg said "", expected "a" |
|
187 | 124 | -fx- C: agree on "a" |
|
188 | 125 | -f-x : hg said "", expected "a" |
|
189 | 126 | --fx : agree on "a" |
|
190 | 127 | #endif |
|
191 | 128 | |
|
192 | 129 | Files modified or cleanly merged, with no greatest common ancestors: |
|
193 | 130 | |
|
194 | 131 | $ hg init repo; cd repo |
|
195 | 132 | $ touch a0 b0; hg commit -qAm 0 |
|
196 | 133 | $ hg up -qr null; touch a1 b1; hg commit -qAm 1 |
|
197 | 134 | $ hg merge -qr 0; rm b*; hg commit -qAm 2 |
|
198 | 135 | $ hg log -r . -T '{files}\n' |
|
199 | 136 | b0 b1 |
|
200 | 137 | $ cd ../ |
|
201 | 138 | $ rm -rf repo |
|
202 | 139 | |
|
203 | 140 | A few cases of criss-cross merges involving deletions (listing all |
|
204 | 141 | such merges is probably too much). Both gcas contain $files, so we |
|
205 | 142 | expect the final merge to behave like a merge with a single gca |
|
206 | 143 | containing $files. |
|
207 | 144 | |
|
208 | 145 | $ hg init repo; cd repo |
|
209 | 146 | $ files="c1 u1 c2 u2" |
|
210 | 147 | $ touch $files; hg commit -qAm '0 root' |
|
211 | 148 | $ for f in $files; do echo f > $f; done; hg commit -qAm '1 gca1' |
|
212 | 149 | $ hg up -qr0; hg revert -qr 1 --all; hg commit -qAm '2 gca2' |
|
213 | 150 | $ hg up -qr 1; hg merge -qr 2; rm *1; hg commit -qAm '3 p1' |
|
214 | 151 | $ hg up -qr 2; hg merge -qr 1; rm *2; hg commit -qAm '4 p2' |
|
215 | 152 | $ hg merge -qr 3; echo f > u1; echo f > u2; rm -f c1 c2 |
|
216 | 153 | $ hg commit -qAm '5 merge with two gcas' |
|
217 | 154 | $ hg log -r . -T '{files}\n' # expecting u1 u2 |
|
218 | 155 | |
|
219 | 156 | $ cd ../ |
|
220 | 157 | $ rm -rf repo |
General Comments 0
You need to be logged in to leave comments.
Login now