Show More
@@ -0,0 +1,434 b'' | |||||
|
1 | =============================================== | |||
|
2 | Testing merge involving change to the exec flag | |||
|
3 | =============================================== | |||
|
4 | ||||
|
5 | #require execbit | |||
|
6 | ||||
|
7 | ||||
|
8 | Initial setup | |||
|
9 | ============== | |||
|
10 | ||||
|
11 | ||||
|
12 | $ hg init base-repo | |||
|
13 | $ cd base-repo | |||
|
14 | $ cat << EOF > a | |||
|
15 | > 1 | |||
|
16 | > 2 | |||
|
17 | > 3 | |||
|
18 | > 4 | |||
|
19 | > 5 | |||
|
20 | > 6 | |||
|
21 | > 7 | |||
|
22 | > 8 | |||
|
23 | > 9 | |||
|
24 | > EOF | |||
|
25 | $ touch b | |||
|
26 | $ hg add a b | |||
|
27 | $ hg commit -m "initial commit" | |||
|
28 | $ cd .. | |||
|
29 | ||||
|
30 | $ hg init base-exec | |||
|
31 | $ cd base-exec | |||
|
32 | $ cat << EOF > a | |||
|
33 | > 1 | |||
|
34 | > 2 | |||
|
35 | > 3 | |||
|
36 | > 4 | |||
|
37 | > 5 | |||
|
38 | > 6 | |||
|
39 | > 7 | |||
|
40 | > 8 | |||
|
41 | > 9 | |||
|
42 | > EOF | |||
|
43 | $ chmod +x a | |||
|
44 | $ touch b | |||
|
45 | $ hg add a b | |||
|
46 | $ hg commit -m "initial commit" | |||
|
47 | $ cd .. | |||
|
48 | ||||
|
49 | Testing merging mode change | |||
|
50 | =========================== | |||
|
51 | ||||
|
52 | Adding the flag | |||
|
53 | --------------- | |||
|
54 | ||||
|
55 | setup | |||
|
56 | ||||
|
57 | Change on one side, executable bit on the other | |||
|
58 | ||||
|
59 | $ hg clone base-repo simple-merge-repo | |||
|
60 | updating to branch default | |||
|
61 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
62 | $ cd simple-merge-repo | |||
|
63 | $ chmod +x a | |||
|
64 | $ hg ci -m "make a executable, no change" | |||
|
65 | $ [ -x a ] || echo "executable bit not recorded" | |||
|
66 | $ hg up ".^" | |||
|
67 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
68 | $ cat << EOF > a | |||
|
69 | > 1 | |||
|
70 | > 2 | |||
|
71 | > 3 | |||
|
72 | > 4 | |||
|
73 | > 5 | |||
|
74 | > 6 | |||
|
75 | > 7 | |||
|
76 | > x | |||
|
77 | > 9 | |||
|
78 | > EOF | |||
|
79 | $ hg commit -m "edit end of file" | |||
|
80 | created new head | |||
|
81 | ||||
|
82 | merge them (from the update side) | |||
|
83 | ||||
|
84 | $ hg merge 'desc("make a executable, no change")' | |||
|
85 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
86 | (branch merge, don't forget to commit) | |||
|
87 | $ hg st | |||
|
88 | M a | |||
|
89 | $ [ -x a ] || echo "executable bit lost" | |||
|
90 | ||||
|
91 | merge them (from the chmod side) | |||
|
92 | ||||
|
93 | $ hg up -C 'desc("make a executable, no change")' | |||
|
94 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
95 | $ hg merge 'desc("edit end of file")' | |||
|
96 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
97 | (branch merge, don't forget to commit) | |||
|
98 | $ hg st | |||
|
99 | M a | |||
|
100 | $ [ -x a ] || echo "executable bit lost" | |||
|
101 | ||||
|
102 | ||||
|
103 | $ cd .. | |||
|
104 | ||||
|
105 | ||||
|
106 | Removing the flag | |||
|
107 | ----------------- | |||
|
108 | ||||
|
109 | Change on one side, executable bit on the other | |||
|
110 | ||||
|
111 | $ hg clone base-exec simple-merge-repo-removal | |||
|
112 | updating to branch default | |||
|
113 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
114 | $ cd simple-merge-repo-removal | |||
|
115 | $ chmod -x a | |||
|
116 | $ hg ci -m "make a non-executable, no change" | |||
|
117 | $ [ -x a ] && echo "executable bit not removed" | |||
|
118 | [1] | |||
|
119 | $ hg up ".^" | |||
|
120 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
121 | $ cat << EOF > a | |||
|
122 | > 1 | |||
|
123 | > 2 | |||
|
124 | > 3 | |||
|
125 | > 4 | |||
|
126 | > 5 | |||
|
127 | > 6 | |||
|
128 | > 7 | |||
|
129 | > x | |||
|
130 | > 9 | |||
|
131 | > EOF | |||
|
132 | $ hg commit -m "edit end of file" | |||
|
133 | created new head | |||
|
134 | ||||
|
135 | merge them (from the update side) | |||
|
136 | ||||
|
137 | $ hg merge 'desc("make a non-executable, no change")' | |||
|
138 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
139 | (branch merge, don't forget to commit) | |||
|
140 | $ hg st | |||
|
141 | M a | |||
|
142 | $ [ -x a ] && echo "executable bit not removed" | |||
|
143 | [1] | |||
|
144 | ||||
|
145 | merge them (from the chmod side) | |||
|
146 | ||||
|
147 | $ hg up -C 'desc("make a non-executable, no change")' | |||
|
148 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
149 | $ hg merge 'desc("edit end of file")' | |||
|
150 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
151 | (branch merge, don't forget to commit) | |||
|
152 | $ hg st | |||
|
153 | M a | |||
|
154 | $ [ -x a ] && echo "executable bit not removed" | |||
|
155 | [1] | |||
|
156 | ||||
|
157 | ||||
|
158 | $ cd .. | |||
|
159 | ||||
|
160 | Testing merging mode change with rename | |||
|
161 | ======================================= | |||
|
162 | ||||
|
163 | Adding the flag | |||
|
164 | --------------- | |||
|
165 | ||||
|
166 | $ hg clone base-repo rename-merge-repo | |||
|
167 | updating to branch default | |||
|
168 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
169 | $ cd rename-merge-repo | |||
|
170 | ||||
|
171 | make "a" executable on one side | |||
|
172 | ||||
|
173 | $ chmod +x a | |||
|
174 | $ hg status | |||
|
175 | M a | |||
|
176 | $ hg ci -m "make a executable" | |||
|
177 | $ [ -x a ] || echo "executable bit not recorded" | |||
|
178 | $ hg up ".^" | |||
|
179 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
180 | ||||
|
181 | make "a" renamed on the other side | |||
|
182 | ||||
|
183 | $ hg mv a z | |||
|
184 | $ hg st --copies | |||
|
185 | A z | |||
|
186 | a | |||
|
187 | R a | |||
|
188 | $ hg ci -m "rename a to z" | |||
|
189 | created new head | |||
|
190 | ||||
|
191 | merge them (from the rename side) | |||
|
192 | ||||
|
193 | $ hg merge 'desc("make a executable")' | |||
|
194 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
195 | (branch merge, don't forget to commit) | |||
|
196 | $ hg st --copies | |||
|
197 | M z | |||
|
198 | a | |||
|
199 | $ [ -x z ] || echo "executable bit lost" | |||
|
200 | ||||
|
201 | merge them (from the chmod side) | |||
|
202 | ||||
|
203 | $ hg up -C 'desc("make a executable")' | |||
|
204 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |||
|
205 | $ hg merge 'desc("rename a to z")' | |||
|
206 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
207 | (branch merge, don't forget to commit) | |||
|
208 | $ hg st --copies | |||
|
209 | M z | |||
|
210 | a | |||
|
211 | R a | |||
|
212 | $ [ -x z ] || echo "executable bit lost" | |||
|
213 | ||||
|
214 | ||||
|
215 | $ cd .. | |||
|
216 | ||||
|
217 | Removing the flag | |||
|
218 | ----------------- | |||
|
219 | ||||
|
220 | $ hg clone base-exec rename-merge-repo-removal | |||
|
221 | updating to branch default | |||
|
222 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
223 | $ cd rename-merge-repo-removal | |||
|
224 | ||||
|
225 | make "a" non-executable on one side | |||
|
226 | ||||
|
227 | $ chmod -x a | |||
|
228 | $ hg status | |||
|
229 | M a | |||
|
230 | $ hg ci -m "make a non-executable" | |||
|
231 | $ [ -x a ] && echo "executable bit not removed" | |||
|
232 | [1] | |||
|
233 | $ hg up ".^" | |||
|
234 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
235 | ||||
|
236 | make "a" renamed on the other side | |||
|
237 | ||||
|
238 | $ hg mv a z | |||
|
239 | $ hg st --copies | |||
|
240 | A z | |||
|
241 | a | |||
|
242 | R a | |||
|
243 | $ hg ci -m "rename a to z" | |||
|
244 | created new head | |||
|
245 | ||||
|
246 | merge them (from the rename side) | |||
|
247 | ||||
|
248 | $ hg merge 'desc("make a non-executable")' | |||
|
249 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
250 | (branch merge, don't forget to commit) | |||
|
251 | $ hg st --copies | |||
|
252 | M z | |||
|
253 | a | |||
|
254 | $ [ -x z ] && echo "executable bit not removed" | |||
|
255 | [1] | |||
|
256 | ||||
|
257 | merge them (from the chmod side) | |||
|
258 | ||||
|
259 | $ hg up -C 'desc("make a non-executable")' | |||
|
260 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |||
|
261 | $ hg merge 'desc("rename a to z")' | |||
|
262 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
263 | (branch merge, don't forget to commit) | |||
|
264 | $ hg st --copies | |||
|
265 | M z | |||
|
266 | a | |||
|
267 | R a | |||
|
268 | $ [ -x z ] && echo "executable bit not removed" | |||
|
269 | [1] | |||
|
270 | ||||
|
271 | ||||
|
272 | $ cd .. | |||
|
273 | ||||
|
274 | ||||
|
275 | Testing merging mode change with rename + modification on both side | |||
|
276 | =================================================================== | |||
|
277 | ||||
|
278 | ||||
|
279 | Adding the flag | |||
|
280 | --------------- | |||
|
281 | ||||
|
282 | $ hg clone base-repo rename+mod-merge-repo | |||
|
283 | updating to branch default | |||
|
284 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
285 | $ cd rename+mod-merge-repo | |||
|
286 | ||||
|
287 | make "a" executable on one side | |||
|
288 | ||||
|
289 | $ chmod +x a | |||
|
290 | $ cat << EOF > a | |||
|
291 | > 1 | |||
|
292 | > x | |||
|
293 | > 3 | |||
|
294 | > 4 | |||
|
295 | > 5 | |||
|
296 | > 6 | |||
|
297 | > 7 | |||
|
298 | > 8 | |||
|
299 | > 9 | |||
|
300 | > EOF | |||
|
301 | $ hg status | |||
|
302 | M a | |||
|
303 | $ hg ci -m "make a executable, and change start" | |||
|
304 | $ [ -x a ] || echo "executable bit not recorded" | |||
|
305 | $ hg up ".^" | |||
|
306 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
307 | ||||
|
308 | make "a" renamed on the other side | |||
|
309 | ||||
|
310 | $ hg mv a z | |||
|
311 | $ hg st --copies | |||
|
312 | A z | |||
|
313 | a | |||
|
314 | R a | |||
|
315 | $ cat << EOF > z | |||
|
316 | > 1 | |||
|
317 | > 2 | |||
|
318 | > 3 | |||
|
319 | > 4 | |||
|
320 | > 5 | |||
|
321 | > 6 | |||
|
322 | > 7 | |||
|
323 | > x | |||
|
324 | > 9 | |||
|
325 | > EOF | |||
|
326 | $ hg ci -m "rename a to z, and change end" | |||
|
327 | created new head | |||
|
328 | ||||
|
329 | merge them (from the rename side) | |||
|
330 | ||||
|
331 | $ hg merge 'desc("make a executable")' | |||
|
332 | merging z and a to z | |||
|
333 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |||
|
334 | (branch merge, don't forget to commit) | |||
|
335 | $ hg st --copies | |||
|
336 | M z | |||
|
337 | a | |||
|
338 | $ [ -x z ] || echo "executable bit lost" | |||
|
339 | ||||
|
340 | merge them (from the chmod side) | |||
|
341 | ||||
|
342 | $ hg up -C 'desc("make a executable")' | |||
|
343 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |||
|
344 | $ hg merge 'desc("rename a to z")' | |||
|
345 | merging a and z to z | |||
|
346 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |||
|
347 | (branch merge, don't forget to commit) | |||
|
348 | $ hg st --copies | |||
|
349 | M z | |||
|
350 | a | |||
|
351 | R a | |||
|
352 | $ [ -x z ] || echo "executable bit lost" | |||
|
353 | ||||
|
354 | $ cd .. | |||
|
355 | ||||
|
356 | Removing the flag | |||
|
357 | ----------------- | |||
|
358 | ||||
|
359 | $ hg clone base-exec rename+mod-merge-repo-removal | |||
|
360 | updating to branch default | |||
|
361 | 2 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
362 | $ cd rename+mod-merge-repo-removal | |||
|
363 | ||||
|
364 | make "a" non-executable on one side | |||
|
365 | ||||
|
366 | $ chmod -x a | |||
|
367 | $ cat << EOF > a | |||
|
368 | > 1 | |||
|
369 | > x | |||
|
370 | > 3 | |||
|
371 | > 4 | |||
|
372 | > 5 | |||
|
373 | > 6 | |||
|
374 | > 7 | |||
|
375 | > 8 | |||
|
376 | > 9 | |||
|
377 | > EOF | |||
|
378 | $ hg status | |||
|
379 | M a | |||
|
380 | $ hg ci -m "make a non-executable, and change start" | |||
|
381 | $ [ -x z ] && echo "executable bit not removed" | |||
|
382 | [1] | |||
|
383 | $ hg up ".^" | |||
|
384 | 1 files updated, 0 files merged, 0 files removed, 0 files unresolved | |||
|
385 | ||||
|
386 | make "a" renamed on the other side | |||
|
387 | ||||
|
388 | $ hg mv a z | |||
|
389 | $ hg st --copies | |||
|
390 | A z | |||
|
391 | a | |||
|
392 | R a | |||
|
393 | $ cat << EOF > z | |||
|
394 | > 1 | |||
|
395 | > 2 | |||
|
396 | > 3 | |||
|
397 | > 4 | |||
|
398 | > 5 | |||
|
399 | > 6 | |||
|
400 | > 7 | |||
|
401 | > x | |||
|
402 | > 9 | |||
|
403 | > EOF | |||
|
404 | $ hg ci -m "rename a to z, and change end" | |||
|
405 | created new head | |||
|
406 | ||||
|
407 | merge them (from the rename side) | |||
|
408 | ||||
|
409 | $ hg merge 'desc("make a non-executable")' | |||
|
410 | merging z and a to z | |||
|
411 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |||
|
412 | (branch merge, don't forget to commit) | |||
|
413 | $ hg st --copies | |||
|
414 | M z | |||
|
415 | a | |||
|
416 | $ [ -x z ] && echo "executable bit not removed" | |||
|
417 | [1] | |||
|
418 | ||||
|
419 | merge them (from the chmod side) | |||
|
420 | ||||
|
421 | $ hg up -C 'desc("make a non-executable")' | |||
|
422 | 1 files updated, 0 files merged, 1 files removed, 0 files unresolved | |||
|
423 | $ hg merge 'desc("rename a to z")' | |||
|
424 | merging a and z to z | |||
|
425 | 0 files updated, 1 files merged, 0 files removed, 0 files unresolved | |||
|
426 | (branch merge, don't forget to commit) | |||
|
427 | $ hg st --copies | |||
|
428 | M z | |||
|
429 | a | |||
|
430 | R a | |||
|
431 | $ [ -x z ] && echo "executable bit not removed" | |||
|
432 | [1] | |||
|
433 | ||||
|
434 | $ cd .. |
@@ -2971,9 +2971,6 b' def _dograft(ui, repo, *revs, **opts):' | |||||
2971 |
|
2971 | |||
2972 | revs = list(revs) |
|
2972 | revs = list(revs) | |
2973 | revs.extend(opts.get(b'rev')) |
|
2973 | revs.extend(opts.get(b'rev')) | |
2974 | basectx = None |
|
|||
2975 | if opts.get(b'base'): |
|
|||
2976 | basectx = scmutil.revsingle(repo, opts[b'base'], None) |
|
|||
2977 | # a dict of data to be stored in state file |
|
2974 | # a dict of data to be stored in state file | |
2978 | statedata = {} |
|
2975 | statedata = {} | |
2979 | # list of new nodes created by ongoing graft |
|
2976 | # list of new nodes created by ongoing graft | |
@@ -3063,6 +3060,8 b' def _dograft(ui, repo, *revs, **opts):' | |||||
3063 | opts[b'log'] = True |
|
3060 | opts[b'log'] = True | |
3064 | if statedata.get(b'no_commit'): |
|
3061 | if statedata.get(b'no_commit'): | |
3065 | opts[b'no_commit'] = statedata.get(b'no_commit') |
|
3062 | opts[b'no_commit'] = statedata.get(b'no_commit') | |
|
3063 | if statedata.get(b'base'): | |||
|
3064 | opts[b'base'] = statedata.get(b'base') | |||
3066 | nodes = statedata[b'nodes'] |
|
3065 | nodes = statedata[b'nodes'] | |
3067 | revs = [repo[node].rev() for node in nodes] |
|
3066 | revs = [repo[node].rev() for node in nodes] | |
3068 | else: |
|
3067 | else: | |
@@ -3075,6 +3074,9 b' def _dograft(ui, repo, *revs, **opts):' | |||||
3075 | revs = scmutil.revrange(repo, revs) |
|
3074 | revs = scmutil.revrange(repo, revs) | |
3076 |
|
3075 | |||
3077 | skipped = set() |
|
3076 | skipped = set() | |
|
3077 | basectx = None | |||
|
3078 | if opts.get(b'base'): | |||
|
3079 | basectx = scmutil.revsingle(repo, opts[b'base'], None) | |||
3078 | if basectx is None: |
|
3080 | if basectx is None: | |
3079 | # check for merges |
|
3081 | # check for merges | |
3080 | for rev in repo.revs(b'%ld and merge()', revs): |
|
3082 | for rev in repo.revs(b'%ld and merge()', revs): | |
@@ -3167,6 +3169,8 b' def _dograft(ui, repo, *revs, **opts):' | |||||
3167 |
|
3169 | |||
3168 | if opts.get(b'no_commit'): |
|
3170 | if opts.get(b'no_commit'): | |
3169 | statedata[b'no_commit'] = True |
|
3171 | statedata[b'no_commit'] = True | |
|
3172 | if opts.get(b'base'): | |||
|
3173 | statedata[b'base'] = opts[b'base'] | |||
3170 | for pos, ctx in enumerate(repo.set(b"%ld", revs)): |
|
3174 | for pos, ctx in enumerate(repo.set(b"%ld", revs)): | |
3171 | desc = b'%d:%s "%s"' % ( |
|
3175 | desc = b'%d:%s "%s"' % ( | |
3172 | ctx.rev(), |
|
3176 | ctx.rev(), |
@@ -1465,6 +1465,18 b' class committablectx(basectx):' | |||||
1465 | def children(self): |
|
1465 | def children(self): | |
1466 | return [] |
|
1466 | return [] | |
1467 |
|
1467 | |||
|
1468 | def flags(self, path): | |||
|
1469 | if '_manifest' in self.__dict__: | |||
|
1470 | try: | |||
|
1471 | return self._manifest.flags(path) | |||
|
1472 | except KeyError: | |||
|
1473 | return b'' | |||
|
1474 | ||||
|
1475 | try: | |||
|
1476 | return self._flagfunc(path) | |||
|
1477 | except OSError: | |||
|
1478 | return b'' | |||
|
1479 | ||||
1468 | def ancestor(self, c2): |
|
1480 | def ancestor(self, c2): | |
1469 | """return the "best" ancestor context of self and c2""" |
|
1481 | """return the "best" ancestor context of self and c2""" | |
1470 | return self._parents[0].ancestor(c2) # punt on two parents for now |
|
1482 | return self._parents[0].ancestor(c2) # punt on two parents for now | |
@@ -1601,12 +1613,6 b' class workingctx(committablectx):' | |||||
1601 | return self._repo.dirstate.flagfunc(self._buildflagfunc) |
|
1613 | return self._repo.dirstate.flagfunc(self._buildflagfunc) | |
1602 |
|
1614 | |||
1603 | def flags(self, path): |
|
1615 | def flags(self, path): | |
1604 | if '_manifest' in self.__dict__: |
|
|||
1605 | try: |
|
|||
1606 | return self._manifest.flags(path) |
|
|||
1607 | except KeyError: |
|
|||
1608 | return b'' |
|
|||
1609 |
|
||||
1610 | try: |
|
1616 | try: | |
1611 | return self._flagfunc(path) |
|
1617 | return self._flagfunc(path) | |
1612 | except OSError: |
|
1618 | except OSError: |
@@ -604,9 +604,9 b' def _checksinglesidecopies(' | |||||
604 | # thing in pathcopies(): pathcopies(x, y) can return a copy where the |
|
604 | # thing in pathcopies(): pathcopies(x, y) can return a copy where the | |
605 | # destination doesn't exist in y. |
|
605 | # destination doesn't exist in y. | |
606 | pass |
|
606 | pass | |
607 | elif m2[src] != mb[src]: |
|
607 | elif mb[src] != m2[src] and not _related(c2[src], base[src]): | |
608 | if not _related(c2[src], base[src]): |
|
608 | return | |
609 | return |
|
609 | elif mb[src] != m2[src] or mb.flags(src) != m2.flags(src): | |
610 | # modified on side 2 |
|
610 | # modified on side 2 | |
611 | for dst in dsts1: |
|
611 | for dst in dsts1: | |
612 | copy[dst] = src |
|
612 | copy[dst] = src |
@@ -22,7 +22,9 b' from .i18n import _' | |||||
22 | from . import ( |
|
22 | from . import ( | |
23 | error, |
|
23 | error, | |
24 | mdiff, |
|
24 | mdiff, | |
|
25 | node as nodemod, | |||
25 | pycompat, |
|
26 | pycompat, | |
|
27 | util, | |||
26 | ) |
|
28 | ) | |
27 | from .utils import stringutil |
|
29 | from .utils import stringutil | |
28 |
|
30 | |||
@@ -449,6 +451,17 b' def _picklabels(defaults, overrides):' | |||||
449 | return result |
|
451 | return result | |
450 |
|
452 | |||
451 |
|
453 | |||
|
454 | def _bytes_to_set(b): | |||
|
455 | """turns a multiple bytes (usually flags) into a set of individual byte""" | |||
|
456 | return set(b[x : x + 1] for x in range(len(b))) | |||
|
457 | ||||
|
458 | ||||
|
459 | def is_null(ctx): | |||
|
460 | if not util.safehasattr(ctx, "node"): | |||
|
461 | return False | |||
|
462 | return ctx.node() != nodemod.nullid | |||
|
463 | ||||
|
464 | ||||
452 | def simplemerge(ui, localctx, basectx, otherctx, **opts): |
|
465 | def simplemerge(ui, localctx, basectx, otherctx, **opts): | |
453 | """Performs the simplemerge algorithm. |
|
466 | """Performs the simplemerge algorithm. | |
454 |
|
467 | |||
@@ -503,8 +516,20 b' def simplemerge(ui, localctx, basectx, o' | |||||
503 | else: |
|
516 | else: | |
504 | mergedtext += line |
|
517 | mergedtext += line | |
505 |
|
518 | |||
|
519 | # merge flags if necessary | |||
|
520 | flags = localctx.flags() | |||
|
521 | localflags = _bytes_to_set(flags) | |||
|
522 | otherflags = _bytes_to_set(otherctx.flags()) | |||
|
523 | if is_null(basectx) and localflags != otherflags: | |||
|
524 | baseflags = _bytes_to_set(basectx.flags()) | |||
|
525 | flags = localflags & otherflags | |||
|
526 | for f in localflags.symmetric_difference(otherflags): | |||
|
527 | if f not in baseflags: | |||
|
528 | flags.add(f) | |||
|
529 | flags = b''.join(sorted(flags)) | |||
|
530 | ||||
506 | if not opts.get(b'print'): |
|
531 | if not opts.get(b'print'): | |
507 |
localctx.write(mergedtext, |
|
532 | localctx.write(mergedtext, flags) | |
508 |
|
533 | |||
509 | if m3.conflicts and not mode == b'union': |
|
534 | if m3.conflicts and not mode == b'union': | |
510 | return 1 |
|
535 | return 1 |
@@ -853,6 +853,26 b' graft --continue after --force' | |||||
853 | $ cat a |
|
853 | $ cat a | |
854 | abc |
|
854 | abc | |
855 |
|
855 | |||
|
856 | graft --continue after --base with conflits | |||
|
857 | ||||
|
858 | $ echo base > d | |||
|
859 | $ hg ci -m _ | |||
|
860 | $ hg graft -r 6 | |||
|
861 | skipping ungraftable merge revision 6 | |||
|
862 | [255] | |||
|
863 | $ hg graft -r 6 --base 5 | |||
|
864 | grafting 6:25a2b029d3ae "6" | |||
|
865 | merging d | |||
|
866 | merging e | |||
|
867 | warning: conflicts while merging d! (edit, then use 'hg resolve --mark') | |||
|
868 | abort: unresolved conflicts, can't continue | |||
|
869 | (use 'hg resolve' and 'hg graft --continue') | |||
|
870 | [1] | |||
|
871 | $ echo a > d && hg resolve -qm | |||
|
872 | continue: hg graft --continue | |||
|
873 | $ hg graft --continue | |||
|
874 | grafting 6:25a2b029d3ae "6" | |||
|
875 | ||||
856 | Continue testing same origin policy, using revision numbers from test above |
|
876 | Continue testing same origin policy, using revision numbers from test above | |
857 | but do some destructive editing of the repo: |
|
877 | but do some destructive editing of the repo: | |
858 |
|
878 |
General Comments 0
You need to be logged in to leave comments.
Login now