comparison tests/test-merge-no-file-change.t @ 39110:f0c2653ca706

merge: add tests for commit with no content change It isn't easy to say when to reuse the p1 manifest. Basically, that's only when wctx.files() is empty, but we need to know that wctx.files() is not the same as repo['.'].files() after the commit. This patch adds several examples of commits with empty ctx/wctx.files(). I don't think this is exhaustive, but it contains at least one failure mode in which a converted repo result in a different hash. I also note that the manifest revlog does NOT follow the DAG shape of the changelog since p1 manifest is reused if wctx.files() is empty even at merge. I don't know whether it is intentional or not, but it's the behavior since 2011, 301725c3df9a "localrepo: reuse parent manifest in commitctx if no files have changed."
author Yuya Nishihara <yuya@tcha.org>
date Sun, 12 Aug 2018 18:44:42 +0900
parents
children 46da52f4b820
comparison
equal deleted inserted replaced
39109:a915db9a5e77 39110:f0c2653ca706
1 $ cat <<'EOF' >> "$HGRCPATH"
2 > [extensions]
3 > convert =
4 > [templates]
5 > l = '{rev}:{node|short} p={p1rev},{p2rev} m={manifest} f={files|json}'
6 > EOF
7
8 $ check_convert_identity () {
9 > hg convert -q "$1" "$1.converted"
10 > hg outgoing -q -R "$1.converted" "$1"
11 > if [ "$?" != 1 ]; then
12 > echo '*** BUG: hash changes on convert ***'
13 > hg log -R "$1.converted" -GTl
14 > fi
15 > }
16
17 Files added at both parents:
18
19 $ hg init added-both
20 $ cd added-both
21 $ touch a b c
22 $ hg ci -qAm0 a
23 $ hg ci -qAm1 b
24 $ hg up -q 0
25 $ hg ci -qAm2 c
26
27 $ hg merge
28 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
29 (branch merge, don't forget to commit)
30 $ hg ci --debug -m merge
31 committing files:
32 b
33 committing manifest
34 committing changelog
35 updating the branch cache
36 committed changeset 3:7aa8a293f5d97377037afc21e871e036e718d659
37 $ hg log -GTl
38 @ 3:7aa8a293f5d9 p=2,1 m=3:8667461869a1 f=[]
39 |\
40 | o 2:e0ea47086fce p=0,-1 m=2:b2e5b07f9374 f=["c"]
41 | |
42 o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
43 |/
44 o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
45
46
47 $ cd ..
48 $ check_convert_identity added-both
49
50 Files added at both parents, but the other removed at the merge:
51 (In this case, ctx.files() after the commit contains the removed file "b", but
52 its manifest does not differ from p1.)
53
54 $ hg init added-both-removed-at-merge
55 $ cd added-both-removed-at-merge
56 $ touch a b c
57 $ hg ci -qAm0 a
58 $ hg ci -qAm1 b
59 $ hg up -q 0
60 $ hg ci -qAm2 c
61
62 $ hg merge
63 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
64 (branch merge, don't forget to commit)
65 $ hg rm -f b
66 $ hg ci --debug -m merge
67 committing files:
68 committing manifest
69 committing changelog
70 updating the branch cache
71 committed changeset 3:915745f3ca3d9d699925269474c2d0a9526e8dfa
72 $ hg log -GTl
73 @ 3:915745f3ca3d p=2,1 m=3:8e9cf3456921 f=["b"]
74 |\
75 | o 2:e0ea47086fce p=0,-1 m=2:b2e5b07f9374 f=["c"]
76 | |
77 o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
78 |/
79 o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
80
81
82 $ cd ..
83 $ check_convert_identity added-both
84
85 An identical file added at both parents:
86
87 $ hg init added-identical
88 $ cd added-identical
89 $ touch a b
90 $ hg ci -qAm0 a
91 $ hg ci -qAm1 b
92 $ hg up -q 0
93 $ touch b
94 $ hg ci -qAm2 b
95
96 $ hg merge
97 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
98 (branch merge, don't forget to commit)
99 $ hg ci --debug -m merge
100 reusing manifest from p1 (no file change)
101 committing changelog
102 updating the branch cache
103 committed changeset 3:de26182cd210f0c3fb175ca7616704ab963d3024
104 $ hg log -GTl
105 @ 3:de26182cd210 p=2,1 m=1:686dbf0aeca4 f=[]
106 |\
107 | o 2:f00991f11eca p=0,-1 m=1:686dbf0aeca4 f=["b"]
108 | |
109 o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
110 |/
111 o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
112
113
114 $ cd ..
115 $ check_convert_identity added-identical
116
117 #if execbit
118
119 An identical file added at both parents, but the flag differs. Take local:
120
121 $ hg init flag-change-take-p1
122 $ cd flag-change-take-p1
123 $ touch a b
124 $ hg ci -qAm0 a
125 $ hg ci -qAm1 b
126 $ hg up -q 0
127 $ touch b
128 $ chmod +x b
129 $ hg ci -qAm2 b
130
131 $ hg merge
132 warning: cannot merge flags for b without common ancestor - keeping local flags
133 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
134 (branch merge, don't forget to commit)
135 $ chmod +x b
136 $ hg ci --debug -m merge
137 committing files:
138 b
139 committing manifest
140 committing changelog
141 updating the branch cache
142 committed changeset 3:4bfaad7f925b7f17f60524dc5d4e605f7bfbba3f
143 $ hg log -GTl
144 @ 3:4bfaad7f925b p=2,1 m=3:a3a9fe23a5b8 f=[]
145 |\
146 | o 2:99451f16b3f5 p=0,-1 m=2:36b69ba4b24b f=["b"]
147 | |
148 o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
149 |/
150 o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
151
152 $ hg files -vr3
153 0 a
154 0 x b
155
156 $ cd ..
157 $ check_convert_identity flag-change-take-p1
158 3:c8d50407916e
159 *** BUG: hash changes on convert ***
160 o 3:c8d50407916e p=2,1 m=2:36b69ba4b24b f=[]
161 |\
162 | o 2:99451f16b3f5 p=0,-1 m=2:36b69ba4b24b f=["b"]
163 | |
164 o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
165 |/
166 o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
167
168
169 An identical file added at both parents, but the flag differs. Take other:
170
171 $ hg init flag-change-take-p2
172 $ cd flag-change-take-p2
173 $ touch a b
174 $ hg ci -qAm0 a
175 $ hg ci -qAm1 b
176 $ hg up -q 0
177 $ touch b
178 $ chmod +x b
179 $ hg ci -qAm2 b
180
181 $ hg merge
182 warning: cannot merge flags for b without common ancestor - keeping local flags
183 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
184 (branch merge, don't forget to commit)
185 $ chmod -x b
186 $ hg ci --debug -m merge
187 committing files:
188 b
189 committing manifest
190 committing changelog
191 updating the branch cache
192 committed changeset 3:06a62a687d87c7d8944743dee1ee9d8c66b3f6e3
193 $ hg log -GTl
194 @ 3:06a62a687d87 p=2,1 m=3:2a315ba1aa45 f=["b"]
195 |\
196 | o 2:99451f16b3f5 p=0,-1 m=2:36b69ba4b24b f=["b"]
197 | |
198 o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
199 |/
200 o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
201
202 $ hg files -vr3
203 0 a
204 0 b
205
206 $ cd ..
207 $ check_convert_identity flag-change-take-p2
208
209 #endif
210
211 An identical file added at both parents, one more file added at p2:
212
213 $ hg init added-some-p2
214 $ cd added-some-p2
215 $ touch a b c
216 $ hg ci -qAm0 a
217 $ hg ci -qAm1 b
218 $ hg ci -qAm2 c
219 $ hg up -q 0
220 $ touch b
221 $ hg ci -qAm3 b
222
223 $ hg merge
224 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
225 (branch merge, don't forget to commit)
226 $ hg ci --debug -m merge
227 committing files:
228 c
229 committing manifest
230 committing changelog
231 updating the branch cache
232 committed changeset 4:f7fbc4e4d9a8fde03ba475adad675578c8bf472d
233 $ hg log -GTl
234 @ 4:f7fbc4e4d9a8 p=3,2 m=3:92acd5bfd716 f=[]
235 |\
236 | o 3:e9d9f3cc981f p=0,-1 m=1:686dbf0aeca4 f=["b"]
237 | |
238 o | 2:93c5529a4ec7 p=1,-1 m=2:ae25a31b30b3 f=["c"]
239 | |
240 o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
241 |/
242 o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
243
244
245 $ cd ..
246 $ check_convert_identity added-some-p2
247
248 An identical file added at both parents, one more file added at p1:
249 (In this case, p1 manifest is reused at the merge commit, which means the
250 manifest DAG does not have the same shape as the changelog.)
251
252 $ hg init added-some-p1
253 $ cd added-some-p1
254 $ touch a b
255 $ hg ci -qAm0 a
256 $ hg ci -qAm1 b
257 $ hg up -q 0
258 $ touch b c
259 $ hg ci -qAm2 b
260 $ hg ci -qAm3 c
261
262 $ hg merge
263 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
264 (branch merge, don't forget to commit)
265 $ hg ci --debug -m merge
266 reusing manifest from p1 (no file change)
267 committing changelog
268 updating the branch cache
269 committed changeset 4:a9f0f589a913f5a149dc10dfbd5af726977c36c4
270 $ hg log -GTl
271 @ 4:a9f0f589a913 p=3,1 m=2:ae25a31b30b3 f=[]
272 |\
273 | o 3:b8dc385241b5 p=2,-1 m=2:ae25a31b30b3 f=["c"]
274 | |
275 | o 2:f00991f11eca p=0,-1 m=1:686dbf0aeca4 f=["b"]
276 | |
277 o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"]
278 |/
279 o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"]
280
281
282 $ cd ..
283 $ check_convert_identity added-some-p1
284
285 A file added at p2, a named branch created at p1:
286
287 $ hg init named-branch-p1
288 $ cd named-branch-p1
289 $ touch a b
290 $ hg ci -qAm0 a
291 $ hg ci -qAm1 b
292 $ hg up -q 0
293 $ hg branch -q foo
294 $ hg ci -m2
295
296 $ hg merge default
297 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
298 (branch merge, don't forget to commit)
299 $ hg ci --debug -m merge
300 committing files:
301 b
302 committing manifest
303 committing changelog
304 updating the branch cache
305 committed changeset 3:fb97d83b02fd072295cfc2171f21b7d38509bfd7
306 $ hg log -GT'{l} branch={branch}'
307 @ 3:fb97d83b02fd p=2,1 m=2:9091c64f4ea1 f=[] branch=foo
308 |\
309 | o 2:a3a9fa6587e5 p=0,-1 m=0:8515d4bfda76 f=[] branch=foo
310 | |
311 o | 1:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"] branch=default
312 |/
313 o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"] branch=default
314
315
316 $ cd ..
317 $ check_convert_identity named-branch-p1
318
319 A file added at p1, a named branch created at p2:
320 (In this case, p1 manifest is reused at the merge commit, which means the
321 manifest DAG does not have the same shape as the changelog.)
322
323 $ hg init named-branch-p2
324 $ cd named-branch-p2
325 $ touch a b
326 $ hg ci -qAm0 a
327 $ hg branch -q foo
328 $ hg ci -m1
329 $ hg up -q 0
330 $ hg ci -qAm1 b
331
332 $ hg merge foo
333 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
334 (branch merge, don't forget to commit)
335 $ hg ci --debug -m merge
336 reusing manifest from p1 (no file change)
337 committing changelog
338 updating the branch cache
339 committed changeset 3:036823e24692218324d4af43b07ff89f8a000096
340 $ hg log -GT'{l} branch={branch}'
341 @ 3:036823e24692 p=2,1 m=1:686dbf0aeca4 f=[] branch=default
342 |\
343 | o 2:64d01526d4c2 p=0,-1 m=1:686dbf0aeca4 f=["b"] branch=default
344 | |
345 o | 1:da38c8e00727 p=0,-1 m=0:8515d4bfda76 f=[] branch=foo
346 |/
347 o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"] branch=default
348
349
350 $ cd ..
351 $ check_convert_identity named-branch-p2
352
353 A file changed once at both parents, but amended to have identical content:
354
355 $ hg init amend-p1
356 $ cd amend-p1
357 $ touch a
358 $ hg ci -qAm0 a
359 $ echo foo > a
360 $ hg ci -m1
361 $ hg up -q 0
362 $ echo bar > a
363 $ hg ci -qm2
364 $ echo foo > a
365 $ hg ci -qm3 --amend
366
367 $ hg merge
368 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
369 (branch merge, don't forget to commit)
370 $ hg ci --debug -m merge
371 reusing manifest from p1 (no file change)
372 committing changelog
373 updating the branch cache
374 committed changeset 3:314e5bc5adf5c58ea571efabe33eedba20a201aa
375 $ hg log -GT'{l} branch={branch}'
376 @ 3:314e5bc5adf5 p=2,1 m=1:d33ea248bd73 f=[] branch=default
377 |\
378 | o 2:de9c64f226a3 p=0,-1 m=1:d33ea248bd73 f=["a"] branch=default
379 | |
380 o | 1:6a74aec01b3c p=0,-1 m=1:d33ea248bd73 f=["a"] branch=default
381 |/
382 o 0:487a0a245cea p=-1,-1 m=0:8515d4bfda76 f=["a"] branch=default
383
384
385 $ cd ..
386 $ check_convert_identity amend-p1