##// END OF EJS Templates
test-copies: add a test updating file content while merging a pure overwrite...
marmoute -
r47540:6b52cffd default
parent child Browse files
Show More
@@ -1,3465 +1,3711 b''
1 #testcases filelog compatibility changeset sidedata upgraded upgraded-parallel
1 #testcases filelog compatibility changeset sidedata upgraded upgraded-parallel
2
2
3 =====================================================
3 =====================================================
4 Test Copy tracing for chain of copies involving merge
4 Test Copy tracing for chain of copies involving merge
5 =====================================================
5 =====================================================
6
6
7 This test files covers copies/rename case for a chains of commit where merges
7 This test files covers copies/rename case for a chains of commit where merges
8 are involved. It cheks we do not have unwanted update of behavior and that the
8 are involved. It cheks we do not have unwanted update of behavior and that the
9 different options to retrieve copies behave correctly.
9 different options to retrieve copies behave correctly.
10
10
11
11
12 Setup
12 Setup
13 =====
13 =====
14
14
15 use git diff to see rename
15 use git diff to see rename
16
16
17 $ cat << EOF >> ./no-linkrev
17 $ cat << EOF >> ./no-linkrev
18 > #!$PYTHON
18 > #!$PYTHON
19 > # filter out linkrev part of the debugindex command
19 > # filter out linkrev part of the debugindex command
20 > import sys
20 > import sys
21 > for line in sys.stdin:
21 > for line in sys.stdin:
22 > if " linkrev " in line:
22 > if " linkrev " in line:
23 > print(line.rstrip())
23 > print(line.rstrip())
24 > else:
24 > else:
25 > l = "%s *%s" % (line[:6], line[14:].rstrip())
25 > l = "%s *%s" % (line[:6], line[14:].rstrip())
26 > print(l)
26 > print(l)
27 > EOF
27 > EOF
28 $ chmod +x no-linkrev
28 $ chmod +x no-linkrev
29
29
30 $ cat << EOF >> $HGRCPATH
30 $ cat << EOF >> $HGRCPATH
31 > [diff]
31 > [diff]
32 > git=yes
32 > git=yes
33 > [command-templates]
33 > [command-templates]
34 > log={desc}\n
34 > log={desc}\n
35 > EOF
35 > EOF
36
36
37 #if compatibility
37 #if compatibility
38 $ cat >> $HGRCPATH << EOF
38 $ cat >> $HGRCPATH << EOF
39 > [experimental]
39 > [experimental]
40 > copies.read-from = compatibility
40 > copies.read-from = compatibility
41 > EOF
41 > EOF
42 #endif
42 #endif
43
43
44 #if changeset
44 #if changeset
45 $ cat >> $HGRCPATH << EOF
45 $ cat >> $HGRCPATH << EOF
46 > [experimental]
46 > [experimental]
47 > copies.read-from = changeset-only
47 > copies.read-from = changeset-only
48 > copies.write-to = changeset-only
48 > copies.write-to = changeset-only
49 > EOF
49 > EOF
50 #endif
50 #endif
51
51
52 #if sidedata
52 #if sidedata
53 $ cat >> $HGRCPATH << EOF
53 $ cat >> $HGRCPATH << EOF
54 > [format]
54 > [format]
55 > exp-use-side-data = yes
55 > exp-use-side-data = yes
56 > exp-use-copies-side-data-changeset = yes
56 > exp-use-copies-side-data-changeset = yes
57 > EOF
57 > EOF
58 #endif
58 #endif
59
59
60
60
61 $ cat > same-content.txt << EOF
61 $ cat > same-content.txt << EOF
62 > Here is some content that will be the same accros multiple file.
62 > Here is some content that will be the same accros multiple file.
63 >
63 >
64 > This is done on purpose so that we end up in some merge situation, were the
64 > This is done on purpose so that we end up in some merge situation, were the
65 > resulting content is the same as in the parent(s), but a new filenodes still
65 > resulting content is the same as in the parent(s), but a new filenodes still
66 > need to be created to record some file history information (especially
66 > need to be created to record some file history information (especially
67 > about copies).
67 > about copies).
68 > EOF
68 > EOF
69
69
70 $ hg init repo-chain
70 $ hg init repo-chain
71 $ cd repo-chain
71 $ cd repo-chain
72
72
73 Add some linear rename initialy
73 Add some linear rename initialy
74
74
75 $ cp ../same-content.txt a
75 $ cp ../same-content.txt a
76 $ cp ../same-content.txt b
76 $ cp ../same-content.txt b
77 $ cp ../same-content.txt h
77 $ cp ../same-content.txt h
78 $ echo "original content for P" > p
78 $ echo "original content for P" > p
79 $ echo "original content for Q" > q
79 $ echo "original content for Q" > q
80 $ echo "original content for R" > r
80 $ echo "original content for R" > r
81 $ hg ci -Am 'i-0 initial commit: a b h p q r'
81 $ hg ci -Am 'i-0 initial commit: a b h p q r'
82 adding a
82 adding a
83 adding b
83 adding b
84 adding h
84 adding h
85 adding p
85 adding p
86 adding q
86 adding q
87 adding r
87 adding r
88 $ hg mv a c
88 $ hg mv a c
89 $ hg mv p s
89 $ hg mv p s
90 $ hg ci -Am 'i-1: a -move-> c, p -move-> s'
90 $ hg ci -Am 'i-1: a -move-> c, p -move-> s'
91 $ hg mv c d
91 $ hg mv c d
92 $ hg mv s t
92 $ hg mv s t
93 $ hg ci -Am 'i-2: c -move-> d, s -move-> t'
93 $ hg ci -Am 'i-2: c -move-> d, s -move-> t'
94 $ hg log -G
94 $ hg log -G
95 @ i-2: c -move-> d, s -move-> t
95 @ i-2: c -move-> d, s -move-> t
96 |
96 |
97 o i-1: a -move-> c, p -move-> s
97 o i-1: a -move-> c, p -move-> s
98 |
98 |
99 o i-0 initial commit: a b h p q r
99 o i-0 initial commit: a b h p q r
100
100
101
101
102 And having another branch with renames on the other side
102 And having another branch with renames on the other side
103
103
104 $ hg mv d e
104 $ hg mv d e
105 $ hg ci -Am 'a-1: d -move-> e'
105 $ hg ci -Am 'a-1: d -move-> e'
106 $ hg mv e f
106 $ hg mv e f
107 $ hg ci -Am 'a-2: e -move-> f'
107 $ hg ci -Am 'a-2: e -move-> f'
108 $ hg log -G --rev '::.'
108 $ hg log -G --rev '::.'
109 @ a-2: e -move-> f
109 @ a-2: e -move-> f
110 |
110 |
111 o a-1: d -move-> e
111 o a-1: d -move-> e
112 |
112 |
113 o i-2: c -move-> d, s -move-> t
113 o i-2: c -move-> d, s -move-> t
114 |
114 |
115 o i-1: a -move-> c, p -move-> s
115 o i-1: a -move-> c, p -move-> s
116 |
116 |
117 o i-0 initial commit: a b h p q r
117 o i-0 initial commit: a b h p q r
118
118
119
119
120 Have a branching with nothing on one side
120 Have a branching with nothing on one side
121
121
122 $ hg up 'desc("i-2")'
122 $ hg up 'desc("i-2")'
123 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
123 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
124 $ echo foo > b
124 $ echo foo > b
125 $ hg ci -m 'b-1: b update'
125 $ hg ci -m 'b-1: b update'
126 created new head
126 created new head
127 $ hg log -G --rev '::.'
127 $ hg log -G --rev '::.'
128 @ b-1: b update
128 @ b-1: b update
129 |
129 |
130 o i-2: c -move-> d, s -move-> t
130 o i-2: c -move-> d, s -move-> t
131 |
131 |
132 o i-1: a -move-> c, p -move-> s
132 o i-1: a -move-> c, p -move-> s
133 |
133 |
134 o i-0 initial commit: a b h p q r
134 o i-0 initial commit: a b h p q r
135
135
136
136
137 Create a branch that delete a file previous renamed
137 Create a branch that delete a file previous renamed
138
138
139 $ hg up 'desc("i-2")'
139 $ hg up 'desc("i-2")'
140 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
140 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
141 $ hg rm d
141 $ hg rm d
142 $ hg ci -m 'c-1 delete d'
142 $ hg ci -m 'c-1 delete d'
143 created new head
143 created new head
144 $ hg log -G --rev '::.'
144 $ hg log -G --rev '::.'
145 @ c-1 delete d
145 @ c-1 delete d
146 |
146 |
147 o i-2: c -move-> d, s -move-> t
147 o i-2: c -move-> d, s -move-> t
148 |
148 |
149 o i-1: a -move-> c, p -move-> s
149 o i-1: a -move-> c, p -move-> s
150 |
150 |
151 o i-0 initial commit: a b h p q r
151 o i-0 initial commit: a b h p q r
152
152
153
153
154 Create a branch that delete a file previous renamed and recreate it
154 Create a branch that delete a file previous renamed and recreate it
155
155
156 $ hg up 'desc("i-2")'
156 $ hg up 'desc("i-2")'
157 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
157 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
158 $ hg rm d
158 $ hg rm d
159 $ hg ci -m 'd-1 delete d'
159 $ hg ci -m 'd-1 delete d'
160 created new head
160 created new head
161 $ echo bar > d
161 $ echo bar > d
162 $ hg add d
162 $ hg add d
163 $ hg ci -m 'd-2 re-add d'
163 $ hg ci -m 'd-2 re-add d'
164 $ hg log -G --rev '::.'
164 $ hg log -G --rev '::.'
165 @ d-2 re-add d
165 @ d-2 re-add d
166 |
166 |
167 o d-1 delete d
167 o d-1 delete d
168 |
168 |
169 o i-2: c -move-> d, s -move-> t
169 o i-2: c -move-> d, s -move-> t
170 |
170 |
171 o i-1: a -move-> c, p -move-> s
171 o i-1: a -move-> c, p -move-> s
172 |
172 |
173 o i-0 initial commit: a b h p q r
173 o i-0 initial commit: a b h p q r
174
174
175
175
176 Having another branch renaming a different file to the same filename as another
176 Having another branch renaming a different file to the same filename as another
177
177
178 $ hg up 'desc("i-2")'
178 $ hg up 'desc("i-2")'
179 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
179 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
180 $ hg mv b g
180 $ hg mv b g
181 $ hg ci -m 'e-1 b -move-> g'
181 $ hg ci -m 'e-1 b -move-> g'
182 created new head
182 created new head
183 $ hg mv g f
183 $ hg mv g f
184 $ hg ci -m 'e-2 g -move-> f'
184 $ hg ci -m 'e-2 g -move-> f'
185 $ hg log -G --rev '::.'
185 $ hg log -G --rev '::.'
186 @ e-2 g -move-> f
186 @ e-2 g -move-> f
187 |
187 |
188 o e-1 b -move-> g
188 o e-1 b -move-> g
189 |
189 |
190 o i-2: c -move-> d, s -move-> t
190 o i-2: c -move-> d, s -move-> t
191 |
191 |
192 o i-1: a -move-> c, p -move-> s
192 o i-1: a -move-> c, p -move-> s
193 |
193 |
194 o i-0 initial commit: a b h p q r
194 o i-0 initial commit: a b h p q r
195
195
196 $ hg up -q null
196 $ hg up -q null
197
197
198 Having a branch similar to the 'a' one, but moving the 'p' file around.
198 Having a branch similar to the 'a' one, but moving the 'p' file around.
199
199
200 $ hg up 'desc("i-2")'
200 $ hg up 'desc("i-2")'
201 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
201 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
202 $ hg mv t u
202 $ hg mv t u
203 $ hg ci -Am 'p-1: t -move-> u'
203 $ hg ci -Am 'p-1: t -move-> u'
204 created new head
204 created new head
205 $ hg mv u v
205 $ hg mv u v
206 $ hg ci -Am 'p-2: u -move-> v'
206 $ hg ci -Am 'p-2: u -move-> v'
207 $ hg log -G --rev '::.'
207 $ hg log -G --rev '::.'
208 @ p-2: u -move-> v
208 @ p-2: u -move-> v
209 |
209 |
210 o p-1: t -move-> u
210 o p-1: t -move-> u
211 |
211 |
212 o i-2: c -move-> d, s -move-> t
212 o i-2: c -move-> d, s -move-> t
213 |
213 |
214 o i-1: a -move-> c, p -move-> s
214 o i-1: a -move-> c, p -move-> s
215 |
215 |
216 o i-0 initial commit: a b h p q r
216 o i-0 initial commit: a b h p q r
217
217
218 $ hg up -q null
218 $ hg up -q null
219
219
220 Having another branch renaming a different file to the same filename as another
220 Having another branch renaming a different file to the same filename as another
221
221
222 $ hg up 'desc("i-2")'
222 $ hg up 'desc("i-2")'
223 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
223 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
224 $ hg mv r w
224 $ hg mv r w
225 $ hg ci -m 'q-1 r -move-> w'
225 $ hg ci -m 'q-1 r -move-> w'
226 created new head
226 created new head
227 $ hg mv w v
227 $ hg mv w v
228 $ hg ci -m 'q-2 w -move-> v'
228 $ hg ci -m 'q-2 w -move-> v'
229 $ hg log -G --rev '::.'
229 $ hg log -G --rev '::.'
230 @ q-2 w -move-> v
230 @ q-2 w -move-> v
231 |
231 |
232 o q-1 r -move-> w
232 o q-1 r -move-> w
233 |
233 |
234 o i-2: c -move-> d, s -move-> t
234 o i-2: c -move-> d, s -move-> t
235 |
235 |
236 o i-1: a -move-> c, p -move-> s
236 o i-1: a -move-> c, p -move-> s
237 |
237 |
238 o i-0 initial commit: a b h p q r
238 o i-0 initial commit: a b h p q r
239
239
240 $ hg up -q null
240 $ hg up -q null
241
241
242 Setup all merge
242 Setup all merge
243 ===============
243 ===============
244
244
245 This is done beforehand to validate that the upgrade process creates valid copy
245 This is done beforehand to validate that the upgrade process creates valid copy
246 information.
246 information.
247
247
248 merging with unrelated change does not interfere with the renames
248 merging with unrelated change does not interfere with the renames
249 ---------------------------------------------------------------
249 ---------------------------------------------------------------
250
250
251 - rename on one side
251 - rename on one side
252 - unrelated change on the other side
252 - unrelated change on the other side
253
253
254 $ case_desc="simple merge - A side: multiple renames, B side: unrelated update"
254 $ case_desc="simple merge - A side: multiple renames, B side: unrelated update"
255
255
256 $ hg up 'desc("b-1")'
256 $ hg up 'desc("b-1")'
257 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
257 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
258 $ hg merge 'desc("a-2")'
258 $ hg merge 'desc("a-2")'
259 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
259 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
260 (branch merge, don't forget to commit)
260 (branch merge, don't forget to commit)
261 $ hg ci -m "mBAm-0 $case_desc - one way"
261 $ hg ci -m "mBAm-0 $case_desc - one way"
262 $ hg up 'desc("a-2")'
262 $ hg up 'desc("a-2")'
263 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
263 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
264 $ hg merge 'desc("b-1")'
264 $ hg merge 'desc("b-1")'
265 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
265 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
266 (branch merge, don't forget to commit)
266 (branch merge, don't forget to commit)
267 $ hg ci -m "mABm-0 $case_desc - the other way"
267 $ hg ci -m "mABm-0 $case_desc - the other way"
268 created new head
268 created new head
269 $ hg log -G --rev '::(desc("mABm")+desc("mBAm"))'
269 $ hg log -G --rev '::(desc("mABm")+desc("mBAm"))'
270 @ mABm-0 simple merge - A side: multiple renames, B side: unrelated update - the other way
270 @ mABm-0 simple merge - A side: multiple renames, B side: unrelated update - the other way
271 |\
271 |\
272 +---o mBAm-0 simple merge - A side: multiple renames, B side: unrelated update - one way
272 +---o mBAm-0 simple merge - A side: multiple renames, B side: unrelated update - one way
273 | |/
273 | |/
274 | o b-1: b update
274 | o b-1: b update
275 | |
275 | |
276 o | a-2: e -move-> f
276 o | a-2: e -move-> f
277 | |
277 | |
278 o | a-1: d -move-> e
278 o | a-1: d -move-> e
279 |/
279 |/
280 o i-2: c -move-> d, s -move-> t
280 o i-2: c -move-> d, s -move-> t
281 |
281 |
282 o i-1: a -move-> c, p -move-> s
282 o i-1: a -move-> c, p -move-> s
283 |
283 |
284 o i-0 initial commit: a b h p q r
284 o i-0 initial commit: a b h p q r
285
285
286
286
287
287
288 merging with the side having a delete
288 merging with the side having a delete
289 -------------------------------------
289 -------------------------------------
290
290
291 case summary:
291 case summary:
292 - one with change to an unrelated file
292 - one with change to an unrelated file
293 - one deleting the change
293 - one deleting the change
294 and recreate an unrelated file after the merge
294 and recreate an unrelated file after the merge
295
295
296 $ case_desc="simple merge - C side: delete a file with copies history , B side: unrelated update"
296 $ case_desc="simple merge - C side: delete a file with copies history , B side: unrelated update"
297
297
298 $ hg up 'desc("b-1")'
298 $ hg up 'desc("b-1")'
299 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
299 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
300 $ hg merge 'desc("c-1")'
300 $ hg merge 'desc("c-1")'
301 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
301 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
302 (branch merge, don't forget to commit)
302 (branch merge, don't forget to commit)
303 $ hg ci -m "mBCm-0 $case_desc - one way"
303 $ hg ci -m "mBCm-0 $case_desc - one way"
304 $ echo bar > d
304 $ echo bar > d
305 $ hg add d
305 $ hg add d
306 $ hg ci -m 'mBCm-1 re-add d'
306 $ hg ci -m 'mBCm-1 re-add d'
307 $ hg up 'desc("c-1")'
307 $ hg up 'desc("c-1")'
308 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
308 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
309 $ hg merge 'desc("b-1")'
309 $ hg merge 'desc("b-1")'
310 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
310 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
311 (branch merge, don't forget to commit)
311 (branch merge, don't forget to commit)
312 $ hg ci -m "mCBm-0 $case_desc - the other way"
312 $ hg ci -m "mCBm-0 $case_desc - the other way"
313 created new head
313 created new head
314 $ echo bar > d
314 $ echo bar > d
315 $ hg add d
315 $ hg add d
316 $ hg ci -m 'mCBm-1 re-add d'
316 $ hg ci -m 'mCBm-1 re-add d'
317 $ hg log -G --rev '::(desc("mCBm")+desc("mBCm"))'
317 $ hg log -G --rev '::(desc("mCBm")+desc("mBCm"))'
318 @ mCBm-1 re-add d
318 @ mCBm-1 re-add d
319 |
319 |
320 o mCBm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - the other way
320 o mCBm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - the other way
321 |\
321 |\
322 | | o mBCm-1 re-add d
322 | | o mBCm-1 re-add d
323 | | |
323 | | |
324 +---o mBCm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - one way
324 +---o mBCm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - one way
325 | |/
325 | |/
326 | o c-1 delete d
326 | o c-1 delete d
327 | |
327 | |
328 o | b-1: b update
328 o | b-1: b update
329 |/
329 |/
330 o i-2: c -move-> d, s -move-> t
330 o i-2: c -move-> d, s -move-> t
331 |
331 |
332 o i-1: a -move-> c, p -move-> s
332 o i-1: a -move-> c, p -move-> s
333 |
333 |
334 o i-0 initial commit: a b h p q r
334 o i-0 initial commit: a b h p q r
335
335
336
336
337 Comparing with a merge re-adding the file afterward
337 Comparing with a merge re-adding the file afterward
338 ---------------------------------------------------
338 ---------------------------------------------------
339
339
340 Merge:
340 Merge:
341 - one with change to an unrelated file
341 - one with change to an unrelated file
342 - one deleting and recreating the change
342 - one deleting and recreating the change
343
343
344 $ case_desc="simple merge - B side: unrelated update, D side: delete and recreate a file (with different content)"
344 $ case_desc="simple merge - B side: unrelated update, D side: delete and recreate a file (with different content)"
345
345
346 $ hg up 'desc("b-1")'
346 $ hg up 'desc("b-1")'
347 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
347 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
348 $ hg merge 'desc("d-2")'
348 $ hg merge 'desc("d-2")'
349 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
349 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
350 (branch merge, don't forget to commit)
350 (branch merge, don't forget to commit)
351 $ hg ci -m "mBDm-0 $case_desc - one way"
351 $ hg ci -m "mBDm-0 $case_desc - one way"
352 $ hg up 'desc("d-2")'
352 $ hg up 'desc("d-2")'
353 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
353 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
354 $ hg merge 'desc("b-1")'
354 $ hg merge 'desc("b-1")'
355 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
355 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
356 (branch merge, don't forget to commit)
356 (branch merge, don't forget to commit)
357 $ hg ci -m "mDBm-0 $case_desc - the other way"
357 $ hg ci -m "mDBm-0 $case_desc - the other way"
358 created new head
358 created new head
359 $ hg log -G --rev '::(desc("mDBm")+desc("mBDm"))'
359 $ hg log -G --rev '::(desc("mDBm")+desc("mBDm"))'
360 @ mDBm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - the other way
360 @ mDBm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - the other way
361 |\
361 |\
362 +---o mBDm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - one way
362 +---o mBDm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - one way
363 | |/
363 | |/
364 | o d-2 re-add d
364 | o d-2 re-add d
365 | |
365 | |
366 | o d-1 delete d
366 | o d-1 delete d
367 | |
367 | |
368 o | b-1: b update
368 o | b-1: b update
369 |/
369 |/
370 o i-2: c -move-> d, s -move-> t
370 o i-2: c -move-> d, s -move-> t
371 |
371 |
372 o i-1: a -move-> c, p -move-> s
372 o i-1: a -move-> c, p -move-> s
373 |
373 |
374 o i-0 initial commit: a b h p q r
374 o i-0 initial commit: a b h p q r
375
375
376
376
377
377
378 Comparing with a merge with colliding rename
378 Comparing with a merge with colliding rename
379 --------------------------------------------
379 --------------------------------------------
380
380
381 Subcase: new copy information on both side
381 Subcase: new copy information on both side
382 ``````````````````````````````````````````
382 ``````````````````````````````````````````
383
383
384 - the "e-" branch renaming b to f (through 'g')
384 - the "e-" branch renaming b to f (through 'g')
385 - the "a-" branch renaming d to f (through e)
385 - the "a-" branch renaming d to f (through e)
386
386
387 $ case_desc="merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f)"
387 $ case_desc="merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f)"
388
388
389 $ hg up 'desc("a-2")'
389 $ hg up 'desc("a-2")'
390 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
390 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
391 $ hg merge 'desc("e-2")'
391 $ hg merge 'desc("e-2")'
392 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
392 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
393 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
393 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
394 (branch merge, don't forget to commit)
394 (branch merge, don't forget to commit)
395 $ hg ci -m "mAEm-0 $case_desc - one way"
395 $ hg ci -m "mAEm-0 $case_desc - one way"
396 $ hg up 'desc("e-2")'
396 $ hg up 'desc("e-2")'
397 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
397 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
398 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
398 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
399 $ hg merge 'desc("a-2")'
399 $ hg merge 'desc("a-2")'
400 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
400 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
401 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
401 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
402 (branch merge, don't forget to commit)
402 (branch merge, don't forget to commit)
403 $ hg ci -m "mEAm-0 $case_desc - the other way"
403 $ hg ci -m "mEAm-0 $case_desc - the other way"
404 created new head
404 created new head
405 $ hg log -G --rev '::(desc("mAEm")+desc("mEAm"))'
405 $ hg log -G --rev '::(desc("mAEm")+desc("mEAm"))'
406 @ mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
406 @ mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
407 |\
407 |\
408 +---o mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
408 +---o mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
409 | |/
409 | |/
410 | o e-2 g -move-> f
410 | o e-2 g -move-> f
411 | |
411 | |
412 | o e-1 b -move-> g
412 | o e-1 b -move-> g
413 | |
413 | |
414 o | a-2: e -move-> f
414 o | a-2: e -move-> f
415 | |
415 | |
416 o | a-1: d -move-> e
416 o | a-1: d -move-> e
417 |/
417 |/
418 o i-2: c -move-> d, s -move-> t
418 o i-2: c -move-> d, s -move-> t
419 |
419 |
420 o i-1: a -move-> c, p -move-> s
420 o i-1: a -move-> c, p -move-> s
421 |
421 |
422 o i-0 initial commit: a b h p q r
422 o i-0 initial commit: a b h p q r
423
423
424
424
425 Subcase: new copy information on both side with an actual merge happening
425 Subcase: new copy information on both side with an actual merge happening
426 `````````````````````````````````````````````````````````````````````````
426 `````````````````````````````````````````````````````````````````````````
427
427
428 - the "p-" branch renaming 't' to 'v' (through 'u')
428 - the "p-" branch renaming 't' to 'v' (through 'u')
429 - the "q-" branch renaming 'r' to 'v' (through 'w')
429 - the "q-" branch renaming 'r' to 'v' (through 'w')
430
430
431 $ case_desc="merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content)"
431 $ case_desc="merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content)"
432
432
433 $ hg up 'desc("p-2")'
433 $ hg up 'desc("p-2")'
434 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
434 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
435 $ hg merge 'desc("q-2")' --tool ':union'
435 $ hg merge 'desc("q-2")' --tool ':union'
436 merging v
436 merging v
437 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
437 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
438 (branch merge, don't forget to commit)
438 (branch merge, don't forget to commit)
439 $ hg ci -m "mPQm-0 $case_desc - one way"
439 $ hg ci -m "mPQm-0 $case_desc - one way"
440 $ hg up 'desc("q-2")'
440 $ hg up 'desc("q-2")'
441 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
441 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
442 $ hg merge 'desc("p-2")' --tool ':union'
442 $ hg merge 'desc("p-2")' --tool ':union'
443 merging v
443 merging v
444 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
444 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
445 (branch merge, don't forget to commit)
445 (branch merge, don't forget to commit)
446 $ hg ci -m "mQPm-0 $case_desc - the other way"
446 $ hg ci -m "mQPm-0 $case_desc - the other way"
447 created new head
447 created new head
448 $ hg log -G --rev '::(desc("mAEm")+desc("mEAm"))'
448 $ hg log -G --rev '::(desc("mAEm")+desc("mEAm"))'
449 o mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
449 o mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
450 |\
450 |\
451 +---o mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
451 +---o mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
452 | |/
452 | |/
453 | o e-2 g -move-> f
453 | o e-2 g -move-> f
454 | |
454 | |
455 | o e-1 b -move-> g
455 | o e-1 b -move-> g
456 | |
456 | |
457 o | a-2: e -move-> f
457 o | a-2: e -move-> f
458 | |
458 | |
459 o | a-1: d -move-> e
459 o | a-1: d -move-> e
460 |/
460 |/
461 o i-2: c -move-> d, s -move-> t
461 o i-2: c -move-> d, s -move-> t
462 |
462 |
463 o i-1: a -move-> c, p -move-> s
463 o i-1: a -move-> c, p -move-> s
464 |
464 |
465 o i-0 initial commit: a b h p q r
465 o i-0 initial commit: a b h p q r
466
466
467
467
468 Subcase: existing copy information overwritten on one branch
468 Subcase: existing copy information overwritten on one branch
469 ````````````````````````````````````````````````````````````
469 ````````````````````````````````````````````````````````````
470
470
471 Merge:
471 Merge:
472 - one with change to an unrelated file (b)
472 - one with change to an unrelated file (b)
473 - one overwriting a file (d) with a rename (from h to i to d)
473 - one overwriting a file (d) with a rename (from h to i to d)
474
474
475 $ case_desc="simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d)"
475 $ case_desc="simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d)"
476
476
477 $ hg up 'desc("i-2")'
477 $ hg up 'desc("i-2")'
478 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
478 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
479 $ hg mv h i
479 $ hg mv h i
480 $ hg commit -m "f-1: rename h -> i"
480 $ hg commit -m "f-1: rename h -> i"
481 created new head
481 created new head
482 $ hg mv --force i d
482 $ hg mv --force i d
483 $ hg commit -m "f-2: rename i -> d"
483 $ hg commit -m "f-2: rename i -> d"
484 $ hg debugindex d | ../no-linkrev
484 $ hg debugindex d | ../no-linkrev
485 rev linkrev nodeid p1 p2
485 rev linkrev nodeid p1 p2
486 0 * d8252ab2e760 000000000000 000000000000 (no-changeset !)
486 0 * d8252ab2e760 000000000000 000000000000 (no-changeset !)
487 0 * ae258f702dfe 000000000000 000000000000 (changeset !)
487 0 * ae258f702dfe 000000000000 000000000000 (changeset !)
488 1 * b004912a8510 000000000000 000000000000
488 1 * b004912a8510 000000000000 000000000000
489 2 * 7b79e2fe0c89 000000000000 000000000000 (no-changeset !)
489 2 * 7b79e2fe0c89 000000000000 000000000000 (no-changeset !)
490 $ hg up 'desc("b-1")'
490 $ hg up 'desc("b-1")'
491 3 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
491 3 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
492 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
492 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
493 $ hg merge 'desc("f-2")'
493 $ hg merge 'desc("f-2")'
494 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
494 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
495 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
495 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
496 (branch merge, don't forget to commit)
496 (branch merge, don't forget to commit)
497 $ hg ci -m "mBFm-0 $case_desc - one way"
497 $ hg ci -m "mBFm-0 $case_desc - one way"
498 $ hg up 'desc("f-2")'
498 $ hg up 'desc("f-2")'
499 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
499 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
500 $ hg merge 'desc("b-1")'
500 $ hg merge 'desc("b-1")'
501 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
501 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
502 (branch merge, don't forget to commit)
502 (branch merge, don't forget to commit)
503 $ hg ci -m "mFBm-0 $case_desc - the other way"
503 $ hg ci -m "mFBm-0 $case_desc - the other way"
504 created new head
504 created new head
505 $ hg up null --quiet
505 $ hg up null --quiet
506 $ hg log -G --rev '::(desc("mBFm")+desc("mFBm"))'
506 $ hg log -G --rev '::(desc("mBFm")+desc("mFBm"))'
507 o mFBm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
507 o mFBm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
508 |\
508 |\
509 +---o mBFm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
509 +---o mBFm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
510 | |/
510 | |/
511 | o f-2: rename i -> d
511 | o f-2: rename i -> d
512 | |
512 | |
513 | o f-1: rename h -> i
513 | o f-1: rename h -> i
514 | |
514 | |
515 o | b-1: b update
515 o | b-1: b update
516 |/
516 |/
517 o i-2: c -move-> d, s -move-> t
517 o i-2: c -move-> d, s -move-> t
518 |
518 |
519 o i-1: a -move-> c, p -move-> s
519 o i-1: a -move-> c, p -move-> s
520 |
520 |
521 o i-0 initial commit: a b h p q r
521 o i-0 initial commit: a b h p q r
522
522
523
523
524 Subcase: existing copy information overwritten on one branch, with different content)
524 Subcase: existing copy information overwritten on one branch, with different content)
525 `````````````````````````````````````````````````````````````````````````````````````
525 `````````````````````````````````````````````````````````````````````````````````````
526
526
527 Merge:
527 Merge:
528 - one with change to an unrelated file (b)
528 - one with change to an unrelated file (b)
529 - one overwriting a file (t) with a rename (from r to x to t), v content is not the same as on the other branch
529 - one overwriting a file (t) with a rename (from r to x to t), v content is not the same as on the other branch
530
530
531 $ case_desc="simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content"
531 $ case_desc="simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content"
532
532
533 $ hg up 'desc("i-2")'
533 $ hg up 'desc("i-2")'
534 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
534 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
535 $ hg mv r x
535 $ hg mv r x
536 $ hg commit -m "r-1: rename r -> x"
536 $ hg commit -m "r-1: rename r -> x"
537 created new head
537 created new head
538 $ hg mv --force x t
538 $ hg mv --force x t
539 $ hg commit -m "r-2: rename t -> x"
539 $ hg commit -m "r-2: rename t -> x"
540 $ hg debugindex t | ../no-linkrev
540 $ hg debugindex t | ../no-linkrev
541 rev linkrev nodeid p1 p2
541 rev linkrev nodeid p1 p2
542 0 * d74efbf65309 000000000000 000000000000 (no-changeset !)
542 0 * d74efbf65309 000000000000 000000000000 (no-changeset !)
543 1 * 02a930b9d7ad 000000000000 000000000000 (no-changeset !)
543 1 * 02a930b9d7ad 000000000000 000000000000 (no-changeset !)
544 0 * 5aed6a8dbff0 000000000000 000000000000 (changeset !)
544 0 * 5aed6a8dbff0 000000000000 000000000000 (changeset !)
545 1 * a38b2fa17021 000000000000 000000000000 (changeset !)
545 1 * a38b2fa17021 000000000000 000000000000 (changeset !)
546 $ hg up 'desc("b-1")'
546 $ hg up 'desc("b-1")'
547 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
547 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
548 $ hg merge 'desc("r-2")'
548 $ hg merge 'desc("r-2")'
549 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
549 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
550 (branch merge, don't forget to commit)
550 (branch merge, don't forget to commit)
551 $ hg ci -m "mBRm-0 $case_desc - one way"
551 $ hg ci -m "mBRm-0 $case_desc - one way"
552 $ hg up 'desc("r-2")'
552 $ hg up 'desc("r-2")'
553 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
553 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
554 $ hg merge 'desc("b-1")'
554 $ hg merge 'desc("b-1")'
555 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
555 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
556 (branch merge, don't forget to commit)
556 (branch merge, don't forget to commit)
557 $ hg ci -m "mRBm-0 $case_desc - the other way"
557 $ hg ci -m "mRBm-0 $case_desc - the other way"
558 created new head
558 created new head
559 $ hg up null --quiet
559 $ hg up null --quiet
560 $ hg log -G --rev '::(desc("mBRm")+desc("mRBm"))'
560 $ hg log -G --rev '::(desc("mBRm")+desc("mRBm"))'
561 o mRBm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - the other way
561 o mRBm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - the other way
562 |\
562 |\
563 +---o mBRm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - one way
563 +---o mBRm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - one way
564 | |/
564 | |/
565 | o r-2: rename t -> x
565 | o r-2: rename t -> x
566 | |
566 | |
567 | o r-1: rename r -> x
567 | o r-1: rename r -> x
568 | |
568 | |
569 o | b-1: b update
569 o | b-1: b update
570 |/
570 |/
571 o i-2: c -move-> d, s -move-> t
571 o i-2: c -move-> d, s -move-> t
572 |
572 |
573 o i-1: a -move-> c, p -move-> s
573 o i-1: a -move-> c, p -move-> s
574 |
574 |
575 o i-0 initial commit: a b h p q r
575 o i-0 initial commit: a b h p q r
576
576
577
577
578
578
579 Subcase: reset of the copy history on one side
579 Subcase: reset of the copy history on one side
580 ``````````````````````````````````````````````
580 ``````````````````````````````````````````````
581
581
582 Merge:
582 Merge:
583 - one with change to a file
583 - one with change to a file
584 - one deleting and recreating the file
584 - one deleting and recreating the file
585
585
586 Unlike in the 'BD/DB' cases, an actual merge happened here. So we should
586 Unlike in the 'BD/DB' cases, an actual merge happened here. So we should
587 consider history and rename on both branch of the merge.
587 consider history and rename on both branch of the merge.
588
588
589 $ case_desc="actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content"
589 $ case_desc="actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content"
590
590
591 $ hg up 'desc("i-2")'
591 $ hg up 'desc("i-2")'
592 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
592 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
593 $ echo "some update" >> d
593 $ echo "some update" >> d
594 $ hg commit -m "g-1: update d"
594 $ hg commit -m "g-1: update d"
595 created new head
595 created new head
596 $ hg up 'desc("d-2")'
596 $ hg up 'desc("d-2")'
597 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
597 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
598 $ hg merge 'desc("g-1")' --tool :union
598 $ hg merge 'desc("g-1")' --tool :union
599 merging d
599 merging d
600 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
600 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
601 (branch merge, don't forget to commit)
601 (branch merge, don't forget to commit)
602 $ hg ci -m "mDGm-0 $case_desc - one way"
602 $ hg ci -m "mDGm-0 $case_desc - one way"
603 $ hg up 'desc("g-1")'
603 $ hg up 'desc("g-1")'
604 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
604 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
605 $ hg merge 'desc("d-2")' --tool :union
605 $ hg merge 'desc("d-2")' --tool :union
606 merging d
606 merging d
607 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
607 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
608 (branch merge, don't forget to commit)
608 (branch merge, don't forget to commit)
609 $ hg ci -m "mGDm-0 $case_desc - the other way"
609 $ hg ci -m "mGDm-0 $case_desc - the other way"
610 created new head
610 created new head
611 $ hg log -G --rev '::(desc("mDGm")+desc("mGDm"))'
611 $ hg log -G --rev '::(desc("mDGm")+desc("mGDm"))'
612 @ mGDm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - the other way
612 @ mGDm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - the other way
613 |\
613 |\
614 +---o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
614 +---o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
615 | |/
615 | |/
616 | o g-1: update d
616 | o g-1: update d
617 | |
617 | |
618 o | d-2 re-add d
618 o | d-2 re-add d
619 | |
619 | |
620 o | d-1 delete d
620 o | d-1 delete d
621 |/
621 |/
622 o i-2: c -move-> d, s -move-> t
622 o i-2: c -move-> d, s -move-> t
623 |
623 |
624 o i-1: a -move-> c, p -move-> s
624 o i-1: a -move-> c, p -move-> s
625 |
625 |
626 o i-0 initial commit: a b h p q r
626 o i-0 initial commit: a b h p q r
627
627
628
628
629 Subcase: merging a change to a file with a "copy overwrite" to that file from another branch
629 Subcase: merging a change to a file with a "copy overwrite" to that file from another branch
630 ````````````````````````````````````````````````````````````````````````````````````````````
630 ````````````````````````````````````````````````````````````````````````````````````````````
631
631
632 Merge:
632 Merge:
633 - one with change to a file (d)
633 - one with change to a file (d)
634 - one overwriting that file with a rename (from h to i, to d)
634 - one overwriting that file with a rename (from h to i, to d)
635
635
636 This case is similar to BF/FB, but an actual merge happens, so both side of the
636 This case is similar to BF/FB, but an actual merge happens, so both side of the
637 history are relevant.
637 history are relevant.
638
638
639 Note:
639 Note:
640 | In this case, the merge get conflicting information since on one side we have
640 | In this case, the merge get conflicting information since on one side we have
641 | "a -> c -> d". and one the other one we have "h -> i -> d".
641 | "a -> c -> d". and one the other one we have "h -> i -> d".
642 |
642 |
643 | The current code arbitrarily pick one side
643 | The current code arbitrarily pick one side
644
644
645 $ case_desc="merge - G side: content change, F side: copy overwrite, no content change"
645 $ case_desc="merge - G side: content change, F side: copy overwrite, no content change"
646
646
647 $ hg up 'desc("f-2")'
647 $ hg up 'desc("f-2")'
648 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
648 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
649 $ hg merge 'desc("g-1")' --tool :union
649 $ hg merge 'desc("g-1")' --tool :union
650 merging d (no-changeset !)
650 merging d (no-changeset !)
651 0 files updated, 1 files merged, 0 files removed, 0 files unresolved (no-changeset !)
651 0 files updated, 1 files merged, 0 files removed, 0 files unresolved (no-changeset !)
652 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
652 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
653 (branch merge, don't forget to commit)
653 (branch merge, don't forget to commit)
654 $ hg ci -m "mFGm-0 $case_desc - one way"
654 $ hg ci -m "mFGm-0 $case_desc - one way"
655 created new head
655 created new head
656 $ hg up 'desc("g-1")'
656 $ hg up 'desc("g-1")'
657 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
657 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
658 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
658 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
659 $ hg merge 'desc("f-2")' --tool :union
659 $ hg merge 'desc("f-2")' --tool :union
660 merging d (no-changeset !)
660 merging d (no-changeset !)
661 0 files updated, 1 files merged, 1 files removed, 0 files unresolved (no-changeset !)
661 0 files updated, 1 files merged, 1 files removed, 0 files unresolved (no-changeset !)
662 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
662 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
663 (branch merge, don't forget to commit)
663 (branch merge, don't forget to commit)
664 $ hg ci -m "mGFm-0 $case_desc - the other way"
664 $ hg ci -m "mGFm-0 $case_desc - the other way"
665 created new head
665 created new head
666 $ hg log -G --rev '::(desc("mGFm")+desc("mFGm"))'
666 $ hg log -G --rev '::(desc("mGFm")+desc("mFGm"))'
667 @ mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
667 @ mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
668 |\
668 |\
669 +---o mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
669 +---o mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
670 | |/
670 | |/
671 | o g-1: update d
671 | o g-1: update d
672 | |
672 | |
673 o | f-2: rename i -> d
673 o | f-2: rename i -> d
674 | |
674 | |
675 o | f-1: rename h -> i
675 o | f-1: rename h -> i
676 |/
676 |/
677 o i-2: c -move-> d, s -move-> t
677 o i-2: c -move-> d, s -move-> t
678 |
678 |
679 o i-1: a -move-> c, p -move-> s
679 o i-1: a -move-> c, p -move-> s
680 |
680 |
681 o i-0 initial commit: a b h p q r
681 o i-0 initial commit: a b h p q r
682
682
683
683
684
684
685 Comparing with merging with a deletion (and keeping the file)
685 Comparing with merging with a deletion (and keeping the file)
686 -------------------------------------------------------------
686 -------------------------------------------------------------
687
687
688 Merge:
688 Merge:
689 - one removing a file (d)
689 - one removing a file (d)
690 - one updating that file
690 - one updating that file
691 - the merge keep the modified version of the file (canceling the delete)
691 - the merge keep the modified version of the file (canceling the delete)
692
692
693 In this case, the file keep on living after the merge. So we should not drop its
693 In this case, the file keep on living after the merge. So we should not drop its
694 copy tracing chain.
694 copy tracing chain.
695
695
696 $ case_desc="merge updated/deleted - revive the file (updated content)"
696 $ case_desc="merge updated/deleted - revive the file (updated content)"
697
697
698 $ hg up 'desc("c-1")'
698 $ hg up 'desc("c-1")'
699 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
699 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
700 $ hg merge 'desc("g-1")'
700 $ hg merge 'desc("g-1")'
701 file 'd' was deleted in local [working copy] but was modified in other [merge rev].
701 file 'd' was deleted in local [working copy] but was modified in other [merge rev].
702 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
702 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
703 What do you want to do? u
703 What do you want to do? u
704 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
704 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
705 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
705 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
706 [1]
706 [1]
707 $ hg resolve -t :other d
707 $ hg resolve -t :other d
708 (no more unresolved files)
708 (no more unresolved files)
709 $ hg ci -m "mCGm-0 $case_desc - one way"
709 $ hg ci -m "mCGm-0 $case_desc - one way"
710 created new head
710 created new head
711
711
712 $ hg up 'desc("g-1")'
712 $ hg up 'desc("g-1")'
713 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
713 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
714 $ hg merge 'desc("c-1")'
714 $ hg merge 'desc("c-1")'
715 file 'd' was deleted in other [merge rev] but was modified in local [working copy].
715 file 'd' was deleted in other [merge rev] but was modified in local [working copy].
716 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
716 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
717 What do you want to do? u
717 What do you want to do? u
718 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
718 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
719 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
719 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
720 [1]
720 [1]
721 $ hg resolve -t :local d
721 $ hg resolve -t :local d
722 (no more unresolved files)
722 (no more unresolved files)
723 $ hg ci -m "mGCm-0 $case_desc - the other way"
723 $ hg ci -m "mGCm-0 $case_desc - the other way"
724 created new head
724 created new head
725
725
726 $ hg log -G --rev '::(desc("mCGm")+desc("mGCm"))'
726 $ hg log -G --rev '::(desc("mCGm")+desc("mGCm"))'
727 @ mGCm-0 merge updated/deleted - revive the file (updated content) - the other way
727 @ mGCm-0 merge updated/deleted - revive the file (updated content) - the other way
728 |\
728 |\
729 +---o mCGm-0 merge updated/deleted - revive the file (updated content) - one way
729 +---o mCGm-0 merge updated/deleted - revive the file (updated content) - one way
730 | |/
730 | |/
731 | o g-1: update d
731 | o g-1: update d
732 | |
732 | |
733 o | c-1 delete d
733 o | c-1 delete d
734 |/
734 |/
735 o i-2: c -move-> d, s -move-> t
735 o i-2: c -move-> d, s -move-> t
736 |
736 |
737 o i-1: a -move-> c, p -move-> s
737 o i-1: a -move-> c, p -move-> s
738 |
738 |
739 o i-0 initial commit: a b h p q r
739 o i-0 initial commit: a b h p q r
740
740
741
741
742
742
743
743
744 Comparing with merge restoring an untouched deleted file
744 Comparing with merge restoring an untouched deleted file
745 --------------------------------------------------------
745 --------------------------------------------------------
746
746
747 Merge:
747 Merge:
748 - one removing a file (d)
748 - one removing a file (d)
749 - one leaving the file untouched
749 - one leaving the file untouched
750 - the merge actively restore the file to the same content.
750 - the merge actively restore the file to the same content.
751
751
752 In this case, the file keep on living after the merge. So we should not drop its
752 In this case, the file keep on living after the merge. So we should not drop its
753 copy tracing chain.
753 copy tracing chain.
754
754
755 $ case_desc="merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge)"
755 $ case_desc="merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge)"
756
756
757 $ hg up 'desc("c-1")'
757 $ hg up 'desc("c-1")'
758 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
758 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
759 $ hg merge 'desc("b-1")'
759 $ hg merge 'desc("b-1")'
760 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
760 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
761 (branch merge, don't forget to commit)
761 (branch merge, don't forget to commit)
762 $ hg revert --rev 'desc("b-1")' d
762 $ hg revert --rev 'desc("b-1")' d
763 $ hg ci -m "mCB-revert-m-0 $case_desc - one way"
763 $ hg ci -m "mCB-revert-m-0 $case_desc - one way"
764 created new head
764 created new head
765
765
766 $ hg up 'desc("b-1")'
766 $ hg up 'desc("b-1")'
767 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
767 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
768 $ hg merge 'desc("c-1")'
768 $ hg merge 'desc("c-1")'
769 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
769 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
770 (branch merge, don't forget to commit)
770 (branch merge, don't forget to commit)
771 $ hg revert --rev 'desc("b-1")' d
771 $ hg revert --rev 'desc("b-1")' d
772 $ hg ci -m "mBC-revert-m-0 $case_desc - the other way"
772 $ hg ci -m "mBC-revert-m-0 $case_desc - the other way"
773 created new head
773 created new head
774
774
775 $ hg log -G --rev '::(desc("mCB-revert-m")+desc("mBC-revert-m"))'
775 $ hg log -G --rev '::(desc("mCB-revert-m")+desc("mBC-revert-m"))'
776 @ mBC-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - the other way
776 @ mBC-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - the other way
777 |\
777 |\
778 +---o mCB-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - one way
778 +---o mCB-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - one way
779 | |/
779 | |/
780 | o c-1 delete d
780 | o c-1 delete d
781 | |
781 | |
782 o | b-1: b update
782 o | b-1: b update
783 |/
783 |/
784 o i-2: c -move-> d, s -move-> t
784 o i-2: c -move-> d, s -move-> t
785 |
785 |
786 o i-1: a -move-> c, p -move-> s
786 o i-1: a -move-> c, p -move-> s
787 |
787 |
788 o i-0 initial commit: a b h p q r
788 o i-0 initial commit: a b h p q r
789
789
790
790
791
791
792 $ hg up null --quiet
792 $ hg up null --quiet
793
793
794 Merging a branch where a rename was deleted with a branch where the same file was renamed
794 Merging a branch where a rename was deleted with a branch where the same file was renamed
795 ------------------------------------------------------------------------------------------
795 ------------------------------------------------------------------------------------------
796
796
797 Create a "conflicting" merge where `d` get removed on one branch before its
797 Create a "conflicting" merge where `d` get removed on one branch before its
798 rename information actually conflict with the other branch.
798 rename information actually conflict with the other branch.
799
799
800 (the copy information from the branch that was not deleted should win).
800 (the copy information from the branch that was not deleted should win).
801
801
802 $ case_desc="simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch)"
802 $ case_desc="simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch)"
803
803
804 $ hg up 'desc("i-0")'
804 $ hg up 'desc("i-0")'
805 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
805 6 files updated, 0 files merged, 0 files removed, 0 files unresolved
806 $ hg mv b d
806 $ hg mv b d
807 $ hg ci -m "h-1: b -(move)-> d"
807 $ hg ci -m "h-1: b -(move)-> d"
808 created new head
808 created new head
809
809
810 $ hg up 'desc("c-1")'
810 $ hg up 'desc("c-1")'
811 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
811 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
812 $ hg merge 'desc("h-1")'
812 $ hg merge 'desc("h-1")'
813 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
813 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
814 (branch merge, don't forget to commit)
814 (branch merge, don't forget to commit)
815 $ hg ci -m "mCH-delete-before-conflict-m-0 $case_desc - one way"
815 $ hg ci -m "mCH-delete-before-conflict-m-0 $case_desc - one way"
816
816
817 $ hg up 'desc("h-1")'
817 $ hg up 'desc("h-1")'
818 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
818 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
819 $ hg merge 'desc("c-1")'
819 $ hg merge 'desc("c-1")'
820 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
820 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
821 (branch merge, don't forget to commit)
821 (branch merge, don't forget to commit)
822 $ hg ci -m "mHC-delete-before-conflict-m-0 $case_desc - the other way"
822 $ hg ci -m "mHC-delete-before-conflict-m-0 $case_desc - the other way"
823 created new head
823 created new head
824 $ hg log -G --rev '::(desc("mCH-delete-before-conflict-m")+desc("mHC-delete-before-conflict-m"))'
824 $ hg log -G --rev '::(desc("mCH-delete-before-conflict-m")+desc("mHC-delete-before-conflict-m"))'
825 @ mHC-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - the other way
825 @ mHC-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - the other way
826 |\
826 |\
827 +---o mCH-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - one way
827 +---o mCH-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - one way
828 | |/
828 | |/
829 | o h-1: b -(move)-> d
829 | o h-1: b -(move)-> d
830 | |
830 | |
831 o | c-1 delete d
831 o | c-1 delete d
832 | |
832 | |
833 o | i-2: c -move-> d, s -move-> t
833 o | i-2: c -move-> d, s -move-> t
834 | |
834 | |
835 o | i-1: a -move-> c, p -move-> s
835 o | i-1: a -move-> c, p -move-> s
836 |/
836 |/
837 o i-0 initial commit: a b h p q r
837 o i-0 initial commit: a b h p q r
838
838
839
839
840 Variant of previous with extra changes introduced by the merge
840 Variant of previous with extra changes introduced by the merge
841 --------------------------------------------------------------
841 --------------------------------------------------------------
842
842
843 Multiple cases above explicitely test cases where content are the same on both side during merge. In this section we will introduce variants for theses cases where new change are introduced to these file content during the merges.
843 Multiple cases above explicitely test cases where content are the same on both side during merge. In this section we will introduce variants for theses cases where new change are introduced to these file content during the merges.
844
844
845
845
846 Subcase: merge has same initial content on both side, but merge introduced a change
846 Subcase: merge has same initial content on both side, but merge introduced a change
847 ```````````````````````````````````````````````````````````````````````````````````
847 ```````````````````````````````````````````````````````````````````````````````````
848
848
849 Same as `mAEm` and `mEAm` but with extra change to the file before commiting
849 Same as `mAEm` and `mEAm` but with extra change to the file before commiting
850
850
851 - the "e-" branch renaming b to f (through 'g')
851 - the "e-" branch renaming b to f (through 'g')
852 - the "a-" branch renaming d to f (through e)
852 - the "a-" branch renaming d to f (through e)
853
853
854 $ case_desc="merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent)"
854 $ case_desc="merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent)"
855
855
856 $ hg up 'desc("a-2")'
856 $ hg up 'desc("a-2")'
857 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
857 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
858 $ hg merge 'desc("e-2")'
858 $ hg merge 'desc("e-2")'
859 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
859 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
860 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
860 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
861 (branch merge, don't forget to commit)
861 (branch merge, don't forget to commit)
862 $ echo "content change for mAE-change-m" > f
862 $ echo "content change for mAE-change-m" > f
863 $ hg ci -m "mAE-change-m-0 $case_desc - one way"
863 $ hg ci -m "mAE-change-m-0 $case_desc - one way"
864 created new head
864 created new head
865 $ hg up 'desc("e-2")'
865 $ hg up 'desc("e-2")'
866 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
866 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
867 $ hg merge 'desc("a-2")'
867 $ hg merge 'desc("a-2")'
868 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
868 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
869 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
869 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
870 (branch merge, don't forget to commit)
870 (branch merge, don't forget to commit)
871 $ echo "content change for mEA-change-m" > f
871 $ echo "content change for mEA-change-m" > f
872 $ hg ci -m "mEA-change-m-0 $case_desc - the other way"
872 $ hg ci -m "mEA-change-m-0 $case_desc - the other way"
873 created new head
873 created new head
874 $ hg log -G --rev '::(desc("mAE-change-m")+desc("mEA-change-m"))'
874 $ hg log -G --rev '::(desc("mAE-change-m")+desc("mEA-change-m"))'
875 @ mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way
875 @ mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way
876 |\
876 |\
877 +---o mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way
877 +---o mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way
878 | |/
878 | |/
879 | o e-2 g -move-> f
879 | o e-2 g -move-> f
880 | |
880 | |
881 | o e-1 b -move-> g
881 | o e-1 b -move-> g
882 | |
882 | |
883 o | a-2: e -move-> f
883 o | a-2: e -move-> f
884 | |
884 | |
885 o | a-1: d -move-> e
885 o | a-1: d -move-> e
886 |/
886 |/
887 o i-2: c -move-> d, s -move-> t
887 o i-2: c -move-> d, s -move-> t
888 |
888 |
889 o i-1: a -move-> c, p -move-> s
889 o i-1: a -move-> c, p -move-> s
890 |
890 |
891 o i-0 initial commit: a b h p q r
891 o i-0 initial commit: a b h p q r
892
892
893
893
894 Subcase: merge overwrite common copy information, but with extra change during the merge
895 ````````````````````````````````````````````````````````````````````````````````````````
896
897 Merge:
898 - one with change to an unrelated file (b)
899 - one overwriting a file (d) with a rename (from h to i to d)
900 - the merge update f content
901
902 $ case_desc="merge with extra change - B side: unrelated change, F side: overwrite d with a copy (from h->i->d)"
903
904 $ hg up 'desc("f-2")'
905 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
906 #if no-changeset
907 $ hg debugindex d | ../no-linkrev
908 rev linkrev nodeid p1 p2
909 0 * d8252ab2e760 000000000000 000000000000
910 1 * b004912a8510 000000000000 000000000000
911 2 * 7b79e2fe0c89 000000000000 000000000000
912 3 * 17ec97e60577 d8252ab2e760 000000000000
913 4 * 06dabf50734c b004912a8510 17ec97e60577
914 5 * 19c0e3924691 17ec97e60577 b004912a8510
915 6 * 89c873a01d97 7b79e2fe0c89 17ec97e60577
916 7 * d55cb4e9ef57 000000000000 000000000000
917 #else
918 $ hg debugindex d | ../no-linkrev
919 rev linkrev nodeid p1 p2
920 0 * ae258f702dfe 000000000000 000000000000
921 1 * b004912a8510 000000000000 000000000000
922 2 * 5cce88bf349f ae258f702dfe 000000000000
923 3 * cc269dd788c8 b004912a8510 5cce88bf349f
924 4 * 51c91a115080 5cce88bf349f b004912a8510
925 #endif
926 $ hg up 'desc("b-1")'
927 3 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
928 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
929 $ hg merge 'desc("f-2")'
930 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
931 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
932 (branch merge, don't forget to commit)
933 $ echo "extra-change to (formelly h) during the merge" > d
934 $ hg ci -m "mBF-change-m-0 $case_desc - one way"
935 created new head
936 $ hg manifest --rev . --debug | grep " d"
937 1c334238bd42ec85c6a0d83fd1b2a898a6a3215d 644 d (no-changeset !)
938 cea2d99c0fde64672ef61953786fdff34f16e230 644 d (changeset !)
939
940 $ hg up 'desc("f-2")'
941 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
942 $ hg merge 'desc("b-1")'
943 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
944 (branch merge, don't forget to commit)
945 $ echo "extra-change to (formelly h) during the merge" > d
946 $ hg ci -m "mFB-change-m-0 $case_desc - the other way"
947 created new head
948 $ hg manifest --rev . --debug | grep " d"
949 1c334238bd42ec85c6a0d83fd1b2a898a6a3215d 644 d (no-changeset missing-correct-output !)
950 646ed7992dec41eb29635ab28268e7867d0e59a0 644 d (no-changeset known-bad-output !)
951 cea2d99c0fde64672ef61953786fdff34f16e230 644 d (changeset !)
952 #if no-changeset
953 $ hg debugindex d | ../no-linkrev
954 rev linkrev nodeid p1 p2
955 0 * d8252ab2e760 000000000000 000000000000
956 1 * b004912a8510 000000000000 000000000000
957 2 * 7b79e2fe0c89 000000000000 000000000000
958 3 * 17ec97e60577 d8252ab2e760 000000000000
959 4 * 06dabf50734c b004912a8510 17ec97e60577
960 5 * 19c0e3924691 17ec97e60577 b004912a8510
961 6 * 89c873a01d97 7b79e2fe0c89 17ec97e60577
962 7 * d55cb4e9ef57 000000000000 000000000000
963 8 * 1c334238bd42 7b79e2fe0c89 000000000000
964 9 * 646ed7992dec 7b79e2fe0c89 d8252ab2e760 (known-bad-output !)
965 #else
966 $ hg debugindex d | ../no-linkrev
967 rev linkrev nodeid p1 p2
968 0 * ae258f702dfe 000000000000 000000000000
969 1 * b004912a8510 000000000000 000000000000
970 2 * 5cce88bf349f ae258f702dfe 000000000000
971 3 * cc269dd788c8 b004912a8510 5cce88bf349f
972 4 * 51c91a115080 5cce88bf349f b004912a8510
973 5 * cea2d99c0fde ae258f702dfe 000000000000
974 #endif
975 $ hg log -G --rev '::(desc("mBF-change-m")+desc("mFB-change-m"))'
976 @ mFB-change-m-0 merge with extra change - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
977 |\
978 +---o mBF-change-m-0 merge with extra change - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
979 | |/
980 | o f-2: rename i -> d
981 | |
982 | o f-1: rename h -> i
983 | |
984 o | b-1: b update
985 |/
986 o i-2: c -move-> d, s -move-> t
987 |
988 o i-1: a -move-> c, p -move-> s
989 |
990 o i-0 initial commit: a b h p q r
991
992
894 Decision from previous merge are properly chained with later merge
993 Decision from previous merge are properly chained with later merge
895 ------------------------------------------------------------------
994 ------------------------------------------------------------------
896
995
897 Subcase: chaining conflicting rename resolution
996 Subcase: chaining conflicting rename resolution
898 ```````````````````````````````````````````````
997 ```````````````````````````````````````````````
899
998
900 The "mAEm" and "mEAm" case create a rename tracking conflict on file 'f'. We
999 The "mAEm" and "mEAm" case create a rename tracking conflict on file 'f'. We
901 add more change on the respective branch and merge again. These second merge
1000 add more change on the respective branch and merge again. These second merge
902 does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
1001 does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
903 about that file should stay unchanged.
1002 about that file should stay unchanged.
904
1003
905 $ case_desc="chained merges (conflict -> simple) - same content everywhere"
1004 $ case_desc="chained merges (conflict -> simple) - same content everywhere"
906
1005
907 (extra unrelated changes)
1006 (extra unrelated changes)
908
1007
909 $ hg up 'desc("a-2")'
1008 $ hg up 'desc("a-2")'
910 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1009 3 files updated, 0 files merged, 1 files removed, 0 files unresolved
911 $ echo j > unrelated-j
1010 $ echo j > unrelated-j
912 $ hg add unrelated-j
1011 $ hg add unrelated-j
913 $ hg ci -m 'j-1: unrelated changes (based on the "a" series of changes)'
1012 $ hg ci -m 'j-1: unrelated changes (based on the "a" series of changes)'
914 created new head
1013 created new head
915
1014
916 $ hg up 'desc("e-2")'
1015 $ hg up 'desc("e-2")'
917 2 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
1016 2 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
918 1 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
1017 1 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
919 $ echo k > unrelated-k
1018 $ echo k > unrelated-k
920 $ hg add unrelated-k
1019 $ hg add unrelated-k
921 $ hg ci -m 'k-1: unrelated changes (based on "e" changes)'
1020 $ hg ci -m 'k-1: unrelated changes (based on "e" changes)'
922 created new head
1021 created new head
923
1022
924 (merge variant 1)
1023 (merge variant 1)
925
1024
926 $ hg up 'desc("mAEm")'
1025 $ hg up 'desc("mAEm")'
927 1 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
1026 1 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
928 0 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
1027 0 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
929 $ hg merge 'desc("k-1")'
1028 $ hg merge 'desc("k-1")'
930 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1029 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
931 (branch merge, don't forget to commit)
1030 (branch merge, don't forget to commit)
932 $ hg ci -m "mAE,Km: $case_desc"
1031 $ hg ci -m "mAE,Km: $case_desc"
933
1032
934 (merge variant 2)
1033 (merge variant 2)
935
1034
936 $ hg up 'desc("k-1")'
1035 $ hg up 'desc("k-1")'
937 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
1036 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
938 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
1037 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
939
1038
940 $ hg merge 'desc("mAEm")'
1039 $ hg merge 'desc("mAEm")'
941 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
1040 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
942 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
1041 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
943 (branch merge, don't forget to commit)
1042 (branch merge, don't forget to commit)
944 $ hg ci -m "mK,AEm: $case_desc"
1043 $ hg ci -m "mK,AEm: $case_desc"
945 created new head
1044 created new head
946
1045
947 (merge variant 3)
1046 (merge variant 3)
948
1047
949 $ hg up 'desc("mEAm")'
1048 $ hg up 'desc("mEAm")'
950 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1049 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
951 $ hg merge 'desc("j-1")'
1050 $ hg merge 'desc("j-1")'
952 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1051 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
953 (branch merge, don't forget to commit)
1052 (branch merge, don't forget to commit)
954 $ hg ci -m "mEA,Jm: $case_desc"
1053 $ hg ci -m "mEA,Jm: $case_desc"
955
1054
956 (merge variant 4)
1055 (merge variant 4)
957
1056
958 $ hg up 'desc("j-1")'
1057 $ hg up 'desc("j-1")'
959 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
1058 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
960 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
1059 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
961 $ hg merge 'desc("mEAm")'
1060 $ hg merge 'desc("mEAm")'
962 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
1061 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
963 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
1062 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
964 (branch merge, don't forget to commit)
1063 (branch merge, don't forget to commit)
965 $ hg ci -m "mJ,EAm: $case_desc"
1064 $ hg ci -m "mJ,EAm: $case_desc"
966 created new head
1065 created new head
967
1066
968
1067
969 $ hg log -G --rev '::(desc("mAE,Km") + desc("mK,AEm") + desc("mEA,Jm") + desc("mJ,EAm"))'
1068 $ hg log -G --rev '::(desc("mAE,Km") + desc("mK,AEm") + desc("mEA,Jm") + desc("mJ,EAm"))'
970 @ mJ,EAm: chained merges (conflict -> simple) - same content everywhere
1069 @ mJ,EAm: chained merges (conflict -> simple) - same content everywhere
971 |\
1070 |\
972 +---o mEA,Jm: chained merges (conflict -> simple) - same content everywhere
1071 +---o mEA,Jm: chained merges (conflict -> simple) - same content everywhere
973 | |/
1072 | |/
974 | | o mK,AEm: chained merges (conflict -> simple) - same content everywhere
1073 | | o mK,AEm: chained merges (conflict -> simple) - same content everywhere
975 | | |\
1074 | | |\
976 | | +---o mAE,Km: chained merges (conflict -> simple) - same content everywhere
1075 | | +---o mAE,Km: chained merges (conflict -> simple) - same content everywhere
977 | | | |/
1076 | | | |/
978 | | | o k-1: unrelated changes (based on "e" changes)
1077 | | | o k-1: unrelated changes (based on "e" changes)
979 | | | |
1078 | | | |
980 | o | | j-1: unrelated changes (based on the "a" series of changes)
1079 | o | | j-1: unrelated changes (based on the "a" series of changes)
981 | | | |
1080 | | | |
982 o-----+ mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
1081 o-----+ mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
983 |/ / /
1082 |/ / /
984 | o / mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
1083 | o / mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
985 |/|/
1084 |/|/
986 | o e-2 g -move-> f
1085 | o e-2 g -move-> f
987 | |
1086 | |
988 | o e-1 b -move-> g
1087 | o e-1 b -move-> g
989 | |
1088 | |
990 o | a-2: e -move-> f
1089 o | a-2: e -move-> f
991 | |
1090 | |
992 o | a-1: d -move-> e
1091 o | a-1: d -move-> e
993 |/
1092 |/
994 o i-2: c -move-> d, s -move-> t
1093 o i-2: c -move-> d, s -move-> t
995 |
1094 |
996 o i-1: a -move-> c, p -move-> s
1095 o i-1: a -move-> c, p -move-> s
997 |
1096 |
998 o i-0 initial commit: a b h p q r
1097 o i-0 initial commit: a b h p q r
999
1098
1000
1099
1001 Subcase: chaining conflicting rename resolution, with actual merging happening
1100 Subcase: chaining conflicting rename resolution, with actual merging happening
1002 ``````````````````````````````````````````````````````````````````````````````
1101 ``````````````````````````````````````````````````````````````````````````````
1003
1102
1004 The "mPQm" and "mQPm" case create a rename tracking conflict on file 't'. We
1103 The "mPQm" and "mQPm" case create a rename tracking conflict on file 't'. We
1005 add more change on the respective branch and merge again. These second merge
1104 add more change on the respective branch and merge again. These second merge
1006 does not involve the file 't' and the arbitration done within "mPQm" and "mQP"
1105 does not involve the file 't' and the arbitration done within "mPQm" and "mQP"
1007 about that file should stay unchanged.
1106 about that file should stay unchanged.
1008
1107
1009 $ case_desc="chained merges (conflict -> simple) - different content"
1108 $ case_desc="chained merges (conflict -> simple) - different content"
1010
1109
1011 (extra unrelated changes)
1110 (extra unrelated changes)
1012
1111
1013 $ hg up 'desc("p-2")'
1112 $ hg up 'desc("p-2")'
1014 3 files updated, 0 files merged, 3 files removed, 0 files unresolved
1113 3 files updated, 0 files merged, 3 files removed, 0 files unresolved
1015 $ echo s > unrelated-s
1114 $ echo s > unrelated-s
1016 $ hg add unrelated-s
1115 $ hg add unrelated-s
1017 $ hg ci -m 's-1: unrelated changes (based on the "p" series of changes)'
1116 $ hg ci -m 's-1: unrelated changes (based on the "p" series of changes)'
1018 created new head
1117 created new head
1019
1118
1020 $ hg up 'desc("q-2")'
1119 $ hg up 'desc("q-2")'
1021 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
1120 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
1022 $ echo t > unrelated-t
1121 $ echo t > unrelated-t
1023 $ hg add unrelated-t
1122 $ hg add unrelated-t
1024 $ hg ci -m 't-1: unrelated changes (based on "q" changes)'
1123 $ hg ci -m 't-1: unrelated changes (based on "q" changes)'
1025 created new head
1124 created new head
1026
1125
1027 (merge variant 1)
1126 (merge variant 1)
1028
1127
1029 $ hg up 'desc("mPQm")'
1128 $ hg up 'desc("mPQm")'
1030 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
1129 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
1031 $ hg merge 'desc("t-1")'
1130 $ hg merge 'desc("t-1")'
1032 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1131 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1033 (branch merge, don't forget to commit)
1132 (branch merge, don't forget to commit)
1034 $ hg ci -m "mPQ,Tm: $case_desc"
1133 $ hg ci -m "mPQ,Tm: $case_desc"
1035
1134
1036 (merge variant 2)
1135 (merge variant 2)
1037
1136
1038 $ hg up 'desc("t-1")'
1137 $ hg up 'desc("t-1")'
1039 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1138 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1040
1139
1041 $ hg merge 'desc("mPQm")'
1140 $ hg merge 'desc("mPQm")'
1042 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1141 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1043 (branch merge, don't forget to commit)
1142 (branch merge, don't forget to commit)
1044 $ hg ci -m "mT,PQm: $case_desc"
1143 $ hg ci -m "mT,PQm: $case_desc"
1045 created new head
1144 created new head
1046
1145
1047 (merge variant 3)
1146 (merge variant 3)
1048
1147
1049 $ hg up 'desc("mQPm")'
1148 $ hg up 'desc("mQPm")'
1050 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1149 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1051 $ hg merge 'desc("s-1")'
1150 $ hg merge 'desc("s-1")'
1052 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1151 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1053 (branch merge, don't forget to commit)
1152 (branch merge, don't forget to commit)
1054 $ hg ci -m "mQP,Sm: $case_desc"
1153 $ hg ci -m "mQP,Sm: $case_desc"
1055
1154
1056 (merge variant 4)
1155 (merge variant 4)
1057
1156
1058 $ hg up 'desc("s-1")'
1157 $ hg up 'desc("s-1")'
1059 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1158 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1060 $ hg merge 'desc("mQPm")'
1159 $ hg merge 'desc("mQPm")'
1061 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1160 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1062 (branch merge, don't forget to commit)
1161 (branch merge, don't forget to commit)
1063 $ hg ci -m "mS,QPm: $case_desc"
1162 $ hg ci -m "mS,QPm: $case_desc"
1064 created new head
1163 created new head
1065 $ hg up null --quiet
1164 $ hg up null --quiet
1066
1165
1067
1166
1068 $ hg log -G --rev '::(desc("mPQ,Tm") + desc("mT,PQm") + desc("mQP,Sm") + desc("mS,QPm"))'
1167 $ hg log -G --rev '::(desc("mPQ,Tm") + desc("mT,PQm") + desc("mQP,Sm") + desc("mS,QPm"))'
1069 o mS,QPm: chained merges (conflict -> simple) - different content
1168 o mS,QPm: chained merges (conflict -> simple) - different content
1070 |\
1169 |\
1071 +---o mQP,Sm: chained merges (conflict -> simple) - different content
1170 +---o mQP,Sm: chained merges (conflict -> simple) - different content
1072 | |/
1171 | |/
1073 | | o mT,PQm: chained merges (conflict -> simple) - different content
1172 | | o mT,PQm: chained merges (conflict -> simple) - different content
1074 | | |\
1173 | | |\
1075 | | +---o mPQ,Tm: chained merges (conflict -> simple) - different content
1174 | | +---o mPQ,Tm: chained merges (conflict -> simple) - different content
1076 | | | |/
1175 | | | |/
1077 | | | o t-1: unrelated changes (based on "q" changes)
1176 | | | o t-1: unrelated changes (based on "q" changes)
1078 | | | |
1177 | | | |
1079 | o | | s-1: unrelated changes (based on the "p" series of changes)
1178 | o | | s-1: unrelated changes (based on the "p" series of changes)
1080 | | | |
1179 | | | |
1081 o-----+ mQPm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - the other way
1180 o-----+ mQPm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - the other way
1082 |/ / /
1181 |/ / /
1083 | o / mPQm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - one way
1182 | o / mPQm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - one way
1084 |/|/
1183 |/|/
1085 | o q-2 w -move-> v
1184 | o q-2 w -move-> v
1086 | |
1185 | |
1087 | o q-1 r -move-> w
1186 | o q-1 r -move-> w
1088 | |
1187 | |
1089 o | p-2: u -move-> v
1188 o | p-2: u -move-> v
1090 | |
1189 | |
1091 o | p-1: t -move-> u
1190 o | p-1: t -move-> u
1092 |/
1191 |/
1093 o i-2: c -move-> d, s -move-> t
1192 o i-2: c -move-> d, s -move-> t
1094 |
1193 |
1095 o i-1: a -move-> c, p -move-> s
1194 o i-1: a -move-> c, p -move-> s
1096 |
1195 |
1097 o i-0 initial commit: a b h p q r
1196 o i-0 initial commit: a b h p q r
1098
1197
1099
1198
1100 Subcase: chaining salvage information during a merge
1199 Subcase: chaining salvage information during a merge
1101 ````````````````````````````````````````````````````
1200 ````````````````````````````````````````````````````
1102
1201
1103 We add more change on the branch were the file was deleted. merging again
1202 We add more change on the branch were the file was deleted. merging again
1104 should preserve the fact eh file was salvaged.
1203 should preserve the fact eh file was salvaged.
1105
1204
1106 $ case_desc="chained merges (salvaged -> simple) - same content (when the file exists)"
1205 $ case_desc="chained merges (salvaged -> simple) - same content (when the file exists)"
1107
1206
1108 (creating the change)
1207 (creating the change)
1109
1208
1110 $ hg up 'desc("c-1")'
1209 $ hg up 'desc("c-1")'
1111 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1210 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
1112 $ echo l > unrelated-l
1211 $ echo l > unrelated-l
1113 $ hg add unrelated-l
1212 $ hg add unrelated-l
1114 $ hg ci -m 'l-1: unrelated changes (based on "c" changes)'
1213 $ hg ci -m 'l-1: unrelated changes (based on "c" changes)'
1115 created new head
1214 created new head
1116
1215
1117 (Merge variant 1)
1216 (Merge variant 1)
1118
1217
1119 $ hg up 'desc("mBC-revert-m")'
1218 $ hg up 'desc("mBC-revert-m")'
1120 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
1219 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
1121 $ hg merge 'desc("l-1")'
1220 $ hg merge 'desc("l-1")'
1122 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1221 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1123 (branch merge, don't forget to commit)
1222 (branch merge, don't forget to commit)
1124 $ hg ci -m "mBC+revert,Lm: $case_desc"
1223 $ hg ci -m "mBC+revert,Lm: $case_desc"
1125
1224
1126 (Merge variant 2)
1225 (Merge variant 2)
1127
1226
1128 $ hg up 'desc("mCB-revert-m")'
1227 $ hg up 'desc("mCB-revert-m")'
1129 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1228 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1130 $ hg merge 'desc("l-1")'
1229 $ hg merge 'desc("l-1")'
1131 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1230 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1132 (branch merge, don't forget to commit)
1231 (branch merge, don't forget to commit)
1133 $ hg ci -m "mCB+revert,Lm: $case_desc"
1232 $ hg ci -m "mCB+revert,Lm: $case_desc"
1134
1233
1135 (Merge variant 3)
1234 (Merge variant 3)
1136
1235
1137 $ hg up 'desc("l-1")'
1236 $ hg up 'desc("l-1")'
1138 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1237 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1139
1238
1140 $ hg merge 'desc("mBC-revert-m")'
1239 $ hg merge 'desc("mBC-revert-m")'
1141 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1240 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1142 (branch merge, don't forget to commit)
1241 (branch merge, don't forget to commit)
1143 $ hg ci -m "mL,BC+revertm: $case_desc"
1242 $ hg ci -m "mL,BC+revertm: $case_desc"
1144 created new head
1243 created new head
1145
1244
1146 (Merge variant 4)
1245 (Merge variant 4)
1147
1246
1148 $ hg up 'desc("l-1")'
1247 $ hg up 'desc("l-1")'
1149 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1248 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1150
1249
1151 $ hg merge 'desc("mCB-revert-m")'
1250 $ hg merge 'desc("mCB-revert-m")'
1152 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1251 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1153 (branch merge, don't forget to commit)
1252 (branch merge, don't forget to commit)
1154 $ hg ci -m "mL,CB+revertm: $case_desc"
1253 $ hg ci -m "mL,CB+revertm: $case_desc"
1155 created new head
1254 created new head
1156
1255
1157 $ hg log -G --rev '::(desc("mBC+revert,Lm") + desc("mCB+revert,Lm") + desc("mL,BC+revertm") + desc("mL,CB+revertm"))'
1256 $ hg log -G --rev '::(desc("mBC+revert,Lm") + desc("mCB+revert,Lm") + desc("mL,BC+revertm") + desc("mL,CB+revertm"))'
1158 @ mL,CB+revertm: chained merges (salvaged -> simple) - same content (when the file exists)
1257 @ mL,CB+revertm: chained merges (salvaged -> simple) - same content (when the file exists)
1159 |\
1258 |\
1160 | | o mL,BC+revertm: chained merges (salvaged -> simple) - same content (when the file exists)
1259 | | o mL,BC+revertm: chained merges (salvaged -> simple) - same content (when the file exists)
1161 | |/|
1260 | |/|
1162 +-+---o mCB+revert,Lm: chained merges (salvaged -> simple) - same content (when the file exists)
1261 +-+---o mCB+revert,Lm: chained merges (salvaged -> simple) - same content (when the file exists)
1163 | | |
1262 | | |
1164 | +---o mBC+revert,Lm: chained merges (salvaged -> simple) - same content (when the file exists)
1263 | +---o mBC+revert,Lm: chained merges (salvaged -> simple) - same content (when the file exists)
1165 | | |/
1264 | | |/
1166 | o | l-1: unrelated changes (based on "c" changes)
1265 | o | l-1: unrelated changes (based on "c" changes)
1167 | | |
1266 | | |
1168 | | o mBC-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - the other way
1267 | | o mBC-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - the other way
1169 | |/|
1268 | |/|
1170 o---+ mCB-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - one way
1269 o---+ mCB-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - one way
1171 |/ /
1270 |/ /
1172 o | c-1 delete d
1271 o | c-1 delete d
1173 | |
1272 | |
1174 | o b-1: b update
1273 | o b-1: b update
1175 |/
1274 |/
1176 o i-2: c -move-> d, s -move-> t
1275 o i-2: c -move-> d, s -move-> t
1177 |
1276 |
1178 o i-1: a -move-> c, p -move-> s
1277 o i-1: a -move-> c, p -move-> s
1179 |
1278 |
1180 o i-0 initial commit: a b h p q r
1279 o i-0 initial commit: a b h p q r
1181
1280
1182
1281
1183
1282
1184 Subcase: chaining "merged" information during a merge
1283 Subcase: chaining "merged" information during a merge
1185 ``````````````````````````````````````````````````````
1284 ``````````````````````````````````````````````````````
1186
1285
1187 When a non-rename change are merged with a copy overwrite, the merge pick the copy source from (p1) as the reference. We should preserve this information in subsequent merges.
1286 When a non-rename change are merged with a copy overwrite, the merge pick the copy source from (p1) as the reference. We should preserve this information in subsequent merges.
1188
1287
1189 $ case_desc="chained merges (copy-overwrite -> simple) - same content"
1288 $ case_desc="chained merges (copy-overwrite -> simple) - same content"
1190
1289
1191 (extra unrelated changes)
1290 (extra unrelated changes)
1192
1291
1193 $ hg up 'desc("f-2")'
1292 $ hg up 'desc("f-2")'
1194 2 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
1293 2 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
1195 1 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
1294 1 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
1196 $ echo n > unrelated-n
1295 $ echo n > unrelated-n
1197 $ hg add unrelated-n
1296 $ hg add unrelated-n
1198 $ hg ci -m 'n-1: unrelated changes (based on the "f" series of changes)'
1297 $ hg ci -m 'n-1: unrelated changes (based on the "f" series of changes)'
1199 created new head
1298 created new head
1200
1299
1201 $ hg up 'desc("g-1")'
1300 $ hg up 'desc("g-1")'
1202 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
1301 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
1203 $ echo o > unrelated-o
1302 $ echo o > unrelated-o
1204 $ hg add unrelated-o
1303 $ hg add unrelated-o
1205 $ hg ci -m 'o-1: unrelated changes (based on "g" changes)'
1304 $ hg ci -m 'o-1: unrelated changes (based on "g" changes)'
1206 created new head
1305 created new head
1207
1306
1208 (merge variant 1)
1307 (merge variant 1)
1209
1308
1210 $ hg up 'desc("mFGm")'
1309 $ hg up 'desc("mFGm")'
1211 1 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
1310 1 files updated, 0 files merged, 2 files removed, 0 files unresolved (no-changeset !)
1212 0 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
1311 0 files updated, 0 files merged, 2 files removed, 0 files unresolved (changeset !)
1213 $ hg merge 'desc("o-1")'
1312 $ hg merge 'desc("o-1")'
1214 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1313 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1215 (branch merge, don't forget to commit)
1314 (branch merge, don't forget to commit)
1216 $ hg ci -m "mFG,Om: $case_desc"
1315 $ hg ci -m "mFG,Om: $case_desc"
1217
1316
1218 (merge variant 2)
1317 (merge variant 2)
1219
1318
1220 $ hg up 'desc("o-1")'
1319 $ hg up 'desc("o-1")'
1221 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
1320 2 files updated, 0 files merged, 0 files removed, 0 files unresolved (no-changeset !)
1222 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
1321 1 files updated, 0 files merged, 0 files removed, 0 files unresolved (changeset !)
1223 $ hg merge 'desc("FGm")'
1322 $ hg merge 'desc("FGm")'
1224 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
1323 1 files updated, 0 files merged, 1 files removed, 0 files unresolved (no-changeset !)
1225 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
1324 0 files updated, 0 files merged, 1 files removed, 0 files unresolved (changeset !)
1226 (branch merge, don't forget to commit)
1325 (branch merge, don't forget to commit)
1227 $ hg ci -m "mO,FGm: $case_desc"
1326 $ hg ci -m "mO,FGm: $case_desc"
1228 created new head
1327 created new head
1229
1328
1230 (merge variant 3)
1329 (merge variant 3)
1231
1330
1232 $ hg up 'desc("mGFm")'
1331 $ hg up 'desc("mGFm")'
1233 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1332 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1234 $ hg merge 'desc("n-1")'
1333 $ hg merge 'desc("n-1")'
1235 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1334 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1236 (branch merge, don't forget to commit)
1335 (branch merge, don't forget to commit)
1237 $ hg ci -m "mGF,Nm: $case_desc"
1336 $ hg ci -m "mGF,Nm: $case_desc"
1238
1337
1239 (merge variant 4)
1338 (merge variant 4)
1240
1339
1241 $ hg up 'desc("n-1")'
1340 $ hg up 'desc("n-1")'
1242 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1341 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1243 $ hg merge 'desc("mGFm")'
1342 $ hg merge 'desc("mGFm")'
1244 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1343 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1245 (branch merge, don't forget to commit)
1344 (branch merge, don't forget to commit)
1246 $ hg ci -m "mN,GFm: $case_desc"
1345 $ hg ci -m "mN,GFm: $case_desc"
1247 created new head
1346 created new head
1248
1347
1249 $ hg log -G --rev '::(desc("mFG,Om") + desc("mO,FGm") + desc("mGF,Nm") + desc("mN,GFm"))'
1348 $ hg log -G --rev '::(desc("mFG,Om") + desc("mO,FGm") + desc("mGF,Nm") + desc("mN,GFm"))'
1250 @ mN,GFm: chained merges (copy-overwrite -> simple) - same content
1349 @ mN,GFm: chained merges (copy-overwrite -> simple) - same content
1251 |\
1350 |\
1252 +---o mGF,Nm: chained merges (copy-overwrite -> simple) - same content
1351 +---o mGF,Nm: chained merges (copy-overwrite -> simple) - same content
1253 | |/
1352 | |/
1254 | | o mO,FGm: chained merges (copy-overwrite -> simple) - same content
1353 | | o mO,FGm: chained merges (copy-overwrite -> simple) - same content
1255 | | |\
1354 | | |\
1256 | | +---o mFG,Om: chained merges (copy-overwrite -> simple) - same content
1355 | | +---o mFG,Om: chained merges (copy-overwrite -> simple) - same content
1257 | | | |/
1356 | | | |/
1258 | | | o o-1: unrelated changes (based on "g" changes)
1357 | | | o o-1: unrelated changes (based on "g" changes)
1259 | | | |
1358 | | | |
1260 | o | | n-1: unrelated changes (based on the "f" series of changes)
1359 | o | | n-1: unrelated changes (based on the "f" series of changes)
1261 | | | |
1360 | | | |
1262 o-----+ mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
1361 o-----+ mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
1263 |/ / /
1362 |/ / /
1264 | o / mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
1363 | o / mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
1265 |/|/
1364 |/|/
1266 | o g-1: update d
1365 | o g-1: update d
1267 | |
1366 | |
1268 o | f-2: rename i -> d
1367 o | f-2: rename i -> d
1269 | |
1368 | |
1270 o | f-1: rename h -> i
1369 o | f-1: rename h -> i
1271 |/
1370 |/
1272 o i-2: c -move-> d, s -move-> t
1371 o i-2: c -move-> d, s -move-> t
1273 |
1372 |
1274 o i-1: a -move-> c, p -move-> s
1373 o i-1: a -move-> c, p -move-> s
1275 |
1374 |
1276 o i-0 initial commit: a b h p q r
1375 o i-0 initial commit: a b h p q r
1277
1376
1278
1377
1279 Subcase: chaining conflicting rename resolution, with extra change during the merge
1378 Subcase: chaining conflicting rename resolution, with extra change during the merge
1280 ```````````````````````````````````````````````````````````````````````````````````
1379 ```````````````````````````````````````````````````````````````````````````````````
1281
1380
1282 The "mEA-change-m-0" and "mAE-change-m-0" case create a rename tracking conflict on file 'f'. We
1381 The "mEA-change-m-0" and "mAE-change-m-0" case create a rename tracking conflict on file 'f'. We
1283 add more change on the respective branch and merge again. These second merge
1382 add more change on the respective branch and merge again. These second merge
1284 does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
1383 does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
1285 about that file should stay unchanged.
1384 about that file should stay unchanged.
1286
1385
1287 $ case_desc="chained merges (conflict+change -> simple) - same content on both branch in the initial merge"
1386 $ case_desc="chained merges (conflict+change -> simple) - same content on both branch in the initial merge"
1288
1387
1289
1388
1290 (merge variant 1)
1389 (merge variant 1)
1291
1390
1292 $ hg up 'desc("mAE-change-m")'
1391 $ hg up 'desc("mAE-change-m")'
1293 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
1392 2 files updated, 0 files merged, 3 files removed, 0 files unresolved
1294 $ hg merge 'desc("k-1")'
1393 $ hg merge 'desc("k-1")'
1295 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1394 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1296 (branch merge, don't forget to commit)
1395 (branch merge, don't forget to commit)
1297 $ hg ci -m "mAE-change,Km: $case_desc"
1396 $ hg ci -m "mAE-change,Km: $case_desc"
1298
1397
1299 (merge variant 2)
1398 (merge variant 2)
1300
1399
1301 $ hg up 'desc("k-1")'
1400 $ hg up 'desc("k-1")'
1302 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1401 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1303
1402
1304 $ hg merge 'desc("mAE-change-m")'
1403 $ hg merge 'desc("mAE-change-m")'
1305 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1404 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1306 (branch merge, don't forget to commit)
1405 (branch merge, don't forget to commit)
1307 $ hg ci -m "mK,AE-change-m: $case_desc"
1406 $ hg ci -m "mK,AE-change-m: $case_desc"
1308 created new head
1407 created new head
1309
1408
1310 (merge variant 3)
1409 (merge variant 3)
1311
1410
1312 $ hg up 'desc("mEA-change-m")'
1411 $ hg up 'desc("mEA-change-m")'
1313 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1412 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1314 $ hg merge 'desc("j-1")'
1413 $ hg merge 'desc("j-1")'
1315 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1414 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1316 (branch merge, don't forget to commit)
1415 (branch merge, don't forget to commit)
1317 $ hg ci -m "mEA-change,Jm: $case_desc"
1416 $ hg ci -m "mEA-change,Jm: $case_desc"
1318
1417
1319 (merge variant 4)
1418 (merge variant 4)
1320
1419
1321 $ hg up 'desc("j-1")'
1420 $ hg up 'desc("j-1")'
1322 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1421 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1323 $ hg merge 'desc("mEA-change-m")'
1422 $ hg merge 'desc("mEA-change-m")'
1324 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1423 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1325 (branch merge, don't forget to commit)
1424 (branch merge, don't forget to commit)
1326 $ hg ci -m "mJ,EA-change-m: $case_desc"
1425 $ hg ci -m "mJ,EA-change-m: $case_desc"
1327 created new head
1426 created new head
1328
1427
1329
1428
1330 $ hg log -G --rev '::(desc("mAE-change,Km") + desc("mK,AE-change-m") + desc("mEA-change,Jm") + desc("mJ,EA-change-m"))'
1429 $ hg log -G --rev '::(desc("mAE-change,Km") + desc("mK,AE-change-m") + desc("mEA-change,Jm") + desc("mJ,EA-change-m"))'
1331 @ mJ,EA-change-m: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1430 @ mJ,EA-change-m: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1332 |\
1431 |\
1333 +---o mEA-change,Jm: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1432 +---o mEA-change,Jm: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1334 | |/
1433 | |/
1335 | | o mK,AE-change-m: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1434 | | o mK,AE-change-m: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1336 | | |\
1435 | | |\
1337 | | +---o mAE-change,Km: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1436 | | +---o mAE-change,Km: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1338 | | | |/
1437 | | | |/
1339 | | | o k-1: unrelated changes (based on "e" changes)
1438 | | | o k-1: unrelated changes (based on "e" changes)
1340 | | | |
1439 | | | |
1341 | o | | j-1: unrelated changes (based on the "a" series of changes)
1440 | o | | j-1: unrelated changes (based on the "a" series of changes)
1342 | | | |
1441 | | | |
1343 o-----+ mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way
1442 o-----+ mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way
1344 |/ / /
1443 |/ / /
1345 | o / mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way
1444 | o / mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way
1346 |/|/
1445 |/|/
1347 | o e-2 g -move-> f
1446 | o e-2 g -move-> f
1348 | |
1447 | |
1349 | o e-1 b -move-> g
1448 | o e-1 b -move-> g
1350 | |
1449 | |
1351 o | a-2: e -move-> f
1450 o | a-2: e -move-> f
1352 | |
1451 | |
1353 o | a-1: d -move-> e
1452 o | a-1: d -move-> e
1354 |/
1453 |/
1355 o i-2: c -move-> d, s -move-> t
1454 o i-2: c -move-> d, s -move-> t
1356 |
1455 |
1357 o i-1: a -move-> c, p -move-> s
1456 o i-1: a -move-> c, p -move-> s
1358 |
1457 |
1359 o i-0 initial commit: a b h p q r
1458 o i-0 initial commit: a b h p q r
1360
1459
1361
1460
1362 Summary of all created cases
1461 Summary of all created cases
1363 ----------------------------
1462 ----------------------------
1364
1463
1365 $ hg up --quiet null
1464 $ hg up --quiet null
1366
1465
1367 (This exists to help keeping a compact list of the various cases we have built)
1466 (This exists to help keeping a compact list of the various cases we have built)
1368
1467
1369 $ hg log -T '{desc|firstline}\n'| sort
1468 $ hg log -T '{desc|firstline}\n'| sort
1370 a-1: d -move-> e
1469 a-1: d -move-> e
1371 a-2: e -move-> f
1470 a-2: e -move-> f
1372 b-1: b update
1471 b-1: b update
1373 c-1 delete d
1472 c-1 delete d
1374 d-1 delete d
1473 d-1 delete d
1375 d-2 re-add d
1474 d-2 re-add d
1376 e-1 b -move-> g
1475 e-1 b -move-> g
1377 e-2 g -move-> f
1476 e-2 g -move-> f
1378 f-1: rename h -> i
1477 f-1: rename h -> i
1379 f-2: rename i -> d
1478 f-2: rename i -> d
1380 g-1: update d
1479 g-1: update d
1381 h-1: b -(move)-> d
1480 h-1: b -(move)-> d
1382 i-0 initial commit: a b h p q r
1481 i-0 initial commit: a b h p q r
1383 i-1: a -move-> c, p -move-> s
1482 i-1: a -move-> c, p -move-> s
1384 i-2: c -move-> d, s -move-> t
1483 i-2: c -move-> d, s -move-> t
1385 j-1: unrelated changes (based on the "a" series of changes)
1484 j-1: unrelated changes (based on the "a" series of changes)
1386 k-1: unrelated changes (based on "e" changes)
1485 k-1: unrelated changes (based on "e" changes)
1387 l-1: unrelated changes (based on "c" changes)
1486 l-1: unrelated changes (based on "c" changes)
1388 mABm-0 simple merge - A side: multiple renames, B side: unrelated update - the other way
1487 mABm-0 simple merge - A side: multiple renames, B side: unrelated update - the other way
1389 mAE,Km: chained merges (conflict -> simple) - same content everywhere
1488 mAE,Km: chained merges (conflict -> simple) - same content everywhere
1390 mAE-change,Km: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1489 mAE-change,Km: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1391 mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way
1490 mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way
1392 mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
1491 mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
1393 mBAm-0 simple merge - A side: multiple renames, B side: unrelated update - one way
1492 mBAm-0 simple merge - A side: multiple renames, B side: unrelated update - one way
1394 mBC+revert,Lm: chained merges (salvaged -> simple) - same content (when the file exists)
1493 mBC+revert,Lm: chained merges (salvaged -> simple) - same content (when the file exists)
1395 mBC-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - the other way
1494 mBC-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - the other way
1396 mBCm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - one way
1495 mBCm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - one way
1397 mBCm-1 re-add d
1496 mBCm-1 re-add d
1398 mBDm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - one way
1497 mBDm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - one way
1498 mBF-change-m-0 merge with extra change - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
1399 mBFm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
1499 mBFm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
1400 mBRm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - one way
1500 mBRm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - one way
1401 mCB+revert,Lm: chained merges (salvaged -> simple) - same content (when the file exists)
1501 mCB+revert,Lm: chained merges (salvaged -> simple) - same content (when the file exists)
1402 mCB-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - one way
1502 mCB-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - one way
1403 mCBm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - the other way
1503 mCBm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - the other way
1404 mCBm-1 re-add d
1504 mCBm-1 re-add d
1405 mCGm-0 merge updated/deleted - revive the file (updated content) - one way
1505 mCGm-0 merge updated/deleted - revive the file (updated content) - one way
1406 mCH-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - one way
1506 mCH-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - one way
1407 mDBm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - the other way
1507 mDBm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - the other way
1408 mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
1508 mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
1409 mEA,Jm: chained merges (conflict -> simple) - same content everywhere
1509 mEA,Jm: chained merges (conflict -> simple) - same content everywhere
1410 mEA-change,Jm: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1510 mEA-change,Jm: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1411 mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way
1511 mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way
1412 mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
1512 mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
1513 mFB-change-m-0 merge with extra change - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
1413 mFBm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
1514 mFBm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
1414 mFG,Om: chained merges (copy-overwrite -> simple) - same content
1515 mFG,Om: chained merges (copy-overwrite -> simple) - same content
1415 mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
1516 mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
1416 mGCm-0 merge updated/deleted - revive the file (updated content) - the other way
1517 mGCm-0 merge updated/deleted - revive the file (updated content) - the other way
1417 mGDm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - the other way
1518 mGDm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - the other way
1418 mGF,Nm: chained merges (copy-overwrite -> simple) - same content
1519 mGF,Nm: chained merges (copy-overwrite -> simple) - same content
1419 mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
1520 mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
1420 mHC-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - the other way
1521 mHC-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - the other way
1421 mJ,EA-change-m: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1522 mJ,EA-change-m: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1422 mJ,EAm: chained merges (conflict -> simple) - same content everywhere
1523 mJ,EAm: chained merges (conflict -> simple) - same content everywhere
1423 mK,AE-change-m: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1524 mK,AE-change-m: chained merges (conflict+change -> simple) - same content on both branch in the initial merge
1424 mK,AEm: chained merges (conflict -> simple) - same content everywhere
1525 mK,AEm: chained merges (conflict -> simple) - same content everywhere
1425 mL,BC+revertm: chained merges (salvaged -> simple) - same content (when the file exists)
1526 mL,BC+revertm: chained merges (salvaged -> simple) - same content (when the file exists)
1426 mL,CB+revertm: chained merges (salvaged -> simple) - same content (when the file exists)
1527 mL,CB+revertm: chained merges (salvaged -> simple) - same content (when the file exists)
1427 mN,GFm: chained merges (copy-overwrite -> simple) - same content
1528 mN,GFm: chained merges (copy-overwrite -> simple) - same content
1428 mO,FGm: chained merges (copy-overwrite -> simple) - same content
1529 mO,FGm: chained merges (copy-overwrite -> simple) - same content
1429 mPQ,Tm: chained merges (conflict -> simple) - different content
1530 mPQ,Tm: chained merges (conflict -> simple) - different content
1430 mPQm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - one way
1531 mPQm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - one way
1431 mQP,Sm: chained merges (conflict -> simple) - different content
1532 mQP,Sm: chained merges (conflict -> simple) - different content
1432 mQPm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - the other way
1533 mQPm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - the other way
1433 mRBm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - the other way
1534 mRBm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - the other way
1434 mS,QPm: chained merges (conflict -> simple) - different content
1535 mS,QPm: chained merges (conflict -> simple) - different content
1435 mT,PQm: chained merges (conflict -> simple) - different content
1536 mT,PQm: chained merges (conflict -> simple) - different content
1436 n-1: unrelated changes (based on the "f" series of changes)
1537 n-1: unrelated changes (based on the "f" series of changes)
1437 o-1: unrelated changes (based on "g" changes)
1538 o-1: unrelated changes (based on "g" changes)
1438 p-1: t -move-> u
1539 p-1: t -move-> u
1439 p-2: u -move-> v
1540 p-2: u -move-> v
1440 q-1 r -move-> w
1541 q-1 r -move-> w
1441 q-2 w -move-> v
1542 q-2 w -move-> v
1442 r-1: rename r -> x
1543 r-1: rename r -> x
1443 r-2: rename t -> x
1544 r-2: rename t -> x
1444 s-1: unrelated changes (based on the "p" series of changes)
1545 s-1: unrelated changes (based on the "p" series of changes)
1445 t-1: unrelated changes (based on "q" changes)
1546 t-1: unrelated changes (based on "q" changes)
1446
1547
1447
1548
1448 Test that sidedata computations during upgrades are correct
1549 Test that sidedata computations during upgrades are correct
1449 ===========================================================
1550 ===========================================================
1450
1551
1451 We upgrade a repository that is not using sidedata (the filelog case) and
1552 We upgrade a repository that is not using sidedata (the filelog case) and
1452 check that the same side data have been generated as if they were computed at
1553 check that the same side data have been generated as if they were computed at
1453 commit time.
1554 commit time.
1454
1555
1455
1556
1456 #if upgraded
1557 #if upgraded
1457 $ cat >> $HGRCPATH << EOF
1558 $ cat >> $HGRCPATH << EOF
1458 > [format]
1559 > [format]
1459 > exp-use-side-data = yes
1560 > exp-use-side-data = yes
1460 > exp-use-copies-side-data-changeset = yes
1561 > exp-use-copies-side-data-changeset = yes
1461 > EOF
1562 > EOF
1462 $ hg debugformat -v
1563 $ hg debugformat -v
1463 format-variant repo config default
1564 format-variant repo config default
1464 fncache: yes yes yes
1565 fncache: yes yes yes
1465 dotencode: yes yes yes
1566 dotencode: yes yes yes
1466 generaldelta: yes yes yes
1567 generaldelta: yes yes yes
1467 share-safe: no no no
1568 share-safe: no no no
1468 sparserevlog: yes yes yes
1569 sparserevlog: yes yes yes
1469 persistent-nodemap: no no no
1570 persistent-nodemap: no no no
1470 copies-sdc: no yes no
1571 copies-sdc: no yes no
1471 revlog-v2: no yes no
1572 revlog-v2: no yes no
1472 plain-cl-delta: yes yes yes
1573 plain-cl-delta: yes yes yes
1473 compression: * (glob)
1574 compression: * (glob)
1474 compression-level: default default default
1575 compression-level: default default default
1475 $ hg debugupgraderepo --run --quiet
1576 $ hg debugupgraderepo --run --quiet
1476 upgrade will perform the following actions:
1577 upgrade will perform the following actions:
1477
1578
1478 requirements
1579 requirements
1479 preserved: * (glob)
1580 preserved: * (glob)
1480 removed: revlogv1
1581 removed: revlogv1
1481 added: exp-copies-sidedata-changeset, exp-revlogv2.2, exp-sidedata-flag
1582 added: exp-copies-sidedata-changeset, exp-revlogv2.2, exp-sidedata-flag
1482
1583
1483 processed revlogs:
1584 processed revlogs:
1484 - all-filelogs
1585 - all-filelogs
1485 - changelog
1586 - changelog
1486 - manifest
1587 - manifest
1487
1588
1488 #endif
1589 #endif
1489
1590
1490 #if upgraded-parallel
1591 #if upgraded-parallel
1491 $ cat >> $HGRCPATH << EOF
1592 $ cat >> $HGRCPATH << EOF
1492 > [format]
1593 > [format]
1493 > exp-use-side-data = yes
1594 > exp-use-side-data = yes
1494 > exp-use-copies-side-data-changeset = yes
1595 > exp-use-copies-side-data-changeset = yes
1495 > [experimental]
1596 > [experimental]
1496 > worker.repository-upgrade=yes
1597 > worker.repository-upgrade=yes
1497 > [worker]
1598 > [worker]
1498 > enabled=yes
1599 > enabled=yes
1499 > numcpus=8
1600 > numcpus=8
1500 > EOF
1601 > EOF
1501 $ hg debugformat -v
1602 $ hg debugformat -v
1502 format-variant repo config default
1603 format-variant repo config default
1503 fncache: yes yes yes
1604 fncache: yes yes yes
1504 dotencode: yes yes yes
1605 dotencode: yes yes yes
1505 generaldelta: yes yes yes
1606 generaldelta: yes yes yes
1506 share-safe: no no no
1607 share-safe: no no no
1507 sparserevlog: yes yes yes
1608 sparserevlog: yes yes yes
1508 persistent-nodemap: no no no
1609 persistent-nodemap: no no no
1509 copies-sdc: no yes no
1610 copies-sdc: no yes no
1510 revlog-v2: no yes no
1611 revlog-v2: no yes no
1511 plain-cl-delta: yes yes yes
1612 plain-cl-delta: yes yes yes
1512 compression: * (glob)
1613 compression: * (glob)
1513 compression-level: default default default
1614 compression-level: default default default
1514 $ hg debugupgraderepo --run --quiet
1615 $ hg debugupgraderepo --run --quiet
1515 upgrade will perform the following actions:
1616 upgrade will perform the following actions:
1516
1617
1517 requirements
1618 requirements
1518 preserved: * (glob)
1619 preserved: * (glob)
1519 removed: revlogv1
1620 removed: revlogv1
1520 added: exp-copies-sidedata-changeset, exp-revlogv2.2, exp-sidedata-flag
1621 added: exp-copies-sidedata-changeset, exp-revlogv2.2, exp-sidedata-flag
1521
1622
1522 processed revlogs:
1623 processed revlogs:
1523 - all-filelogs
1624 - all-filelogs
1524 - changelog
1625 - changelog
1525 - manifest
1626 - manifest
1526
1627
1527 #endif
1628 #endif
1528
1629
1529
1630
1530 #if no-compatibility no-filelog no-changeset
1631 #if no-compatibility no-filelog no-changeset
1531
1632
1532 $ hg debugchangedfiles --compute 0
1633 $ hg debugchangedfiles --compute 0
1533 added : a, ;
1634 added : a, ;
1534 added : b, ;
1635 added : b, ;
1535 added : h, ;
1636 added : h, ;
1536 added : p, ;
1637 added : p, ;
1537 added : q, ;
1638 added : q, ;
1538 added : r, ;
1639 added : r, ;
1539
1640
1540 $ for rev in `hg log --rev 'all()' -T '{rev}\n'`; do
1641 $ for rev in `hg log --rev 'all()' -T '{rev}\n'`; do
1541 > case_id=`hg log -r $rev -T '{word(0, desc, ":")}\n'`
1642 > case_id=`hg log -r $rev -T '{word(0, desc, ":")}\n'`
1542 > echo "##### revision \"$case_id\" #####"
1643 > echo "##### revision \"$case_id\" #####"
1543 > hg debugsidedata -c -v -- $rev
1644 > hg debugsidedata -c -v -- $rev
1544 > hg debugchangedfiles $rev
1645 > hg debugchangedfiles $rev
1545 > done
1646 > done
1546 ##### revision "i-0 initial commit" #####
1647 ##### revision "i-0 initial commit" #####
1547 1 sidedata entries
1648 1 sidedata entries
1548 entry-0014 size 64
1649 entry-0014 size 64
1549 '\x00\x00\x00\x06\x04\x00\x00\x00\x01\x00\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00\x04\x00\x00\x00\x03\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\x00abhpqr'
1650 '\x00\x00\x00\x06\x04\x00\x00\x00\x01\x00\x00\x00\x00\x04\x00\x00\x00\x02\x00\x00\x00\x00\x04\x00\x00\x00\x03\x00\x00\x00\x00\x04\x00\x00\x00\x04\x00\x00\x00\x00\x04\x00\x00\x00\x05\x00\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00\x00abhpqr'
1550 added : a, ;
1651 added : a, ;
1551 added : b, ;
1652 added : b, ;
1552 added : h, ;
1653 added : h, ;
1553 added : p, ;
1654 added : p, ;
1554 added : q, ;
1655 added : q, ;
1555 added : r, ;
1656 added : r, ;
1556 ##### revision "i-1" #####
1657 ##### revision "i-1" #####
1557 1 sidedata entries
1658 1 sidedata entries
1558 entry-0014 size 44
1659 entry-0014 size 44
1559 '\x00\x00\x00\x04\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00\x0c\x00\x00\x00\x03\x00\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x02acps'
1660 '\x00\x00\x00\x04\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00\x0c\x00\x00\x00\x03\x00\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x02acps'
1560 removed : a, ;
1661 removed : a, ;
1561 added p1: c, a;
1662 added p1: c, a;
1562 removed : p, ;
1663 removed : p, ;
1563 added p1: s, p;
1664 added p1: s, p;
1564 ##### revision "i-2" #####
1665 ##### revision "i-2" #####
1565 1 sidedata entries
1666 1 sidedata entries
1566 entry-0014 size 44
1667 entry-0014 size 44
1567 '\x00\x00\x00\x04\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00\x0c\x00\x00\x00\x03\x00\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x02cdst'
1668 '\x00\x00\x00\x04\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00\x0c\x00\x00\x00\x03\x00\x00\x00\x00\x06\x00\x00\x00\x04\x00\x00\x00\x02cdst'
1568 removed : c, ;
1669 removed : c, ;
1569 added p1: d, c;
1670 added p1: d, c;
1570 removed : s, ;
1671 removed : s, ;
1571 added p1: t, s;
1672 added p1: t, s;
1572 ##### revision "a-1" #####
1673 ##### revision "a-1" #####
1573 1 sidedata entries
1674 1 sidedata entries
1574 entry-0014 size 24
1675 entry-0014 size 24
1575 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00de'
1676 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00de'
1576 removed : d, ;
1677 removed : d, ;
1577 added p1: e, d;
1678 added p1: e, d;
1578 ##### revision "a-2" #####
1679 ##### revision "a-2" #####
1579 1 sidedata entries
1680 1 sidedata entries
1580 entry-0014 size 24
1681 entry-0014 size 24
1581 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00ef'
1682 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00ef'
1582 removed : e, ;
1683 removed : e, ;
1583 added p1: f, e;
1684 added p1: f, e;
1584 ##### revision "b-1" #####
1685 ##### revision "b-1" #####
1585 1 sidedata entries
1686 1 sidedata entries
1586 entry-0014 size 14
1687 entry-0014 size 14
1587 '\x00\x00\x00\x01\x14\x00\x00\x00\x01\x00\x00\x00\x00b'
1688 '\x00\x00\x00\x01\x14\x00\x00\x00\x01\x00\x00\x00\x00b'
1588 touched : b, ;
1689 touched : b, ;
1589 ##### revision "c-1 delete d" #####
1690 ##### revision "c-1 delete d" #####
1590 1 sidedata entries
1691 1 sidedata entries
1591 entry-0014 size 14
1692 entry-0014 size 14
1592 '\x00\x00\x00\x01\x0c\x00\x00\x00\x01\x00\x00\x00\x00d'
1693 '\x00\x00\x00\x01\x0c\x00\x00\x00\x01\x00\x00\x00\x00d'
1593 removed : d, ;
1694 removed : d, ;
1594 ##### revision "d-1 delete d" #####
1695 ##### revision "d-1 delete d" #####
1595 1 sidedata entries
1696 1 sidedata entries
1596 entry-0014 size 14
1697 entry-0014 size 14
1597 '\x00\x00\x00\x01\x0c\x00\x00\x00\x01\x00\x00\x00\x00d'
1698 '\x00\x00\x00\x01\x0c\x00\x00\x00\x01\x00\x00\x00\x00d'
1598 removed : d, ;
1699 removed : d, ;
1599 ##### revision "d-2 re-add d" #####
1700 ##### revision "d-2 re-add d" #####
1600 1 sidedata entries
1701 1 sidedata entries
1601 entry-0014 size 14
1702 entry-0014 size 14
1602 '\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x00\x00d'
1703 '\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x00\x00d'
1603 added : d, ;
1704 added : d, ;
1604 ##### revision "e-1 b -move-> g" #####
1705 ##### revision "e-1 b -move-> g" #####
1605 1 sidedata entries
1706 1 sidedata entries
1606 entry-0014 size 24
1707 entry-0014 size 24
1607 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00bg'
1708 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00bg'
1608 removed : b, ;
1709 removed : b, ;
1609 added p1: g, b;
1710 added p1: g, b;
1610 ##### revision "e-2 g -move-> f" #####
1711 ##### revision "e-2 g -move-> f" #####
1611 1 sidedata entries
1712 1 sidedata entries
1612 entry-0014 size 24
1713 entry-0014 size 24
1613 '\x00\x00\x00\x02\x06\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00fg'
1714 '\x00\x00\x00\x02\x06\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00fg'
1614 added p1: f, g;
1715 added p1: f, g;
1615 removed : g, ;
1716 removed : g, ;
1616 ##### revision "p-1" #####
1717 ##### revision "p-1" #####
1617 1 sidedata entries
1718 1 sidedata entries
1618 entry-0014 size 24
1719 entry-0014 size 24
1619 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00tu'
1720 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00tu'
1620 removed : t, ;
1721 removed : t, ;
1621 added p1: u, t;
1722 added p1: u, t;
1622 ##### revision "p-2" #####
1723 ##### revision "p-2" #####
1623 1 sidedata entries
1724 1 sidedata entries
1624 entry-0014 size 24
1725 entry-0014 size 24
1625 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00uv'
1726 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00uv'
1626 removed : u, ;
1727 removed : u, ;
1627 added p1: v, u;
1728 added p1: v, u;
1628 ##### revision "q-1 r -move-> w" #####
1729 ##### revision "q-1 r -move-> w" #####
1629 1 sidedata entries
1730 1 sidedata entries
1630 entry-0014 size 24
1731 entry-0014 size 24
1631 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00rw'
1732 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00rw'
1632 removed : r, ;
1733 removed : r, ;
1633 added p1: w, r;
1734 added p1: w, r;
1634 ##### revision "q-2 w -move-> v" #####
1735 ##### revision "q-2 w -move-> v" #####
1635 1 sidedata entries
1736 1 sidedata entries
1636 entry-0014 size 24
1737 entry-0014 size 24
1637 '\x00\x00\x00\x02\x06\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00vw'
1738 '\x00\x00\x00\x02\x06\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00vw'
1638 added p1: v, w;
1739 added p1: v, w;
1639 removed : w, ;
1740 removed : w, ;
1640 ##### revision "mBAm-0 simple merge - A side" #####
1741 ##### revision "mBAm-0 simple merge - A side" #####
1641 1 sidedata entries
1742 1 sidedata entries
1642 entry-0014 size 4
1743 entry-0014 size 4
1643 '\x00\x00\x00\x00'
1744 '\x00\x00\x00\x00'
1644 ##### revision "mABm-0 simple merge - A side" #####
1745 ##### revision "mABm-0 simple merge - A side" #####
1645 1 sidedata entries
1746 1 sidedata entries
1646 entry-0014 size 4
1747 entry-0014 size 4
1647 '\x00\x00\x00\x00'
1748 '\x00\x00\x00\x00'
1648 ##### revision "mBCm-0 simple merge - C side" #####
1749 ##### revision "mBCm-0 simple merge - C side" #####
1649 1 sidedata entries
1750 1 sidedata entries
1650 entry-0014 size 4
1751 entry-0014 size 4
1651 '\x00\x00\x00\x00'
1752 '\x00\x00\x00\x00'
1652 ##### revision "mBCm-1 re-add d" #####
1753 ##### revision "mBCm-1 re-add d" #####
1653 1 sidedata entries
1754 1 sidedata entries
1654 entry-0014 size 14
1755 entry-0014 size 14
1655 '\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x00\x00d'
1756 '\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x00\x00d'
1656 added : d, ;
1757 added : d, ;
1657 ##### revision "mCBm-0 simple merge - C side" #####
1758 ##### revision "mCBm-0 simple merge - C side" #####
1658 1 sidedata entries
1759 1 sidedata entries
1659 entry-0014 size 4
1760 entry-0014 size 4
1660 '\x00\x00\x00\x00'
1761 '\x00\x00\x00\x00'
1661 ##### revision "mCBm-1 re-add d" #####
1762 ##### revision "mCBm-1 re-add d" #####
1662 1 sidedata entries
1763 1 sidedata entries
1663 entry-0014 size 14
1764 entry-0014 size 14
1664 '\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x00\x00d'
1765 '\x00\x00\x00\x01\x04\x00\x00\x00\x01\x00\x00\x00\x00d'
1665 added : d, ;
1766 added : d, ;
1666 ##### revision "mBDm-0 simple merge - B side" #####
1767 ##### revision "mBDm-0 simple merge - B side" #####
1667 1 sidedata entries
1768 1 sidedata entries
1668 entry-0014 size 4
1769 entry-0014 size 4
1669 '\x00\x00\x00\x00'
1770 '\x00\x00\x00\x00'
1670 ##### revision "mDBm-0 simple merge - B side" #####
1771 ##### revision "mDBm-0 simple merge - B side" #####
1671 1 sidedata entries
1772 1 sidedata entries
1672 entry-0014 size 4
1773 entry-0014 size 4
1673 '\x00\x00\x00\x00'
1774 '\x00\x00\x00\x00'
1674 ##### revision "mAEm-0 merge with copies info on both side - A side" #####
1775 ##### revision "mAEm-0 merge with copies info on both side - A side" #####
1675 1 sidedata entries
1776 1 sidedata entries
1676 entry-0014 size 14
1777 entry-0014 size 14
1677 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
1778 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
1678 merged : f, ;
1779 merged : f, ;
1679 ##### revision "mEAm-0 merge with copies info on both side - A side" #####
1780 ##### revision "mEAm-0 merge with copies info on both side - A side" #####
1680 1 sidedata entries
1781 1 sidedata entries
1681 entry-0014 size 14
1782 entry-0014 size 14
1682 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
1783 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
1683 merged : f, ;
1784 merged : f, ;
1684 ##### revision "mPQm-0 merge with copies info on both side - P side" #####
1785 ##### revision "mPQm-0 merge with copies info on both side - P side" #####
1685 1 sidedata entries
1786 1 sidedata entries
1686 entry-0014 size 14
1787 entry-0014 size 14
1687 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00v'
1788 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00v'
1688 merged : v, ;
1789 merged : v, ;
1689 ##### revision "mQPm-0 merge with copies info on both side - P side" #####
1790 ##### revision "mQPm-0 merge with copies info on both side - P side" #####
1690 1 sidedata entries
1791 1 sidedata entries
1691 entry-0014 size 14
1792 entry-0014 size 14
1692 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00v'
1793 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00v'
1693 merged : v, ;
1794 merged : v, ;
1694 ##### revision "f-1" #####
1795 ##### revision "f-1" #####
1695 1 sidedata entries
1796 1 sidedata entries
1696 entry-0014 size 24
1797 entry-0014 size 24
1697 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00hi'
1798 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00hi'
1698 removed : h, ;
1799 removed : h, ;
1699 added p1: i, h;
1800 added p1: i, h;
1700 ##### revision "f-2" #####
1801 ##### revision "f-2" #####
1701 1 sidedata entries
1802 1 sidedata entries
1702 entry-0014 size 24
1803 entry-0014 size 24
1703 '\x00\x00\x00\x02\x16\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00di'
1804 '\x00\x00\x00\x02\x16\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00di'
1704 touched p1: d, i;
1805 touched p1: d, i;
1705 removed : i, ;
1806 removed : i, ;
1706 ##### revision "mBFm-0 simple merge - B side" #####
1807 ##### revision "mBFm-0 simple merge - B side" #####
1707 1 sidedata entries
1808 1 sidedata entries
1708 entry-0014 size 4
1809 entry-0014 size 4
1709 '\x00\x00\x00\x00'
1810 '\x00\x00\x00\x00'
1710 ##### revision "mFBm-0 simple merge - B side" #####
1811 ##### revision "mFBm-0 simple merge - B side" #####
1711 1 sidedata entries
1812 1 sidedata entries
1712 entry-0014 size 4
1813 entry-0014 size 4
1713 '\x00\x00\x00\x00'
1814 '\x00\x00\x00\x00'
1714 ##### revision "r-1" #####
1815 ##### revision "r-1" #####
1715 1 sidedata entries
1816 1 sidedata entries
1716 entry-0014 size 24
1817 entry-0014 size 24
1717 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00rx'
1818 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00rx'
1718 removed : r, ;
1819 removed : r, ;
1719 added p1: x, r;
1820 added p1: x, r;
1720 ##### revision "r-2" #####
1821 ##### revision "r-2" #####
1721 1 sidedata entries
1822 1 sidedata entries
1722 entry-0014 size 24
1823 entry-0014 size 24
1723 '\x00\x00\x00\x02\x16\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00tx'
1824 '\x00\x00\x00\x02\x16\x00\x00\x00\x01\x00\x00\x00\x01\x0c\x00\x00\x00\x02\x00\x00\x00\x00tx'
1724 touched p1: t, x;
1825 touched p1: t, x;
1725 removed : x, ;
1826 removed : x, ;
1726 ##### revision "mBRm-0 simple merge - B side" #####
1827 ##### revision "mBRm-0 simple merge - B side" #####
1727 1 sidedata entries
1828 1 sidedata entries
1728 entry-0014 size 4
1829 entry-0014 size 4
1729 '\x00\x00\x00\x00'
1830 '\x00\x00\x00\x00'
1730 ##### revision "mRBm-0 simple merge - B side" #####
1831 ##### revision "mRBm-0 simple merge - B side" #####
1731 1 sidedata entries
1832 1 sidedata entries
1732 entry-0014 size 4
1833 entry-0014 size 4
1733 '\x00\x00\x00\x00'
1834 '\x00\x00\x00\x00'
1734 ##### revision "g-1" #####
1835 ##### revision "g-1" #####
1735 1 sidedata entries
1836 1 sidedata entries
1736 entry-0014 size 14
1837 entry-0014 size 14
1737 '\x00\x00\x00\x01\x14\x00\x00\x00\x01\x00\x00\x00\x00d'
1838 '\x00\x00\x00\x01\x14\x00\x00\x00\x01\x00\x00\x00\x00d'
1738 touched : d, ;
1839 touched : d, ;
1739 ##### revision "mDGm-0 actual content merge, copies on one side - D side" #####
1840 ##### revision "mDGm-0 actual content merge, copies on one side - D side" #####
1740 1 sidedata entries
1841 1 sidedata entries
1741 entry-0014 size 14
1842 entry-0014 size 14
1742 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
1843 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
1743 merged : d, ;
1844 merged : d, ;
1744 ##### revision "mGDm-0 actual content merge, copies on one side - D side" #####
1845 ##### revision "mGDm-0 actual content merge, copies on one side - D side" #####
1745 1 sidedata entries
1846 1 sidedata entries
1746 entry-0014 size 14
1847 entry-0014 size 14
1747 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
1848 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
1748 merged : d, ;
1849 merged : d, ;
1749 ##### revision "mFGm-0 merge - G side" #####
1850 ##### revision "mFGm-0 merge - G side" #####
1750 1 sidedata entries
1851 1 sidedata entries
1751 entry-0014 size 14
1852 entry-0014 size 14
1752 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
1853 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
1753 merged : d, ;
1854 merged : d, ;
1754 ##### revision "mGFm-0 merge - G side" #####
1855 ##### revision "mGFm-0 merge - G side" #####
1755 1 sidedata entries
1856 1 sidedata entries
1756 entry-0014 size 14
1857 entry-0014 size 14
1757 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
1858 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d'
1758 merged : d, ;
1859 merged : d, ;
1759 ##### revision "mCGm-0 merge updated/deleted - revive the file (updated content) - one way" #####
1860 ##### revision "mCGm-0 merge updated/deleted - revive the file (updated content) - one way" #####
1760 1 sidedata entries
1861 1 sidedata entries
1761 entry-0014 size 14
1862 entry-0014 size 14
1762 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
1863 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
1763 salvaged : d, ;
1864 salvaged : d, ;
1764 ##### revision "mGCm-0 merge updated/deleted - revive the file (updated content) - the other way" #####
1865 ##### revision "mGCm-0 merge updated/deleted - revive the file (updated content) - the other way" #####
1765 1 sidedata entries
1866 1 sidedata entries
1766 entry-0014 size 14
1867 entry-0014 size 14
1767 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
1868 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
1768 salvaged : d, ;
1869 salvaged : d, ;
1769 ##### revision "mCB-revert-m-0 merge explicitely revive deleted file - B side" #####
1870 ##### revision "mCB-revert-m-0 merge explicitely revive deleted file - B side" #####
1770 1 sidedata entries
1871 1 sidedata entries
1771 entry-0014 size 14
1872 entry-0014 size 14
1772 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
1873 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
1773 salvaged : d, ;
1874 salvaged : d, ;
1774 ##### revision "mBC-revert-m-0 merge explicitely revive deleted file - B side" #####
1875 ##### revision "mBC-revert-m-0 merge explicitely revive deleted file - B side" #####
1775 1 sidedata entries
1876 1 sidedata entries
1776 entry-0014 size 14
1877 entry-0014 size 14
1777 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
1878 '\x00\x00\x00\x01\x10\x00\x00\x00\x01\x00\x00\x00\x00d'
1778 salvaged : d, ;
1879 salvaged : d, ;
1779 ##### revision "h-1" #####
1880 ##### revision "h-1" #####
1780 1 sidedata entries
1881 1 sidedata entries
1781 entry-0014 size 24
1882 entry-0014 size 24
1782 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00bd'
1883 '\x00\x00\x00\x02\x0c\x00\x00\x00\x01\x00\x00\x00\x00\x06\x00\x00\x00\x02\x00\x00\x00\x00bd'
1783 removed : b, ;
1884 removed : b, ;
1784 added p1: d, b;
1885 added p1: d, b;
1785 ##### revision "mCH-delete-before-conflict-m-0 simple merge - C side" #####
1886 ##### revision "mCH-delete-before-conflict-m-0 simple merge - C side" #####
1786 1 sidedata entries
1887 1 sidedata entries
1787 entry-0014 size 4
1888 entry-0014 size 4
1788 '\x00\x00\x00\x00'
1889 '\x00\x00\x00\x00'
1789 ##### revision "mHC-delete-before-conflict-m-0 simple merge - C side" #####
1890 ##### revision "mHC-delete-before-conflict-m-0 simple merge - C side" #####
1790 1 sidedata entries
1891 1 sidedata entries
1791 entry-0014 size 4
1892 entry-0014 size 4
1792 '\x00\x00\x00\x00'
1893 '\x00\x00\x00\x00'
1793 ##### revision "mAE-change-m-0 merge with file update and copies info on both side - A side" #####
1894 ##### revision "mAE-change-m-0 merge with file update and copies info on both side - A side" #####
1794 1 sidedata entries
1895 1 sidedata entries
1795 entry-0014 size 14
1896 entry-0014 size 14
1796 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
1897 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
1797 merged : f, ;
1898 merged : f, ;
1798 ##### revision "mEA-change-m-0 merge with file update and copies info on both side - A side" #####
1899 ##### revision "mEA-change-m-0 merge with file update and copies info on both side - A side" #####
1799 1 sidedata entries
1900 1 sidedata entries
1800 entry-0014 size 14
1901 entry-0014 size 14
1801 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
1902 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00f'
1802 merged : f, ;
1903 merged : f, ;
1904 ##### revision "mBF-change-m-0 merge with extra change - B side" #####
1905 1 sidedata entries
1906 entry-0014 size 14
1907 '\x00\x00\x00\x01\x14\x00\x00\x00\x01\x00\x00\x00\x00d' (no-upgraded no-upgraded-parallel !)
1908 touched : d, ; (no-upgraded no-upgraded-parallel !)
1909 '\x00\x00\x00\x01\x14\x00\x00\x00\x01\x00\x00\x00\x00d' (upgraded missing-correct-output !)
1910 touched : d, ; (upgraded missing-correct-output !)
1911 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d' (upgraded known-bad-output !)
1912 merged : d, ; (upgraded known-bad-output !)
1913 '\x00\x00\x00\x01\x14\x00\x00\x00\x01\x00\x00\x00\x00d' (upgraded-parallel missing-correct-output !)
1914 touched : d, ; (upgraded-parallel missing-correct-output !)
1915 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d' (upgraded-parallel known-bad-output !)
1916 merged : d, ; (upgraded-parallel known-bad-output !)
1917 ##### revision "mFB-change-m-0 merge with extra change - B side" #####
1918 1 sidedata entries
1919 entry-0014 size 14
1920 '\x00\x00\x00\x01\x08\x00\x00\x00\x01\x00\x00\x00\x00d' (known-bad-output !)
1921 merged : d, ; (known-bad-output !)
1922 '\x00\x00\x00\x01\x14\x00\x00\x00\x01\x00\x00\x00\x00d' (missing-correct-output !)
1923 touched : d, ; (missing-correct-output !)
1803 ##### revision "j-1" #####
1924 ##### revision "j-1" #####
1804 1 sidedata entries
1925 1 sidedata entries
1805 entry-0014 size 24
1926 entry-0014 size 24
1806 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-j'
1927 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-j'
1807 added : unrelated-j, ;
1928 added : unrelated-j, ;
1808 ##### revision "k-1" #####
1929 ##### revision "k-1" #####
1809 1 sidedata entries
1930 1 sidedata entries
1810 entry-0014 size 24
1931 entry-0014 size 24
1811 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-k'
1932 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-k'
1812 added : unrelated-k, ;
1933 added : unrelated-k, ;
1813 ##### revision "mAE,Km" #####
1934 ##### revision "mAE,Km" #####
1814 1 sidedata entries
1935 1 sidedata entries
1815 entry-0014 size 4
1936 entry-0014 size 4
1816 '\x00\x00\x00\x00'
1937 '\x00\x00\x00\x00'
1817 ##### revision "mK,AEm" #####
1938 ##### revision "mK,AEm" #####
1818 1 sidedata entries
1939 1 sidedata entries
1819 entry-0014 size 4
1940 entry-0014 size 4
1820 '\x00\x00\x00\x00'
1941 '\x00\x00\x00\x00'
1821 ##### revision "mEA,Jm" #####
1942 ##### revision "mEA,Jm" #####
1822 1 sidedata entries
1943 1 sidedata entries
1823 entry-0014 size 4
1944 entry-0014 size 4
1824 '\x00\x00\x00\x00'
1945 '\x00\x00\x00\x00'
1825 ##### revision "mJ,EAm" #####
1946 ##### revision "mJ,EAm" #####
1826 1 sidedata entries
1947 1 sidedata entries
1827 entry-0014 size 4
1948 entry-0014 size 4
1828 '\x00\x00\x00\x00'
1949 '\x00\x00\x00\x00'
1829 ##### revision "s-1" #####
1950 ##### revision "s-1" #####
1830 1 sidedata entries
1951 1 sidedata entries
1831 entry-0014 size 24
1952 entry-0014 size 24
1832 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-s'
1953 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-s'
1833 added : unrelated-s, ;
1954 added : unrelated-s, ;
1834 ##### revision "t-1" #####
1955 ##### revision "t-1" #####
1835 1 sidedata entries
1956 1 sidedata entries
1836 entry-0014 size 24
1957 entry-0014 size 24
1837 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-t'
1958 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-t'
1838 added : unrelated-t, ;
1959 added : unrelated-t, ;
1839 ##### revision "mPQ,Tm" #####
1960 ##### revision "mPQ,Tm" #####
1840 1 sidedata entries
1961 1 sidedata entries
1841 entry-0014 size 4
1962 entry-0014 size 4
1842 '\x00\x00\x00\x00'
1963 '\x00\x00\x00\x00'
1843 ##### revision "mT,PQm" #####
1964 ##### revision "mT,PQm" #####
1844 1 sidedata entries
1965 1 sidedata entries
1845 entry-0014 size 4
1966 entry-0014 size 4
1846 '\x00\x00\x00\x00'
1967 '\x00\x00\x00\x00'
1847 ##### revision "mQP,Sm" #####
1968 ##### revision "mQP,Sm" #####
1848 1 sidedata entries
1969 1 sidedata entries
1849 entry-0014 size 4
1970 entry-0014 size 4
1850 '\x00\x00\x00\x00'
1971 '\x00\x00\x00\x00'
1851 ##### revision "mS,QPm" #####
1972 ##### revision "mS,QPm" #####
1852 1 sidedata entries
1973 1 sidedata entries
1853 entry-0014 size 4
1974 entry-0014 size 4
1854 '\x00\x00\x00\x00'
1975 '\x00\x00\x00\x00'
1855 ##### revision "l-1" #####
1976 ##### revision "l-1" #####
1856 1 sidedata entries
1977 1 sidedata entries
1857 entry-0014 size 24
1978 entry-0014 size 24
1858 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-l'
1979 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-l'
1859 added : unrelated-l, ;
1980 added : unrelated-l, ;
1860 ##### revision "mBC+revert,Lm" #####
1981 ##### revision "mBC+revert,Lm" #####
1861 1 sidedata entries
1982 1 sidedata entries
1862 entry-0014 size 4
1983 entry-0014 size 4
1863 '\x00\x00\x00\x00'
1984 '\x00\x00\x00\x00'
1864 ##### revision "mCB+revert,Lm" #####
1985 ##### revision "mCB+revert,Lm" #####
1865 1 sidedata entries
1986 1 sidedata entries
1866 entry-0014 size 4
1987 entry-0014 size 4
1867 '\x00\x00\x00\x00'
1988 '\x00\x00\x00\x00'
1868 ##### revision "mL,BC+revertm" #####
1989 ##### revision "mL,BC+revertm" #####
1869 1 sidedata entries
1990 1 sidedata entries
1870 entry-0014 size 4
1991 entry-0014 size 4
1871 '\x00\x00\x00\x00'
1992 '\x00\x00\x00\x00'
1872 ##### revision "mL,CB+revertm" #####
1993 ##### revision "mL,CB+revertm" #####
1873 1 sidedata entries
1994 1 sidedata entries
1874 entry-0014 size 4
1995 entry-0014 size 4
1875 '\x00\x00\x00\x00'
1996 '\x00\x00\x00\x00'
1876 ##### revision "n-1" #####
1997 ##### revision "n-1" #####
1877 1 sidedata entries
1998 1 sidedata entries
1878 entry-0014 size 24
1999 entry-0014 size 24
1879 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-n'
2000 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-n'
1880 added : unrelated-n, ;
2001 added : unrelated-n, ;
1881 ##### revision "o-1" #####
2002 ##### revision "o-1" #####
1882 1 sidedata entries
2003 1 sidedata entries
1883 entry-0014 size 24
2004 entry-0014 size 24
1884 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-o'
2005 '\x00\x00\x00\x01\x04\x00\x00\x00\x0b\x00\x00\x00\x00unrelated-o'
1885 added : unrelated-o, ;
2006 added : unrelated-o, ;
1886 ##### revision "mFG,Om" #####
2007 ##### revision "mFG,Om" #####
1887 1 sidedata entries
2008 1 sidedata entries
1888 entry-0014 size 4
2009 entry-0014 size 4
1889 '\x00\x00\x00\x00'
2010 '\x00\x00\x00\x00'
1890 ##### revision "mO,FGm" #####
2011 ##### revision "mO,FGm" #####
1891 1 sidedata entries
2012 1 sidedata entries
1892 entry-0014 size 4
2013 entry-0014 size 4
1893 '\x00\x00\x00\x00'
2014 '\x00\x00\x00\x00'
1894 ##### revision "mGF,Nm" #####
2015 ##### revision "mGF,Nm" #####
1895 1 sidedata entries
2016 1 sidedata entries
1896 entry-0014 size 4
2017 entry-0014 size 4
1897 '\x00\x00\x00\x00'
2018 '\x00\x00\x00\x00'
1898 ##### revision "mN,GFm" #####
2019 ##### revision "mN,GFm" #####
1899 1 sidedata entries
2020 1 sidedata entries
1900 entry-0014 size 4
2021 entry-0014 size 4
1901 '\x00\x00\x00\x00'
2022 '\x00\x00\x00\x00'
1902 ##### revision "mAE-change,Km" #####
2023 ##### revision "mAE-change,Km" #####
1903 1 sidedata entries
2024 1 sidedata entries
1904 entry-0014 size 4
2025 entry-0014 size 4
1905 '\x00\x00\x00\x00'
2026 '\x00\x00\x00\x00'
1906 ##### revision "mK,AE-change-m" #####
2027 ##### revision "mK,AE-change-m" #####
1907 1 sidedata entries
2028 1 sidedata entries
1908 entry-0014 size 4
2029 entry-0014 size 4
1909 '\x00\x00\x00\x00'
2030 '\x00\x00\x00\x00'
1910 ##### revision "mEA-change,Jm" #####
2031 ##### revision "mEA-change,Jm" #####
1911 1 sidedata entries
2032 1 sidedata entries
1912 entry-0014 size 4
2033 entry-0014 size 4
1913 '\x00\x00\x00\x00'
2034 '\x00\x00\x00\x00'
1914 ##### revision "mJ,EA-change-m" #####
2035 ##### revision "mJ,EA-change-m" #####
1915 1 sidedata entries
2036 1 sidedata entries
1916 entry-0014 size 4
2037 entry-0014 size 4
1917 '\x00\x00\x00\x00'
2038 '\x00\x00\x00\x00'
1918
2039
1919 #endif
2040 #endif
1920
2041
1921
2042
1922 Test copy information chaining
2043 Test copy information chaining
1923 ==============================
2044 ==============================
1924
2045
1925 Check that matching only affect the destination and not intermediate path
2046 Check that matching only affect the destination and not intermediate path
1926 -------------------------------------------------------------------------
2047 -------------------------------------------------------------------------
1927
2048
1928 The two status call should give the same value for f
2049 The two status call should give the same value for f
1929
2050
1930 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("a-2")'
2051 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("a-2")'
1931 A f
2052 A f
1932 a
2053 a
1933 A t
2054 A t
1934 p
2055 p
1935 R a
2056 R a
1936 R p
2057 R p
1937 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("a-2")' f
2058 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("a-2")' f
1938 A f
2059 A f
1939 a (no-changeset no-compatibility !)
2060 a (no-changeset no-compatibility !)
1940
2061
1941 merging with unrelated change does not interfere with the renames
2062 merging with unrelated change does not interfere with the renames
1942 ---------------------------------------------------------------
2063 ---------------------------------------------------------------
1943
2064
1944 - rename on one side
2065 - rename on one side
1945 - unrelated change on the other side
2066 - unrelated change on the other side
1946
2067
1947 $ hg log -G --rev '::(desc("mABm")+desc("mBAm"))'
2068 $ hg log -G --rev '::(desc("mABm")+desc("mBAm"))'
1948 o mABm-0 simple merge - A side: multiple renames, B side: unrelated update - the other way
2069 o mABm-0 simple merge - A side: multiple renames, B side: unrelated update - the other way
1949 |\
2070 |\
1950 +---o mBAm-0 simple merge - A side: multiple renames, B side: unrelated update - one way
2071 +---o mBAm-0 simple merge - A side: multiple renames, B side: unrelated update - one way
1951 | |/
2072 | |/
1952 | o b-1: b update
2073 | o b-1: b update
1953 | |
2074 | |
1954 o | a-2: e -move-> f
2075 o | a-2: e -move-> f
1955 | |
2076 | |
1956 o | a-1: d -move-> e
2077 o | a-1: d -move-> e
1957 |/
2078 |/
1958 o i-2: c -move-> d, s -move-> t
2079 o i-2: c -move-> d, s -move-> t
1959 |
2080 |
1960 o i-1: a -move-> c, p -move-> s
2081 o i-1: a -move-> c, p -move-> s
1961 |
2082 |
1962 o i-0 initial commit: a b h p q r
2083 o i-0 initial commit: a b h p q r
1963
2084
1964
2085
1965 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mABm")'
2086 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mABm")'
1966 A f
2087 A f
1967 d
2088 d
1968 R d
2089 R d
1969 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBAm")'
2090 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBAm")'
1970 A f
2091 A f
1971 d
2092 d
1972 R d
2093 R d
1973 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mABm")'
2094 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mABm")'
1974 M b
2095 M b
1975 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mBAm")'
2096 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mBAm")'
1976 M b
2097 M b
1977 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mABm")'
2098 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mABm")'
1978 M b
2099 M b
1979 A f
2100 A f
1980 d
2101 d
1981 R d
2102 R d
1982 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBAm")'
2103 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBAm")'
1983 M b
2104 M b
1984 A f
2105 A f
1985 d
2106 d
1986 R d
2107 R d
1987 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mABm")'
2108 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mABm")'
1988 M b
2109 M b
1989 A f
2110 A f
1990 a
2111 a
1991 A t
2112 A t
1992 p
2113 p
1993 R a
2114 R a
1994 R p
2115 R p
1995 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBAm")'
2116 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBAm")'
1996 M b
2117 M b
1997 A f
2118 A f
1998 a
2119 a
1999 A t
2120 A t
2000 p
2121 p
2001 R a
2122 R a
2002 R p
2123 R p
2003
2124
2004 merging with the side having a delete
2125 merging with the side having a delete
2005 -------------------------------------
2126 -------------------------------------
2006
2127
2007 case summary:
2128 case summary:
2008 - one with change to an unrelated file
2129 - one with change to an unrelated file
2009 - one deleting the change
2130 - one deleting the change
2010 and recreate an unrelated file after the merge
2131 and recreate an unrelated file after the merge
2011
2132
2012 $ hg log -G --rev '::(desc("mCBm")+desc("mBCm"))'
2133 $ hg log -G --rev '::(desc("mCBm")+desc("mBCm"))'
2013 o mCBm-1 re-add d
2134 o mCBm-1 re-add d
2014 |
2135 |
2015 o mCBm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - the other way
2136 o mCBm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - the other way
2016 |\
2137 |\
2017 | | o mBCm-1 re-add d
2138 | | o mBCm-1 re-add d
2018 | | |
2139 | | |
2019 +---o mBCm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - one way
2140 +---o mBCm-0 simple merge - C side: delete a file with copies history , B side: unrelated update - one way
2020 | |/
2141 | |/
2021 | o c-1 delete d
2142 | o c-1 delete d
2022 | |
2143 | |
2023 o | b-1: b update
2144 o | b-1: b update
2024 |/
2145 |/
2025 o i-2: c -move-> d, s -move-> t
2146 o i-2: c -move-> d, s -move-> t
2026 |
2147 |
2027 o i-1: a -move-> c, p -move-> s
2148 o i-1: a -move-> c, p -move-> s
2028 |
2149 |
2029 o i-0 initial commit: a b h p q r
2150 o i-0 initial commit: a b h p q r
2030
2151
2031 - comparing from the merge
2152 - comparing from the merge
2032
2153
2033 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBCm-0")'
2154 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBCm-0")'
2034 R d
2155 R d
2035 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mCBm-0")'
2156 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mCBm-0")'
2036 R d
2157 R d
2037 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mBCm-0")'
2158 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mBCm-0")'
2038 M b
2159 M b
2039 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCBm-0")'
2160 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCBm-0")'
2040 M b
2161 M b
2041 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBCm-0")'
2162 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBCm-0")'
2042 M b
2163 M b
2043 R d
2164 R d
2044 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mCBm-0")'
2165 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mCBm-0")'
2045 M b
2166 M b
2046 R d
2167 R d
2047 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBCm-0")'
2168 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBCm-0")'
2048 M b
2169 M b
2049 A t
2170 A t
2050 p
2171 p
2051 R a
2172 R a
2052 R p
2173 R p
2053 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCBm-0")'
2174 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCBm-0")'
2054 M b
2175 M b
2055 A t
2176 A t
2056 p
2177 p
2057 R a
2178 R a
2058 R p
2179 R p
2059
2180
2060 - comparing with the merge children re-adding the file
2181 - comparing with the merge children re-adding the file
2061
2182
2062 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBCm-1")'
2183 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBCm-1")'
2063 M d
2184 M d
2064 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mCBm-1")'
2185 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mCBm-1")'
2065 M d
2186 M d
2066 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mBCm-1")'
2187 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mBCm-1")'
2067 M b
2188 M b
2068 A d
2189 A d
2069 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCBm-1")'
2190 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCBm-1")'
2070 M b
2191 M b
2071 A d
2192 A d
2072 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBCm-1")'
2193 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBCm-1")'
2073 M b
2194 M b
2074 M d
2195 M d
2075 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mCBm-1")'
2196 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mCBm-1")'
2076 M b
2197 M b
2077 M d
2198 M d
2078 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBCm-1")'
2199 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBCm-1")'
2079 M b
2200 M b
2080 A d
2201 A d
2081 A t
2202 A t
2082 p
2203 p
2083 R a
2204 R a
2084 R p
2205 R p
2085 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCBm-1")'
2206 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCBm-1")'
2086 M b
2207 M b
2087 A d
2208 A d
2088 A t
2209 A t
2089 p
2210 p
2090 R a
2211 R a
2091 R p
2212 R p
2092
2213
2093 Comparing with a merge re-adding the file afterward
2214 Comparing with a merge re-adding the file afterward
2094 ---------------------------------------------------
2215 ---------------------------------------------------
2095
2216
2096 Merge:
2217 Merge:
2097 - one with change to an unrelated file
2218 - one with change to an unrelated file
2098 - one deleting and recreating the change
2219 - one deleting and recreating the change
2099
2220
2100 $ hg log -G --rev '::(desc("mDBm")+desc("mBDm"))'
2221 $ hg log -G --rev '::(desc("mDBm")+desc("mBDm"))'
2101 o mDBm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - the other way
2222 o mDBm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - the other way
2102 |\
2223 |\
2103 +---o mBDm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - one way
2224 +---o mBDm-0 simple merge - B side: unrelated update, D side: delete and recreate a file (with different content) - one way
2104 | |/
2225 | |/
2105 | o d-2 re-add d
2226 | o d-2 re-add d
2106 | |
2227 | |
2107 | o d-1 delete d
2228 | o d-1 delete d
2108 | |
2229 | |
2109 o | b-1: b update
2230 o | b-1: b update
2110 |/
2231 |/
2111 o i-2: c -move-> d, s -move-> t
2232 o i-2: c -move-> d, s -move-> t
2112 |
2233 |
2113 o i-1: a -move-> c, p -move-> s
2234 o i-1: a -move-> c, p -move-> s
2114 |
2235 |
2115 o i-0 initial commit: a b h p q r
2236 o i-0 initial commit: a b h p q r
2116
2237
2117 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBDm-0")'
2238 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBDm-0")'
2118 M d
2239 M d
2119 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mDBm-0")'
2240 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mDBm-0")'
2120 M d
2241 M d
2121 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mBDm-0")'
2242 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mBDm-0")'
2122 M b
2243 M b
2123 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mDBm-0")'
2244 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mDBm-0")'
2124 M b
2245 M b
2125 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBDm-0")'
2246 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mBDm-0")'
2126 M b
2247 M b
2127 M d
2248 M d
2128 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mDBm-0")'
2249 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mDBm-0")'
2129 M b
2250 M b
2130 M d
2251 M d
2131
2252
2132 The bugs makes recorded copy is different depending of where we started the merge from since
2253 The bugs makes recorded copy is different depending of where we started the merge from since
2133
2254
2134 $ hg manifest --debug --rev 'desc("mBDm-0")' | grep '644 d'
2255 $ hg manifest --debug --rev 'desc("mBDm-0")' | grep '644 d'
2135 b004912a8510032a0350a74daa2803dadfb00e12 644 d
2256 b004912a8510032a0350a74daa2803dadfb00e12 644 d
2136 $ hg manifest --debug --rev 'desc("mDBm-0")' | grep '644 d'
2257 $ hg manifest --debug --rev 'desc("mDBm-0")' | grep '644 d'
2137 b004912a8510032a0350a74daa2803dadfb00e12 644 d
2258 b004912a8510032a0350a74daa2803dadfb00e12 644 d
2138
2259
2139 $ hg manifest --debug --rev 'desc("d-2")' | grep '644 d'
2260 $ hg manifest --debug --rev 'desc("d-2")' | grep '644 d'
2140 b004912a8510032a0350a74daa2803dadfb00e12 644 d
2261 b004912a8510032a0350a74daa2803dadfb00e12 644 d
2141 $ hg manifest --debug --rev 'desc("b-1")' | grep '644 d'
2262 $ hg manifest --debug --rev 'desc("b-1")' | grep '644 d'
2142 d8252ab2e760b0d4e5288fd44cbd15a0fa567e16 644 d (no-changeset !)
2263 d8252ab2e760b0d4e5288fd44cbd15a0fa567e16 644 d (no-changeset !)
2143 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 d (changeset !)
2264 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 d (changeset !)
2144 $ hg debugindex d | head -n 4 | ../no-linkrev
2265 $ hg debugindex d | head -n 4 | ../no-linkrev
2145 rev linkrev nodeid p1 p2
2266 rev linkrev nodeid p1 p2
2146 0 * d8252ab2e760 000000000000 000000000000 (no-changeset !)
2267 0 * d8252ab2e760 000000000000 000000000000 (no-changeset !)
2147 0 * ae258f702dfe 000000000000 000000000000 (changeset !)
2268 0 * ae258f702dfe 000000000000 000000000000 (changeset !)
2148 1 * b004912a8510 000000000000 000000000000
2269 1 * b004912a8510 000000000000 000000000000
2149 2 * 7b79e2fe0c89 000000000000 000000000000 (no-changeset !)
2270 2 * 7b79e2fe0c89 000000000000 000000000000 (no-changeset !)
2150 2 * 5cce88bf349f ae258f702dfe 000000000000 (changeset !)
2271 2 * 5cce88bf349f ae258f702dfe 000000000000 (changeset !)
2151
2272
2152 Log output should not include a merge commit as it did not happen
2273 Log output should not include a merge commit as it did not happen
2153
2274
2154 $ hg log -Gfr 'desc("mBDm-0")' d
2275 $ hg log -Gfr 'desc("mBDm-0")' d
2155 o d-2 re-add d
2276 o d-2 re-add d
2156 |
2277 |
2157 ~
2278 ~
2158
2279
2159 $ hg log -Gfr 'desc("mDBm-0")' d
2280 $ hg log -Gfr 'desc("mDBm-0")' d
2160 o d-2 re-add d
2281 o d-2 re-add d
2161 |
2282 |
2162 ~
2283 ~
2163
2284
2164 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBDm-0")'
2285 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBDm-0")'
2165 M b
2286 M b
2166 A d
2287 A d
2167 A t
2288 A t
2168 p
2289 p
2169 R a
2290 R a
2170 R p
2291 R p
2171 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mDBm-0")'
2292 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mDBm-0")'
2172 M b
2293 M b
2173 A d
2294 A d
2174 A t
2295 A t
2175 p
2296 p
2176 R a
2297 R a
2177 R p
2298 R p
2178
2299
2179
2300
2180 Comparing with a merge with colliding rename
2301 Comparing with a merge with colliding rename
2181 --------------------------------------------
2302 --------------------------------------------
2182
2303
2183 Subcase: new copy information on both side
2304 Subcase: new copy information on both side
2184 ``````````````````````````````````````````
2305 ``````````````````````````````````````````
2185
2306
2186 - the "e-" branch renaming b to f (through 'g')
2307 - the "e-" branch renaming b to f (through 'g')
2187 - the "a-" branch renaming d to f (through e)
2308 - the "a-" branch renaming d to f (through e)
2188
2309
2189 $ hg log -G --rev '::(desc("mAEm")+desc("mEAm"))'
2310 $ hg log -G --rev '::(desc("mAEm")+desc("mEAm"))'
2190 o mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
2311 o mEAm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - the other way
2191 |\
2312 |\
2192 +---o mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
2313 +---o mAEm-0 merge with copies info on both side - A side: rename d to f, E side: b to f, (same content for f) - one way
2193 | |/
2314 | |/
2194 | o e-2 g -move-> f
2315 | o e-2 g -move-> f
2195 | |
2316 | |
2196 | o e-1 b -move-> g
2317 | o e-1 b -move-> g
2197 | |
2318 | |
2198 o | a-2: e -move-> f
2319 o | a-2: e -move-> f
2199 | |
2320 | |
2200 o | a-1: d -move-> e
2321 o | a-1: d -move-> e
2201 |/
2322 |/
2202 o i-2: c -move-> d, s -move-> t
2323 o i-2: c -move-> d, s -move-> t
2203 |
2324 |
2204 o i-1: a -move-> c, p -move-> s
2325 o i-1: a -move-> c, p -move-> s
2205 |
2326 |
2206 o i-0 initial commit: a b h p q r
2327 o i-0 initial commit: a b h p q r
2207
2328
2208 #if no-changeset
2329 #if no-changeset
2209 $ hg manifest --debug --rev 'desc("mAEm-0")' | grep '644 f'
2330 $ hg manifest --debug --rev 'desc("mAEm-0")' | grep '644 f'
2210 2ff93c643948464ee1f871867910ae43a45b0bea 644 f
2331 2ff93c643948464ee1f871867910ae43a45b0bea 644 f
2211 $ hg manifest --debug --rev 'desc("mEAm-0")' | grep '644 f'
2332 $ hg manifest --debug --rev 'desc("mEAm-0")' | grep '644 f'
2212 2ff93c643948464ee1f871867910ae43a45b0bea 644 f
2333 2ff93c643948464ee1f871867910ae43a45b0bea 644 f
2213 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
2334 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
2214 b76eb76580df486c3d51d63c5c210d4dd43a8ac7 644 f
2335 b76eb76580df486c3d51d63c5c210d4dd43a8ac7 644 f
2215 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
2336 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
2216 e8825b386367b29fec957283a80bb47b47483fe1 644 f
2337 e8825b386367b29fec957283a80bb47b47483fe1 644 f
2217 $ hg debugindex f | ../no-linkrev
2338 $ hg debugindex f | ../no-linkrev
2218 rev linkrev nodeid p1 p2
2339 rev linkrev nodeid p1 p2
2219 0 * b76eb76580df 000000000000 000000000000
2340 0 * b76eb76580df 000000000000 000000000000
2220 1 * e8825b386367 000000000000 000000000000
2341 1 * e8825b386367 000000000000 000000000000
2221 2 * 2ff93c643948 b76eb76580df e8825b386367
2342 2 * 2ff93c643948 b76eb76580df e8825b386367
2222 3 * 2f649fba7eb2 b76eb76580df e8825b386367
2343 3 * 2f649fba7eb2 b76eb76580df e8825b386367
2223 4 * 774e7c1637d5 e8825b386367 b76eb76580df
2344 4 * 774e7c1637d5 e8825b386367 b76eb76580df
2224 #else
2345 #else
2225 $ hg manifest --debug --rev 'desc("mAEm-0")' | grep '644 f'
2346 $ hg manifest --debug --rev 'desc("mAEm-0")' | grep '644 f'
2226 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
2347 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
2227 $ hg manifest --debug --rev 'desc("mEAm-0")' | grep '644 f'
2348 $ hg manifest --debug --rev 'desc("mEAm-0")' | grep '644 f'
2228 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
2349 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
2229 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
2350 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
2230 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
2351 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
2231 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
2352 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
2232 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
2353 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
2233 $ hg debugindex f | ../no-linkrev
2354 $ hg debugindex f | ../no-linkrev
2234 rev linkrev nodeid p1 p2
2355 rev linkrev nodeid p1 p2
2235 0 * ae258f702dfe 000000000000 000000000000
2356 0 * ae258f702dfe 000000000000 000000000000
2236 1 * d3613c1ec831 ae258f702dfe 000000000000
2357 1 * d3613c1ec831 ae258f702dfe 000000000000
2237 2 * 05e03c868bbc ae258f702dfe 000000000000
2358 2 * 05e03c868bbc ae258f702dfe 000000000000
2238 #endif
2359 #endif
2239
2360
2240 # Here the filelog based implementation is not looking at the rename
2361 # Here the filelog based implementation is not looking at the rename
2241 # information (because the file exist on both side). However the changelog
2362 # information (because the file exist on both side). However the changelog
2242 # based on works fine. We have different output.
2363 # based on works fine. We have different output.
2243
2364
2244 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mAEm-0")'
2365 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mAEm-0")'
2245 M f (no-changeset !)
2366 M f (no-changeset !)
2246 b (no-filelog no-changeset !)
2367 b (no-filelog no-changeset !)
2247 R b
2368 R b
2248 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mEAm-0")'
2369 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mEAm-0")'
2249 M f (no-changeset !)
2370 M f (no-changeset !)
2250 b (no-filelog no-changeset !)
2371 b (no-filelog no-changeset !)
2251 R b
2372 R b
2252 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mAEm-0")'
2373 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mAEm-0")'
2253 M f (no-changeset !)
2374 M f (no-changeset !)
2254 d (no-filelog no-changeset !)
2375 d (no-filelog no-changeset !)
2255 R d
2376 R d
2256 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mEAm-0")'
2377 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mEAm-0")'
2257 M f (no-changeset !)
2378 M f (no-changeset !)
2258 d (no-filelog no-changeset !)
2379 d (no-filelog no-changeset !)
2259 R d
2380 R d
2260 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("a-2")'
2381 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("a-2")'
2261 A f
2382 A f
2262 d
2383 d
2263 R d
2384 R d
2264 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("e-2")'
2385 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("e-2")'
2265 A f
2386 A f
2266 b
2387 b
2267 R b
2388 R b
2268
2389
2269 # From here, we run status against revision where both source file exists.
2390 # From here, we run status against revision where both source file exists.
2270 #
2391 #
2271 # The filelog based implementation picks an arbitrary side based on revision
2392 # The filelog based implementation picks an arbitrary side based on revision
2272 # numbers. So the same side "wins" whatever the parents order is. This is
2393 # numbers. So the same side "wins" whatever the parents order is. This is
2273 # sub-optimal because depending on revision numbers means the result can be
2394 # sub-optimal because depending on revision numbers means the result can be
2274 # different from one repository to the next.
2395 # different from one repository to the next.
2275 #
2396 #
2276 # The changeset based algorithm use the parent order to break tie on conflicting
2397 # The changeset based algorithm use the parent order to break tie on conflicting
2277 # information and will have a different order depending on who is p1 and p2.
2398 # information and will have a different order depending on who is p1 and p2.
2278 # That order is stable accross repositories. (data from p1 prevails)
2399 # That order is stable accross repositories. (data from p1 prevails)
2279
2400
2280 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mAEm-0")'
2401 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mAEm-0")'
2281 A f
2402 A f
2282 d
2403 d
2283 R b
2404 R b
2284 R d
2405 R d
2285 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mEAm-0")'
2406 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mEAm-0")'
2286 A f
2407 A f
2287 d (filelog !)
2408 d (filelog !)
2288 b (no-filelog !)
2409 b (no-filelog !)
2289 R b
2410 R b
2290 R d
2411 R d
2291 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAEm-0")'
2412 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAEm-0")'
2292 A f
2413 A f
2293 a
2414 a
2294 A t
2415 A t
2295 p
2416 p
2296 R a
2417 R a
2297 R b
2418 R b
2298 R p
2419 R p
2299 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEAm-0")'
2420 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEAm-0")'
2300 A f
2421 A f
2301 a (filelog !)
2422 a (filelog !)
2302 b (no-filelog !)
2423 b (no-filelog !)
2303 A t
2424 A t
2304 p
2425 p
2305 R a
2426 R a
2306 R b
2427 R b
2307 R p
2428 R p
2308
2429
2309
2430
2310 Subcase: existing copy information overwritten on one branch
2431 Subcase: existing copy information overwritten on one branch
2311 ````````````````````````````````````````````````````````````
2432 ````````````````````````````````````````````````````````````
2312
2433
2313 Note:
2434 Note:
2314 | In this case, one of the merge wrongly record a merge while there is none.
2435 | In this case, one of the merge wrongly record a merge while there is none.
2315 | This lead to bad copy tracing information to be dug up.
2436 | This lead to bad copy tracing information to be dug up.
2316
2437
2317
2438
2318 Merge:
2439 Merge:
2319 - one with change to an unrelated file (b)
2440 - one with change to an unrelated file (b)
2320 - one overwriting a file (d) with a rename (from h to i to d)
2441 - one overwriting a file (d) with a rename (from h to i to d)
2321
2442
2322 $ hg log -G --rev '::(desc("mBFm")+desc("mFBm"))'
2443 $ hg log -G --rev '::(desc("mBFm")+desc("mFBm"))'
2323 o mFBm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
2444 o mFBm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
2324 |\
2445 |\
2325 +---o mBFm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
2446 +---o mBFm-0 simple merge - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
2326 | |/
2447 | |/
2327 | o f-2: rename i -> d
2448 | o f-2: rename i -> d
2328 | |
2449 | |
2329 | o f-1: rename h -> i
2450 | o f-1: rename h -> i
2330 | |
2451 | |
2331 o | b-1: b update
2452 o | b-1: b update
2332 |/
2453 |/
2333 o i-2: c -move-> d, s -move-> t
2454 o i-2: c -move-> d, s -move-> t
2334 |
2455 |
2335 o i-1: a -move-> c, p -move-> s
2456 o i-1: a -move-> c, p -move-> s
2336 |
2457 |
2337 o i-0 initial commit: a b h p q r
2458 o i-0 initial commit: a b h p q r
2338
2459
2339 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBFm-0")'
2460 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBFm-0")'
2340 M b
2461 M b
2341 A d
2462 A d
2342 h
2463 h
2343 A t
2464 A t
2344 p
2465 p
2345 R a
2466 R a
2346 R h
2467 R h
2347 R p
2468 R p
2348 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFBm-0")'
2469 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFBm-0")'
2349 M b
2470 M b
2350 A d
2471 A d
2351 h
2472 h
2352 A t
2473 A t
2353 p
2474 p
2354 R a
2475 R a
2355 R h
2476 R h
2356 R p
2477 R p
2357 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBFm-0")'
2478 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBFm-0")'
2358 M d (no-changeset !)
2479 M d (no-changeset !)
2359 h (no-filelog no-changeset !)
2480 h (no-filelog no-changeset !)
2360 R h
2481 R h
2361 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mBFm-0")'
2482 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mBFm-0")'
2362 M b
2483 M b
2363 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mBFm-0")'
2484 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mBFm-0")'
2364 M b
2485 M b
2365 M d (no-changeset !)
2486 M d (no-changeset !)
2366 i (no-filelog no-changeset !)
2487 i (no-filelog no-changeset !)
2367 R i
2488 R i
2368 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mFBm-0")'
2489 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mFBm-0")'
2369 M d (no-changeset !)
2490 M d (no-changeset !)
2370 h (no-filelog no-changeset !)
2491 h (no-filelog no-changeset !)
2371 R h
2492 R h
2372 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mFBm-0")'
2493 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mFBm-0")'
2373 M b
2494 M b
2374 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mFBm-0")'
2495 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mFBm-0")'
2375 M b
2496 M b
2376 M d (no-changeset !)
2497 M d (no-changeset !)
2377 i (no-filelog no-changeset !)
2498 i (no-filelog no-changeset !)
2378 R i
2499 R i
2379
2500
2380 #if no-changeset
2501 #if no-changeset
2381 $ hg log -Gfr 'desc("mBFm-0")' d
2502 $ hg log -Gfr 'desc("mBFm-0")' d
2382 o f-2: rename i -> d
2503 o f-2: rename i -> d
2383 |
2504 |
2384 o f-1: rename h -> i
2505 o f-1: rename h -> i
2385 :
2506 :
2386 o i-0 initial commit: a b h p q r
2507 o i-0 initial commit: a b h p q r
2387
2508
2388 #else
2509 #else
2389 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2510 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2390 $ hg log -Gfr 'desc("mBFm-0")' d
2511 $ hg log -Gfr 'desc("mBFm-0")' d
2391 o i-2: c -move-> d, s -move-> t
2512 o i-2: c -move-> d, s -move-> t
2392 |
2513 |
2393 ~
2514 ~
2394 #endif
2515 #endif
2395
2516
2396 #if no-changeset
2517 #if no-changeset
2397 $ hg log -Gfr 'desc("mFBm-0")' d
2518 $ hg log -Gfr 'desc("mFBm-0")' d
2398 o f-2: rename i -> d
2519 o f-2: rename i -> d
2399 |
2520 |
2400 o f-1: rename h -> i
2521 o f-1: rename h -> i
2401 :
2522 :
2402 o i-0 initial commit: a b h p q r
2523 o i-0 initial commit: a b h p q r
2403
2524
2404 #else
2525 #else
2405 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2526 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2406 $ hg log -Gfr 'desc("mFBm-0")' d
2527 $ hg log -Gfr 'desc("mFBm-0")' d
2407 o i-2: c -move-> d, s -move-> t
2528 o i-2: c -move-> d, s -move-> t
2408 |
2529 |
2409 ~
2530 ~
2410 #endif
2531 #endif
2411
2532
2412
2533
2413 Subcase: existing copy information overwritten on one branch, with different content)
2534 Subcase: existing copy information overwritten on one branch, with different content)
2414 `````````````````````````````````````````````````````````````````````````````````````
2535 `````````````````````````````````````````````````````````````````````````````````````
2415
2536
2416 Merge:
2537 Merge:
2417 - one with change to an unrelated file (b)
2538 - one with change to an unrelated file (b)
2418 - one overwriting a file (t) with a rename (from r to x to t), v content is not the same as on the other branch
2539 - one overwriting a file (t) with a rename (from r to x to t), v content is not the same as on the other branch
2419
2540
2420 $ hg log -G --rev '::(desc("mBRm")+desc("mRBm"))'
2541 $ hg log -G --rev '::(desc("mBRm")+desc("mRBm"))'
2421 o mRBm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - the other way
2542 o mRBm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - the other way
2422 |\
2543 |\
2423 +---o mBRm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - one way
2544 +---o mBRm-0 simple merge - B side: unrelated change, R side: overwrite d with a copy (from r->x->t) different content - one way
2424 | |/
2545 | |/
2425 | o r-2: rename t -> x
2546 | o r-2: rename t -> x
2426 | |
2547 | |
2427 | o r-1: rename r -> x
2548 | o r-1: rename r -> x
2428 | |
2549 | |
2429 o | b-1: b update
2550 o | b-1: b update
2430 |/
2551 |/
2431 o i-2: c -move-> d, s -move-> t
2552 o i-2: c -move-> d, s -move-> t
2432 |
2553 |
2433 o i-1: a -move-> c, p -move-> s
2554 o i-1: a -move-> c, p -move-> s
2434 |
2555 |
2435 o i-0 initial commit: a b h p q r
2556 o i-0 initial commit: a b h p q r
2436
2557
2437 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBRm-0")'
2558 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBRm-0")'
2438 M b
2559 M b
2439 A d
2560 A d
2440 a
2561 a
2441 A t
2562 A t
2442 r
2563 r
2443 R a
2564 R a
2444 R p
2565 R p
2445 R r
2566 R r
2446 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mRBm-0")'
2567 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mRBm-0")'
2447 M b
2568 M b
2448 A d
2569 A d
2449 a
2570 a
2450 A t
2571 A t
2451 r
2572 r
2452 R a
2573 R a
2453 R p
2574 R p
2454 R r
2575 R r
2455 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBRm-0")'
2576 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBRm-0")'
2456 M t
2577 M t
2457 r (no-filelog !)
2578 r (no-filelog !)
2458 R r
2579 R r
2459 $ hg status --copies --rev 'desc("r-2")' --rev 'desc("mBRm-0")'
2580 $ hg status --copies --rev 'desc("r-2")' --rev 'desc("mBRm-0")'
2460 M b
2581 M b
2461 $ hg status --copies --rev 'desc("r-1")' --rev 'desc("mBRm-0")'
2582 $ hg status --copies --rev 'desc("r-1")' --rev 'desc("mBRm-0")'
2462 M b
2583 M b
2463 M t
2584 M t
2464 x (no-filelog !)
2585 x (no-filelog !)
2465 R x
2586 R x
2466 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mRBm-0")'
2587 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mRBm-0")'
2467 M t
2588 M t
2468 r (no-filelog !)
2589 r (no-filelog !)
2469 R r
2590 R r
2470 $ hg status --copies --rev 'desc("r-2")' --rev 'desc("mRBm-0")'
2591 $ hg status --copies --rev 'desc("r-2")' --rev 'desc("mRBm-0")'
2471 M b
2592 M b
2472 $ hg status --copies --rev 'desc("r-1")' --rev 'desc("mRBm-0")'
2593 $ hg status --copies --rev 'desc("r-1")' --rev 'desc("mRBm-0")'
2473 M b
2594 M b
2474 M t
2595 M t
2475 x (no-filelog !)
2596 x (no-filelog !)
2476 R x
2597 R x
2477
2598
2478 #if no-changeset
2599 #if no-changeset
2479 $ hg log -Gfr 'desc("mBRm-0")' d
2600 $ hg log -Gfr 'desc("mBRm-0")' d
2480 o i-2: c -move-> d, s -move-> t
2601 o i-2: c -move-> d, s -move-> t
2481 |
2602 |
2482 o i-1: a -move-> c, p -move-> s
2603 o i-1: a -move-> c, p -move-> s
2483 |
2604 |
2484 o i-0 initial commit: a b h p q r
2605 o i-0 initial commit: a b h p q r
2485
2606
2486 #else
2607 #else
2487 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2608 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2488 $ hg log -Gfr 'desc("mBRm-0")' d
2609 $ hg log -Gfr 'desc("mBRm-0")' d
2489 o i-2: c -move-> d, s -move-> t
2610 o i-2: c -move-> d, s -move-> t
2490 |
2611 |
2491 ~
2612 ~
2492 #endif
2613 #endif
2493
2614
2494 #if no-changeset
2615 #if no-changeset
2495 $ hg log -Gfr 'desc("mRBm-0")' d
2616 $ hg log -Gfr 'desc("mRBm-0")' d
2496 o i-2: c -move-> d, s -move-> t
2617 o i-2: c -move-> d, s -move-> t
2497 |
2618 |
2498 o i-1: a -move-> c, p -move-> s
2619 o i-1: a -move-> c, p -move-> s
2499 |
2620 |
2500 o i-0 initial commit: a b h p q r
2621 o i-0 initial commit: a b h p q r
2501
2622
2502 #else
2623 #else
2503 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2624 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2504 $ hg log -Gfr 'desc("mRBm-0")' d
2625 $ hg log -Gfr 'desc("mRBm-0")' d
2505 o i-2: c -move-> d, s -move-> t
2626 o i-2: c -move-> d, s -move-> t
2506 |
2627 |
2507 ~
2628 ~
2508 #endif
2629 #endif
2509
2630
2510 Subcase: reset of the copy history on one side
2631 Subcase: reset of the copy history on one side
2511 ``````````````````````````````````````````````
2632 ``````````````````````````````````````````````
2512
2633
2513 Merge:
2634 Merge:
2514 - one with change to a file
2635 - one with change to a file
2515 - one deleting and recreating the file
2636 - one deleting and recreating the file
2516
2637
2517 Unlike in the 'BD/DB' cases, an actual merge happened here. So we should
2638 Unlike in the 'BD/DB' cases, an actual merge happened here. So we should
2518 consider history and rename on both branch of the merge.
2639 consider history and rename on both branch of the merge.
2519
2640
2520 $ hg log -G --rev '::(desc("mDGm")+desc("mGDm"))'
2641 $ hg log -G --rev '::(desc("mDGm")+desc("mGDm"))'
2521 o mGDm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - the other way
2642 o mGDm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - the other way
2522 |\
2643 |\
2523 +---o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2644 +---o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2524 | |/
2645 | |/
2525 | o g-1: update d
2646 | o g-1: update d
2526 | |
2647 | |
2527 o | d-2 re-add d
2648 o | d-2 re-add d
2528 | |
2649 | |
2529 o | d-1 delete d
2650 o | d-1 delete d
2530 |/
2651 |/
2531 o i-2: c -move-> d, s -move-> t
2652 o i-2: c -move-> d, s -move-> t
2532 |
2653 |
2533 o i-1: a -move-> c, p -move-> s
2654 o i-1: a -move-> c, p -move-> s
2534 |
2655 |
2535 o i-0 initial commit: a b h p q r
2656 o i-0 initial commit: a b h p q r
2536
2657
2537 One side of the merge have a long history with rename. The other side of the
2658 One side of the merge have a long history with rename. The other side of the
2538 merge point to a new file with a smaller history. Each side is "valid".
2659 merge point to a new file with a smaller history. Each side is "valid".
2539
2660
2540 (and again the filelog based algorithm only explore one, with a pick based on
2661 (and again the filelog based algorithm only explore one, with a pick based on
2541 revision numbers)
2662 revision numbers)
2542
2663
2543 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mDGm-0")'
2664 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mDGm-0")'
2544 A d
2665 A d
2545 a (filelog !)
2666 a (filelog !)
2546 A t
2667 A t
2547 p
2668 p
2548 R a
2669 R a
2549 R p
2670 R p
2550 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGDm-0")'
2671 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGDm-0")'
2551 A d
2672 A d
2552 a
2673 a
2553 A t
2674 A t
2554 p
2675 p
2555 R a
2676 R a
2556 R p
2677 R p
2557 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mDGm-0")'
2678 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mDGm-0")'
2558 M d
2679 M d
2559 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mGDm-0")'
2680 $ hg status --copies --rev 'desc("d-2")' --rev 'desc("mGDm-0")'
2560 M d
2681 M d
2561 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mDGm-0")'
2682 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mDGm-0")'
2562 M d
2683 M d
2563 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mGDm-0")'
2684 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mGDm-0")'
2564 M d
2685 M d
2565
2686
2566 #if no-changeset
2687 #if no-changeset
2567 $ hg log -Gfr 'desc("mDGm-0")' d
2688 $ hg log -Gfr 'desc("mDGm-0")' d
2568 o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2689 o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2569 |\
2690 |\
2570 | o g-1: update d
2691 | o g-1: update d
2571 | |
2692 | |
2572 o | d-2 re-add d
2693 o | d-2 re-add d
2573 |/
2694 |/
2574 o i-2: c -move-> d, s -move-> t
2695 o i-2: c -move-> d, s -move-> t
2575 |
2696 |
2576 o i-1: a -move-> c, p -move-> s
2697 o i-1: a -move-> c, p -move-> s
2577 |
2698 |
2578 o i-0 initial commit: a b h p q r
2699 o i-0 initial commit: a b h p q r
2579
2700
2580 #else
2701 #else
2581 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2702 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2582 $ hg log -Gfr 'desc("mDGm-0")' d
2703 $ hg log -Gfr 'desc("mDGm-0")' d
2583 o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2704 o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2584 |\
2705 |\
2585 | o g-1: update d
2706 | o g-1: update d
2586 | |
2707 | |
2587 o | d-2 re-add d
2708 o | d-2 re-add d
2588 |/
2709 |/
2589 o i-2: c -move-> d, s -move-> t
2710 o i-2: c -move-> d, s -move-> t
2590 |
2711 |
2591 ~
2712 ~
2592 #endif
2713 #endif
2593
2714
2594
2715
2595 #if no-changeset
2716 #if no-changeset
2596 $ hg log -Gfr 'desc("mDGm-0")' d
2717 $ hg log -Gfr 'desc("mDGm-0")' d
2597 o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2718 o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2598 |\
2719 |\
2599 | o g-1: update d
2720 | o g-1: update d
2600 | |
2721 | |
2601 o | d-2 re-add d
2722 o | d-2 re-add d
2602 |/
2723 |/
2603 o i-2: c -move-> d, s -move-> t
2724 o i-2: c -move-> d, s -move-> t
2604 |
2725 |
2605 o i-1: a -move-> c, p -move-> s
2726 o i-1: a -move-> c, p -move-> s
2606 |
2727 |
2607 o i-0 initial commit: a b h p q r
2728 o i-0 initial commit: a b h p q r
2608
2729
2609 #else
2730 #else
2610 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2731 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2611 $ hg log -Gfr 'desc("mDGm-0")' d
2732 $ hg log -Gfr 'desc("mDGm-0")' d
2612 o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2733 o mDGm-0 actual content merge, copies on one side - D side: delete and re-add (different content), G side: update content - one way
2613 |\
2734 |\
2614 | o g-1: update d
2735 | o g-1: update d
2615 | |
2736 | |
2616 o | d-2 re-add d
2737 o | d-2 re-add d
2617 |/
2738 |/
2618 o i-2: c -move-> d, s -move-> t
2739 o i-2: c -move-> d, s -move-> t
2619 |
2740 |
2620 ~
2741 ~
2621 #endif
2742 #endif
2622
2743
2623 Subcase: merging a change to a file with a "copy overwrite" to that file from another branch
2744 Subcase: merging a change to a file with a "copy overwrite" to that file from another branch
2624 ````````````````````````````````````````````````````````````````````````````````````````````
2745 ````````````````````````````````````````````````````````````````````````````````````````````
2625
2746
2626 Merge:
2747 Merge:
2627 - one with change to a file (d)
2748 - one with change to a file (d)
2628 - one overwriting that file with a rename (from h to i, to d)
2749 - one overwriting that file with a rename (from h to i, to d)
2629
2750
2630 This case is similar to BF/FB, but an actual merge happens, so both side of the
2751 This case is similar to BF/FB, but an actual merge happens, so both side of the
2631 history are relevant.
2752 history are relevant.
2632
2753
2633
2754
2634 $ hg log -G --rev '::(desc("mGFm")+desc("mFGm"))'
2755 $ hg log -G --rev '::(desc("mGFm")+desc("mFGm"))'
2635 o mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
2756 o mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
2636 |\
2757 |\
2637 +---o mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
2758 +---o mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
2638 | |/
2759 | |/
2639 | o g-1: update d
2760 | o g-1: update d
2640 | |
2761 | |
2641 o | f-2: rename i -> d
2762 o | f-2: rename i -> d
2642 | |
2763 | |
2643 o | f-1: rename h -> i
2764 o | f-1: rename h -> i
2644 |/
2765 |/
2645 o i-2: c -move-> d, s -move-> t
2766 o i-2: c -move-> d, s -move-> t
2646 |
2767 |
2647 o i-1: a -move-> c, p -move-> s
2768 o i-1: a -move-> c, p -move-> s
2648 |
2769 |
2649 o i-0 initial commit: a b h p q r
2770 o i-0 initial commit: a b h p q r
2650
2771
2651
2772
2652 Note:
2773 Note:
2653 | In this case, the merge get conflicting information since on one side we have
2774 | In this case, the merge get conflicting information since on one side we have
2654 | "a -> c -> d". and one the other one we have "h -> i -> d".
2775 | "a -> c -> d". and one the other one we have "h -> i -> d".
2655 |
2776 |
2656 | The current code arbitrarily pick one side depending the ordering of the merged hash:
2777 | The current code arbitrarily pick one side depending the ordering of the merged hash:
2657
2778
2658 In this case, the file hash from "f-2" is lower, so it will be `p1` of the resulting filenode its copy tracing information will win (and trace back to "h"):
2779 In this case, the file hash from "f-2" is lower, so it will be `p1` of the resulting filenode its copy tracing information will win (and trace back to "h"):
2659
2780
2660 Details on this hash ordering pick:
2781 Details on this hash ordering pick:
2661
2782
2662 $ hg manifest --debug 'desc("g-1")' | egrep 'd$'
2783 $ hg manifest --debug 'desc("g-1")' | egrep 'd$'
2663 17ec97e605773eb44a117d1136b3849bcdc1924f 644 d (no-changeset !)
2784 17ec97e605773eb44a117d1136b3849bcdc1924f 644 d (no-changeset !)
2664 5cce88bf349f7c742bb440f2c53f81db9c294279 644 d (changeset !)
2785 5cce88bf349f7c742bb440f2c53f81db9c294279 644 d (changeset !)
2665 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("g-1")' d
2786 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("g-1")' d
2666 A d
2787 A d
2667 a (no-changeset no-compatibility !)
2788 a (no-changeset no-compatibility !)
2668
2789
2669 $ hg manifest --debug 'desc("f-2")' | egrep 'd$'
2790 $ hg manifest --debug 'desc("f-2")' | egrep 'd$'
2670 7b79e2fe0c8924e0e598a82f048a7b024afa4d96 644 d (no-changeset !)
2791 7b79e2fe0c8924e0e598a82f048a7b024afa4d96 644 d (no-changeset !)
2671 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 d (changeset !)
2792 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 d (changeset !)
2672 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("f-2")' d
2793 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("f-2")' d
2673 A d
2794 A d
2674 h (no-changeset no-compatibility !)
2795 h (no-changeset no-compatibility !)
2675
2796
2676 Copy tracing data on the resulting merge:
2797 Copy tracing data on the resulting merge:
2677
2798
2678 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFGm-0")'
2799 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFGm-0")'
2679 A d
2800 A d
2680 h (no-filelog !)
2801 h (no-filelog !)
2681 a (filelog !)
2802 a (filelog !)
2682 A t
2803 A t
2683 p
2804 p
2684 R a
2805 R a
2685 R h
2806 R h
2686 R p
2807 R p
2687 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGFm-0")'
2808 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGFm-0")'
2688 A d
2809 A d
2689 a (no-changeset !)
2810 a (no-changeset !)
2690 h (changeset !)
2811 h (changeset !)
2691 A t
2812 A t
2692 p
2813 p
2693 R a
2814 R a
2694 R h
2815 R h
2695 R p
2816 R p
2696 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mFGm-0")'
2817 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mFGm-0")'
2697 M d
2818 M d
2698 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mGFm-0")'
2819 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mGFm-0")'
2699 M d
2820 M d
2700 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mFGm-0")'
2821 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mFGm-0")'
2701 M d
2822 M d
2702 i (no-filelog !)
2823 i (no-filelog !)
2703 R i
2824 R i
2704 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mGFm-0")'
2825 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mGFm-0")'
2705 M d
2826 M d
2706 i (no-filelog !)
2827 i (no-filelog !)
2707 R i
2828 R i
2708 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mFGm-0")'
2829 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mFGm-0")'
2709 M d (no-changeset !)
2830 M d (no-changeset !)
2710 h (no-filelog no-changeset !)
2831 h (no-filelog no-changeset !)
2711 R h
2832 R h
2712 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mGFm-0")'
2833 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mGFm-0")'
2713 M d (no-changeset !)
2834 M d (no-changeset !)
2714 h (no-filelog no-changeset !)
2835 h (no-filelog no-changeset !)
2715 R h
2836 R h
2716
2837
2717 #if no-changeset
2838 #if no-changeset
2718 $ hg log -Gfr 'desc("mFGm-0")' d
2839 $ hg log -Gfr 'desc("mFGm-0")' d
2719 o mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
2840 o mFGm-0 merge - G side: content change, F side: copy overwrite, no content change - one way
2720 |\
2841 |\
2721 | o g-1: update d
2842 | o g-1: update d
2722 | |
2843 | |
2723 o | f-2: rename i -> d
2844 o | f-2: rename i -> d
2724 | |
2845 | |
2725 o | f-1: rename h -> i
2846 o | f-1: rename h -> i
2726 |/
2847 |/
2727 o i-2: c -move-> d, s -move-> t
2848 o i-2: c -move-> d, s -move-> t
2728 |
2849 |
2729 o i-1: a -move-> c, p -move-> s
2850 o i-1: a -move-> c, p -move-> s
2730 |
2851 |
2731 o i-0 initial commit: a b h p q r
2852 o i-0 initial commit: a b h p q r
2732
2853
2733 #else
2854 #else
2734 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2855 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2735 $ hg log -Gfr 'desc("mFGm-0")' d
2856 $ hg log -Gfr 'desc("mFGm-0")' d
2736 o g-1: update d
2857 o g-1: update d
2737 |
2858 |
2738 o i-2: c -move-> d, s -move-> t
2859 o i-2: c -move-> d, s -move-> t
2739 |
2860 |
2740 ~
2861 ~
2741 #endif
2862 #endif
2742
2863
2743 #if no-changeset
2864 #if no-changeset
2744 $ hg log -Gfr 'desc("mGFm-0")' d
2865 $ hg log -Gfr 'desc("mGFm-0")' d
2745 o mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
2866 o mGFm-0 merge - G side: content change, F side: copy overwrite, no content change - the other way
2746 |\
2867 |\
2747 | o g-1: update d
2868 | o g-1: update d
2748 | |
2869 | |
2749 o | f-2: rename i -> d
2870 o | f-2: rename i -> d
2750 | |
2871 | |
2751 o | f-1: rename h -> i
2872 o | f-1: rename h -> i
2752 |/
2873 |/
2753 o i-2: c -move-> d, s -move-> t
2874 o i-2: c -move-> d, s -move-> t
2754 |
2875 |
2755 o i-1: a -move-> c, p -move-> s
2876 o i-1: a -move-> c, p -move-> s
2756 |
2877 |
2757 o i-0 initial commit: a b h p q r
2878 o i-0 initial commit: a b h p q r
2758
2879
2759 #else
2880 #else
2760 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2881 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
2761 $ hg log -Gfr 'desc("mGFm-0")' d
2882 $ hg log -Gfr 'desc("mGFm-0")' d
2762 o g-1: update d
2883 o g-1: update d
2763 |
2884 |
2764 o i-2: c -move-> d, s -move-> t
2885 o i-2: c -move-> d, s -move-> t
2765 |
2886 |
2766 ~
2887 ~
2767 #endif
2888 #endif
2768
2889
2769 Subcase: new copy information on both side with an actual merge happening
2890 Subcase: new copy information on both side with an actual merge happening
2770 `````````````````````````````````````````````````````````````````````````
2891 `````````````````````````````````````````````````````````````````````````
2771
2892
2772 - the "p-" branch renaming 't' to 'v' (through 'u')
2893 - the "p-" branch renaming 't' to 'v' (through 'u')
2773 - the "q-" branch renaming 'r' to 'v' (through 'w')
2894 - the "q-" branch renaming 'r' to 'v' (through 'w')
2774
2895
2775
2896
2776 $ hg log -G --rev '::(desc("mPQm")+desc("mQPm"))'
2897 $ hg log -G --rev '::(desc("mPQm")+desc("mQPm"))'
2777 o mQPm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - the other way
2898 o mQPm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - the other way
2778 |\
2899 |\
2779 +---o mPQm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - one way
2900 +---o mPQm-0 merge with copies info on both side - P side: rename t to v, Q side: r to v, (different content) - one way
2780 | |/
2901 | |/
2781 | o q-2 w -move-> v
2902 | o q-2 w -move-> v
2782 | |
2903 | |
2783 | o q-1 r -move-> w
2904 | o q-1 r -move-> w
2784 | |
2905 | |
2785 o | p-2: u -move-> v
2906 o | p-2: u -move-> v
2786 | |
2907 | |
2787 o | p-1: t -move-> u
2908 o | p-1: t -move-> u
2788 |/
2909 |/
2789 o i-2: c -move-> d, s -move-> t
2910 o i-2: c -move-> d, s -move-> t
2790 |
2911 |
2791 o i-1: a -move-> c, p -move-> s
2912 o i-1: a -move-> c, p -move-> s
2792 |
2913 |
2793 o i-0 initial commit: a b h p q r
2914 o i-0 initial commit: a b h p q r
2794
2915
2795
2916
2796 #if no-changeset
2917 #if no-changeset
2797 $ hg manifest --debug --rev 'desc("mPQm-0")' | grep '644 v'
2918 $ hg manifest --debug --rev 'desc("mPQm-0")' | grep '644 v'
2798 0946c662ef16e4e67397fd717389eb6693d41749 644 v
2919 0946c662ef16e4e67397fd717389eb6693d41749 644 v
2799 $ hg manifest --debug --rev 'desc("mQPm-0")' | grep '644 v'
2920 $ hg manifest --debug --rev 'desc("mQPm-0")' | grep '644 v'
2800 0db3aad7fcc1ec27fab57060e327b9e864ea0cc9 644 v
2921 0db3aad7fcc1ec27fab57060e327b9e864ea0cc9 644 v
2801 $ hg manifest --debug --rev 'desc("p-2")' | grep '644 v'
2922 $ hg manifest --debug --rev 'desc("p-2")' | grep '644 v'
2802 3f91841cd75cadc9a1f1b4e7c1aa6d411f76032e 644 v
2923 3f91841cd75cadc9a1f1b4e7c1aa6d411f76032e 644 v
2803 $ hg manifest --debug --rev 'desc("q-2")' | grep '644 v'
2924 $ hg manifest --debug --rev 'desc("q-2")' | grep '644 v'
2804 c43c088b811fd27983c0a9aadf44f3343cd4cd7e 644 v
2925 c43c088b811fd27983c0a9aadf44f3343cd4cd7e 644 v
2805 $ hg debugindex v | ../no-linkrev
2926 $ hg debugindex v | ../no-linkrev
2806 rev linkrev nodeid p1 p2
2927 rev linkrev nodeid p1 p2
2807 0 * 3f91841cd75c 000000000000 000000000000
2928 0 * 3f91841cd75c 000000000000 000000000000
2808 1 * c43c088b811f 000000000000 000000000000
2929 1 * c43c088b811f 000000000000 000000000000
2809 2 * 0946c662ef16 3f91841cd75c c43c088b811f
2930 2 * 0946c662ef16 3f91841cd75c c43c088b811f
2810 3 * 0db3aad7fcc1 c43c088b811f 3f91841cd75c
2931 3 * 0db3aad7fcc1 c43c088b811f 3f91841cd75c
2811 #else
2932 #else
2812 $ hg manifest --debug --rev 'desc("mPQm-0")' | grep '644 v'
2933 $ hg manifest --debug --rev 'desc("mPQm-0")' | grep '644 v'
2813 65fde9f6e4d4da23b3f610e07b53673ea9541d75 644 v
2934 65fde9f6e4d4da23b3f610e07b53673ea9541d75 644 v
2814 $ hg manifest --debug --rev 'desc("mQPm-0")' | grep '644 v'
2935 $ hg manifest --debug --rev 'desc("mQPm-0")' | grep '644 v'
2815 a098dda6413aecf154eefc976afc38b295acb7e5 644 v
2936 a098dda6413aecf154eefc976afc38b295acb7e5 644 v
2816 $ hg manifest --debug --rev 'desc("p-2")' | grep '644 v'
2937 $ hg manifest --debug --rev 'desc("p-2")' | grep '644 v'
2817 5aed6a8dbff0301328c08360d24354d3d064cf0d 644 v
2938 5aed6a8dbff0301328c08360d24354d3d064cf0d 644 v
2818 $ hg manifest --debug --rev 'desc("q-2")' | grep '644 v'
2939 $ hg manifest --debug --rev 'desc("q-2")' | grep '644 v'
2819 a38b2fa170219750dac9bc7d19df831f213ba708 644 v
2940 a38b2fa170219750dac9bc7d19df831f213ba708 644 v
2820 $ hg debugindex v | ../no-linkrev
2941 $ hg debugindex v | ../no-linkrev
2821 rev linkrev nodeid p1 p2
2942 rev linkrev nodeid p1 p2
2822 0 * 5aed6a8dbff0 000000000000 000000000000
2943 0 * 5aed6a8dbff0 000000000000 000000000000
2823 1 * a38b2fa17021 000000000000 000000000000
2944 1 * a38b2fa17021 000000000000 000000000000
2824 2 * 65fde9f6e4d4 5aed6a8dbff0 a38b2fa17021
2945 2 * 65fde9f6e4d4 5aed6a8dbff0 a38b2fa17021
2825 3 * a098dda6413a a38b2fa17021 5aed6a8dbff0
2946 3 * a098dda6413a a38b2fa17021 5aed6a8dbff0
2826 #endif
2947 #endif
2827
2948
2828 # Here the filelog based implementation is not looking at the rename
2949 # Here the filelog based implementation is not looking at the rename
2829 # information (because the file exist on both side). However the changelog
2950 # information (because the file exist on both side). However the changelog
2830 # based on works fine. We have different output.
2951 # based on works fine. We have different output.
2831
2952
2832 $ hg status --copies --rev 'desc("p-2")' --rev 'desc("mPQm-0")'
2953 $ hg status --copies --rev 'desc("p-2")' --rev 'desc("mPQm-0")'
2833 M v
2954 M v
2834 r (no-filelog !)
2955 r (no-filelog !)
2835 R r
2956 R r
2836 $ hg status --copies --rev 'desc("p-2")' --rev 'desc("mQPm-0")'
2957 $ hg status --copies --rev 'desc("p-2")' --rev 'desc("mQPm-0")'
2837 M v
2958 M v
2838 r (no-filelog !)
2959 r (no-filelog !)
2839 R r
2960 R r
2840 $ hg status --copies --rev 'desc("q-2")' --rev 'desc("mPQm-0")'
2961 $ hg status --copies --rev 'desc("q-2")' --rev 'desc("mPQm-0")'
2841 M v
2962 M v
2842 t (no-filelog !)
2963 t (no-filelog !)
2843 R t
2964 R t
2844 $ hg status --copies --rev 'desc("q-2")' --rev 'desc("mQPm-0")'
2965 $ hg status --copies --rev 'desc("q-2")' --rev 'desc("mQPm-0")'
2845 M v
2966 M v
2846 t (no-filelog !)
2967 t (no-filelog !)
2847 R t
2968 R t
2848 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("p-2")'
2969 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("p-2")'
2849 A v
2970 A v
2850 t
2971 t
2851 R t
2972 R t
2852 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("q-2")'
2973 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("q-2")'
2853 A v
2974 A v
2854 r
2975 r
2855 R r
2976 R r
2856
2977
2857 # From here, we run status against revision where both source file exists.
2978 # From here, we run status against revision where both source file exists.
2858 #
2979 #
2859 # The filelog based implementation picks an arbitrary side based on revision
2980 # The filelog based implementation picks an arbitrary side based on revision
2860 # numbers. So the same side "wins" whatever the parents order is. This is
2981 # numbers. So the same side "wins" whatever the parents order is. This is
2861 # sub-optimal because depending on revision numbers means the result can be
2982 # sub-optimal because depending on revision numbers means the result can be
2862 # different from one repository to the next.
2983 # different from one repository to the next.
2863 #
2984 #
2864 # The changeset based algorithm use the parent order to break tie on conflicting
2985 # The changeset based algorithm use the parent order to break tie on conflicting
2865 # information and will have a different order depending on who is p1 and p2.
2986 # information and will have a different order depending on who is p1 and p2.
2866 # That order is stable accross repositories. (data from p1 prevails)
2987 # That order is stable accross repositories. (data from p1 prevails)
2867
2988
2868 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mPQm-0")'
2989 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mPQm-0")'
2869 A v
2990 A v
2870 t
2991 t
2871 R r
2992 R r
2872 R t
2993 R t
2873 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mQPm-0")'
2994 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mQPm-0")'
2874 A v
2995 A v
2875 t (filelog !)
2996 t (filelog !)
2876 r (no-filelog !)
2997 r (no-filelog !)
2877 R r
2998 R r
2878 R t
2999 R t
2879 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mPQm-0")'
3000 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mPQm-0")'
2880 A d
3001 A d
2881 a
3002 a
2882 A v
3003 A v
2883 r (filelog !)
3004 r (filelog !)
2884 p (no-filelog !)
3005 p (no-filelog !)
2885 R a
3006 R a
2886 R p
3007 R p
2887 R r
3008 R r
2888 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mQPm-0")'
3009 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mQPm-0")'
2889 A d
3010 A d
2890 a
3011 a
2891 A v
3012 A v
2892 r
3013 r
2893 R a
3014 R a
2894 R p
3015 R p
2895 R r
3016 R r
2896
3017
2897
3018
2898 Comparing with merging with a deletion (and keeping the file)
3019 Comparing with merging with a deletion (and keeping the file)
2899 -------------------------------------------------------------
3020 -------------------------------------------------------------
2900
3021
2901 Merge:
3022 Merge:
2902 - one removing a file (d)
3023 - one removing a file (d)
2903 - one updating that file
3024 - one updating that file
2904 - the merge keep the modified version of the file (canceling the delete)
3025 - the merge keep the modified version of the file (canceling the delete)
2905
3026
2906 In this case, the file keep on living after the merge. So we should not drop its
3027 In this case, the file keep on living after the merge. So we should not drop its
2907 copy tracing chain.
3028 copy tracing chain.
2908
3029
2909 $ hg log -G --rev '::(desc("mCGm")+desc("mGCm"))'
3030 $ hg log -G --rev '::(desc("mCGm")+desc("mGCm"))'
2910 o mGCm-0 merge updated/deleted - revive the file (updated content) - the other way
3031 o mGCm-0 merge updated/deleted - revive the file (updated content) - the other way
2911 |\
3032 |\
2912 +---o mCGm-0 merge updated/deleted - revive the file (updated content) - one way
3033 +---o mCGm-0 merge updated/deleted - revive the file (updated content) - one way
2913 | |/
3034 | |/
2914 | o g-1: update d
3035 | o g-1: update d
2915 | |
3036 | |
2916 o | c-1 delete d
3037 o | c-1 delete d
2917 |/
3038 |/
2918 o i-2: c -move-> d, s -move-> t
3039 o i-2: c -move-> d, s -move-> t
2919 |
3040 |
2920 o i-1: a -move-> c, p -move-> s
3041 o i-1: a -move-> c, p -move-> s
2921 |
3042 |
2922 o i-0 initial commit: a b h p q r
3043 o i-0 initial commit: a b h p q r
2923
3044
2924
3045
2925 'a' is the copy source of 'd'
3046 'a' is the copy source of 'd'
2926
3047
2927 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCGm-0")'
3048 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCGm-0")'
2928 A d
3049 A d
2929 a (no-compatibility no-changeset !)
3050 a (no-compatibility no-changeset !)
2930 A t
3051 A t
2931 p
3052 p
2932 R a
3053 R a
2933 R p
3054 R p
2934 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGCm-0")'
3055 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGCm-0")'
2935 A d
3056 A d
2936 a (no-compatibility no-changeset !)
3057 a (no-compatibility no-changeset !)
2937 A t
3058 A t
2938 p
3059 p
2939 R a
3060 R a
2940 R p
3061 R p
2941 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCGm-0")'
3062 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCGm-0")'
2942 A d
3063 A d
2943 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mGCm-0")'
3064 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mGCm-0")'
2944 A d
3065 A d
2945 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mCGm-0")'
3066 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mCGm-0")'
2946 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mGCm-0")'
3067 $ hg status --copies --rev 'desc("g-1")' --rev 'desc("mGCm-0")'
2947
3068
2948
3069
2949 Comparing with merge restoring an untouched deleted file
3070 Comparing with merge restoring an untouched deleted file
2950 --------------------------------------------------------
3071 --------------------------------------------------------
2951
3072
2952 Merge:
3073 Merge:
2953 - one removing a file (d)
3074 - one removing a file (d)
2954 - one leaving the file untouched
3075 - one leaving the file untouched
2955 - the merge actively restore the file to the same content.
3076 - the merge actively restore the file to the same content.
2956
3077
2957 In this case, the file keep on living after the merge. So we should not drop its
3078 In this case, the file keep on living after the merge. So we should not drop its
2958 copy tracing chain.
3079 copy tracing chain.
2959
3080
2960 $ hg log -G --rev '::(desc("mCB-revert-m")+desc("mBC-revert-m"))'
3081 $ hg log -G --rev '::(desc("mCB-revert-m")+desc("mBC-revert-m"))'
2961 o mBC-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - the other way
3082 o mBC-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - the other way
2962 |\
3083 |\
2963 +---o mCB-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - one way
3084 +---o mCB-revert-m-0 merge explicitely revive deleted file - B side: unrelated change, C side: delete d (restored by merge) - one way
2964 | |/
3085 | |/
2965 | o c-1 delete d
3086 | o c-1 delete d
2966 | |
3087 | |
2967 o | b-1: b update
3088 o | b-1: b update
2968 |/
3089 |/
2969 o i-2: c -move-> d, s -move-> t
3090 o i-2: c -move-> d, s -move-> t
2970 |
3091 |
2971 o i-1: a -move-> c, p -move-> s
3092 o i-1: a -move-> c, p -move-> s
2972 |
3093 |
2973 o i-0 initial commit: a b h p q r
3094 o i-0 initial commit: a b h p q r
2974
3095
2975
3096
2976 'a' is the the copy source of 'd'
3097 'a' is the the copy source of 'd'
2977
3098
2978 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCB-revert-m-0")'
3099 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCB-revert-m-0")'
2979 M b
3100 M b
2980 A d
3101 A d
2981 a (no-compatibility no-changeset !)
3102 a (no-compatibility no-changeset !)
2982 A t
3103 A t
2983 p
3104 p
2984 R a
3105 R a
2985 R p
3106 R p
2986 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBC-revert-m-0")'
3107 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBC-revert-m-0")'
2987 M b
3108 M b
2988 A d
3109 A d
2989 a (no-compatibility no-changeset !)
3110 a (no-compatibility no-changeset !)
2990 A t
3111 A t
2991 p
3112 p
2992 R a
3113 R a
2993 R p
3114 R p
2994 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCB-revert-m-0")'
3115 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCB-revert-m-0")'
2995 M b
3116 M b
2996 A d
3117 A d
2997 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mBC-revert-m-0")'
3118 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mBC-revert-m-0")'
2998 M b
3119 M b
2999 A d
3120 A d
3000 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mCB-revert-m-0")'
3121 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mCB-revert-m-0")'
3001 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBC-revert-m-0")'
3122 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBC-revert-m-0")'
3002
3123
3003
3124
3004 Merging a branch where a rename was deleted with a branch where the same file was renamed
3125 Merging a branch where a rename was deleted with a branch where the same file was renamed
3005 ------------------------------------------------------------------------------------------
3126 ------------------------------------------------------------------------------------------
3006
3127
3007 Create a "conflicting" merge where `d` get removed on one branch before its
3128 Create a "conflicting" merge where `d` get removed on one branch before its
3008 rename information actually conflict with the other branch.
3129 rename information actually conflict with the other branch.
3009
3130
3010 (the copy information from the branch that was not deleted should win).
3131 (the copy information from the branch that was not deleted should win).
3011
3132
3012 $ hg log -G --rev '::(desc("mCH-delete-before-conflict-m")+desc("mHC-delete-before-conflict-m"))'
3133 $ hg log -G --rev '::(desc("mCH-delete-before-conflict-m")+desc("mHC-delete-before-conflict-m"))'
3013 o mHC-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - the other way
3134 o mHC-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - the other way
3014 |\
3135 |\
3015 +---o mCH-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - one way
3136 +---o mCH-delete-before-conflict-m-0 simple merge - C side: d is the results of renames then deleted, H side: d is result of another rename (same content as the other branch) - one way
3016 | |/
3137 | |/
3017 | o h-1: b -(move)-> d
3138 | o h-1: b -(move)-> d
3018 | |
3139 | |
3019 o | c-1 delete d
3140 o | c-1 delete d
3020 | |
3141 | |
3021 o | i-2: c -move-> d, s -move-> t
3142 o | i-2: c -move-> d, s -move-> t
3022 | |
3143 | |
3023 o | i-1: a -move-> c, p -move-> s
3144 o | i-1: a -move-> c, p -move-> s
3024 |/
3145 |/
3025 o i-0 initial commit: a b h p q r
3146 o i-0 initial commit: a b h p q r
3026
3147
3027
3148
3028 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCH-delete-before-conflict-m")'
3149 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCH-delete-before-conflict-m")'
3029 A d
3150 A d
3030 b (no-compatibility no-changeset !)
3151 b (no-compatibility no-changeset !)
3031 A t
3152 A t
3032 p
3153 p
3033 R a
3154 R a
3034 R b
3155 R b
3035 R p
3156 R p
3036 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mHC-delete-before-conflict-m")'
3157 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mHC-delete-before-conflict-m")'
3037 A d
3158 A d
3038 b
3159 b
3039 A t
3160 A t
3040 p
3161 p
3041 R a
3162 R a
3042 R b
3163 R b
3043 R p
3164 R p
3044 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCH-delete-before-conflict-m")'
3165 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mCH-delete-before-conflict-m")'
3045 A d
3166 A d
3046 b
3167 b
3047 R b
3168 R b
3048 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mHC-delete-before-conflict-m")'
3169 $ hg status --copies --rev 'desc("c-1")' --rev 'desc("mHC-delete-before-conflict-m")'
3049 A d
3170 A d
3050 b
3171 b
3051 R b
3172 R b
3052 $ hg status --copies --rev 'desc("h-1")' --rev 'desc("mCH-delete-before-conflict-m")'
3173 $ hg status --copies --rev 'desc("h-1")' --rev 'desc("mCH-delete-before-conflict-m")'
3053 A t
3174 A t
3054 p
3175 p
3055 R a
3176 R a
3056 R p
3177 R p
3057 $ hg status --copies --rev 'desc("h-1")' --rev 'desc("mHC-delete-before-conflict-m")'
3178 $ hg status --copies --rev 'desc("h-1")' --rev 'desc("mHC-delete-before-conflict-m")'
3058 A t
3179 A t
3059 p
3180 p
3060 R a
3181 R a
3061 R p
3182 R p
3062
3183
3063 Variant of previous with extra changes introduced by the merge
3184 Variant of previous with extra changes introduced by the merge
3064 --------------------------------------------------------------
3185 --------------------------------------------------------------
3065
3186
3066 (see case declaration for details)
3187 (see case declaration for details)
3067
3188
3068 Subcase: merge has same initial content on both side, but merge introduced a change
3189 Subcase: merge has same initial content on both side, but merge introduced a change
3069 ```````````````````````````````````````````````````````````````````````````````````
3190 ```````````````````````````````````````````````````````````````````````````````````
3070
3191
3071 - the "e-" branch renaming b to f (through 'g')
3192 - the "e-" branch renaming b to f (through 'g')
3072 - the "a-" branch renaming d to f (through e)
3193 - the "a-" branch renaming d to f (through e)
3073 - the merge add new change to b
3194 - the merge add new change to b
3074
3195
3075 $ hg log -G --rev '::(desc("mAE-change-m")+desc("mEA-change-m"))'
3196 $ hg log -G --rev '::(desc("mAE-change-m")+desc("mEA-change-m"))'
3076 o mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way
3197 o mEA-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - the other way
3077 |\
3198 |\
3078 +---o mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way
3199 +---o mAE-change-m-0 merge with file update and copies info on both side - A side: rename d to f, E side: b to f, (same content for f in parent) - one way
3079 | |/
3200 | |/
3080 | o e-2 g -move-> f
3201 | o e-2 g -move-> f
3081 | |
3202 | |
3082 | o e-1 b -move-> g
3203 | o e-1 b -move-> g
3083 | |
3204 | |
3084 o | a-2: e -move-> f
3205 o | a-2: e -move-> f
3085 | |
3206 | |
3086 o | a-1: d -move-> e
3207 o | a-1: d -move-> e
3087 |/
3208 |/
3088 o i-2: c -move-> d, s -move-> t
3209 o i-2: c -move-> d, s -move-> t
3089 |
3210 |
3090 o i-1: a -move-> c, p -move-> s
3211 o i-1: a -move-> c, p -move-> s
3091 |
3212 |
3092 o i-0 initial commit: a b h p q r
3213 o i-0 initial commit: a b h p q r
3093
3214
3094 #if no-changeset
3215 #if no-changeset
3095 $ hg manifest --debug --rev 'desc("mAE-change-m-0")' | grep '644 f'
3216 $ hg manifest --debug --rev 'desc("mAE-change-m-0")' | grep '644 f'
3096 2f649fba7eb284e720d02b61f0546fcef694c045 644 f
3217 2f649fba7eb284e720d02b61f0546fcef694c045 644 f
3097 $ hg manifest --debug --rev 'desc("mEA-change-m-0")' | grep '644 f'
3218 $ hg manifest --debug --rev 'desc("mEA-change-m-0")' | grep '644 f'
3098 774e7c1637d536b99e2d8ef16fd731f87a82bd09 644 f
3219 774e7c1637d536b99e2d8ef16fd731f87a82bd09 644 f
3099 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
3220 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
3100 b76eb76580df486c3d51d63c5c210d4dd43a8ac7 644 f
3221 b76eb76580df486c3d51d63c5c210d4dd43a8ac7 644 f
3101 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
3222 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
3102 e8825b386367b29fec957283a80bb47b47483fe1 644 f
3223 e8825b386367b29fec957283a80bb47b47483fe1 644 f
3103 $ hg debugindex f | ../no-linkrev
3224 $ hg debugindex f | ../no-linkrev
3104 rev linkrev nodeid p1 p2
3225 rev linkrev nodeid p1 p2
3105 0 * b76eb76580df 000000000000 000000000000
3226 0 * b76eb76580df 000000000000 000000000000
3106 1 * e8825b386367 000000000000 000000000000
3227 1 * e8825b386367 000000000000 000000000000
3107 2 * 2ff93c643948 b76eb76580df e8825b386367
3228 2 * 2ff93c643948 b76eb76580df e8825b386367
3108 3 * 2f649fba7eb2 b76eb76580df e8825b386367
3229 3 * 2f649fba7eb2 b76eb76580df e8825b386367
3109 4 * 774e7c1637d5 e8825b386367 b76eb76580df
3230 4 * 774e7c1637d5 e8825b386367 b76eb76580df
3110 #else
3231 #else
3111 $ hg manifest --debug --rev 'desc("mAE-change-m-0")' | grep '644 f'
3232 $ hg manifest --debug --rev 'desc("mAE-change-m-0")' | grep '644 f'
3112 d3613c1ec8310a812ac4268fd853ac576b6caea5 644 f
3233 d3613c1ec8310a812ac4268fd853ac576b6caea5 644 f
3113 $ hg manifest --debug --rev 'desc("mEA-change-m-0")' | grep '644 f'
3234 $ hg manifest --debug --rev 'desc("mEA-change-m-0")' | grep '644 f'
3114 05e03c868bbcab4a649cb33a238d7aa07398a469 644 f
3235 05e03c868bbcab4a649cb33a238d7aa07398a469 644 f
3115 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
3236 $ hg manifest --debug --rev 'desc("a-2")' | grep '644 f'
3116 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
3237 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
3117 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
3238 $ hg manifest --debug --rev 'desc("e-2")' | grep '644 f'
3118 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
3239 ae258f702dfeca05bf9b6a22a97a4b5645570f11 644 f
3119 $ hg debugindex f | ../no-linkrev
3240 $ hg debugindex f | ../no-linkrev
3120 rev linkrev nodeid p1 p2
3241 rev linkrev nodeid p1 p2
3121 0 * ae258f702dfe 000000000000 000000000000
3242 0 * ae258f702dfe 000000000000 000000000000
3122 1 * d3613c1ec831 ae258f702dfe 000000000000
3243 1 * d3613c1ec831 ae258f702dfe 000000000000
3123 2 * 05e03c868bbc ae258f702dfe 000000000000
3244 2 * 05e03c868bbc ae258f702dfe 000000000000
3124 #endif
3245 #endif
3125
3246
3126 # Here the filelog based implementation is not looking at the rename
3247 # Here the filelog based implementation is not looking at the rename
3127 # information (because the file exist on both side). However the changelog
3248 # information (because the file exist on both side). However the changelog
3128 # based on works fine. We have different output.
3249 # based on works fine. We have different output.
3129
3250
3130 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mAE-change-m-0")'
3251 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mAE-change-m-0")'
3131 M f
3252 M f
3132 b (no-filelog !)
3253 b (no-filelog !)
3133 R b
3254 R b
3134 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mEA-change-m-0")'
3255 $ hg status --copies --rev 'desc("a-2")' --rev 'desc("mEA-change-m-0")'
3135 M f
3256 M f
3136 b (no-filelog !)
3257 b (no-filelog !)
3137 R b
3258 R b
3138 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mAE-change-m-0")'
3259 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mAE-change-m-0")'
3139 M f
3260 M f
3140 d (no-filelog !)
3261 d (no-filelog !)
3141 R d
3262 R d
3142 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mEA-change-m-0")'
3263 $ hg status --copies --rev 'desc("e-2")' --rev 'desc("mEA-change-m-0")'
3143 M f
3264 M f
3144 d (no-filelog !)
3265 d (no-filelog !)
3145 R d
3266 R d
3146 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("a-2")'
3267 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("a-2")'
3147 A f
3268 A f
3148 d
3269 d
3149 R d
3270 R d
3150 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("e-2")'
3271 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("e-2")'
3151 A f
3272 A f
3152 b
3273 b
3153 R b
3274 R b
3154
3275
3155 # From here, we run status against revision where both source file exists.
3276 # From here, we run status against revision where both source file exists.
3156 #
3277 #
3157 # The filelog based implementation picks an arbitrary side based on revision
3278 # The filelog based implementation picks an arbitrary side based on revision
3158 # numbers. So the same side "wins" whatever the parents order is. This is
3279 # numbers. So the same side "wins" whatever the parents order is. This is
3159 # sub-optimal because depending on revision numbers means the result can be
3280 # sub-optimal because depending on revision numbers means the result can be
3160 # different from one repository to the next.
3281 # different from one repository to the next.
3161 #
3282 #
3162 # The changeset based algorithm use the parent order to break tie on conflicting
3283 # The changeset based algorithm use the parent order to break tie on conflicting
3163 # information and will have a different order depending on who is p1 and p2.
3284 # information and will have a different order depending on who is p1 and p2.
3164 # That order is stable accross repositories. (data from p1 prevails)
3285 # That order is stable accross repositories. (data from p1 prevails)
3165
3286
3166 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mAE-change-m-0")'
3287 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mAE-change-m-0")'
3167 A f
3288 A f
3168 d
3289 d
3169 R b
3290 R b
3170 R d
3291 R d
3171 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mEA-change-m-0")'
3292 $ hg status --copies --rev 'desc("i-2")' --rev 'desc("mEA-change-m-0")'
3172 A f
3293 A f
3173 d (filelog !)
3294 d (filelog !)
3174 b (no-filelog !)
3295 b (no-filelog !)
3175 R b
3296 R b
3176 R d
3297 R d
3177 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE-change-m-0")'
3298 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE-change-m-0")'
3178 A f
3299 A f
3179 a
3300 a
3180 A t
3301 A t
3181 p
3302 p
3182 R a
3303 R a
3183 R b
3304 R b
3184 R p
3305 R p
3185 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA-change-m-0")'
3306 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA-change-m-0")'
3186 A f
3307 A f
3187 a (filelog !)
3308 a (filelog !)
3188 b (no-filelog !)
3309 b (no-filelog !)
3189 A t
3310 A t
3190 p
3311 p
3191 R a
3312 R a
3192 R b
3313 R b
3193 R p
3314 R p
3194
3315
3195
3316
3317 Subcase: merge overwrite common copy information, but with extra change during the merge
3318 ```````````````````````````````````````````````````````````````````````````````````
3319
3320 Merge:
3321 - one with change to an unrelated file (b)
3322 - one overwriting a file (d) with a rename (from h to i to d)
3323
3324 $ hg log -G --rev '::(desc("mBF-change-m")+desc("mFB-change-m"))'
3325 o mFB-change-m-0 merge with extra change - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
3326 |\
3327 +---o mBF-change-m-0 merge with extra change - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
3328 | |/
3329 | o f-2: rename i -> d
3330 | |
3331 | o f-1: rename h -> i
3332 | |
3333 o | b-1: b update
3334 |/
3335 o i-2: c -move-> d, s -move-> t
3336 |
3337 o i-1: a -move-> c, p -move-> s
3338 |
3339 o i-0 initial commit: a b h p q r
3340
3341 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBF-change-m-0")'
3342 M b
3343 A d
3344 h (filelog !)
3345 h (sidedata !)
3346 a (upgraded known-bad-output !)
3347 h (upgraded missing-correct-output !)
3348 a (upgraded-parallel known-bad-output !)
3349 h (upgraded-parallel missing-correct-output !)
3350 h (changeset !)
3351 h (compatibility !)
3352 A t
3353 p
3354 R a
3355 R h
3356 R p
3357 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFB-change-m-0")'
3358 M b
3359 A d
3360 h (filelog missing-correct-output !)
3361 a (filelog known-bad-output !)
3362 h (sidedata !)
3363 h (upgraded !)
3364 h (upgraded-parallel !)
3365 h (changeset !)
3366 h (compatibility !)
3367 A t
3368 p
3369 R a
3370 R h
3371 R p
3372 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mBF-change-m-0")'
3373 M d
3374 h (no-filelog !)
3375 R h
3376 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mBF-change-m-0")'
3377 M b
3378 M d
3379 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mBF-change-m-0")'
3380 M b
3381 M d
3382 i (no-filelog !)
3383 R i
3384 $ hg status --copies --rev 'desc("b-1")' --rev 'desc("mFB-change-m-0")'
3385 M d
3386 h (no-filelog !)
3387 R h
3388 $ hg status --copies --rev 'desc("f-2")' --rev 'desc("mFB-change-m-0")'
3389 M b
3390 M d
3391 $ hg status --copies --rev 'desc("f-1")' --rev 'desc("mFB-change-m-0")'
3392 M b
3393 M d
3394 i (no-filelog !)
3395 R i
3396
3397 #if no-changeset
3398 $ hg log -Gfr 'desc("mBF-change-m-0")' d
3399 o mBF-change-m-0 merge with extra change - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
3400 |\
3401 o : f-2: rename i -> d
3402 | :
3403 o : f-1: rename h -> i
3404 :/
3405 o i-0 initial commit: a b h p q r
3406
3407 #else
3408 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
3409 $ hg log -Gfr 'desc("mBF-change-m-0")' d
3410 o mBF-change-m-0 merge with extra change - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - one way
3411 :
3412 o i-2: c -move-> d, s -move-> t
3413 |
3414 ~
3415 #endif
3416
3417 #if no-changeset
3418 $ hg log -Gfr 'desc("mFB-change-m-0")' d
3419 o mFB-change-m-0 merge with extra change - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
3420 |\
3421 o : f-2: rename i -> d
3422 | :
3423 o : f-1: rename h -> i
3424 :/
3425 o i-2: c -move-> d, s -move-> t (known-bad-output !)
3426 | (known-bad-output !)
3427 o i-1: a -move-> c, p -move-> s (known-bad-output !)
3428 | (known-bad-output !)
3429 o i-0 initial commit: a b h p q r
3430
3431 #else
3432 BROKEN: `hg log --follow <file>` relies on filelog metadata to work
3433 $ hg log -Gfr 'desc("mFB-change-m-0")' d
3434 o mFB-change-m-0 merge with extra change - B side: unrelated change, F side: overwrite d with a copy (from h->i->d) - the other way
3435 :
3436 o i-2: c -move-> d, s -move-> t
3437 |
3438 ~
3439 #endif
3440
3441
3196 Decision from previous merge are properly chained with later merge
3442 Decision from previous merge are properly chained with later merge
3197 ------------------------------------------------------------------
3443 ------------------------------------------------------------------
3198
3444
3199
3445
3200 Subcase: chaining conflicting rename resolution
3446 Subcase: chaining conflicting rename resolution
3201 ```````````````````````````````````````````````
3447 ```````````````````````````````````````````````
3202
3448
3203 The "mAEm" and "mEAm" case create a rename tracking conflict on file 'f'. We
3449 The "mAEm" and "mEAm" case create a rename tracking conflict on file 'f'. We
3204 add more change on the respective branch and merge again. These second merge
3450 add more change on the respective branch and merge again. These second merge
3205 does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
3451 does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
3206 about that file should stay unchanged.
3452 about that file should stay unchanged.
3207
3453
3208 The result from mAEm is the same for the subsequent merge:
3454 The result from mAEm is the same for the subsequent merge:
3209
3455
3210 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAEm")' f
3456 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAEm")' f
3211 A f
3457 A f
3212 a (filelog !)
3458 a (filelog !)
3213 a (sidedata !)
3459 a (sidedata !)
3214 a (upgraded !)
3460 a (upgraded !)
3215 a (upgraded-parallel !)
3461 a (upgraded-parallel !)
3216
3462
3217 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE,Km")' f
3463 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE,Km")' f
3218 A f
3464 A f
3219 a (filelog !)
3465 a (filelog !)
3220 a (sidedata !)
3466 a (sidedata !)
3221 a (upgraded !)
3467 a (upgraded !)
3222 a (upgraded-parallel !)
3468 a (upgraded-parallel !)
3223
3469
3224 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mK,AEm")' f
3470 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mK,AEm")' f
3225 A f
3471 A f
3226 a (filelog !)
3472 a (filelog !)
3227 a (sidedata !)
3473 a (sidedata !)
3228 a (upgraded !)
3474 a (upgraded !)
3229 a (upgraded-parallel !)
3475 a (upgraded-parallel !)
3230
3476
3231
3477
3232 The result from mEAm is the same for the subsequent merge:
3478 The result from mEAm is the same for the subsequent merge:
3233
3479
3234 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEAm")' f
3480 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEAm")' f
3235 A f
3481 A f
3236 a (filelog !)
3482 a (filelog !)
3237 b (sidedata !)
3483 b (sidedata !)
3238 b (upgraded !)
3484 b (upgraded !)
3239 b (upgraded-parallel !)
3485 b (upgraded-parallel !)
3240
3486
3241 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA,Jm")' f
3487 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA,Jm")' f
3242 A f
3488 A f
3243 a (filelog !)
3489 a (filelog !)
3244 b (sidedata !)
3490 b (sidedata !)
3245 b (upgraded !)
3491 b (upgraded !)
3246 b (upgraded-parallel !)
3492 b (upgraded-parallel !)
3247
3493
3248 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mJ,EAm")' f
3494 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mJ,EAm")' f
3249 A f
3495 A f
3250 a (filelog !)
3496 a (filelog !)
3251 b (sidedata !)
3497 b (sidedata !)
3252 b (upgraded !)
3498 b (upgraded !)
3253 b (upgraded-parallel !)
3499 b (upgraded-parallel !)
3254
3500
3255 Subcase: chaining conflicting rename resolution
3501 Subcase: chaining conflicting rename resolution
3256 ```````````````````````````````````````````````
3502 ```````````````````````````````````````````````
3257
3503
3258 The "mPQm" and "mQPm" case create a rename tracking conflict on file 'v'. We
3504 The "mPQm" and "mQPm" case create a rename tracking conflict on file 'v'. We
3259 add more change on the respective branch and merge again. These second merge
3505 add more change on the respective branch and merge again. These second merge
3260 does not involve the file 'v' and the arbitration done within "mPQm" and "mQP"
3506 does not involve the file 'v' and the arbitration done within "mPQm" and "mQP"
3261 about that file should stay unchanged.
3507 about that file should stay unchanged.
3262
3508
3263 The result from mPQm is the same for the subsequent merge:
3509 The result from mPQm is the same for the subsequent merge:
3264
3510
3265 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mPQm")' v
3511 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mPQm")' v
3266 A v
3512 A v
3267 r (filelog !)
3513 r (filelog !)
3268 p (sidedata !)
3514 p (sidedata !)
3269 p (upgraded !)
3515 p (upgraded !)
3270 p (upgraded-parallel !)
3516 p (upgraded-parallel !)
3271
3517
3272 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mPQ,Tm")' v
3518 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mPQ,Tm")' v
3273 A v
3519 A v
3274 r (filelog !)
3520 r (filelog !)
3275 p (sidedata !)
3521 p (sidedata !)
3276 p (upgraded !)
3522 p (upgraded !)
3277 p (upgraded-parallel !)
3523 p (upgraded-parallel !)
3278
3524
3279 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mT,PQm")' v
3525 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mT,PQm")' v
3280 A v
3526 A v
3281 r (filelog !)
3527 r (filelog !)
3282 p (sidedata !)
3528 p (sidedata !)
3283 p (upgraded !)
3529 p (upgraded !)
3284 p (upgraded-parallel !)
3530 p (upgraded-parallel !)
3285
3531
3286
3532
3287 The result from mQPm is the same for the subsequent merge:
3533 The result from mQPm is the same for the subsequent merge:
3288
3534
3289 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mQPm")' v
3535 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mQPm")' v
3290 A v
3536 A v
3291 r (no-changeset no-compatibility !)
3537 r (no-changeset no-compatibility !)
3292
3538
3293 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mQP,Sm")' v
3539 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mQP,Sm")' v
3294 A v
3540 A v
3295 r (no-changeset no-compatibility !)
3541 r (no-changeset no-compatibility !)
3296
3542
3297 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mS,QPm")' v
3543 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mS,QPm")' v
3298 A v
3544 A v
3299 r (filelog !)
3545 r (filelog !)
3300 r (sidedata !)
3546 r (sidedata !)
3301 r (upgraded !)
3547 r (upgraded !)
3302 r (upgraded-parallel !)
3548 r (upgraded-parallel !)
3303
3549
3304
3550
3305 Subcase: chaining salvage information during a merge
3551 Subcase: chaining salvage information during a merge
3306 ````````````````````````````````````````````````````
3552 ````````````````````````````````````````````````````
3307
3553
3308 We add more change on the branch were the file was deleted. merging again
3554 We add more change on the branch were the file was deleted. merging again
3309 should preserve the fact eh file was salvaged.
3555 should preserve the fact eh file was salvaged.
3310
3556
3311 reference output:
3557 reference output:
3312
3558
3313 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCB-revert-m-0")'
3559 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCB-revert-m-0")'
3314 M b
3560 M b
3315 A d
3561 A d
3316 a (no-changeset no-compatibility !)
3562 a (no-changeset no-compatibility !)
3317 A t
3563 A t
3318 p
3564 p
3319 R a
3565 R a
3320 R p
3566 R p
3321 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBC-revert-m-0")'
3567 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBC-revert-m-0")'
3322 M b
3568 M b
3323 A d
3569 A d
3324 a (no-changeset no-compatibility !)
3570 a (no-changeset no-compatibility !)
3325 A t
3571 A t
3326 p
3572 p
3327 R a
3573 R a
3328 R p
3574 R p
3329
3575
3330 chained output
3576 chained output
3331 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBC+revert,Lm")'
3577 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mBC+revert,Lm")'
3332 M b
3578 M b
3333 A d
3579 A d
3334 a (no-changeset no-compatibility !)
3580 a (no-changeset no-compatibility !)
3335 A t
3581 A t
3336 p
3582 p
3337 A unrelated-l
3583 A unrelated-l
3338 R a
3584 R a
3339 R p
3585 R p
3340 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCB+revert,Lm")'
3586 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mCB+revert,Lm")'
3341 M b
3587 M b
3342 A d
3588 A d
3343 a (no-changeset no-compatibility !)
3589 a (no-changeset no-compatibility !)
3344 A t
3590 A t
3345 p
3591 p
3346 A unrelated-l
3592 A unrelated-l
3347 R a
3593 R a
3348 R p
3594 R p
3349 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mL,BC+revertm")'
3595 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mL,BC+revertm")'
3350 M b
3596 M b
3351 A d
3597 A d
3352 a (no-changeset no-compatibility !)
3598 a (no-changeset no-compatibility !)
3353 A t
3599 A t
3354 p
3600 p
3355 A unrelated-l
3601 A unrelated-l
3356 R a
3602 R a
3357 R p
3603 R p
3358 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mL,CB+revertm")'
3604 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mL,CB+revertm")'
3359 M b
3605 M b
3360 A d
3606 A d
3361 a (no-changeset no-compatibility !)
3607 a (no-changeset no-compatibility !)
3362 A t
3608 A t
3363 p
3609 p
3364 A unrelated-l
3610 A unrelated-l
3365 R a
3611 R a
3366 R p
3612 R p
3367
3613
3368 Subcase: chaining "merged" information during a merge
3614 Subcase: chaining "merged" information during a merge
3369 ``````````````````````````````````````````````````````
3615 ``````````````````````````````````````````````````````
3370
3616
3371 When a non-rename change are merged with a copy overwrite, the merge pick the copy source from (p1) as the reference. We should preserve this information in subsequent merges.
3617 When a non-rename change are merged with a copy overwrite, the merge pick the copy source from (p1) as the reference. We should preserve this information in subsequent merges.
3372
3618
3373
3619
3374 reference output:
3620 reference output:
3375
3621
3376 (for details about the filelog pick, check the mFGm/mGFm case)
3622 (for details about the filelog pick, check the mFGm/mGFm case)
3377
3623
3378 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFGm")' d
3624 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFGm")' d
3379 A d
3625 A d
3380 a (filelog !)
3626 a (filelog !)
3381 h (sidedata !)
3627 h (sidedata !)
3382 h (upgraded !)
3628 h (upgraded !)
3383 h (upgraded-parallel !)
3629 h (upgraded-parallel !)
3384 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGFm")' d
3630 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGFm")' d
3385 A d
3631 A d
3386 a (filelog !)
3632 a (filelog !)
3387 a (sidedata !)
3633 a (sidedata !)
3388 a (upgraded !)
3634 a (upgraded !)
3389 a (upgraded-parallel !)
3635 a (upgraded-parallel !)
3390
3636
3391 Chained output
3637 Chained output
3392
3638
3393 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mO,FGm")' d
3639 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mO,FGm")' d
3394 A d
3640 A d
3395 a (filelog !)
3641 a (filelog !)
3396 h (sidedata !)
3642 h (sidedata !)
3397 h (upgraded !)
3643 h (upgraded !)
3398 h (upgraded-parallel !)
3644 h (upgraded-parallel !)
3399 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFG,Om")' d
3645 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mFG,Om")' d
3400 A d
3646 A d
3401 a (filelog !)
3647 a (filelog !)
3402 h (sidedata !)
3648 h (sidedata !)
3403 h (upgraded !)
3649 h (upgraded !)
3404 h (upgraded-parallel !)
3650 h (upgraded-parallel !)
3405
3651
3406
3652
3407 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGF,Nm")' d
3653 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mGF,Nm")' d
3408 A d
3654 A d
3409 a (no-changeset no-compatibility !)
3655 a (no-changeset no-compatibility !)
3410 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mN,GFm")' d
3656 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mN,GFm")' d
3411 A d
3657 A d
3412 a (no-changeset no-compatibility !)
3658 a (no-changeset no-compatibility !)
3413
3659
3414
3660
3415 Subcase: chaining conflicting rename resolution, with extra change during the merge
3661 Subcase: chaining conflicting rename resolution, with extra change during the merge
3416 ```````````````````````````````````````````````````````````````````````````````````
3662 ```````````````````````````````````````````````````````````````````````````````````
3417
3663
3418 The "mAEm" and "mEAm" case create a rename tracking conflict on file 'f'. We
3664 The "mAEm" and "mEAm" case create a rename tracking conflict on file 'f'. We
3419 add more change on the respective branch and merge again. These second merge
3665 add more change on the respective branch and merge again. These second merge
3420 does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
3666 does not involve the file 'f' and the arbitration done within "mAEm" and "mEA"
3421 about that file should stay unchanged.
3667 about that file should stay unchanged.
3422
3668
3423 The result from mAEm is the same for the subsequent merge:
3669 The result from mAEm is the same for the subsequent merge:
3424
3670
3425 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE-change-m")' f
3671 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE-change-m")' f
3426 A f
3672 A f
3427 a (filelog !)
3673 a (filelog !)
3428 a (sidedata !)
3674 a (sidedata !)
3429 a (upgraded !)
3675 a (upgraded !)
3430 a (upgraded-parallel !)
3676 a (upgraded-parallel !)
3431
3677
3432 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE-change,Km")' f
3678 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mAE-change,Km")' f
3433 A f
3679 A f
3434 a (filelog !)
3680 a (filelog !)
3435 a (sidedata !)
3681 a (sidedata !)
3436 a (upgraded !)
3682 a (upgraded !)
3437 a (upgraded-parallel !)
3683 a (upgraded-parallel !)
3438
3684
3439 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mK,AE-change-m")' f
3685 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mK,AE-change-m")' f
3440 A f
3686 A f
3441 a (no-changeset no-compatibility !)
3687 a (no-changeset no-compatibility !)
3442
3688
3443
3689
3444 The result from mEAm is the same for the subsequent merge:
3690 The result from mEAm is the same for the subsequent merge:
3445
3691
3446 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA-change-m")' f
3692 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA-change-m")' f
3447 A f
3693 A f
3448 a (filelog !)
3694 a (filelog !)
3449 b (sidedata !)
3695 b (sidedata !)
3450 b (upgraded !)
3696 b (upgraded !)
3451 b (upgraded-parallel !)
3697 b (upgraded-parallel !)
3452
3698
3453 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA-change,Jm")' f
3699 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mEA-change,Jm")' f
3454 A f
3700 A f
3455 a (filelog !)
3701 a (filelog !)
3456 b (sidedata !)
3702 b (sidedata !)
3457 b (upgraded !)
3703 b (upgraded !)
3458 b (upgraded-parallel !)
3704 b (upgraded-parallel !)
3459
3705
3460 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mJ,EA-change-m")' f
3706 $ hg status --copies --rev 'desc("i-0")' --rev 'desc("mJ,EA-change-m")' f
3461 A f
3707 A f
3462 a (filelog !)
3708 a (filelog !)
3463 b (sidedata !)
3709 b (sidedata !)
3464 b (upgraded !)
3710 b (upgraded !)
3465 b (upgraded-parallel !)
3711 b (upgraded-parallel !)
General Comments 0
You need to be logged in to leave comments. Login now