##// END OF EJS Templates
Merge crew and main.
Augie Fackler -
r18641:6204e4d4 merge default
parent child Browse files
Show More
@@ -0,0 +1,123 b''
1 # worker.py - master-slave parallelism support
2 #
3 # Copyright 2013 Facebook, Inc.
4 #
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
7
8 from i18n import _
9 import os, signal, sys, util
10
11 def countcpus():
12 '''try to count the number of CPUs on the system'''
13
14 # posix
15 try:
16 n = int(os.sysconf('SC_NPROCESSORS_ONLN'))
17 if n > 0:
18 return n
19 except (AttributeError, ValueError):
20 pass
21
22 # windows
23 try:
24 n = int(os.environ['NUMBER_OF_PROCESSORS'])
25 if n > 0:
26 return n
27 except (KeyError, ValueError):
28 pass
29
30 return 1
31
32 def _numworkers(ui):
33 s = ui.config('worker', 'numcpus')
34 if s:
35 try:
36 n = int(s)
37 if n >= 1:
38 return n
39 except ValueError:
40 raise util.Abort(_('number of cpus must be an integer'))
41 return min(max(countcpus(), 4), 32)
42
43 if os.name == 'posix':
44 _startupcost = 0.01
45 else:
46 _startupcost = 1e30
47
48 def worthwhile(ui, costperop, nops):
49 '''try to determine whether the benefit of multiple processes can
50 outweigh the cost of starting them'''
51 linear = costperop * nops
52 workers = _numworkers(ui)
53 benefit = linear - (_startupcost * workers + linear / workers)
54 return benefit >= 0.15
55
56 def worker(ui, costperarg, func, staticargs, args):
57 '''run a function, possibly in parallel in multiple worker
58 processes.
59
60 returns a progress iterator
61
62 costperarg - cost of a single task
63
64 func - function to run
65
66 staticargs - arguments to pass to every invocation of the function
67
68 args - arguments to split into chunks, to pass to individual
69 workers
70 '''
71 if worthwhile(ui, costperarg, len(args)):
72 return _platformworker(ui, func, staticargs, args)
73 return func(*staticargs + (args,))
74
75 def _posixworker(ui, func, staticargs, args):
76 rfd, wfd = os.pipe()
77 workers = _numworkers(ui)
78 for pargs in partition(args, workers):
79 pid = os.fork()
80 if pid == 0:
81 try:
82 os.close(rfd)
83 for i, item in func(*(staticargs + (pargs,))):
84 os.write(wfd, '%d %s\n' % (i, item))
85 os._exit(0)
86 except KeyboardInterrupt:
87 os._exit(255)
88 os.close(wfd)
89 fp = os.fdopen(rfd, 'rb', 0)
90 oldhandler = signal.getsignal(signal.SIGINT)
91 signal.signal(signal.SIGINT, signal.SIG_IGN)
92 def cleanup():
93 # python 2.4 is too dumb for try/yield/finally
94 signal.signal(signal.SIGINT, oldhandler)
95 problems = 0
96 for i in xrange(workers):
97 problems |= os.wait()[1]
98 if problems:
99 sys.exit(1)
100 try:
101 for line in fp:
102 l = line.split(' ', 1)
103 yield int(l[0]), l[1][:-1]
104 except: # re-raises
105 cleanup()
106 raise
107 cleanup()
108
109 if os.name != 'nt':
110 _platformworker = _posixworker
111
112 def partition(lst, nslices):
113 '''partition a list into N slices of equal size'''
114 n = len(lst)
115 chunk, slop = n / nslices, n % nslices
116 end = 0
117 for i in xrange(nslices):
118 start = end
119 end = start + chunk
120 if slop:
121 end += 1
122 slop -= 1
123 yield lst[start:end]
@@ -1463,3 +1463,15 b' The full set of options is:'
1463
1463
1464 ``templates``
1464 ``templates``
1465 Where to find the HTML templates. Default is install path.
1465 Where to find the HTML templates. Default is install path.
1466
1467 ``worker``
1468 ----------
1469
1470 Parallel master/worker configuration. We currently perform working
1471 directory updates in parallel on Unix-like systems, which greatly
1472 helps performance.
1473
1474 ``numcpus``
1475 Number of CPUs to use for parallel operations. Default is 4 or the
1476 number of CPUs on the system, whichever is larger. A zero or
1477 negative value is treated as ``use the default``.
@@ -7,7 +7,7 b''
7
7
8 from node import nullid, nullrev, hex, bin
8 from node import nullid, nullrev, hex, bin
9 from i18n import _
9 from i18n import _
10 import error, util, filemerge, copies, subrepo
10 import error, util, filemerge, copies, subrepo, worker
11 import errno, os, shutil
11 import errno, os, shutil
12
12
13 class mergestate(object):
13 class mergestate(object):
@@ -342,6 +342,42 b' def manifestmerge(repo, wctx, p2, pa, br'
342 def actionkey(a):
342 def actionkey(a):
343 return a[1] == "r" and -1 or 0, a
343 return a[1] == "r" and -1 or 0, a
344
344
345 def getremove(repo, mctx, overwrite, args):
346 """apply usually-non-interactive updates to the working directory
347
348 mctx is the context to be merged into the working copy
349
350 yields tuples for progress updates
351 """
352 verbose = repo.ui.verbose
353 unlink = util.unlinkpath
354 wjoin = repo.wjoin
355 fctx = mctx.filectx
356 wwrite = repo.wwrite
357 audit = repo.wopener.audit
358 i = 0
359 for arg in args:
360 f = arg[0]
361 if arg[1] == 'r':
362 if verbose:
363 repo.ui.note(_("removing %s\n") % f)
364 audit(f)
365 try:
366 unlink(wjoin(f), ignoremissing=True)
367 except OSError, inst:
368 repo.ui.warn(_("update failed to remove %s: %s!\n") %
369 (f, inst.strerror))
370 else:
371 if verbose:
372 repo.ui.note(_("getting %s\n") % f)
373 wwrite(f, fctx(f).data(), arg[2][0])
374 if i == 100:
375 yield i, f
376 i = 0
377 i += 1
378 if i > 0:
379 yield i, f
380
345 def applyupdates(repo, actions, wctx, mctx, actx, overwrite):
381 def applyupdates(repo, actions, wctx, mctx, actx, overwrite):
346 """apply the merge action list to the working directory
382 """apply the merge action list to the working directory
347
383
@@ -393,22 +429,34 b' def applyupdates(repo, actions, wctx, mc'
393 util.unlinkpath(repo.wjoin(f))
429 util.unlinkpath(repo.wjoin(f))
394
430
395 numupdates = len(actions)
431 numupdates = len(actions)
432 workeractions = [a for a in actions if a[1] in 'gr']
433 updated = len([a for a in workeractions if a[1] == 'g'])
434 removed = len([a for a in workeractions if a[1] == 'r'])
435 actions = [a for a in actions if a[1] not in 'gr']
436
437 hgsub = [a[1] for a in workeractions if a[0] == '.hgsubstate']
438 if hgsub and hgsub[0] == 'r':
439 subrepo.submerge(repo, wctx, mctx, wctx, overwrite)
440
441 z = 0
442 prog = worker.worker(repo.ui, 0.001, getremove, (repo, mctx, overwrite),
443 workeractions)
444 for i, item in prog:
445 z += i
446 repo.ui.progress(_('updating'), z, item=item, total=numupdates,
447 unit=_('files'))
448
449 if hgsub and hgsub[0] == 'g':
450 subrepo.submerge(repo, wctx, mctx, wctx, overwrite)
451
452 _updating = _('updating')
453 _files = _('files')
454 progress = repo.ui.progress
455
396 for i, a in enumerate(actions):
456 for i, a in enumerate(actions):
397 f, m, args, msg = a
457 f, m, args, msg = a
398 repo.ui.progress(_('updating'), i + 1, item=f, total=numupdates,
458 progress(_updating, z + i + 1, item=f, total=numupdates, unit=_files)
399 unit=_('files'))
459 if m == "m": # merge
400 if m == "r": # remove
401 repo.ui.note(_("removing %s\n") % f)
402 audit(f)
403 if f == '.hgsubstate': # subrepo states need updating
404 subrepo.submerge(repo, wctx, mctx, wctx, overwrite)
405 try:
406 util.unlinkpath(repo.wjoin(f), ignoremissing=True)
407 except OSError, inst:
408 repo.ui.warn(_("update failed to remove %s: %s!\n") %
409 (f, inst.strerror))
410 removed += 1
411 elif m == "m": # merge
412 if fd == '.hgsubstate': # subrepo states need updating
460 if fd == '.hgsubstate': # subrepo states need updating
413 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx),
461 subrepo.submerge(repo, wctx, mctx, wctx.ancestor(mctx),
414 overwrite)
462 overwrite)
@@ -423,13 +471,6 b' def applyupdates(repo, actions, wctx, mc'
423 updated += 1
471 updated += 1
424 else:
472 else:
425 merged += 1
473 merged += 1
426 elif m == "g": # get
427 flags, = args
428 repo.ui.note(_("getting %s\n") % f)
429 repo.wwrite(f, mctx.filectx(f).data(), flags)
430 updated += 1
431 if f == '.hgsubstate': # subrepo states need updating
432 subrepo.submerge(repo, wctx, mctx, wctx, overwrite)
433 elif m == "d": # directory rename
474 elif m == "d": # directory rename
434 f2, fd, flags = args
475 f2, fd, flags = args
435 if f:
476 if f:
@@ -459,7 +500,7 b' def applyupdates(repo, actions, wctx, mc'
459 util.setflags(repo.wjoin(f), 'l' in flags, 'x' in flags)
500 util.setflags(repo.wjoin(f), 'l' in flags, 'x' in flags)
460 updated += 1
501 updated += 1
461 ms.commit()
502 ms.commit()
462 repo.ui.progress(_('updating'), None, total=numupdates, unit=_('files'))
503 progress(_updating, None, total=numupdates, unit=_files)
463
504
464 return updated, merged, removed, unresolved
505 return updated, merged, removed, unresolved
465
506
@@ -150,8 +150,8 b' Graft out of order, skipping a merge and'
150 branchmerge: True, force: True, partial: False
150 branchmerge: True, force: True, partial: False
151 ancestor: 4c60f11aa304, local: 6b9e5368ca4e+, remote: 97f8bfe72746
151 ancestor: 4c60f11aa304, local: 6b9e5368ca4e+, remote: 97f8bfe72746
152 e: remote is newer -> g
152 e: remote is newer -> g
153 getting e
153 updating: e 1/1 files (100.00%)
154 updating: e 1/1 files (100.00%)
154 getting e
155 e
155 e
156 grafting revision 4
156 grafting revision 4
157 searching for copies back to rev 1
157 searching for copies back to rev 1
@@ -161,8 +161,8 b' Graft out of order, skipping a merge and'
161 d: remote is newer -> g
161 d: remote is newer -> g
162 e: versions differ -> m
162 e: versions differ -> m
163 preserving e for resolve of e
163 preserving e for resolve of e
164 getting d
164 updating: d 1/2 files (50.00%)
165 updating: d 1/2 files (50.00%)
165 getting d
166 updating: e 2/2 files (100.00%)
166 updating: e 2/2 files (100.00%)
167 picked tool 'internal:merge' for e (binary False symlink False)
167 picked tool 'internal:merge' for e (binary False symlink False)
168 merging e
168 merging e
@@ -32,8 +32,8 b' revision.'
32 branchmerge: True, force: False, partial: False
32 branchmerge: True, force: False, partial: False
33 ancestor: bbd179dfa0a7, local: 71766447bdbb+, remote: 4d9e78aaceee
33 ancestor: bbd179dfa0a7, local: 71766447bdbb+, remote: 4d9e78aaceee
34 foo: remote is newer -> g
34 foo: remote is newer -> g
35 getting foo
35 updating: foo 1/1 files (100.00%)
36 updating: foo 1/1 files (100.00%)
36 getting foo
37 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
37 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
38 (branch merge, don't forget to commit)
38 (branch merge, don't forget to commit)
39
39
@@ -36,10 +36,9 b' http://mercurial.selenic.com/bts/issue67'
36 ancestor: 81f4b099af3d, local: c64f439569a9+, remote: c12dcd37c90a
36 ancestor: 81f4b099af3d, local: c64f439569a9+, remote: c12dcd37c90a
37 1: other deleted -> r
37 1: other deleted -> r
38 1a: remote created -> g
38 1a: remote created -> g
39 updating: 1 1/2 files (50.00%)
40 removing 1
39 removing 1
40 getting 1a
41 updating: 1a 2/2 files (100.00%)
41 updating: 1a 2/2 files (100.00%)
42 getting 1a
43 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
42 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
44 (branch merge, don't forget to commit)
43 (branch merge, don't forget to commit)
45
44
@@ -1679,8 +1679,8 b' largefiles pulled on update - no server '
1679 branchmerge: False, force: False, partial: False
1679 branchmerge: False, force: False, partial: False
1680 ancestor: 000000000000, local: 000000000000+, remote: cf03e5bb9936
1680 ancestor: 000000000000, local: 000000000000+, remote: cf03e5bb9936
1681 .hglf/f1: remote created -> g
1681 .hglf/f1: remote created -> g
1682 getting .hglf/f1
1682 updating: .hglf/f1 1/1 files (100.00%)
1683 updating: .hglf/f1 1/1 files (100.00%)
1683 getting .hglf/f1
1684 getting changed largefiles
1684 getting changed largefiles
1685 using http://localhost:$HGPORT2/
1685 using http://localhost:$HGPORT2/
1686 sending capabilities command
1686 sending capabilities command
@@ -44,16 +44,13 b''
44 a/c: remote renamed directory to b/c -> d
44 a/c: remote renamed directory to b/c -> d
45 b/a: remote created -> g
45 b/a: remote created -> g
46 b/b: remote created -> g
46 b/b: remote created -> g
47 updating: a/a 1/5 files (20.00%)
48 removing a/a
47 removing a/a
49 updating: a/b 2/5 files (40.00%)
50 removing a/b
48 removing a/b
51 updating: a/c 3/5 files (60.00%)
49 getting b/a
50 getting b/b
51 updating: b/b 4/5 files (80.00%)
52 updating: a/c 5/5 files (100.00%)
52 moving a/c to b/c
53 moving a/c to b/c
53 updating: b/a 4/5 files (80.00%)
54 getting b/a
55 updating: b/b 5/5 files (100.00%)
56 getting b/b
57 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
54 3 files updated, 0 files merged, 2 files removed, 0 files unresolved
58 (branch merge, don't forget to commit)
55 (branch merge, don't forget to commit)
59
56
@@ -41,17 +41,17 b''
41 a2: divergent renames -> dr
41 a2: divergent renames -> dr
42 b2: remote created -> g
42 b2: remote created -> g
43 removing a
43 removing a
44 updating: a 1/3 files (33.33%)
44 getting b2
45 updating: b2 1/3 files (33.33%)
46 updating: a 2/3 files (66.67%)
45 picked tool 'internal:merge' for b (binary False symlink False)
47 picked tool 'internal:merge' for b (binary False symlink False)
46 merging a and b to b
48 merging a and b to b
47 my b@044f8520aeeb+ other b@85c198ef2f6c ancestor a@af1939970a1c
49 my b@044f8520aeeb+ other b@85c198ef2f6c ancestor a@af1939970a1c
48 premerge successful
50 premerge successful
49 updating: a2 2/3 files (66.67%)
51 updating: a2 3/3 files (100.00%)
50 note: possible conflict - a2 was renamed multiple times to:
52 note: possible conflict - a2 was renamed multiple times to:
51 c2
53 c2
52 b2
54 b2
53 updating: b2 3/3 files (100.00%)
54 getting b2
55 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
55 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
56 (branch merge, don't forget to commit)
56 (branch merge, don't forget to commit)
57
57
@@ -183,11 +183,11 b' Check for issue3074'
183 ancestor: 19d7f95df299, local: 0084274f6b67+, remote: 5d32493049f0
183 ancestor: 19d7f95df299, local: 0084274f6b67+, remote: 5d32493049f0
184 file: rename and delete -> rd
184 file: rename and delete -> rd
185 newfile: remote created -> g
185 newfile: remote created -> g
186 updating: file 1/2 files (50.00%)
186 getting newfile
187 updating: newfile 1/2 files (50.00%)
188 updating: file 2/2 files (100.00%)
187 note: possible conflict - file was deleted and renamed to:
189 note: possible conflict - file was deleted and renamed to:
188 newfile
190 newfile
189 updating: newfile 2/2 files (100.00%)
190 getting newfile
191 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
191 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
192 (branch merge, don't forget to commit)
192 (branch merge, don't forget to commit)
193 $ hg status
193 $ hg status
@@ -126,8 +126,8 b' args:'
126 preserving b for resolve of b
126 preserving b for resolve of b
127 rev: versions differ -> m
127 rev: versions differ -> m
128 preserving rev for resolve of rev
128 preserving rev for resolve of rev
129 getting a
129 updating: a 1/3 files (33.33%)
130 updating: a 1/3 files (33.33%)
130 getting a
131 updating: b 2/3 files (66.67%)
131 updating: b 2/3 files (66.67%)
132 picked tool 'python ../merge' for b (binary False symlink False)
132 picked tool 'python ../merge' for b (binary False symlink False)
133 merging b and a to b
133 merging b and a to b
@@ -231,8 +231,8 b' args:'
231 b: remote created -> g
231 b: remote created -> g
232 rev: versions differ -> m
232 rev: versions differ -> m
233 preserving rev for resolve of rev
233 preserving rev for resolve of rev
234 getting b
234 updating: b 1/2 files (50.00%)
235 updating: b 1/2 files (50.00%)
235 getting b
236 updating: rev 2/2 files (100.00%)
236 updating: rev 2/2 files (100.00%)
237 picked tool 'python ../merge' for rev (binary False symlink False)
237 picked tool 'python ../merge' for rev (binary False symlink False)
238 merging rev
238 merging rev
@@ -289,10 +289,9 b' args:'
289 b: remote created -> g
289 b: remote created -> g
290 rev: versions differ -> m
290 rev: versions differ -> m
291 preserving rev for resolve of rev
291 preserving rev for resolve of rev
292 updating: a 1/3 files (33.33%)
293 removing a
292 removing a
293 getting b
294 updating: b 2/3 files (66.67%)
294 updating: b 2/3 files (66.67%)
295 getting b
296 updating: rev 3/3 files (100.00%)
295 updating: rev 3/3 files (100.00%)
297 picked tool 'python ../merge' for rev (binary False symlink False)
296 picked tool 'python ../merge' for rev (binary False symlink False)
298 merging rev
297 merging rev
@@ -380,12 +379,12 b' m "um a c" "um x c" " " "10 do merg'
380 c: remote created -> g
379 c: remote created -> g
381 rev: versions differ -> m
380 rev: versions differ -> m
382 preserving rev for resolve of rev
381 preserving rev for resolve of rev
383 updating: a 1/3 files (33.33%)
382 getting c
383 updating: c 1/3 files (33.33%)
384 updating: a 2/3 files (66.67%)
384 note: possible conflict - a was renamed multiple times to:
385 note: possible conflict - a was renamed multiple times to:
385 b
386 b
386 c
387 c
387 updating: c 2/3 files (66.67%)
388 getting c
389 updating: rev 3/3 files (100.00%)
388 updating: rev 3/3 files (100.00%)
390 picked tool 'python ../merge' for rev (binary False symlink False)
389 picked tool 'python ../merge' for rev (binary False symlink False)
391 merging rev
390 merging rev
@@ -439,8 +438,8 b' m "um a c" "um x c" " " "10 do merg'
439 preserving b for resolve of b
438 preserving b for resolve of b
440 rev: versions differ -> m
439 rev: versions differ -> m
441 preserving rev for resolve of rev
440 preserving rev for resolve of rev
441 removing a
442 updating: a 1/3 files (33.33%)
442 updating: a 1/3 files (33.33%)
443 removing a
444 updating: b 2/3 files (66.67%)
443 updating: b 2/3 files (66.67%)
445 picked tool 'python ../merge' for b (binary False symlink False)
444 picked tool 'python ../merge' for b (binary False symlink False)
446 merging b
445 merging b
@@ -469,8 +468,8 b' m "um a c" "um x c" " " "10 do merg'
469 preserving b for resolve of b
468 preserving b for resolve of b
470 rev: versions differ -> m
469 rev: versions differ -> m
471 preserving rev for resolve of rev
470 preserving rev for resolve of rev
471 getting a
472 updating: a 1/3 files (33.33%)
472 updating: a 1/3 files (33.33%)
473 getting a
474 updating: b 2/3 files (66.67%)
473 updating: b 2/3 files (66.67%)
475 picked tool 'python ../merge' for b (binary False symlink False)
474 picked tool 'python ../merge' for b (binary False symlink False)
476 merging b
475 merging b
@@ -500,8 +499,8 b' m "um a c" "um x c" " " "10 do merg'
500 preserving b for resolve of b
499 preserving b for resolve of b
501 rev: versions differ -> m
500 rev: versions differ -> m
502 preserving rev for resolve of rev
501 preserving rev for resolve of rev
502 removing a
503 updating: a 1/3 files (33.33%)
503 updating: a 1/3 files (33.33%)
504 removing a
505 updating: b 2/3 files (66.67%)
504 updating: b 2/3 files (66.67%)
506 picked tool 'python ../merge' for b (binary False symlink False)
505 picked tool 'python ../merge' for b (binary False symlink False)
507 merging b
506 merging b
@@ -530,8 +529,8 b' m "um a c" "um x c" " " "10 do merg'
530 preserving b for resolve of b
529 preserving b for resolve of b
531 rev: versions differ -> m
530 rev: versions differ -> m
532 preserving rev for resolve of rev
531 preserving rev for resolve of rev
532 getting a
533 updating: a 1/3 files (33.33%)
533 updating: a 1/3 files (33.33%)
534 getting a
535 updating: b 2/3 files (66.67%)
534 updating: b 2/3 files (66.67%)
536 picked tool 'python ../merge' for b (binary False symlink False)
535 picked tool 'python ../merge' for b (binary False symlink False)
537 merging b
536 merging b
@@ -591,8 +590,8 b' m "um a c" "um x c" " " "10 do merg'
591 preserving b for resolve of b
590 preserving b for resolve of b
592 rev: versions differ -> m
591 rev: versions differ -> m
593 preserving rev for resolve of rev
592 preserving rev for resolve of rev
593 getting a
594 updating: a 1/3 files (33.33%)
594 updating: a 1/3 files (33.33%)
595 getting a
596 updating: b 2/3 files (66.67%)
595 updating: b 2/3 files (66.67%)
597 picked tool 'python ../merge' for b (binary False symlink False)
596 picked tool 'python ../merge' for b (binary False symlink False)
598 merging b
597 merging b
@@ -731,13 +730,13 b' m "nm a b" "um x a" " " "22 get a, '
731 c: remote created -> g
730 c: remote created -> g
732 rev: versions differ -> m
731 rev: versions differ -> m
733 preserving rev for resolve of rev
732 preserving rev for resolve of rev
734 updating: b 1/3 files (33.33%)
733 getting c
734 updating: c 1/3 files (33.33%)
735 updating: b 2/3 files (66.67%)
735 picked tool 'python ../merge' for b (binary False symlink False)
736 picked tool 'python ../merge' for b (binary False symlink False)
736 merging b and a to b
737 merging b and a to b
737 my b@02963e448370+ other a@2b958612230f ancestor a@924404dff337
738 my b@02963e448370+ other a@2b958612230f ancestor a@924404dff337
738 premerge successful
739 premerge successful
739 updating: c 2/3 files (66.67%)
740 getting c
741 updating: rev 3/3 files (100.00%)
740 updating: rev 3/3 files (100.00%)
742 picked tool 'python ../merge' for rev (binary False symlink False)
741 picked tool 'python ../merge' for rev (binary False symlink False)
743 merging rev
742 merging rev
@@ -214,8 +214,8 b' merge tests'
214 branchmerge: False, force: False, partial: False
214 branchmerge: False, force: False, partial: False
215 ancestor: 60ca1237c194, local: 60ca1237c194+, remote: 6747d179aa9a
215 ancestor: 60ca1237c194, local: 60ca1237c194+, remote: 6747d179aa9a
216 t: remote is newer -> g
216 t: remote is newer -> g
217 getting t
217 updating: t 1/1 files (100.00%)
218 updating: t 1/1 files (100.00%)
218 getting t
219 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
219 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
220 (branch merge, don't forget to commit)
220 (branch merge, don't forget to commit)
221 $ hg debugsub
221 $ hg debugsub
@@ -49,12 +49,12 b''
49 a: versions differ -> m
49 a: versions differ -> m
50 preserving a for resolve of a
50 preserving a for resolve of a
51 b: remote created -> g
51 b: remote created -> g
52 updating: a 1/2 files (50.00%)
52 getting b
53 updating: b 1/2 files (50.00%)
54 updating: a 2/2 files (100.00%)
53 picked tool 'true' for a (binary False symlink False)
55 picked tool 'true' for a (binary False symlink False)
54 merging a
56 merging a
55 my a@c19d34741b0a+ other a@1e71731e6fbb ancestor a@c19d34741b0a
57 my a@c19d34741b0a+ other a@1e71731e6fbb ancestor a@c19d34741b0a
56 updating: b 2/2 files (100.00%)
57 getting b
58 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
58 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
59 $ hg parents
59 $ hg parents
60 changeset: 1:1e71731e6fbb
60 changeset: 1:1e71731e6fbb
@@ -70,8 +70,8 b''
70 b: other deleted -> r
70 b: other deleted -> r
71 a: versions differ -> m
71 a: versions differ -> m
72 preserving a for resolve of a
72 preserving a for resolve of a
73 removing b
73 updating: b 1/2 files (50.00%)
74 updating: b 1/2 files (50.00%)
74 removing b
75 updating: a 2/2 files (100.00%)
75 updating: a 2/2 files (100.00%)
76 picked tool 'true' for a (binary False symlink False)
76 picked tool 'true' for a (binary False symlink False)
77 merging a
77 merging a
@@ -103,12 +103,12 b''
103 a: versions differ -> m
103 a: versions differ -> m
104 preserving a for resolve of a
104 preserving a for resolve of a
105 b: remote created -> g
105 b: remote created -> g
106 updating: a 1/2 files (50.00%)
106 getting b
107 updating: b 1/2 files (50.00%)
108 updating: a 2/2 files (100.00%)
107 picked tool 'true' for a (binary False symlink False)
109 picked tool 'true' for a (binary False symlink False)
108 merging a
110 merging a
109 my a@c19d34741b0a+ other a@1e71731e6fbb ancestor a@c19d34741b0a
111 my a@c19d34741b0a+ other a@1e71731e6fbb ancestor a@c19d34741b0a
110 updating: b 2/2 files (100.00%)
111 getting b
112 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
112 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
113 $ hg parents
113 $ hg parents
114 changeset: 1:1e71731e6fbb
114 changeset: 1:1e71731e6fbb
@@ -71,12 +71,10 b''
71 side1: other deleted -> r
71 side1: other deleted -> r
72 side2: other deleted -> r
72 side2: other deleted -> r
73 main: remote created -> g
73 main: remote created -> g
74 updating: side1 1/3 files (33.33%)
75 removing side1
74 removing side1
76 updating: side2 2/3 files (66.67%)
77 removing side2
75 removing side2
76 getting main
78 updating: main 3/3 files (100.00%)
77 updating: main 3/3 files (100.00%)
79 getting main
80 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
78 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
81
79
82 $ ls
80 $ ls
General Comments 0
You need to be logged in to leave comments. Login now