##// END OF EJS Templates
merge with crew
Benoit Boissinot -
r3331:f472cf9a merge default
parent child Browse files
Show More
@@ -8,7 +8,7 b''
8 from node import *
8 from node import *
9 from i18n import gettext as _
9 from i18n import gettext as _
10 from demandload import demandload
10 from demandload import demandload
11 demandload(globals(), "ancestor bdiff repo revlog util")
11 demandload(globals(), "ancestor bdiff repo revlog util os")
12
12
13 class changectx(object):
13 class changectx(object):
14 """A changecontext object makes access to data related to a particular
14 """A changecontext object makes access to data related to a particular
@@ -191,6 +191,9 b' class filectx(object):'
191 def data(self): return self._filelog.read(self._filenode)
191 def data(self): return self._filelog.read(self._filenode)
192 def renamed(self): return self._filelog.renamed(self._filenode)
192 def renamed(self): return self._filelog.renamed(self._filenode)
193 def path(self): return self._path
193 def path(self): return self._path
194 def size(self): return self._filelog.size(self._filerev)
195
196 def cmp(self, text): return self._filelog.cmp(self._filenode, text)
194
197
195 def parents(self):
198 def parents(self):
196 p = self._path
199 p = self._path
@@ -327,7 +330,7 b' class workingctx(changectx):'
327 self._node = None
330 self._node = None
328
331
329 def __str__(self):
332 def __str__(self):
330 return "."
333 return str(self._parents[0]) + "+"
331
334
332 def __nonzero__(self):
335 def __nonzero__(self):
333 return True
336 return True
@@ -414,7 +417,9 b' class workingfilectx(filectx):'
414 self._changectx = workingctx(repo)
417 self._changectx = workingctx(repo)
415 return self._changectx
418 return self._changectx
416 elif name == '_repopath':
419 elif name == '_repopath':
417 self._repopath = self._repo.dirstate.copied(p) or self._path
420 self._repopath = (self._repo.dirstate.copied(self._path)
421 or self._path)
422 return self._repopath
418 elif name == '_filelog':
423 elif name == '_filelog':
419 self._filelog = self._repo.file(self._repopath)
424 self._filelog = self._repo.file(self._repopath)
420 return self._filelog
425 return self._filelog
@@ -425,7 +430,7 b' class workingfilectx(filectx):'
425 return True
430 return True
426
431
427 def __str__(self):
432 def __str__(self):
428 return "%s@." % self.path()
433 return "%s@%s" % (self.path(), self._changectx)
429
434
430 def filectx(self, fileid):
435 def filectx(self, fileid):
431 '''opens an arbitrary revision of the file without
436 '''opens an arbitrary revision of the file without
@@ -449,7 +454,7 b' class workingfilectx(filectx):'
449 '''return parent filectxs, following copies if necessary'''
454 '''return parent filectxs, following copies if necessary'''
450 p = self._path
455 p = self._path
451 rp = self._repopath
456 rp = self._repopath
452 pcl = self._workingctx._parents
457 pcl = self._changectx._parents
453 fl = self._filelog
458 fl = self._filelog
454 pl = [ (rp, pcl[0]._manifest.get(rp, nullid), fl) ]
459 pl = [ (rp, pcl[0]._manifest.get(rp, nullid), fl) ]
455 if len(pcl) > 1:
460 if len(pcl) > 1:
@@ -463,3 +468,6 b' class workingfilectx(filectx):'
463 def children(self):
468 def children(self):
464 return []
469 return []
465
470
471 def size(self): return os.stat(self._repo.wjoin(self._path)).st_size
472
473 def cmp(self, text): return self._repo.wread(self._path) == text
@@ -201,30 +201,55 b' def clone(ui, source, dest=None, pull=Fa'
201 dest_lock.release()
201 dest_lock.release()
202
202
203 if update:
203 if update:
204 _merge.update(dest_repo, dest_repo.changelog.tip())
204 _update(dest_repo, dest_repo.changelog.tip())
205 if dir_cleanup:
205 if dir_cleanup:
206 dir_cleanup.close()
206 dir_cleanup.close()
207
207
208 return src_repo, dest_repo
208 return src_repo, dest_repo
209
209
210 def _showstats(repo, stats):
211 stats = ((stats[0], _("updated")),
212 (stats[1], _("merged")),
213 (stats[2], _("removed")),
214 (stats[3], _("unresolved")))
215 note = ", ".join([_("%d files %s") % s for s in stats])
216 repo.ui.status("%s\n" % note)
217
218 def _update(repo, node): return update(repo, node)
219
210 def update(repo, node):
220 def update(repo, node):
211 """update the working directory to node, merging linear changes"""
221 """update the working directory to node, merging linear changes"""
212 return _merge.update(repo, node)
222 stats = _merge.update(repo, node, False, False, None, None)
223 _showstats(repo, stats)
224 if stats[3]:
225 repo.ui.status(_("There are unresolved merges with"
226 " locally modified files.\n"))
227 return stats[3]
213
228
214 def clean(repo, node, wlock=None, show_stats=True):
229 def clean(repo, node, wlock=None, show_stats=True):
215 """forcibly switch the working directory to node, clobbering changes"""
230 """forcibly switch the working directory to node, clobbering changes"""
216 return _merge.update(repo, node, force=True, wlock=wlock,
231 stats = _merge.update(repo, node, False, True, None, wlock)
217 show_stats=show_stats)
232 if show_stats: _showstats(repo, stats)
233 return stats[3]
218
234
219 def merge(repo, node, force=None, remind=True, wlock=None):
235 def merge(repo, node, force=None, remind=True, wlock=None):
220 """branch merge with node, resolving changes"""
236 """branch merge with node, resolving changes"""
221 return _merge.update(repo, node, branchmerge=True, force=force,
237 stats = _merge.update(repo, node, True, force, False, wlock)
222 remind=remind, wlock=wlock)
238 _showstats(repo, stats)
239 if stats[3]:
240 pl = repo.parents()
241 repo.ui.status(_("There are unresolved merges,"
242 " you can redo the full merge using:\n"
243 " hg update -C %s\n"
244 " hg merge %s\n"
245 % (pl[0].rev(), pl[1].rev())))
246 elif remind:
247 repo.ui.status(_("(branch merge, don't forget to commit)\n"))
248 return stats[3]
223
249
224 def revert(repo, node, choose, wlock):
250 def revert(repo, node, choose, wlock):
225 """revert changes to revision in node without updating dirstate"""
251 """revert changes to revision in node without updating dirstate"""
226 return _merge.update(repo, node, force=True, partial=choose,
252 return _merge.update(repo, node, False, True, choose, wlock)[3]
227 show_stats=False, wlock=wlock)
228
253
229 def verify(repo):
254 def verify(repo):
230 """verify the consistency of a repository"""
255 """verify the consistency of a repository"""
@@ -59,12 +59,6 b' class hgweb(object):'
59 if i in allowed or self.repo.ui.configbool("web", "allow" + i):
59 if i in allowed or self.repo.ui.configbool("web", "allow" + i):
60 yield {"type" : i, "extension" : spec[2], "node" : nodeid}
60 yield {"type" : i, "extension" : spec[2], "node" : nodeid}
61
61
62 def listfiles(self, files, mf):
63 for f in files[:self.maxfiles]:
64 yield self.t("filenodelink", node=hex(mf[f]), file=f)
65 if len(files) > self.maxfiles:
66 yield self.t("fileellipses")
67
68 def listfilediffs(self, files, changeset):
62 def listfilediffs(self, files, changeset):
69 for f in files[:self.maxfiles]:
63 for f in files[:self.maxfiles]:
70 yield self.t("filedifflink", node=hex(changeset), file=f)
64 yield self.t("filedifflink", node=hex(changeset), file=f)
@@ -436,9 +430,9 b' class hgweb(object):'
436 continue
430 continue
437
431
438 yield {"file": full,
432 yield {"file": full,
439 "filenode": hex(fnode),
440 "parity": self.stripes(parity),
433 "parity": self.stripes(parity),
441 "basename": f,
434 "basename": f,
435 "size": ctx.filectx(full).size(),
442 "permissions": mf.execf(full)}
436 "permissions": mf.execf(full)}
443 parity += 1
437 parity += 1
444
438
@@ -653,38 +647,31 b' class hgweb(object):'
653 def firstitem(query):
647 def firstitem(query):
654 return query.split('&', 1)[0].split(';', 1)[0]
648 return query.split('&', 1)[0].split(';', 1)[0]
655
649
656 root = req.env.get('REQUEST_URI', '').split('?', 1)[0]
650 def normurl(url):
657 pi = req.env.get('PATH_INFO', '')
651 inner = '/'.join([x for x in url.split('/') if x])
658 if pi:
652 tl = len(url) > 1 and url.endswith('/') and '/' or ''
659 root = root[:-len(pi)]
660
661 if req.env.has_key('REPO_NAME'):
662 base = '/' + req.env['REPO_NAME']
663 else:
664 base = root
665
653
654 return '%s%s%s' % (url.startswith('/') and '/' or '',
655 inner, tl)
656
657 root = normurl(req.env.get('REQUEST_URI', '').split('?', 1)[0])
658 pi = normurl(req.env.get('PATH_INFO', ''))
666 if pi:
659 if pi:
667 while pi.startswith('//'):
660 # strip leading /
668 pi = pi[1:]
661 pi = pi[1:]
669 if pi.startswith(base):
662 if pi:
670 if len(pi) > len(base):
663 root = root[:-len(pi)]
671 base += '/'
664 if req.env.has_key('REPO_NAME'):
672 query = pi[len(base):]
665 rn = req.env['REPO_NAME'] + '/'
673 else:
666 root += rn
674 if req.env.has_key('REPO_NAME'):
667 query = pi[len(rn):]
675 # We are using hgwebdir
676 base += '/'
677 else:
678 base += '?'
679 query = firstitem(req.env['QUERY_STRING'])
680 else:
668 else:
681 base += '/'
669 query = pi
682 query = pi[1:]
683 else:
670 else:
684 base += '?'
671 root += '?'
685 query = firstitem(req.env['QUERY_STRING'])
672 query = firstitem(req.env['QUERY_STRING'])
686
673
687 return (root + base, query)
674 return (root, query)
688
675
689 req.url, query = spliturl(req)
676 req.url, query = spliturl(req)
690
677
@@ -69,13 +69,18 b' class hgwebdir(object):'
69 def footer(**map):
69 def footer(**map):
70 yield tmpl("footer", motd=self.motd, **map)
70 yield tmpl("footer", motd=self.motd, **map)
71
71
72 url = req.env['REQUEST_URI'].split('?')[0]
73 if not url.endswith('/'):
74 url += '/'
75
72 style = self.style
76 style = self.style
73 if req.form.has_key('style'):
77 if req.form.has_key('style'):
74 style = req.form['style'][0]
78 style = req.form['style'][0]
75 mapfile = style_map(templater.templatepath(), style)
79 mapfile = style_map(templater.templatepath(), style)
76 tmpl = templater.templater(mapfile, templater.common_filters,
80 tmpl = templater.templater(mapfile, templater.common_filters,
77 defaults={"header": header,
81 defaults={"header": header,
78 "footer": footer})
82 "footer": footer,
83 "url": url})
79
84
80 def archivelist(ui, nodeid, url):
85 def archivelist(ui, nodeid, url):
81 allowed = ui.configlist("web", "allow_archive")
86 allowed = ui.configlist("web", "allow_archive")
@@ -461,20 +461,18 b' class localrepository(repo.repository):'
461 self.wreload,
461 self.wreload,
462 desc=_('working directory of %s') % self.origroot)
462 desc=_('working directory of %s') % self.origroot)
463
463
464 def checkfilemerge(self, filename, text, filelog, manifest1, manifest2):
464 def filecommit(self, fn, manifest1, manifest2, linkrev, transaction, changelist):
465 """
465 """
466 Determine whether a new filenode is needed and what parent
466 commit an individual file as part of a larger transaction
467 and rename information is needed for a file commit.
467 """
468
468
469 Returns (old entry, file parent 1, file parent 2, metadata)
469 t = self.wread(fn)
470
470 fl = self.file(fn)
471 If old entry is not None, a commit is not needed.
471 fp1 = manifest1.get(fn, nullid)
472 """
472 fp2 = manifest2.get(fn, nullid)
473 fp1 = manifest1.get(filename, nullid)
474 fp2 = manifest2.get(filename, nullid)
475
473
476 meta = {}
474 meta = {}
477 cp = self.dirstate.copied(filename)
475 cp = self.dirstate.copied(fn)
478 if cp:
476 if cp:
479 meta["copy"] = cp
477 meta["copy"] = cp
480 if not manifest2: # not a branch merge
478 if not manifest2: # not a branch merge
@@ -486,21 +484,22 b' class localrepository(repo.repository):'
486 meta["copyrev"] = hex(manifest2.get(cp))
484 meta["copyrev"] = hex(manifest2.get(cp))
487 fp2 = nullid
485 fp2 = nullid
488 self.ui.debug(_(" %s: copy %s:%s\n") %
486 self.ui.debug(_(" %s: copy %s:%s\n") %
489 (filename, cp, meta["copyrev"]))
487 (fn, cp, meta["copyrev"]))
490 fp1 = nullid
488 fp1 = nullid
491 elif fp2 != nullid:
489 elif fp2 != nullid:
492 # is one parent an ancestor of the other?
490 # is one parent an ancestor of the other?
493 fpa = filelog.ancestor(fp1, fp2)
491 fpa = fl.ancestor(fp1, fp2)
494 if fpa == fp1:
492 if fpa == fp1:
495 fp1, fp2 = fp2, nullid
493 fp1, fp2 = fp2, nullid
496 elif fpa == fp2:
494 elif fpa == fp2:
497 fp2 = nullid
495 fp2 = nullid
498
496
499 # is the file unmodified from the parent? report existing entry
497 # is the file unmodified from the parent? report existing entry
500 if fp2 == nullid and not filelog.cmp(fp1, text):
498 if fp2 == nullid and not fl.cmp(fp1, t):
501 return (fp1, None, None, {})
499 return fp1
502
500
503 return (None, fp1, fp2, meta)
501 changelist.append(fn)
502 return fl.add(t, meta, transaction, linkrev, fp1, fp2)
504
503
505 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None):
504 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None):
506 orig_parent = self.dirstate.parents()[0] or nullid
505 orig_parent = self.dirstate.parents()[0] or nullid
@@ -524,19 +523,8 b' class localrepository(repo.repository):'
524 linkrev = self.changelog.count()
523 linkrev = self.changelog.count()
525 for f in files:
524 for f in files:
526 try:
525 try:
527 t = self.wread(f)
526 m1[f] = self.filecommit(f, m1, m2, linkrev, tr, changed)
528 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f)))
527 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f)))
529 r = self.file(f)
530
531 entry, fp1, fp2, meta = self.checkfilemerge(f, t, r, m1, m2)
532 if entry:
533 m1[f] = entry
534 continue
535
536 m1[f] = r.add(t, meta, tr, linkrev, fp1, fp2)
537 changed.append(f)
538 if update_dirstate:
539 self.dirstate.update([f], "n")
540 except IOError:
528 except IOError:
541 try:
529 try:
542 del m1[f]
530 del m1[f]
@@ -603,31 +591,18 b' class localrepository(repo.repository):'
603 for f in commit:
591 for f in commit:
604 self.ui.note(f + "\n")
592 self.ui.note(f + "\n")
605 try:
593 try:
594 new[f] = self.filecommit(f, m1, m2, linkrev, tr, changed)
606 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f)))
595 m1.set(f, util.is_exec(self.wjoin(f), m1.execf(f)))
607 t = self.wread(f)
608 except IOError:
596 except IOError:
609 self.ui.warn(_("trouble committing %s!\n") % f)
597 self.ui.warn(_("trouble committing %s!\n") % f)
610 raise
598 raise
611
599
612 r = self.file(f)
613
614 entry, fp1, fp2, meta = self.checkfilemerge(f, t, r, m1, m2)
615 if entry:
616 new[f] = entry
617 continue
618
619 new[f] = r.add(t, meta, tr, linkrev, fp1, fp2)
620 # remember what we've added so that we can later calculate
621 # the files to pull from a set of changesets
622 changed.append(f)
623
624 # update manifest
600 # update manifest
625 m1.update(new)
601 m1.update(new)
626 for f in remove:
602 for f in remove:
627 if f in m1:
603 if f in m1:
628 del m1[f]
604 del m1[f]
629 mn = self.manifest.add(m1, tr, linkrev, c1[0], c2[0],
605 mn = self.manifest.add(m1, tr, linkrev, c1[0], c2[0], (new, remove))
630 (new, remove))
631
606
632 # add changeset
607 # add changeset
633 new = new.keys()
608 new = new.keys()
@@ -10,20 +10,12 b' from i18n import gettext as _'
10 from demandload import *
10 from demandload import *
11 demandload(globals(), "errno util os tempfile")
11 demandload(globals(), "errno util os tempfile")
12
12
13 def filemerge(repo, fw, fo, fd, my, other, p1, p2, move):
13 def filemerge(repo, fw, fo, wctx, mctx):
14 """perform a 3-way merge in the working directory
14 """perform a 3-way merge in the working directory
15
15
16 fw = filename in the working directory and first parent
16 fw = filename in the working directory
17 fo = filename in other parent
17 fo = filename in other parent
18 fd = destination filename
18 wctx, mctx = working and merge changecontexts
19 my = fileid in first parent
20 other = fileid in second parent
21 p1, p2 = hex changeset ids for merge command
22 move = whether to move or copy the file to the destination
23
24 TODO:
25 if fw is copied in the working directory, we get confused
26 implement move and fd
27 """
19 """
28
20
29 def temp(prefix, ctx):
21 def temp(prefix, ctx):
@@ -34,8 +26,12 b' def filemerge(repo, fw, fo, fd, my, othe'
34 f.close()
26 f.close()
35 return name
27 return name
36
28
37 fcm = repo.filectx(fw, fileid=my)
29 fcm = wctx.filectx(fw)
38 fco = repo.filectx(fo, fileid=other)
30 fco = mctx.filectx(fo)
31
32 if not fco.cmp(fcm.data()): # files identical?
33 return 0
34
39 fca = fcm.ancestor(fco)
35 fca = fcm.ancestor(fco)
40 if not fca:
36 if not fca:
41 fca = repo.filectx(fw, fileid=-1)
37 fca = repo.filectx(fw, fileid=-1)
@@ -43,40 +39,36 b' def filemerge(repo, fw, fo, fd, my, othe'
43 b = temp("base", fca)
39 b = temp("base", fca)
44 c = temp("other", fco)
40 c = temp("other", fco)
45
41
46 repo.ui.note(_("resolving %s\n") % fw)
42 if fw != fo:
43 repo.ui.status(_("merging %s and %s\n") % (fw, fo))
44 else:
45 repo.ui.status(_("merging %s\n") % fw)
46
47 repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca))
47 repo.ui.debug(_("my %s other %s ancestor %s\n") % (fcm, fco, fca))
48
48
49 cmd = (os.environ.get("HGMERGE") or repo.ui.config("ui", "merge")
49 cmd = (os.environ.get("HGMERGE") or repo.ui.config("ui", "merge")
50 or "hgmerge")
50 or "hgmerge")
51 r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=repo.root,
51 r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c), cwd=repo.root,
52 environ={'HG_FILE': fw,
52 environ={'HG_FILE': fw,
53 'HG_MY_NODE': p1,
53 'HG_MY_NODE': str(wctx.parents()[0]),
54 'HG_OTHER_NODE': p2})
54 'HG_OTHER_NODE': str(mctx)})
55 if r:
55 if r:
56 repo.ui.warn(_("merging %s failed!\n") % fw)
56 repo.ui.warn(_("merging %s failed!\n") % fw)
57 else:
58 if fd != fw:
59 repo.ui.debug(_("copying %s to %s\n") % (fw, fd))
60 repo.wwrite(fd, repo.wread(fw))
61 if move:
62 repo.ui.debug(_("removing %s\n") % fw)
63 os.unlink(a)
64
57
65 os.unlink(b)
58 os.unlink(b)
66 os.unlink(c)
59 os.unlink(c)
67 return r
60 return r
68
61
69 def checkunknown(repo, m2, wctx):
62 def checkunknown(wctx, mctx):
70 """
63 "check for collisions between unknown files and files in mctx"
71 check for collisions between unknown files and files in m2
64 man = mctx.manifest()
72 """
73 for f in wctx.unknown():
65 for f in wctx.unknown():
74 if f in m2:
66 if f in man:
75 if repo.file(f).cmp(m2[f], repo.wread(f)):
67 if mctx.filectx(f).cmp(wctx.filectx(f).data()):
76 raise util.Abort(_("'%s' already exists in the working"
68 raise util.Abort(_("'%s' already exists in the working"
77 " dir and differs from remote") % f)
69 " dir and differs from remote") % f)
78
70
79 def forgetremoved(m2, wctx):
71 def forgetremoved(wctx, mctx):
80 """
72 """
81 Forget removed files
73 Forget removed files
82
74
@@ -88,17 +80,15 b' def forgetremoved(m2, wctx):'
88 """
80 """
89
81
90 action = []
82 action = []
91
83 man = mctx.manifest()
92 for f in wctx.deleted() + wctx.removed():
84 for f in wctx.deleted() + wctx.removed():
93 if f not in m2:
85 if f not in man:
94 action.append((f, "f"))
86 action.append((f, "f"))
95
87
96 return action
88 return action
97
89
98 def nonoverlap(d1, d2):
90 def nonoverlap(d1, d2):
99 """
91 "Return list of elements in d1 not in d2"
100 Return list of elements in d1 not in d2
101 """
102
92
103 l = []
93 l = []
104 for d in d1:
94 for d in d1:
@@ -109,9 +99,7 b' def nonoverlap(d1, d2):'
109 return l
99 return l
110
100
111 def findold(fctx, limit):
101 def findold(fctx, limit):
112 """
102 "find files that path was copied from, back to linkrev limit"
113 find files that path was copied from, back to linkrev limit
114 """
115
103
116 old = {}
104 old = {}
117 orig = fctx.path()
105 orig = fctx.path()
@@ -174,10 +162,24 b' def findcopies(repo, m1, m2, limit):'
174
162
175 return copy
163 return copy
176
164
177 def manifestmerge(ui, m1, m2, ma, copy, overwrite, backwards, partial):
165 def manifestmerge(repo, p1, p2, pa, overwrite, partial):
166 """
167 Merge p1 and p2 with ancestor ma and generate merge action list
168
169 overwrite = whether we clobber working files
170 partial = function to filter file lists
178 """
171 """
179 Merge manifest m1 with m2 using ancestor ma and generate merge action list
172
180 """
173 repo.ui.note(_("resolving manifests\n"))
174 repo.ui.debug(_(" overwrite %s partial %s\n") % (overwrite, bool(partial)))
175 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (pa, p1, p2))
176
177 m1 = p1.manifest()
178 m2 = p2.manifest()
179 ma = pa.manifest()
180 backwards = (pa == p2)
181 action = []
182 copy = {}
181
183
182 def fmerge(f, f2=None, fa=None):
184 def fmerge(f, f2=None, fa=None):
183 """merge executable flags"""
185 """merge executable flags"""
@@ -187,11 +189,12 b' def manifestmerge(ui, m1, m2, ma, copy, '
187 a, b, c = ma.execf(fa), m1.execf(f), m2.execf(f2)
189 a, b, c = ma.execf(fa), m1.execf(f), m2.execf(f2)
188 return ((a^b) | (a^c)) ^ a
190 return ((a^b) | (a^c)) ^ a
189
191
190 action = []
192 def act(msg, m, f, *args):
193 repo.ui.debug(" %s: %s -> %s\n" % (f, msg, m))
194 action.append((f, m) + args)
191
195
192 def act(msg, f, m, *args):
196 if not (backwards or overwrite):
193 ui.debug(" %s: %s -> %s\n" % (f, msg, m))
197 copy = findcopies(repo, m1, m2, pa.rev())
194 action.append((f, m) + args)
195
198
196 # Compare manifests
199 # Compare manifests
197 for f, n in m1.iteritems():
200 for f, n in m1.iteritems():
@@ -203,43 +206,42 b' def manifestmerge(ui, m1, m2, ma, copy, '
203 a = ma.get(f, nullid)
206 a = ma.get(f, nullid)
204 # are both different from the ancestor?
207 # are both different from the ancestor?
205 if not overwrite and n != a and m2[f] != a:
208 if not overwrite and n != a and m2[f] != a:
206 act("versions differ", f, "m", fmerge(f), n[:20], m2[f])
209 act("versions differ", "m", f, f, f, fmerge(f), False)
207 # are we clobbering?
210 # are we clobbering?
208 # is remote's version newer?
211 # is remote's version newer?
209 # or are we going back in time and clean?
212 # or are we going back in time and clean?
210 elif overwrite or m2[f] != a or (backwards and not n[20:]):
213 elif overwrite or m2[f] != a or (backwards and not n[20:]):
211 act("remote is newer", f, "g", m2.execf(f), m2[f])
214 act("remote is newer", "g", f, m2.execf(f))
212 # local is newer, not overwrite, check mode bits
215 # local is newer, not overwrite, check mode bits
213 elif fmerge(f) != m1.execf(f):
216 elif fmerge(f) != m1.execf(f):
214 act("update permissions", f, "e", m2.execf(f))
217 act("update permissions", "e", f, m2.execf(f))
215 # contents same, check mode bits
218 # contents same, check mode bits
216 elif m1.execf(f) != m2.execf(f):
219 elif m1.execf(f) != m2.execf(f):
217 if overwrite or fmerge(f) != m1.execf(f):
220 if overwrite or fmerge(f) != m1.execf(f):
218 act("update permissions", f, "e", m2.execf(f))
221 act("update permissions", "e", f, m2.execf(f))
219 elif f in copy:
222 elif f in copy:
220 f2 = copy[f]
223 f2 = copy[f]
221 if f in ma: # case 3,20 A/B/A
224 if f in ma: # case 3,20 A/B/A
222 act("remote moved",
225 act("remote moved", "m", f, f2, f2, fmerge(f, f2, f), True)
223 f, "c", f2, f2, m1[f], m2[f2], fmerge(f, f2, f), True)
224 else:
226 else:
225 if f2 in m1: # case 2 A,B/B/B
227 if f2 in m1: # case 2 A,B/B/B
226 act("local copied",
228 act("local copied", "m",
227 f, "c", f2, f, m1[f], m2[f2], fmerge(f, f2, f2), False)
229 f, f2, f, fmerge(f, f2, f2), False)
228 else: # case 4,21 A/B/B
230 else: # case 4,21 A/B/B
229 act("local moved",
231 act("local moved", "m",
230 f, "c", f2, f, m1[f], m2[f2], fmerge(f, f2, f2), False)
232 f, f2, f, fmerge(f, f2, f2), False)
231 elif f in ma:
233 elif f in ma:
232 if n != ma[f] and not overwrite:
234 if n != ma[f] and not overwrite:
233 if ui.prompt(
235 if repo.ui.prompt(
234 (_(" local changed %s which remote deleted\n") % f) +
236 (_(" local changed %s which remote deleted\n") % f) +
235 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("d"):
237 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("d"):
236 act("prompt delete", f, "r")
238 act("prompt delete", "r", f)
237 else:
239 else:
238 act("other deleted", f, "r")
240 act("other deleted", "r", f)
239 else:
241 else:
240 # file is created on branch or in working directory
242 # file is created on branch or in working directory
241 if (overwrite and n[20:] != "u") or (backwards and not n[20:]):
243 if (overwrite and n[20:] != "u") or (backwards and not n[20:]):
242 act("remote deleted", f, "r")
244 act("remote deleted", "r", f)
243
245
244 for f, n in m2.iteritems():
246 for f, n in m2.iteritems():
245 if partial and not partial(f):
247 if partial and not partial(f):
@@ -251,22 +253,23 b' def manifestmerge(ui, m1, m2, ma, copy, '
251 if f2 not in m2: # already seen
253 if f2 not in m2: # already seen
252 continue
254 continue
253 # rename case 1, A/A,B/A
255 # rename case 1, A/A,B/A
254 act("remote copied",
256 act("remote copied", "m", f2, f, f, fmerge(f2, f, f2), False)
255 f2, "c", f, f, m1[f2], m2[f], fmerge(f2, f, f2), False)
256 elif f in ma:
257 elif f in ma:
257 if overwrite or backwards:
258 if overwrite or backwards:
258 act("recreating", f, "g", m2.execf(f), n)
259 act("recreating", "g", f, m2.execf(f))
259 elif n != ma[f]:
260 elif n != ma[f]:
260 if ui.prompt(
261 if repo.ui.prompt(
261 (_("remote changed %s which local deleted\n") % f) +
262 (_("remote changed %s which local deleted\n") % f) +
262 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("k"):
263 _("(k)eep or (d)elete?"), _("[kd]"), _("k")) == _("k"):
263 act("prompt recreating", f, "g", m2.execf(f), n)
264 act("prompt recreating", "g", f, m2.execf(f))
264 else:
265 else:
265 act("remote created", f, "g", m2.execf(f), n)
266 act("remote created", "g", f, m2.execf(f))
266
267
267 return action
268 return action
268
269
269 def applyupdates(repo, action, xp1, xp2):
270 def applyupdates(repo, action, wctx, mctx):
271 "apply the merge action list to the working directory"
272
270 updated, merged, removed, unresolved = 0, 0, 0, 0
273 updated, merged, removed, unresolved = 0, 0, 0, 0
271 action.sort()
274 action.sort()
272 for a in action:
275 for a in action:
@@ -283,34 +286,35 b' def applyupdates(repo, action, xp1, xp2)'
283 repo.ui.warn(_("update failed to remove %s: %s!\n") %
286 repo.ui.warn(_("update failed to remove %s: %s!\n") %
284 (f, inst.strerror))
287 (f, inst.strerror))
285 removed +=1
288 removed +=1
286 elif m == "c": # copy
289 elif m == "m": # merge
287 f2, fd, my, other, flag, move = a[2:]
290 f2, fd, flag, move = a[2:]
288 repo.ui.status(_("merging %s and %s to %s\n") % (f, f2, fd))
291 if filemerge(repo, f, f2, wctx, mctx):
289 if filemerge(repo, f, f2, fd, my, other, xp1, xp2, move):
290 unresolved += 1
292 unresolved += 1
293 else:
294 merged += 1
295 if f != fd:
296 repo.ui.debug(_("copying %s to %s\n") % (f, fd))
297 repo.wwrite(fd, repo.wread(f))
298 if move:
299 repo.ui.debug(_("removing %s\n") % f)
300 os.unlink(repo.wjoin(f))
291 util.set_exec(repo.wjoin(fd), flag)
301 util.set_exec(repo.wjoin(fd), flag)
292 merged += 1
293 elif m == "m": # merge
294 flag, my, other = a[2:]
295 repo.ui.status(_("merging %s\n") % f)
296 if filemerge(repo, f, f, f, my, other, xp1, xp2, False):
297 unresolved += 1
298 util.set_exec(repo.wjoin(f), flag)
299 merged += 1
300 elif m == "g": # get
302 elif m == "g": # get
301 flag, node = a[2:]
303 flag = a[2]
302 repo.ui.note(_("getting %s\n") % f)
304 repo.ui.note(_("getting %s\n") % f)
303 t = repo.file(f).read(node)
305 t = mctx.filectx(f).data()
304 repo.wwrite(f, t)
306 repo.wwrite(f, t)
305 util.set_exec(repo.wjoin(f), flag)
307 util.set_exec(repo.wjoin(f), flag)
306 updated += 1
308 updated += 1
307 elif m == "e": # exec
309 elif m == "e": # exec
308 flag = a[2:]
310 flag = a[2]
309 util.set_exec(repo.wjoin(f), flag)
311 util.set_exec(repo.wjoin(f), flag)
310
312
311 return updated, merged, removed, unresolved
313 return updated, merged, removed, unresolved
312
314
313 def recordupdates(repo, action, branchmerge):
315 def recordupdates(repo, action, branchmerge, mctx):
316 "record merge actions to the dirstate"
317
314 for a in action:
318 for a in action:
315 f, m = a[:2]
319 f, m = a[:2]
316 if m == "r": # remove
320 if m == "r": # remove
@@ -326,22 +330,7 b' def recordupdates(repo, action, branchme'
326 else:
330 else:
327 repo.dirstate.update([f], 'n')
331 repo.dirstate.update([f], 'n')
328 elif m == "m": # merge
332 elif m == "m": # merge
329 flag, my, other = a[2:]
333 f2, fd, flag, move = a[2:]
330 if branchmerge:
331 # We've done a branch merge, mark this file as merged
332 # so that we properly record the merger later
333 repo.dirstate.update([f], 'm')
334 else:
335 # We've update-merged a locally modified file, so
336 # we set the dirstate to emulate a normal checkout
337 # of that file some time in the past. Thus our
338 # merge will appear as a normal local file
339 # modification.
340 fl = repo.file(f)
341 f_len = fl.size(fl.rev(other))
342 repo.dirstate.update([f], 'n', st_size=f_len, st_mtime=-1)
343 elif m == "c": # copy
344 f2, fd, my, other, flag, move = a[2:]
345 if branchmerge:
334 if branchmerge:
346 # We've done a branch merge, mark this file as merged
335 # We've done a branch merge, mark this file as merged
347 # so that we properly record the merger later
336 # so that we properly record the merger later
@@ -352,114 +341,71 b' def recordupdates(repo, action, branchme'
352 # of that file some time in the past. Thus our
341 # of that file some time in the past. Thus our
353 # merge will appear as a normal local file
342 # merge will appear as a normal local file
354 # modification.
343 # modification.
355 fl = repo.file(f)
344 f_len = mctx.filectx(f).size()
356 f_len = fl.size(fl.rev(other))
357 repo.dirstate.update([fd], 'n', st_size=f_len, st_mtime=-1)
345 repo.dirstate.update([fd], 'n', st_size=f_len, st_mtime=-1)
358 if move:
346 if f != f2: # copy/rename
359 repo.dirstate.update([f], 'r')
347 if move:
360 if f != fd:
348 repo.dirstate.update([f], 'r')
361 repo.dirstate.copy(f, fd)
349 if f != fd:
362 else:
350 repo.dirstate.copy(f, fd)
363 repo.dirstate.copy(f2, fd)
351 else:
352 repo.dirstate.copy(f2, fd)
364
353
365 def update(repo, node, branchmerge=False, force=False, partial=None,
354 def update(repo, node, branchmerge, force, partial, wlock):
366 wlock=None, show_stats=True, remind=True):
355 """
356 Perform a merge between the working directory and the given node
367
357
368 overwrite = force and not branchmerge
358 branchmerge = whether to merge between branches
369 forcemerge = force and branchmerge
359 force = whether to force branch merging or file overwriting
360 partial = a function to filter file lists (dirstate not updated)
361 wlock = working dir lock, if already held
362 """
370
363
371 if not wlock:
364 if not wlock:
372 wlock = repo.wlock()
365 wlock = repo.wlock()
373
366
374 ### check phase
367 overwrite = force and not branchmerge
375
368 forcemerge = force and branchmerge
376 wc = repo.workingctx()
369 wc = repo.workingctx()
377 pl = wc.parents()
370 pl = wc.parents()
371 p1, p2 = pl[0], repo.changectx(node)
372 pa = p1.ancestor(p2)
373 fp1, fp2, xp1, xp2 = p1.node(), p2.node(), str(p1), str(p2)
374
375 ### check phase
378 if not overwrite and len(pl) > 1:
376 if not overwrite and len(pl) > 1:
379 raise util.Abort(_("outstanding uncommitted merges"))
377 raise util.Abort(_("outstanding uncommitted merges"))
380
378 if pa == p1 or pa == p2: # is there a linear path from p1 to p2?
381 p1, p2 = pl[0], repo.changectx(node)
382 pa = p1.ancestor(p2)
383
384 # are we going backwards?
385 backwards = (pa == p2)
386
387 # is there a linear path from p1 to p2?
388 if pa == p1 or pa == p2:
389 if branchmerge:
379 if branchmerge:
390 raise util.Abort(_("there is nothing to merge, just use "
380 raise util.Abort(_("there is nothing to merge, just use "
391 "'hg update' or look at 'hg heads'"))
381 "'hg update' or look at 'hg heads'"))
392 elif not (overwrite or branchmerge):
382 elif not (overwrite or branchmerge):
393 raise util.Abort(_("update spans branches, use 'hg merge' "
383 raise util.Abort(_("update spans branches, use 'hg merge' "
394 "or 'hg update -C' to lose changes"))
384 "or 'hg update -C' to lose changes"))
395
396 if branchmerge and not forcemerge:
385 if branchmerge and not forcemerge:
397 if wc.modified() or wc.added() or wc.removed():
386 if wc.modified() or wc.added() or wc.removed():
398 raise util.Abort(_("outstanding uncommitted changes"))
387 raise util.Abort(_("outstanding uncommitted changes"))
399
388
400 m1 = wc.manifest()
389 ### calculate phase
401 m2 = p2.manifest()
402 ma = pa.manifest()
403
404 # resolve the manifest to determine which files
405 # we care about merging
406 repo.ui.note(_("resolving manifests\n"))
407 repo.ui.debug(_(" overwrite %s branchmerge %s partial %s\n") %
408 (overwrite, branchmerge, bool(partial)))
409 repo.ui.debug(_(" ancestor %s local %s remote %s\n") % (p1, p2, pa))
410
411 action = []
390 action = []
412 copy = {}
413
414 if not force:
391 if not force:
415 checkunknown(repo, m2, wc)
392 checkunknown(wc, p2)
416 if not branchmerge:
393 if not branchmerge:
417 action += forgetremoved(m2, wc)
394 action += forgetremoved(wc, p2)
418 if not (backwards or overwrite):
395 action += manifestmerge(repo, wc, p2, pa, overwrite, partial)
419 copy = findcopies(repo, m1, m2, pa.rev())
420
421 action += manifestmerge(repo.ui, m1, m2, ma, copy,
422 overwrite, backwards, partial)
423
396
424 ### apply phase
397 ### apply phase
425
398 if not branchmerge: # just jump to the new rev
426 if not branchmerge:
399 fp1, fp2, xp1, xp2 = fp2, nullid, xp2, ''
427 # we don't need to do any magic, just jump to the new rev
400 if not partial:
428 p1, p2 = p2, repo.changectx(nullid)
401 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
429
430 xp1, xp2 = str(p1), str(p2)
431 if not p2: xp2 = ''
432
402
433 repo.hook('preupdate', throw=True, parent1=xp1, parent2=xp2)
403 stats = applyupdates(repo, action, wc, p2)
434
435 updated, merged, removed, unresolved = applyupdates(repo, action, xp1, xp2)
436
437 # update dirstate
438 if not partial:
439 recordupdates(repo, action, branchmerge)
440 repo.dirstate.setparents(p1.node(), p2.node())
441
404
442 if show_stats:
443 stats = ((updated, _("updated")),
444 (merged - unresolved, _("merged")),
445 (removed, _("removed")),
446 (unresolved, _("unresolved")))
447 note = ", ".join([_("%d files %s") % s for s in stats])
448 repo.ui.status("%s\n" % note)
449 if not partial:
405 if not partial:
450 if branchmerge:
406 recordupdates(repo, action, branchmerge, p2)
451 if unresolved:
407 repo.dirstate.setparents(fp1, fp2)
452 repo.ui.status(_("There are unresolved merges,"
408 repo.hook('update', parent1=xp1, parent2=xp2, error=stats[3])
453 " you can redo the full merge using:\n"
454 " hg update -C %s\n"
455 " hg merge %s\n"
456 % (p1.rev(), p2.rev())))
457 elif remind:
458 repo.ui.status(_("(branch merge, don't forget to commit)\n"))
459 elif unresolved:
460 repo.ui.status(_("There are unresolved merges with"
461 " locally modified files.\n"))
462
409
463 repo.hook('update', parent1=xp1, parent2=xp2, error=unresolved)
410 return stats
464 return unresolved
465
411
@@ -467,6 +467,7 b' def diff(repo, node1=None, node2=None, f'
467 to = None
467 to = None
468 tn = None
468 tn = None
469 dodiff = True
469 dodiff = True
470 header = []
470 if f in mmap:
471 if f in mmap:
471 to = getfile(f).read(mmap[f])
472 to = getfile(f).read(mmap[f])
472 if f not in removed:
473 if f not in removed:
@@ -480,7 +481,6 b' def diff(repo, node1=None, node2=None, f'
480 header.append('new mode %s\n' % nmode)
481 header.append('new mode %s\n' % nmode)
481
482
482 a, b = f, f
483 a, b = f, f
483 header = []
484 if f in added:
484 if f in added:
485 if node2:
485 if node2:
486 mode = gitmode(mmap2.execf(f))
486 mode = gitmode(mmap2.execf(f))
@@ -510,11 +510,12 b' def diff(repo, node1=None, node2=None, f'
510 nmode = gitmode(util.is_exec(repo.wjoin(f), mmap.execf(f)))
510 nmode = gitmode(util.is_exec(repo.wjoin(f), mmap.execf(f)))
511 addmodehdr(header, omode, nmode)
511 addmodehdr(header, omode, nmode)
512 r = None
512 r = None
513 if dodiff:
513 header.insert(0, 'diff --git a/%s b/%s\n' % (a, b))
514 header.insert(0, 'diff --git a/%s b/%s\n' % (a, b))
514 if dodiff:
515 text = mdiff.unidiff(to, date1, tn, date2(f), f, r, opts=opts)
516 if text or len(header) > 1:
515 fp.write(''.join(header))
517 fp.write(''.join(header))
516 if dodiff:
518 fp.write(text)
517 fp.write(mdiff.unidiff(to, date1, tn, date2(f), f, r, opts=opts))
518
519
519 def export(repo, revs, template='hg-%h.patch', fp=None, switch_parent=False,
520 def export(repo, revs, template='hg-%h.patch', fp=None, switch_parent=False,
520 opts=None):
521 opts=None):
@@ -23,6 +23,7 b' manifest |'
23 <table cellspacing="0">
23 <table cellspacing="0">
24 <tr class="light">
24 <tr class="light">
25 <td style="font-family:monospace">drwxr-xr-x</td>
25 <td style="font-family:monospace">drwxr-xr-x</td>
26 <td style="font-family:monospace"></td>
26 <td><a href="{url}file/#node|short##up|urlescape#{getentries}">[up]</a></td>
27 <td><a href="{url}file/#node|short##up|urlescape#{getentries}">[up]</a></td>
27 <td class="link">&nbsp;</td>
28 <td class="link">&nbsp;</td>
28 </tr>
29 </tr>
@@ -14,8 +14,8 b' changelogentry = changelogentry.tmpl'
14 searchentry = changelogentry.tmpl
14 searchentry = changelogentry.tmpl
15 changeset = changeset.tmpl
15 changeset = changeset.tmpl
16 manifest = manifest.tmpl
16 manifest = manifest.tmpl
17 manifestdirentry = '<tr class="parity#parity#"><td style="font-family:monospace">drwxr-xr-x</td><td><a href="#url#file/#node|short##path|urlescape#{getentries}">#basename|escape#/</a></td><td class="link"><a href="#url#file/#node|short##path|urlescape#{getentries}">manifest</a></td></tr>'
17 manifestdirentry = '<tr class="parity#parity#"><td style="font-family:monospace">drwxr-xr-x</td><td style="font-family:monospace"></td><td><a href="#url#file/#node|short##path|urlescape#{getentries}">#basename|escape#/</a></td><td class="link"><a href="#url#file/#node|short##path|urlescape#{getentries}">manifest</a></td></tr>'
18 manifestfileentry = '<tr class="parity#parity#"><td style="font-family:monospace">#permissions|permissions#</td><td class="list"><a class="list" href="#url#file/#node|short#/#file|urlescape#{getentries}">#basename|escape#</a></td><td class="link"><a href="#url#file/#node|short#/#file|urlescape#{getentries}">file</a> | <a href="#url#log/#node|short#/#file|urlescape#{getentries}">revisions</a> | <a href="#url#annotate/#node|short#/#file|urlescape#{getentries}">annotate</a></td></tr>'
18 manifestfileentry = '<tr class="parity#parity#"><td style="font-family:monospace">#permissions|permissions#</td><td style="font-family:monospace" align=right>#size#</td><td class="list"><a class="list" href="#url#file/#node|short#/#file|urlescape#{getentries}">#basename|escape#</a></td><td class="link"><a href="#url#file/#node|short#/#file|urlescape#{getentries}">file</a> | <a href="#url#log/#node|short#/#file|urlescape#{getentries}">revisions</a> | <a href="#url#annotate/#node|short#/#file|urlescape#{getentries}">annotate</a></td></tr>'
19 filerevision = filerevision.tmpl
19 filerevision = filerevision.tmpl
20 fileannotate = fileannotate.tmpl
20 fileannotate = fileannotate.tmpl
21 filelog = filelog.tmpl
21 filelog = filelog.tmpl
@@ -16,7 +16,9 b''
16 <table cellpadding="0" cellspacing="0">
16 <table cellpadding="0" cellspacing="0">
17 <tr class="parity1">
17 <tr class="parity1">
18 <td><tt>drwxr-xr-x</tt>&nbsp;
18 <td><tt>drwxr-xr-x</tt>&nbsp;
19 <td>&nbsp;
19 <td><a href="#url#file/#node|short##up|urlescape#{getentries}">[up]</a>
20 <td><a href="#url#file/#node|short##up|urlescape#{getentries}">[up]</a>
21 </tr>
20 #dentries%manifestdirentry#
22 #dentries%manifestdirentry#
21 #fentries%manifestfileentry#
23 #fentries%manifestfileentry#
22 </table>
24 </table>
@@ -14,8 +14,8 b' changelogentry = changelogentry.tmpl'
14 searchentry = changelogentry.tmpl
14 searchentry = changelogentry.tmpl
15 changeset = changeset.tmpl
15 changeset = changeset.tmpl
16 manifest = manifest.tmpl
16 manifest = manifest.tmpl
17 manifestdirentry = '<tr class="parity#parity#"><td><tt>drwxr-xr-x</tt>&nbsp;<td><a href="#url#file/#node|short##path|urlescape#{getentries}">#basename|escape#/</a>'
17 manifestdirentry = '<tr class="parity#parity#"><td><tt>drwxr-xr-x</tt>&nbsp;<td>&nbsp;<td><a href="#url#file/#node|short##path|urlescape#{getentries}">#basename|escape#/</a>'
18 manifestfileentry = '<tr class="parity#parity#"><td><tt>#permissions|permissions#</tt>&nbsp;<td><a href="#url#file/#node|short#/#file|urlescape#{getentries}">#basename|escape#</a>'
18 manifestfileentry = '<tr class="parity#parity#"><td><tt>#permissions|permissions#</tt>&nbsp;<td align=right><tt>#size#</tt>&nbsp;<td><a href="#url#file/#node|short#/#file|urlescape#{getentries}">#basename|escape#</a>'
19 filerevision = filerevision.tmpl
19 filerevision = filerevision.tmpl
20 fileannotate = fileannotate.tmpl
20 fileannotate = fileannotate.tmpl
21 filediff = filediff.tmpl
21 filediff = filediff.tmpl
@@ -32,6 +32,11 b' parser.add_option("-s", "--cover_stdlib"'
32 help="print a test coverage report inc. standard libraries")
32 help="print a test coverage report inc. standard libraries")
33 parser.add_option("-C", "--annotate", action="store_true",
33 parser.add_option("-C", "--annotate", action="store_true",
34 help="output files annotated with coverage")
34 help="output files annotated with coverage")
35 parser.add_option("-r", "--retest", action="store_true",
36 help="retest failed tests")
37 parser.add_option("-f", "--first", action="store_true",
38 help="exit on the first test failure")
39
35 parser.set_defaults(timeout=180)
40 parser.set_defaults(timeout=180)
36 (options, args) = parser.parse_args()
41 (options, args) = parser.parse_args()
37 verbose = options.verbose
42 verbose = options.verbose
@@ -360,11 +365,16 b' try:'
360 if (test.startswith("test-") and '~' not in test and
365 if (test.startswith("test-") and '~' not in test and
361 ('.' not in test or test.endswith('.py') or
366 ('.' not in test or test.endswith('.py') or
362 test.endswith('.bat'))):
367 test.endswith('.bat'))):
368 if options.retest and not os.path.exists(test + ".err"):
369 skipped += 1
370 continue
363 ret = run_one(test)
371 ret = run_one(test)
364 if ret is None:
372 if ret is None:
365 skipped += 1
373 skipped += 1
366 elif not ret:
374 elif not ret:
367 failed += 1
375 failed += 1
376 if options.first:
377 break
368 tests += 1
378 tests += 1
369
379
370 print "\n# Ran %d tests, %d skipped, %d failed." % (tests, skipped,
380 print "\n# Ran %d tests, %d skipped, %d failed." % (tests, skipped,
@@ -13,4 +13,5 b' rollback completed'
13 abort: date exceeds 32 bits: 111111111111
13 abort: date exceeds 32 bits: 111111111111
14 transaction abort!
14 transaction abort!
15 rollback completed
15 rollback completed
16 trouble committing bar!
16 abort: No such file or directory: .../test/bar
17 abort: No such file or directory: .../test/bar
@@ -19,7 +19,6 b' merging for foo'
19 resolving manifests
19 resolving manifests
20 getting bar
20 getting bar
21 merging foo
21 merging foo
22 resolving foo
23 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
22 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
24 (branch merge, don't forget to commit)
23 (branch merge, don't forget to commit)
25 we shouldn't have anything but foo in merge state here
24 we shouldn't have anything but foo in merge state here
@@ -45,7 +45,6 b' summary: added a b'
45
45
46 resolving manifests
46 resolving manifests
47 merging a
47 merging a
48 resolving a
49 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
48 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
50 (branch merge, don't forget to commit)
49 (branch merge, don't forget to commit)
51 pulling from ../test2
50 pulling from ../test2
@@ -11,7 +11,6 b' 1 files updated, 0 files merged, 0 files'
11 ? file1.orig
11 ? file1.orig
12 016807e6fdaf tip
12 016807e6fdaf tip
13 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
13 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
14 merging file1
15 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
14 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
16 ? file1.orig
15 ? file1.orig
17 016807e6fdaf tip
16 016807e6fdaf tip
@@ -1,7 +1,5 b''
1 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
2 %% no merges expected
2 %% no merges expected
3 merging for b
4 merging b
5 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
3 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
6 (branch merge, don't forget to commit)
4 (branch merge, don't forget to commit)
7 diff -r d9e5953b9dec b
5 diff -r d9e5953b9dec b
@@ -31,8 +29,6 b' This is file b1'
31 %% merge fails
29 %% merge fails
32 abort: outstanding uncommitted changes
30 abort: outstanding uncommitted changes
33 %% merge expected!
31 %% merge expected!
34 merging for b
35 merging b
36 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
32 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
37 (branch merge, don't forget to commit)
33 (branch merge, don't forget to commit)
38 diff -r c1dd73cbf59f b
34 diff -r c1dd73cbf59f b
@@ -22,12 +22,11 b' added 1 changesets with 1 changes to 1 f'
22 (run 'hg heads' to see heads, 'hg merge' to merge)
22 (run 'hg heads' to see heads, 'hg merge' to merge)
23 merge: warning: conflicts during merge
23 merge: warning: conflicts during merge
24 resolving manifests
24 resolving manifests
25 overwrite None branchmerge True partial False
25 overwrite None partial False
26 ancestor 451c744aabcc local a070d41e8360 remote faaea63e63a9
26 ancestor faaea63e63a9 local 451c744aabcc+ remote a070d41e8360
27 test.txt: versions differ -> m
27 test.txt: versions differ -> m
28 merging test.txt
28 merging test.txt
29 resolving test.txt
29 my test.txt@451c744aabcc+ other test.txt@a070d41e8360 ancestor test.txt@faaea63e63a9
30 my test.txt@451c744aabcc other test.txt@a070d41e8360 ancestor test.txt@faaea63e63a9
31 merging test.txt failed!
30 merging test.txt failed!
32 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
31 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
33 There are unresolved merges, you can redo the full merge using:
32 There are unresolved merges, you can redo the full merge using:
@@ -2,13 +2,12 b' checkout'
2 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
2 2 files updated, 0 files merged, 2 files removed, 0 files unresolved
3 merge
3 merge
4 resolving manifests
4 resolving manifests
5 overwrite None branchmerge True partial False
5 overwrite None partial False
6 ancestor f26ec4fc3fa3 local 8e765a822af2 remote af1939970a1c
6 ancestor af1939970a1c local f26ec4fc3fa3+ remote 8e765a822af2
7 a: remote moved -> c
7 a: remote moved -> m
8 b2: remote created -> g
8 b2: remote created -> g
9 merging a and b to b
9 merging a and b
10 resolving a
10 my a@f26ec4fc3fa3+ other b@8e765a822af2 ancestor a@af1939970a1c
11 my a@f26ec4fc3fa3 other b@8e765a822af2 ancestor a@af1939970a1c
12 copying a to b
11 copying a to b
13 removing a
12 removing a
14 getting b2
13 getting b2
@@ -2,17 +2,15 b''
2 test L:up a R:nc a b W: - 1 get local a to b
2 test L:up a R:nc a b W: - 1 get local a to b
3 --------------
3 --------------
4 resolving manifests
4 resolving manifests
5 overwrite None branchmerge True partial False
5 overwrite None partial False
6 ancestor e300d1c794ec local 735846fee2d7 remote 924404dff337
6 ancestor 924404dff337 local e300d1c794ec+ remote 735846fee2d7
7 rev: versions differ -> m
7 rev: versions differ -> m
8 a: remote copied -> c
8 a: remote copied -> m
9 merging a and b to b
9 merging a and b
10 resolving a
10 my a@e300d1c794ec+ other b@735846fee2d7 ancestor a@924404dff337
11 my a@e300d1c794ec other b@735846fee2d7 ancestor a@924404dff337
12 copying a to b
11 copying a to b
13 merging rev
12 merging rev
14 resolving rev
13 my rev@e300d1c794ec+ other rev@735846fee2d7 ancestor rev@924404dff337
15 my rev@e300d1c794ec other rev@735846fee2d7 ancestor rev@924404dff337
16 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
14 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
17 (branch merge, don't forget to commit)
15 (branch merge, don't forget to commit)
18 --------------
16 --------------
@@ -25,18 +23,16 b' M b'
25 test L:nc a b R:up a W: - 2 get rem change to a and b
23 test L:nc a b R:up a W: - 2 get rem change to a and b
26 --------------
24 --------------
27 resolving manifests
25 resolving manifests
28 overwrite None branchmerge True partial False
26 overwrite None partial False
29 ancestor ac809aeed39a local f4db7e329e71 remote 924404dff337
27 ancestor 924404dff337 local ac809aeed39a+ remote f4db7e329e71
30 a: remote is newer -> g
28 a: remote is newer -> g
31 b: local copied -> c
29 b: local copied -> m
32 rev: versions differ -> m
30 rev: versions differ -> m
33 getting a
31 getting a
34 merging b and a to b
32 merging b and a
35 resolving b
33 my b@ac809aeed39a+ other a@f4db7e329e71 ancestor a@924404dff337
36 my b@ac809aeed39a other a@f4db7e329e71 ancestor a@924404dff337
37 merging rev
34 merging rev
38 resolving rev
35 my rev@ac809aeed39a+ other rev@f4db7e329e71 ancestor rev@924404dff337
39 my rev@ac809aeed39a other rev@f4db7e329e71 ancestor rev@924404dff337
40 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
36 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
41 (branch merge, don't forget to commit)
37 (branch merge, don't forget to commit)
42 --------------
38 --------------
@@ -49,18 +45,16 b' M b'
49 test L:up a R:nm a b W: - 3 get local a change to b, remove a
45 test L:up a R:nm a b W: - 3 get local a change to b, remove a
50 --------------
46 --------------
51 resolving manifests
47 resolving manifests
52 overwrite None branchmerge True partial False
48 overwrite None partial False
53 ancestor e300d1c794ec local e03727d2d66b remote 924404dff337
49 ancestor 924404dff337 local e300d1c794ec+ remote e03727d2d66b
54 a: remote moved -> c
50 a: remote moved -> m
55 rev: versions differ -> m
51 rev: versions differ -> m
56 merging a and b to b
52 merging a and b
57 resolving a
53 my a@e300d1c794ec+ other b@e03727d2d66b ancestor a@924404dff337
58 my a@e300d1c794ec other b@e03727d2d66b ancestor a@924404dff337
59 copying a to b
54 copying a to b
60 removing a
55 removing a
61 merging rev
56 merging rev
62 resolving rev
57 my rev@e300d1c794ec+ other rev@e03727d2d66b ancestor rev@924404dff337
63 my rev@e300d1c794ec other rev@e03727d2d66b ancestor rev@924404dff337
64 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
58 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
65 (branch merge, don't forget to commit)
59 (branch merge, don't forget to commit)
66 --------------
60 --------------
@@ -72,16 +66,14 b' M b'
72 test L:nm a b R:up a W: - 4 get remote change to b
66 test L:nm a b R:up a W: - 4 get remote change to b
73 --------------
67 --------------
74 resolving manifests
68 resolving manifests
75 overwrite None branchmerge True partial False
69 overwrite None partial False
76 ancestor ecf3cb2a4219 local f4db7e329e71 remote 924404dff337
70 ancestor 924404dff337 local ecf3cb2a4219+ remote f4db7e329e71
77 b: local moved -> c
71 b: local moved -> m
78 rev: versions differ -> m
72 rev: versions differ -> m
79 merging b and a to b
73 merging b and a
80 resolving b
74 my b@ecf3cb2a4219+ other a@f4db7e329e71 ancestor a@924404dff337
81 my b@ecf3cb2a4219 other a@f4db7e329e71 ancestor a@924404dff337
82 merging rev
75 merging rev
83 resolving rev
76 my rev@ecf3cb2a4219+ other rev@f4db7e329e71 ancestor rev@924404dff337
84 my rev@ecf3cb2a4219 other rev@f4db7e329e71 ancestor rev@924404dff337
85 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
77 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
86 (branch merge, don't forget to commit)
78 (branch merge, don't forget to commit)
87 --------------
79 --------------
@@ -93,39 +85,31 b' M b'
93 test L: R:nc a b W: - 5 get b
85 test L: R:nc a b W: - 5 get b
94 --------------
86 --------------
95 resolving manifests
87 resolving manifests
96 overwrite None branchmerge True partial False
88 overwrite None partial False
97 ancestor 94b33a1b7f2d local 735846fee2d7 remote 924404dff337
89 ancestor 924404dff337 local 94b33a1b7f2d+ remote 735846fee2d7
98 rev: versions differ -> m
90 rev: versions differ -> m
99 a: remote copied -> c
91 a: remote copied -> m
100 merging a and b to b
101 resolving a
102 my a@924404dff337 other b@735846fee2d7 ancestor a@924404dff337
103 copying a to b
92 copying a to b
104 merging rev
93 merging rev
105 resolving rev
94 my rev@94b33a1b7f2d+ other rev@735846fee2d7 ancestor rev@924404dff337
106 my rev@94b33a1b7f2d other rev@735846fee2d7 ancestor rev@924404dff337
107 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
95 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
108 (branch merge, don't forget to commit)
96 (branch merge, don't forget to commit)
109 --------------
97 --------------
110 M a
111 M b
98 M b
112 a
99 a
100 C a
113 --------------
101 --------------
114
102
115 --------------
103 --------------
116 test L:nc a b R: W: - 6 nothing
104 test L:nc a b R: W: - 6 nothing
117 --------------
105 --------------
118 resolving manifests
106 resolving manifests
119 overwrite None branchmerge True partial False
107 overwrite None partial False
120 ancestor ac809aeed39a local 97c705ade336 remote 924404dff337
108 ancestor 924404dff337 local ac809aeed39a+ remote 97c705ade336
121 b: local copied -> c
109 b: local copied -> m
122 rev: versions differ -> m
110 rev: versions differ -> m
123 merging b and a to b
124 resolving b
125 my b@ac809aeed39a other a@924404dff337 ancestor a@924404dff337
126 merging rev
111 merging rev
127 resolving rev
112 my rev@ac809aeed39a+ other rev@97c705ade336 ancestor rev@924404dff337
128 my rev@ac809aeed39a other rev@97c705ade336 ancestor rev@924404dff337
129 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
113 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
130 (branch merge, don't forget to commit)
114 (branch merge, don't forget to commit)
131 --------------
115 --------------
@@ -138,18 +122,14 b' C a'
138 test L: R:nm a b W: - 7 get b
122 test L: R:nm a b W: - 7 get b
139 --------------
123 --------------
140 resolving manifests
124 resolving manifests
141 overwrite None branchmerge True partial False
125 overwrite None partial False
142 ancestor 94b33a1b7f2d local e03727d2d66b remote 924404dff337
126 ancestor 924404dff337 local 94b33a1b7f2d+ remote e03727d2d66b
143 a: remote moved -> c
127 a: remote moved -> m
144 rev: versions differ -> m
128 rev: versions differ -> m
145 merging a and b to b
146 resolving a
147 my a@924404dff337 other b@e03727d2d66b ancestor a@924404dff337
148 copying a to b
129 copying a to b
149 removing a
130 removing a
150 merging rev
131 merging rev
151 resolving rev
132 my rev@94b33a1b7f2d+ other rev@e03727d2d66b ancestor rev@924404dff337
152 my rev@94b33a1b7f2d other rev@e03727d2d66b ancestor rev@924404dff337
153 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
133 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
154 (branch merge, don't forget to commit)
134 (branch merge, don't forget to commit)
155 --------------
135 --------------
@@ -161,16 +141,12 b' M b'
161 test L:nm a b R: W: - 8 nothing
141 test L:nm a b R: W: - 8 nothing
162 --------------
142 --------------
163 resolving manifests
143 resolving manifests
164 overwrite None branchmerge True partial False
144 overwrite None partial False
165 ancestor ecf3cb2a4219 local 97c705ade336 remote 924404dff337
145 ancestor 924404dff337 local ecf3cb2a4219+ remote 97c705ade336
166 b: local moved -> c
146 b: local moved -> m
167 rev: versions differ -> m
147 rev: versions differ -> m
168 merging b and a to b
169 resolving b
170 my b@ecf3cb2a4219 other a@924404dff337 ancestor a@924404dff337
171 merging rev
148 merging rev
172 resolving rev
149 my rev@ecf3cb2a4219+ other rev@97c705ade336 ancestor rev@924404dff337
173 my rev@ecf3cb2a4219 other rev@97c705ade336 ancestor rev@924404dff337
174 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
150 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
175 (branch merge, don't forget to commit)
151 (branch merge, don't forget to commit)
176 --------------
152 --------------
@@ -182,16 +158,14 b' M b'
182 test L:um a b R:um a b W: - 9 do merge with ancestor in a
158 test L:um a b R:um a b W: - 9 do merge with ancestor in a
183 --------------
159 --------------
184 resolving manifests
160 resolving manifests
185 overwrite None branchmerge True partial False
161 overwrite None partial False
186 ancestor ec03c2ca8642 local 79cc6877a3b7 remote 924404dff337
162 ancestor 924404dff337 local ec03c2ca8642+ remote 79cc6877a3b7
187 b: versions differ -> m
163 b: versions differ -> m
188 rev: versions differ -> m
164 rev: versions differ -> m
189 merging b
165 merging b
190 resolving b
166 my b@ec03c2ca8642+ other b@79cc6877a3b7 ancestor a@924404dff337
191 my b@ec03c2ca8642 other b@79cc6877a3b7 ancestor a@924404dff337
192 merging rev
167 merging rev
193 resolving rev
168 my rev@ec03c2ca8642+ other rev@79cc6877a3b7 ancestor rev@924404dff337
194 my rev@ec03c2ca8642 other rev@79cc6877a3b7 ancestor rev@924404dff337
195 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
169 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
196 (branch merge, don't forget to commit)
170 (branch merge, don't forget to commit)
197 --------------
171 --------------
@@ -202,14 +176,13 b' M b'
202 test L:nm a b R:nm a c W: - 11 get c, keep b
176 test L:nm a b R:nm a c W: - 11 get c, keep b
203 --------------
177 --------------
204 resolving manifests
178 resolving manifests
205 overwrite None branchmerge True partial False
179 overwrite None partial False
206 ancestor ecf3cb2a4219 local e6abcc1a30c2 remote 924404dff337
180 ancestor 924404dff337 local ecf3cb2a4219+ remote e6abcc1a30c2
207 rev: versions differ -> m
181 rev: versions differ -> m
208 c: remote created -> g
182 c: remote created -> g
209 getting c
183 getting c
210 merging rev
184 merging rev
211 resolving rev
185 my rev@ecf3cb2a4219+ other rev@e6abcc1a30c2 ancestor rev@924404dff337
212 my rev@ecf3cb2a4219 other rev@e6abcc1a30c2 ancestor rev@924404dff337
213 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
186 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
214 (branch merge, don't forget to commit)
187 (branch merge, don't forget to commit)
215 --------------
188 --------------
@@ -221,16 +194,14 b' C b'
221 test L:nc a b R:up b W: - 12 merge b no ancestor
194 test L:nc a b R:up b W: - 12 merge b no ancestor
222 --------------
195 --------------
223 resolving manifests
196 resolving manifests
224 overwrite None branchmerge True partial False
197 overwrite None partial False
225 ancestor ac809aeed39a local af30c7647fc7 remote 924404dff337
198 ancestor 924404dff337 local ac809aeed39a+ remote af30c7647fc7
226 b: versions differ -> m
199 b: versions differ -> m
227 rev: versions differ -> m
200 rev: versions differ -> m
228 merging b
201 merging b
229 resolving b
202 my b@ac809aeed39a+ other b@af30c7647fc7 ancestor b@000000000000
230 my b@ac809aeed39a other b@af30c7647fc7 ancestor b@000000000000
231 merging rev
203 merging rev
232 resolving rev
204 my rev@ac809aeed39a+ other rev@af30c7647fc7 ancestor rev@924404dff337
233 my rev@ac809aeed39a other rev@af30c7647fc7 ancestor rev@924404dff337
234 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
205 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
235 (branch merge, don't forget to commit)
206 (branch merge, don't forget to commit)
236 --------------
207 --------------
@@ -242,18 +213,16 b' C a'
242 test L:up b R:nm a b W: - 13 merge b no ancestor
213 test L:up b R:nm a b W: - 13 merge b no ancestor
243 --------------
214 --------------
244 resolving manifests
215 resolving manifests
245 overwrite None branchmerge True partial False
216 overwrite None partial False
246 ancestor 59318016310c local e03727d2d66b remote 924404dff337
217 ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
247 a: other deleted -> r
218 a: other deleted -> r
248 b: versions differ -> m
219 b: versions differ -> m
249 rev: versions differ -> m
220 rev: versions differ -> m
250 removing a
221 removing a
251 merging b
222 merging b
252 resolving b
223 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
253 my b@59318016310c other b@e03727d2d66b ancestor b@000000000000
254 merging rev
224 merging rev
255 resolving rev
225 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
256 my rev@59318016310c other rev@e03727d2d66b ancestor rev@924404dff337
257 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
226 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
258 (branch merge, don't forget to commit)
227 (branch merge, don't forget to commit)
259 --------------
228 --------------
@@ -264,18 +233,16 b' M b'
264 test L:nc a b R:up a b W: - 14 merge b no ancestor
233 test L:nc a b R:up a b W: - 14 merge b no ancestor
265 --------------
234 --------------
266 resolving manifests
235 resolving manifests
267 overwrite None branchmerge True partial False
236 overwrite None partial False
268 ancestor ac809aeed39a local 8dbce441892a remote 924404dff337
237 ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
269 a: remote is newer -> g
238 a: remote is newer -> g
270 b: versions differ -> m
239 b: versions differ -> m
271 rev: versions differ -> m
240 rev: versions differ -> m
272 getting a
241 getting a
273 merging b
242 merging b
274 resolving b
243 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
275 my b@ac809aeed39a other b@8dbce441892a ancestor b@000000000000
276 merging rev
244 merging rev
277 resolving rev
245 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
278 my rev@ac809aeed39a other rev@8dbce441892a ancestor rev@924404dff337
279 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
246 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
280 (branch merge, don't forget to commit)
247 (branch merge, don't forget to commit)
281 --------------
248 --------------
@@ -287,18 +254,16 b' M b'
287 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
254 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
288 --------------
255 --------------
289 resolving manifests
256 resolving manifests
290 overwrite None branchmerge True partial False
257 overwrite None partial False
291 ancestor 59318016310c local e03727d2d66b remote 924404dff337
258 ancestor 924404dff337 local 59318016310c+ remote e03727d2d66b
292 a: other deleted -> r
259 a: other deleted -> r
293 b: versions differ -> m
260 b: versions differ -> m
294 rev: versions differ -> m
261 rev: versions differ -> m
295 removing a
262 removing a
296 merging b
263 merging b
297 resolving b
264 my b@59318016310c+ other b@e03727d2d66b ancestor b@000000000000
298 my b@59318016310c other b@e03727d2d66b ancestor b@000000000000
299 merging rev
265 merging rev
300 resolving rev
266 my rev@59318016310c+ other rev@e03727d2d66b ancestor rev@924404dff337
301 my rev@59318016310c other rev@e03727d2d66b ancestor rev@924404dff337
302 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
267 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
303 (branch merge, don't forget to commit)
268 (branch merge, don't forget to commit)
304 --------------
269 --------------
@@ -309,18 +274,16 b' M b'
309 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
274 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
310 --------------
275 --------------
311 resolving manifests
276 resolving manifests
312 overwrite None branchmerge True partial False
277 overwrite None partial False
313 ancestor ac809aeed39a local 8dbce441892a remote 924404dff337
278 ancestor 924404dff337 local ac809aeed39a+ remote 8dbce441892a
314 a: remote is newer -> g
279 a: remote is newer -> g
315 b: versions differ -> m
280 b: versions differ -> m
316 rev: versions differ -> m
281 rev: versions differ -> m
317 getting a
282 getting a
318 merging b
283 merging b
319 resolving b
284 my b@ac809aeed39a+ other b@8dbce441892a ancestor b@000000000000
320 my b@ac809aeed39a other b@8dbce441892a ancestor b@000000000000
321 merging rev
285 merging rev
322 resolving rev
286 my rev@ac809aeed39a+ other rev@8dbce441892a ancestor rev@924404dff337
323 my rev@ac809aeed39a other rev@8dbce441892a ancestor rev@924404dff337
324 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
287 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
325 (branch merge, don't forget to commit)
288 (branch merge, don't forget to commit)
326 --------------
289 --------------
@@ -332,16 +295,14 b' M b'
332 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
295 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
333 --------------
296 --------------
334 resolving manifests
297 resolving manifests
335 overwrite None branchmerge True partial False
298 overwrite None partial False
336 ancestor 0b76e65c8289 local 735846fee2d7 remote 924404dff337
299 ancestor 924404dff337 local 0b76e65c8289+ remote 735846fee2d7
337 b: versions differ -> m
300 b: versions differ -> m
338 rev: versions differ -> m
301 rev: versions differ -> m
339 merging b
302 merging b
340 resolving b
303 my b@0b76e65c8289+ other b@735846fee2d7 ancestor b@000000000000
341 my b@0b76e65c8289 other b@735846fee2d7 ancestor b@000000000000
342 merging rev
304 merging rev
343 resolving rev
305 my rev@0b76e65c8289+ other rev@735846fee2d7 ancestor rev@924404dff337
344 my rev@0b76e65c8289 other rev@735846fee2d7 ancestor rev@924404dff337
345 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
306 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
346 (branch merge, don't forget to commit)
307 (branch merge, don't forget to commit)
347 --------------
308 --------------
@@ -353,18 +314,16 b' C a'
353 test L:nm a b R:up a b W: - 18 merge b no ancestor
314 test L:nm a b R:up a b W: - 18 merge b no ancestor
354 --------------
315 --------------
355 resolving manifests
316 resolving manifests
356 overwrite None branchmerge True partial False
317 overwrite None partial False
357 ancestor ecf3cb2a4219 local 8dbce441892a remote 924404dff337
318 ancestor 924404dff337 local ecf3cb2a4219+ remote 8dbce441892a
358 b: versions differ -> m
319 b: versions differ -> m
359 rev: versions differ -> m
320 rev: versions differ -> m
360 a: prompt recreating -> g
321 a: prompt recreating -> g
361 getting a
322 getting a
362 merging b
323 merging b
363 resolving b
324 my b@ecf3cb2a4219+ other b@8dbce441892a ancestor b@000000000000
364 my b@ecf3cb2a4219 other b@8dbce441892a ancestor b@000000000000
365 merging rev
325 merging rev
366 resolving rev
326 my rev@ecf3cb2a4219+ other rev@8dbce441892a ancestor rev@924404dff337
367 my rev@ecf3cb2a4219 other rev@8dbce441892a ancestor rev@924404dff337
368 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
327 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
369 (branch merge, don't forget to commit)
328 (branch merge, don't forget to commit)
370 --------------
329 --------------
@@ -376,16 +335,14 b' M b'
376 test L:up a b R:nm a b W: - 19 merge b no ancestor, prompt remove a
335 test L:up a b R:nm a b W: - 19 merge b no ancestor, prompt remove a
377 --------------
336 --------------
378 resolving manifests
337 resolving manifests
379 overwrite None branchmerge True partial False
338 overwrite None partial False
380 ancestor 0b76e65c8289 local e03727d2d66b remote 924404dff337
339 ancestor 924404dff337 local 0b76e65c8289+ remote e03727d2d66b
381 b: versions differ -> m
340 b: versions differ -> m
382 rev: versions differ -> m
341 rev: versions differ -> m
383 merging b
342 merging b
384 resolving b
343 my b@0b76e65c8289+ other b@e03727d2d66b ancestor b@000000000000
385 my b@0b76e65c8289 other b@e03727d2d66b ancestor b@000000000000
386 merging rev
344 merging rev
387 resolving rev
345 my rev@0b76e65c8289+ other rev@e03727d2d66b ancestor rev@924404dff337
388 my rev@0b76e65c8289 other rev@e03727d2d66b ancestor rev@924404dff337
389 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
346 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
390 (branch merge, don't forget to commit)
347 (branch merge, don't forget to commit)
391 --------------
348 --------------
@@ -397,18 +354,16 b' C a'
397 test L:up a R:um a b W: - 20 merge a and b to b, remove a
354 test L:up a R:um a b W: - 20 merge a and b to b, remove a
398 --------------
355 --------------
399 resolving manifests
356 resolving manifests
400 overwrite None branchmerge True partial False
357 overwrite None partial False
401 ancestor e300d1c794ec local 79cc6877a3b7 remote 924404dff337
358 ancestor 924404dff337 local e300d1c794ec+ remote 79cc6877a3b7
402 a: remote moved -> c
359 a: remote moved -> m
403 rev: versions differ -> m
360 rev: versions differ -> m
404 merging a and b to b
361 merging a and b
405 resolving a
362 my a@e300d1c794ec+ other b@79cc6877a3b7 ancestor a@924404dff337
406 my a@e300d1c794ec other b@79cc6877a3b7 ancestor a@924404dff337
407 copying a to b
363 copying a to b
408 removing a
364 removing a
409 merging rev
365 merging rev
410 resolving rev
366 my rev@e300d1c794ec+ other rev@79cc6877a3b7 ancestor rev@924404dff337
411 my rev@e300d1c794ec other rev@79cc6877a3b7 ancestor rev@924404dff337
412 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
367 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
413 (branch merge, don't forget to commit)
368 (branch merge, don't forget to commit)
414 --------------
369 --------------
@@ -420,16 +375,14 b' M b'
420 test L:um a b R:up a W: - 21 merge a and b to b
375 test L:um a b R:up a W: - 21 merge a and b to b
421 --------------
376 --------------
422 resolving manifests
377 resolving manifests
423 overwrite None branchmerge True partial False
378 overwrite None partial False
424 ancestor ec03c2ca8642 local f4db7e329e71 remote 924404dff337
379 ancestor 924404dff337 local ec03c2ca8642+ remote f4db7e329e71
425 b: local moved -> c
380 b: local moved -> m
426 rev: versions differ -> m
381 rev: versions differ -> m
427 merging b and a to b
382 merging b and a
428 resolving b
383 my b@ec03c2ca8642+ other a@f4db7e329e71 ancestor a@924404dff337
429 my b@ec03c2ca8642 other a@f4db7e329e71 ancestor a@924404dff337
430 merging rev
384 merging rev
431 resolving rev
385 my rev@ec03c2ca8642+ other rev@f4db7e329e71 ancestor rev@924404dff337
432 my rev@ec03c2ca8642 other rev@f4db7e329e71 ancestor rev@924404dff337
433 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
386 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
434 (branch merge, don't forget to commit)
387 (branch merge, don't forget to commit)
435 --------------
388 --------------
@@ -441,18 +394,16 b' M b'
441 test L:nm a b R:up a c W: - 23 get c, keep b
394 test L:nm a b R:up a c W: - 23 get c, keep b
442 --------------
395 --------------
443 resolving manifests
396 resolving manifests
444 overwrite None branchmerge True partial False
397 overwrite None partial False
445 ancestor ecf3cb2a4219 local 2b958612230f remote 924404dff337
398 ancestor 924404dff337 local ecf3cb2a4219+ remote 2b958612230f
446 b: local moved -> c
399 b: local moved -> m
447 rev: versions differ -> m
400 rev: versions differ -> m
448 c: remote created -> g
401 c: remote created -> g
449 merging b and a to b
402 merging b and a
450 resolving b
403 my b@ecf3cb2a4219+ other a@2b958612230f ancestor a@924404dff337
451 my b@ecf3cb2a4219 other a@2b958612230f ancestor a@924404dff337
452 getting c
404 getting c
453 merging rev
405 merging rev
454 resolving rev
406 my rev@ecf3cb2a4219+ other rev@2b958612230f ancestor rev@924404dff337
455 my rev@ecf3cb2a4219 other rev@2b958612230f ancestor rev@924404dff337
456 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
407 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
457 (branch merge, don't forget to commit)
408 (branch merge, don't forget to commit)
458 --------------
409 --------------
@@ -15,13 +15,12 b' date: Mon Jan 12 13:46:40 1970 +0'
15 summary: 1
15 summary: 1
16
16
17 resolving manifests
17 resolving manifests
18 overwrite False branchmerge False partial False
18 overwrite False partial False
19 ancestor 33aaa84a386b local 802f095af299 remote 33aaa84a386b
19 ancestor 33aaa84a386b local 33aaa84a386b+ remote 802f095af299
20 a: versions differ -> m
20 a: versions differ -> m
21 b: remote created -> g
21 b: remote created -> g
22 merging a
22 merging a
23 resolving a
23 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
24 my a@33aaa84a386b other a@802f095af299 ancestor a@33aaa84a386b
25 getting b
24 getting b
26 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
25 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
27 changeset: 1:802f095af299
26 changeset: 1:802f095af299
@@ -31,8 +30,8 b' date: Mon Jan 12 13:46:40 1970 +0'
31 summary: 2
30 summary: 2
32
31
33 resolving manifests
32 resolving manifests
34 overwrite False branchmerge False partial False
33 overwrite False partial False
35 ancestor 802f095af299 local 33aaa84a386b remote 33aaa84a386b
34 ancestor 33aaa84a386b local 802f095af299+ remote 33aaa84a386b
36 b: remote deleted -> r
35 b: remote deleted -> r
37 removing b
36 removing b
38 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
37 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
@@ -49,13 +48,12 b' date: Mon Jan 12 13:46:40 1970 +0'
49 summary: 1
48 summary: 1
50
49
51 resolving manifests
50 resolving manifests
52 overwrite False branchmerge False partial False
51 overwrite False partial False
53 ancestor 33aaa84a386b local 802f095af299 remote 33aaa84a386b
52 ancestor 33aaa84a386b local 33aaa84a386b+ remote 802f095af299
54 a: versions differ -> m
53 a: versions differ -> m
55 b: remote created -> g
54 b: remote created -> g
56 merging a
55 merging a
57 resolving a
56 my a@33aaa84a386b+ other a@802f095af299 ancestor a@33aaa84a386b
58 my a@33aaa84a386b other a@802f095af299 ancestor a@33aaa84a386b
59 getting b
57 getting b
60 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
61 changeset: 1:802f095af299
59 changeset: 1:802f095af299
@@ -100,16 +98,14 b' failed'
100 abort: outstanding uncommitted changes
98 abort: outstanding uncommitted changes
101 failed
99 failed
102 resolving manifests
100 resolving manifests
103 overwrite False branchmerge True partial False
101 overwrite False partial False
104 ancestor 802f095af299 local 030602aee63d remote 33aaa84a386b
102 ancestor 33aaa84a386b local 802f095af299+ remote 030602aee63d
105 a: versions differ -> m
103 a: versions differ -> m
106 b: versions differ -> m
104 b: versions differ -> m
107 merging a
105 merging a
108 resolving a
106 my a@802f095af299+ other a@030602aee63d ancestor a@33aaa84a386b
109 my a@802f095af299 other a@030602aee63d ancestor a@33aaa84a386b
110 merging b
107 merging b
111 resolving b
108 my b@802f095af299+ other b@030602aee63d ancestor b@000000000000
112 my b@802f095af299 other b@030602aee63d ancestor b@000000000000
113 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
109 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
114 (branch merge, don't forget to commit)
110 (branch merge, don't forget to commit)
115 changeset: 1:802f095af299
111 changeset: 1:802f095af299
@@ -137,5 +133,4 b' adding changesets'
137 adding manifests
133 adding manifests
138 adding file changes
134 adding file changes
139 added 1 changesets with 1 changes to 1 files
135 added 1 changesets with 1 changes to 1 files
140 merging a
141 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
136 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
@@ -40,8 +40,8 b' a'
40 side1
40 side1
41 side2
41 side2
42 resolving manifests
42 resolving manifests
43 overwrite True branchmerge False partial False
43 overwrite True partial False
44 ancestor ded32b0db104 local 221226fb2bd8 remote 537353581d3d
44 ancestor 537353581d3d local ded32b0db104+ remote 221226fb2bd8
45 side2: remote deleted -> r
45 side2: remote deleted -> r
46 side1: remote deleted -> r
46 side1: remote deleted -> r
47 main: remote created -> g
47 main: remote created -> g
General Comments 0
You need to be logged in to leave comments. Login now