##// END OF EJS Templates
merge with stable
Yuya Nishihara -
r45443:61719b96 merge default
parent child Browse files
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, localctx.flags())
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