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 |
|
|
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 |
|
|
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 |
|
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