##// END OF EJS Templates
filemerge: default change/delete conflicts to 'leave unresolved' (BC)...
Siddharth Agarwal -
r27599:ad5966de default
parent child Browse files
Show More
@@ -1,686 +1,686 b''
1 # filemerge.py - file-level merge handling for Mercurial
1 # filemerge.py - file-level merge handling for Mercurial
2 #
2 #
3 # Copyright 2006, 2007, 2008 Matt Mackall <mpm@selenic.com>
3 # Copyright 2006, 2007, 2008 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
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.
6 # GNU General Public License version 2 or any later version.
7
7
8 from __future__ import absolute_import
8 from __future__ import absolute_import
9
9
10 import filecmp
10 import filecmp
11 import os
11 import os
12 import re
12 import re
13 import tempfile
13 import tempfile
14
14
15 from .i18n import _
15 from .i18n import _
16 from .node import nullid, short
16 from .node import nullid, short
17
17
18 from . import (
18 from . import (
19 cmdutil,
19 cmdutil,
20 error,
20 error,
21 match,
21 match,
22 simplemerge,
22 simplemerge,
23 tagmerge,
23 tagmerge,
24 templatekw,
24 templatekw,
25 templater,
25 templater,
26 util,
26 util,
27 )
27 )
28
28
29 def _toolstr(ui, tool, part, default=""):
29 def _toolstr(ui, tool, part, default=""):
30 return ui.config("merge-tools", tool + "." + part, default)
30 return ui.config("merge-tools", tool + "." + part, default)
31
31
32 def _toolbool(ui, tool, part, default=False):
32 def _toolbool(ui, tool, part, default=False):
33 return ui.configbool("merge-tools", tool + "." + part, default)
33 return ui.configbool("merge-tools", tool + "." + part, default)
34
34
35 def _toollist(ui, tool, part, default=[]):
35 def _toollist(ui, tool, part, default=[]):
36 return ui.configlist("merge-tools", tool + "." + part, default)
36 return ui.configlist("merge-tools", tool + "." + part, default)
37
37
38 internals = {}
38 internals = {}
39 # Merge tools to document.
39 # Merge tools to document.
40 internalsdoc = {}
40 internalsdoc = {}
41
41
42 # internal tool merge types
42 # internal tool merge types
43 nomerge = None
43 nomerge = None
44 mergeonly = 'mergeonly' # just the full merge, no premerge
44 mergeonly = 'mergeonly' # just the full merge, no premerge
45 fullmerge = 'fullmerge' # both premerge and merge
45 fullmerge = 'fullmerge' # both premerge and merge
46
46
47 class absentfilectx(object):
47 class absentfilectx(object):
48 """Represents a file that's ostensibly in a context but is actually not
48 """Represents a file that's ostensibly in a context but is actually not
49 present in it.
49 present in it.
50
50
51 This is here because it's very specific to the filemerge code for now --
51 This is here because it's very specific to the filemerge code for now --
52 other code is likely going to break with the values this returns."""
52 other code is likely going to break with the values this returns."""
53 def __init__(self, ctx, f):
53 def __init__(self, ctx, f):
54 self._ctx = ctx
54 self._ctx = ctx
55 self._f = f
55 self._f = f
56
56
57 def path(self):
57 def path(self):
58 return self._f
58 return self._f
59
59
60 def size(self):
60 def size(self):
61 return None
61 return None
62
62
63 def data(self):
63 def data(self):
64 return None
64 return None
65
65
66 def filenode(self):
66 def filenode(self):
67 return nullid
67 return nullid
68
68
69 _customcmp = True
69 _customcmp = True
70 def cmp(self, fctx):
70 def cmp(self, fctx):
71 """compare with other file context
71 """compare with other file context
72
72
73 returns True if different from fctx.
73 returns True if different from fctx.
74 """
74 """
75 return not (fctx.isabsent() and
75 return not (fctx.isabsent() and
76 fctx.ctx() == self.ctx() and
76 fctx.ctx() == self.ctx() and
77 fctx.path() == self.path())
77 fctx.path() == self.path())
78
78
79 def flags(self):
79 def flags(self):
80 return ''
80 return ''
81
81
82 def changectx(self):
82 def changectx(self):
83 return self._ctx
83 return self._ctx
84
84
85 def isbinary(self):
85 def isbinary(self):
86 return False
86 return False
87
87
88 def isabsent(self):
88 def isabsent(self):
89 return True
89 return True
90
90
91 def internaltool(name, mergetype, onfailure=None, precheck=None):
91 def internaltool(name, mergetype, onfailure=None, precheck=None):
92 '''return a decorator for populating internal merge tool table'''
92 '''return a decorator for populating internal merge tool table'''
93 def decorator(func):
93 def decorator(func):
94 fullname = ':' + name
94 fullname = ':' + name
95 func.__doc__ = "``%s``\n" % fullname + func.__doc__.strip()
95 func.__doc__ = "``%s``\n" % fullname + func.__doc__.strip()
96 internals[fullname] = func
96 internals[fullname] = func
97 internals['internal:' + name] = func
97 internals['internal:' + name] = func
98 internalsdoc[fullname] = func
98 internalsdoc[fullname] = func
99 func.mergetype = mergetype
99 func.mergetype = mergetype
100 func.onfailure = onfailure
100 func.onfailure = onfailure
101 func.precheck = precheck
101 func.precheck = precheck
102 return func
102 return func
103 return decorator
103 return decorator
104
104
105 def _findtool(ui, tool):
105 def _findtool(ui, tool):
106 if tool in internals:
106 if tool in internals:
107 return tool
107 return tool
108 return findexternaltool(ui, tool)
108 return findexternaltool(ui, tool)
109
109
110 def findexternaltool(ui, tool):
110 def findexternaltool(ui, tool):
111 for kn in ("regkey", "regkeyalt"):
111 for kn in ("regkey", "regkeyalt"):
112 k = _toolstr(ui, tool, kn)
112 k = _toolstr(ui, tool, kn)
113 if not k:
113 if not k:
114 continue
114 continue
115 p = util.lookupreg(k, _toolstr(ui, tool, "regname"))
115 p = util.lookupreg(k, _toolstr(ui, tool, "regname"))
116 if p:
116 if p:
117 p = util.findexe(p + _toolstr(ui, tool, "regappend"))
117 p = util.findexe(p + _toolstr(ui, tool, "regappend"))
118 if p:
118 if p:
119 return p
119 return p
120 exe = _toolstr(ui, tool, "executable", tool)
120 exe = _toolstr(ui, tool, "executable", tool)
121 return util.findexe(util.expandpath(exe))
121 return util.findexe(util.expandpath(exe))
122
122
123 def _picktool(repo, ui, path, binary, symlink, changedelete):
123 def _picktool(repo, ui, path, binary, symlink, changedelete):
124 def supportscd(tool):
124 def supportscd(tool):
125 return tool in internals and internals[tool].mergetype == nomerge
125 return tool in internals and internals[tool].mergetype == nomerge
126
126
127 def check(tool, pat, symlink, binary, changedelete):
127 def check(tool, pat, symlink, binary, changedelete):
128 tmsg = tool
128 tmsg = tool
129 if pat:
129 if pat:
130 tmsg += " specified for " + pat
130 tmsg += " specified for " + pat
131 if not _findtool(ui, tool):
131 if not _findtool(ui, tool):
132 if pat: # explicitly requested tool deserves a warning
132 if pat: # explicitly requested tool deserves a warning
133 ui.warn(_("couldn't find merge tool %s\n") % tmsg)
133 ui.warn(_("couldn't find merge tool %s\n") % tmsg)
134 else: # configured but non-existing tools are more silent
134 else: # configured but non-existing tools are more silent
135 ui.note(_("couldn't find merge tool %s\n") % tmsg)
135 ui.note(_("couldn't find merge tool %s\n") % tmsg)
136 elif symlink and not _toolbool(ui, tool, "symlink"):
136 elif symlink and not _toolbool(ui, tool, "symlink"):
137 ui.warn(_("tool %s can't handle symlinks\n") % tmsg)
137 ui.warn(_("tool %s can't handle symlinks\n") % tmsg)
138 elif binary and not _toolbool(ui, tool, "binary"):
138 elif binary and not _toolbool(ui, tool, "binary"):
139 ui.warn(_("tool %s can't handle binary\n") % tmsg)
139 ui.warn(_("tool %s can't handle binary\n") % tmsg)
140 elif changedelete and not supportscd(tool):
140 elif changedelete and not supportscd(tool):
141 # the nomerge tools are the only tools that support change/delete
141 # the nomerge tools are the only tools that support change/delete
142 # conflicts
142 # conflicts
143 pass
143 pass
144 elif not util.gui() and _toolbool(ui, tool, "gui"):
144 elif not util.gui() and _toolbool(ui, tool, "gui"):
145 ui.warn(_("tool %s requires a GUI\n") % tmsg)
145 ui.warn(_("tool %s requires a GUI\n") % tmsg)
146 else:
146 else:
147 return True
147 return True
148 return False
148 return False
149
149
150 # internal config: ui.forcemerge
150 # internal config: ui.forcemerge
151 # forcemerge comes from command line arguments, highest priority
151 # forcemerge comes from command line arguments, highest priority
152 force = ui.config('ui', 'forcemerge')
152 force = ui.config('ui', 'forcemerge')
153 if force:
153 if force:
154 toolpath = _findtool(ui, force)
154 toolpath = _findtool(ui, force)
155 if changedelete and not supportscd(toolpath):
155 if changedelete and not supportscd(toolpath):
156 return ":prompt", None
156 return ":prompt", None
157 else:
157 else:
158 if toolpath:
158 if toolpath:
159 return (force, util.shellquote(toolpath))
159 return (force, util.shellquote(toolpath))
160 else:
160 else:
161 # mimic HGMERGE if given tool not found
161 # mimic HGMERGE if given tool not found
162 return (force, force)
162 return (force, force)
163
163
164 # HGMERGE takes next precedence
164 # HGMERGE takes next precedence
165 hgmerge = os.environ.get("HGMERGE")
165 hgmerge = os.environ.get("HGMERGE")
166 if hgmerge:
166 if hgmerge:
167 if changedelete and not supportscd(hgmerge):
167 if changedelete and not supportscd(hgmerge):
168 return ":prompt", None
168 return ":prompt", None
169 else:
169 else:
170 return (hgmerge, hgmerge)
170 return (hgmerge, hgmerge)
171
171
172 # then patterns
172 # then patterns
173 for pat, tool in ui.configitems("merge-patterns"):
173 for pat, tool in ui.configitems("merge-patterns"):
174 mf = match.match(repo.root, '', [pat])
174 mf = match.match(repo.root, '', [pat])
175 if mf(path) and check(tool, pat, symlink, False, changedelete):
175 if mf(path) and check(tool, pat, symlink, False, changedelete):
176 toolpath = _findtool(ui, tool)
176 toolpath = _findtool(ui, tool)
177 return (tool, util.shellquote(toolpath))
177 return (tool, util.shellquote(toolpath))
178
178
179 # then merge tools
179 # then merge tools
180 tools = {}
180 tools = {}
181 disabled = set()
181 disabled = set()
182 for k, v in ui.configitems("merge-tools"):
182 for k, v in ui.configitems("merge-tools"):
183 t = k.split('.')[0]
183 t = k.split('.')[0]
184 if t not in tools:
184 if t not in tools:
185 tools[t] = int(_toolstr(ui, t, "priority", "0"))
185 tools[t] = int(_toolstr(ui, t, "priority", "0"))
186 if _toolbool(ui, t, "disabled", False):
186 if _toolbool(ui, t, "disabled", False):
187 disabled.add(t)
187 disabled.add(t)
188 names = tools.keys()
188 names = tools.keys()
189 tools = sorted([(-p, t) for t, p in tools.items() if t not in disabled])
189 tools = sorted([(-p, t) for t, p in tools.items() if t not in disabled])
190 uimerge = ui.config("ui", "merge")
190 uimerge = ui.config("ui", "merge")
191 if uimerge:
191 if uimerge:
192 # external tools defined in uimerge won't be able to handle
192 # external tools defined in uimerge won't be able to handle
193 # change/delete conflicts
193 # change/delete conflicts
194 if uimerge not in names and not changedelete:
194 if uimerge not in names and not changedelete:
195 return (uimerge, uimerge)
195 return (uimerge, uimerge)
196 tools.insert(0, (None, uimerge)) # highest priority
196 tools.insert(0, (None, uimerge)) # highest priority
197 tools.append((None, "hgmerge")) # the old default, if found
197 tools.append((None, "hgmerge")) # the old default, if found
198 for p, t in tools:
198 for p, t in tools:
199 if check(t, None, symlink, binary, changedelete):
199 if check(t, None, symlink, binary, changedelete):
200 toolpath = _findtool(ui, t)
200 toolpath = _findtool(ui, t)
201 return (t, util.shellquote(toolpath))
201 return (t, util.shellquote(toolpath))
202
202
203 # internal merge or prompt as last resort
203 # internal merge or prompt as last resort
204 if symlink or binary or changedelete:
204 if symlink or binary or changedelete:
205 return ":prompt", None
205 return ":prompt", None
206 return ":merge", None
206 return ":merge", None
207
207
208 def _eoltype(data):
208 def _eoltype(data):
209 "Guess the EOL type of a file"
209 "Guess the EOL type of a file"
210 if '\0' in data: # binary
210 if '\0' in data: # binary
211 return None
211 return None
212 if '\r\n' in data: # Windows
212 if '\r\n' in data: # Windows
213 return '\r\n'
213 return '\r\n'
214 if '\r' in data: # Old Mac
214 if '\r' in data: # Old Mac
215 return '\r'
215 return '\r'
216 if '\n' in data: # UNIX
216 if '\n' in data: # UNIX
217 return '\n'
217 return '\n'
218 return None # unknown
218 return None # unknown
219
219
220 def _matcheol(file, origfile):
220 def _matcheol(file, origfile):
221 "Convert EOL markers in a file to match origfile"
221 "Convert EOL markers in a file to match origfile"
222 tostyle = _eoltype(util.readfile(origfile))
222 tostyle = _eoltype(util.readfile(origfile))
223 if tostyle:
223 if tostyle:
224 data = util.readfile(file)
224 data = util.readfile(file)
225 style = _eoltype(data)
225 style = _eoltype(data)
226 if style:
226 if style:
227 newdata = data.replace(style, tostyle)
227 newdata = data.replace(style, tostyle)
228 if newdata != data:
228 if newdata != data:
229 util.writefile(file, newdata)
229 util.writefile(file, newdata)
230
230
231 @internaltool('prompt', nomerge)
231 @internaltool('prompt', nomerge)
232 def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf):
232 def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf):
233 """Asks the user which of the local or the other version to keep as
233 """Asks the user which of the local or the other version to keep as
234 the merged version."""
234 the merged version."""
235 ui = repo.ui
235 ui = repo.ui
236 fd = fcd.path()
236 fd = fcd.path()
237
237
238 try:
238 try:
239 if fco.isabsent():
239 if fco.isabsent():
240 index = ui.promptchoice(
240 index = ui.promptchoice(
241 _("local changed %s which remote deleted\n"
241 _("local changed %s which remote deleted\n"
242 "use (c)hanged version, (d)elete, or leave (u)nresolved?"
242 "use (c)hanged version, (d)elete, or leave (u)nresolved?"
243 "$$ &Changed $$ &Delete $$ &Unresolved") % fd, 0)
243 "$$ &Changed $$ &Delete $$ &Unresolved") % fd, 2)
244 choice = ['local', 'other', 'unresolved'][index]
244 choice = ['local', 'other', 'unresolved'][index]
245 elif fcd.isabsent():
245 elif fcd.isabsent():
246 index = ui.promptchoice(
246 index = ui.promptchoice(
247 _("remote changed %s which local deleted\n"
247 _("remote changed %s which local deleted\n"
248 "use (c)hanged version, leave (d)eleted, or "
248 "use (c)hanged version, leave (d)eleted, or "
249 "leave (u)nresolved?"
249 "leave (u)nresolved?"
250 "$$ &Changed $$ &Deleted $$ &Unresolved") % fd, 0)
250 "$$ &Changed $$ &Deleted $$ &Unresolved") % fd, 2)
251 choice = ['other', 'local', 'unresolved'][index]
251 choice = ['other', 'local', 'unresolved'][index]
252 else:
252 else:
253 index = ui.promptchoice(
253 index = ui.promptchoice(
254 _("no tool found to merge %s\n"
254 _("no tool found to merge %s\n"
255 "keep (l)ocal, take (o)ther, or leave (u)nresolved?"
255 "keep (l)ocal, take (o)ther, or leave (u)nresolved?"
256 "$$ &Local $$ &Other $$ &Unresolved") % fd, 2)
256 "$$ &Local $$ &Other $$ &Unresolved") % fd, 2)
257 choice = ['local', 'other', 'unresolved'][index]
257 choice = ['local', 'other', 'unresolved'][index]
258
258
259 if choice == 'other':
259 if choice == 'other':
260 return _iother(repo, mynode, orig, fcd, fco, fca, toolconf)
260 return _iother(repo, mynode, orig, fcd, fco, fca, toolconf)
261 elif choice == 'local':
261 elif choice == 'local':
262 return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf)
262 return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf)
263 elif choice == 'unresolved':
263 elif choice == 'unresolved':
264 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf)
264 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf)
265 except error.ResponseExpected:
265 except error.ResponseExpected:
266 ui.write("\n")
266 ui.write("\n")
267 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf)
267 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf)
268
268
269 @internaltool('local', nomerge)
269 @internaltool('local', nomerge)
270 def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf):
270 def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf):
271 """Uses the local version of files as the merged version."""
271 """Uses the local version of files as the merged version."""
272 return 0, fcd.isabsent()
272 return 0, fcd.isabsent()
273
273
274 @internaltool('other', nomerge)
274 @internaltool('other', nomerge)
275 def _iother(repo, mynode, orig, fcd, fco, fca, toolconf):
275 def _iother(repo, mynode, orig, fcd, fco, fca, toolconf):
276 """Uses the other version of files as the merged version."""
276 """Uses the other version of files as the merged version."""
277 if fco.isabsent():
277 if fco.isabsent():
278 # local changed, remote deleted -- 'deleted' picked
278 # local changed, remote deleted -- 'deleted' picked
279 repo.wvfs.unlinkpath(fcd.path())
279 repo.wvfs.unlinkpath(fcd.path())
280 deleted = True
280 deleted = True
281 else:
281 else:
282 repo.wwrite(fcd.path(), fco.data(), fco.flags())
282 repo.wwrite(fcd.path(), fco.data(), fco.flags())
283 deleted = False
283 deleted = False
284 return 0, deleted
284 return 0, deleted
285
285
286 @internaltool('fail', nomerge)
286 @internaltool('fail', nomerge)
287 def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf):
287 def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf):
288 """
288 """
289 Rather than attempting to merge files that were modified on both
289 Rather than attempting to merge files that were modified on both
290 branches, it marks them as unresolved. The resolve command must be
290 branches, it marks them as unresolved. The resolve command must be
291 used to resolve these conflicts."""
291 used to resolve these conflicts."""
292 # for change/delete conflicts write out the changed version, then fail
292 # for change/delete conflicts write out the changed version, then fail
293 if fcd.isabsent():
293 if fcd.isabsent():
294 repo.wwrite(fcd.path(), fco.data(), fco.flags())
294 repo.wwrite(fcd.path(), fco.data(), fco.flags())
295 return 1, False
295 return 1, False
296
296
297 def _premerge(repo, fcd, fco, fca, toolconf, files, labels=None):
297 def _premerge(repo, fcd, fco, fca, toolconf, files, labels=None):
298 tool, toolpath, binary, symlink = toolconf
298 tool, toolpath, binary, symlink = toolconf
299 if symlink or fcd.isabsent() or fco.isabsent():
299 if symlink or fcd.isabsent() or fco.isabsent():
300 return 1
300 return 1
301 a, b, c, back = files
301 a, b, c, back = files
302
302
303 ui = repo.ui
303 ui = repo.ui
304
304
305 validkeep = ['keep', 'keep-merge3']
305 validkeep = ['keep', 'keep-merge3']
306
306
307 # do we attempt to simplemerge first?
307 # do we attempt to simplemerge first?
308 try:
308 try:
309 premerge = _toolbool(ui, tool, "premerge", not binary)
309 premerge = _toolbool(ui, tool, "premerge", not binary)
310 except error.ConfigError:
310 except error.ConfigError:
311 premerge = _toolstr(ui, tool, "premerge").lower()
311 premerge = _toolstr(ui, tool, "premerge").lower()
312 if premerge not in validkeep:
312 if premerge not in validkeep:
313 _valid = ', '.join(["'" + v + "'" for v in validkeep])
313 _valid = ', '.join(["'" + v + "'" for v in validkeep])
314 raise error.ConfigError(_("%s.premerge not valid "
314 raise error.ConfigError(_("%s.premerge not valid "
315 "('%s' is neither boolean nor %s)") %
315 "('%s' is neither boolean nor %s)") %
316 (tool, premerge, _valid))
316 (tool, premerge, _valid))
317
317
318 if premerge:
318 if premerge:
319 if premerge == 'keep-merge3':
319 if premerge == 'keep-merge3':
320 if not labels:
320 if not labels:
321 labels = _defaultconflictlabels
321 labels = _defaultconflictlabels
322 if len(labels) < 3:
322 if len(labels) < 3:
323 labels.append('base')
323 labels.append('base')
324 r = simplemerge.simplemerge(ui, a, b, c, quiet=True, label=labels)
324 r = simplemerge.simplemerge(ui, a, b, c, quiet=True, label=labels)
325 if not r:
325 if not r:
326 ui.debug(" premerge successful\n")
326 ui.debug(" premerge successful\n")
327 return 0
327 return 0
328 if premerge not in validkeep:
328 if premerge not in validkeep:
329 util.copyfile(back, a) # restore from backup and try again
329 util.copyfile(back, a) # restore from backup and try again
330 return 1 # continue merging
330 return 1 # continue merging
331
331
332 def _mergecheck(repo, mynode, orig, fcd, fco, fca, toolconf):
332 def _mergecheck(repo, mynode, orig, fcd, fco, fca, toolconf):
333 tool, toolpath, binary, symlink = toolconf
333 tool, toolpath, binary, symlink = toolconf
334 if symlink:
334 if symlink:
335 repo.ui.warn(_('warning: internal %s cannot merge symlinks '
335 repo.ui.warn(_('warning: internal %s cannot merge symlinks '
336 'for %s\n') % (tool, fcd.path()))
336 'for %s\n') % (tool, fcd.path()))
337 return False
337 return False
338 if fcd.isabsent() or fco.isabsent():
338 if fcd.isabsent() or fco.isabsent():
339 repo.ui.warn(_('warning: internal %s cannot merge change/delete '
339 repo.ui.warn(_('warning: internal %s cannot merge change/delete '
340 'conflict for %s\n') % (tool, fcd.path()))
340 'conflict for %s\n') % (tool, fcd.path()))
341 return False
341 return False
342 return True
342 return True
343
343
344 def _merge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels, mode):
344 def _merge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels, mode):
345 """
345 """
346 Uses the internal non-interactive simple merge algorithm for merging
346 Uses the internal non-interactive simple merge algorithm for merging
347 files. It will fail if there are any conflicts and leave markers in
347 files. It will fail if there are any conflicts and leave markers in
348 the partially merged file. Markers will have two sections, one for each side
348 the partially merged file. Markers will have two sections, one for each side
349 of merge, unless mode equals 'union' which suppresses the markers."""
349 of merge, unless mode equals 'union' which suppresses the markers."""
350 a, b, c, back = files
350 a, b, c, back = files
351
351
352 ui = repo.ui
352 ui = repo.ui
353
353
354 r = simplemerge.simplemerge(ui, a, b, c, label=labels, mode=mode)
354 r = simplemerge.simplemerge(ui, a, b, c, label=labels, mode=mode)
355 return True, r, False
355 return True, r, False
356
356
357 @internaltool('union', fullmerge,
357 @internaltool('union', fullmerge,
358 _("warning: conflicts while merging %s! "
358 _("warning: conflicts while merging %s! "
359 "(edit, then use 'hg resolve --mark')\n"),
359 "(edit, then use 'hg resolve --mark')\n"),
360 precheck=_mergecheck)
360 precheck=_mergecheck)
361 def _iunion(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
361 def _iunion(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
362 """
362 """
363 Uses the internal non-interactive simple merge algorithm for merging
363 Uses the internal non-interactive simple merge algorithm for merging
364 files. It will use both left and right sides for conflict regions.
364 files. It will use both left and right sides for conflict regions.
365 No markers are inserted."""
365 No markers are inserted."""
366 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
366 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
367 files, labels, 'union')
367 files, labels, 'union')
368
368
369 @internaltool('merge', fullmerge,
369 @internaltool('merge', fullmerge,
370 _("warning: conflicts while merging %s! "
370 _("warning: conflicts while merging %s! "
371 "(edit, then use 'hg resolve --mark')\n"),
371 "(edit, then use 'hg resolve --mark')\n"),
372 precheck=_mergecheck)
372 precheck=_mergecheck)
373 def _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
373 def _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
374 """
374 """
375 Uses the internal non-interactive simple merge algorithm for merging
375 Uses the internal non-interactive simple merge algorithm for merging
376 files. It will fail if there are any conflicts and leave markers in
376 files. It will fail if there are any conflicts and leave markers in
377 the partially merged file. Markers will have two sections, one for each side
377 the partially merged file. Markers will have two sections, one for each side
378 of merge."""
378 of merge."""
379 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
379 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
380 files, labels, 'merge')
380 files, labels, 'merge')
381
381
382 @internaltool('merge3', fullmerge,
382 @internaltool('merge3', fullmerge,
383 _("warning: conflicts while merging %s! "
383 _("warning: conflicts while merging %s! "
384 "(edit, then use 'hg resolve --mark')\n"),
384 "(edit, then use 'hg resolve --mark')\n"),
385 precheck=_mergecheck)
385 precheck=_mergecheck)
386 def _imerge3(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
386 def _imerge3(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
387 """
387 """
388 Uses the internal non-interactive simple merge algorithm for merging
388 Uses the internal non-interactive simple merge algorithm for merging
389 files. It will fail if there are any conflicts and leave markers in
389 files. It will fail if there are any conflicts and leave markers in
390 the partially merged file. Marker will have three sections, one from each
390 the partially merged file. Marker will have three sections, one from each
391 side of the merge and one for the base content."""
391 side of the merge and one for the base content."""
392 if not labels:
392 if not labels:
393 labels = _defaultconflictlabels
393 labels = _defaultconflictlabels
394 if len(labels) < 3:
394 if len(labels) < 3:
395 labels.append('base')
395 labels.append('base')
396 return _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels)
396 return _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels)
397
397
398 def _imergeauto(repo, mynode, orig, fcd, fco, fca, toolconf, files,
398 def _imergeauto(repo, mynode, orig, fcd, fco, fca, toolconf, files,
399 labels=None, localorother=None):
399 labels=None, localorother=None):
400 """
400 """
401 Generic driver for _imergelocal and _imergeother
401 Generic driver for _imergelocal and _imergeother
402 """
402 """
403 assert localorother is not None
403 assert localorother is not None
404 tool, toolpath, binary, symlink = toolconf
404 tool, toolpath, binary, symlink = toolconf
405 a, b, c, back = files
405 a, b, c, back = files
406 r = simplemerge.simplemerge(repo.ui, a, b, c, label=labels,
406 r = simplemerge.simplemerge(repo.ui, a, b, c, label=labels,
407 localorother=localorother)
407 localorother=localorother)
408 return True, r
408 return True, r
409
409
410 @internaltool('merge-local', mergeonly, precheck=_mergecheck)
410 @internaltool('merge-local', mergeonly, precheck=_mergecheck)
411 def _imergelocal(*args, **kwargs):
411 def _imergelocal(*args, **kwargs):
412 """
412 """
413 Like :merge, but resolve all conflicts non-interactively in favor
413 Like :merge, but resolve all conflicts non-interactively in favor
414 of the local changes."""
414 of the local changes."""
415 success, status = _imergeauto(localorother='local', *args, **kwargs)
415 success, status = _imergeauto(localorother='local', *args, **kwargs)
416 return success, status, False
416 return success, status, False
417
417
418 @internaltool('merge-other', mergeonly, precheck=_mergecheck)
418 @internaltool('merge-other', mergeonly, precheck=_mergecheck)
419 def _imergeother(*args, **kwargs):
419 def _imergeother(*args, **kwargs):
420 """
420 """
421 Like :merge, but resolve all conflicts non-interactively in favor
421 Like :merge, but resolve all conflicts non-interactively in favor
422 of the other changes."""
422 of the other changes."""
423 success, status = _imergeauto(localorother='other', *args, **kwargs)
423 success, status = _imergeauto(localorother='other', *args, **kwargs)
424 return success, status, False
424 return success, status, False
425
425
426 @internaltool('tagmerge', mergeonly,
426 @internaltool('tagmerge', mergeonly,
427 _("automatic tag merging of %s failed! "
427 _("automatic tag merging of %s failed! "
428 "(use 'hg resolve --tool :merge' or another merge "
428 "(use 'hg resolve --tool :merge' or another merge "
429 "tool of your choice)\n"))
429 "tool of your choice)\n"))
430 def _itagmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
430 def _itagmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
431 """
431 """
432 Uses the internal tag merge algorithm (experimental).
432 Uses the internal tag merge algorithm (experimental).
433 """
433 """
434 success, status = tagmerge.merge(repo, fcd, fco, fca)
434 success, status = tagmerge.merge(repo, fcd, fco, fca)
435 return success, status, False
435 return success, status, False
436
436
437 @internaltool('dump', fullmerge)
437 @internaltool('dump', fullmerge)
438 def _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
438 def _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
439 """
439 """
440 Creates three versions of the files to merge, containing the
440 Creates three versions of the files to merge, containing the
441 contents of local, other and base. These files can then be used to
441 contents of local, other and base. These files can then be used to
442 perform a merge manually. If the file to be merged is named
442 perform a merge manually. If the file to be merged is named
443 ``a.txt``, these files will accordingly be named ``a.txt.local``,
443 ``a.txt``, these files will accordingly be named ``a.txt.local``,
444 ``a.txt.other`` and ``a.txt.base`` and they will be placed in the
444 ``a.txt.other`` and ``a.txt.base`` and they will be placed in the
445 same directory as ``a.txt``."""
445 same directory as ``a.txt``."""
446 a, b, c, back = files
446 a, b, c, back = files
447
447
448 fd = fcd.path()
448 fd = fcd.path()
449
449
450 util.copyfile(a, a + ".local")
450 util.copyfile(a, a + ".local")
451 repo.wwrite(fd + ".other", fco.data(), fco.flags())
451 repo.wwrite(fd + ".other", fco.data(), fco.flags())
452 repo.wwrite(fd + ".base", fca.data(), fca.flags())
452 repo.wwrite(fd + ".base", fca.data(), fca.flags())
453 return False, 1, False
453 return False, 1, False
454
454
455 def _xmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
455 def _xmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
456 tool, toolpath, binary, symlink = toolconf
456 tool, toolpath, binary, symlink = toolconf
457 if fcd.isabsent() or fco.isabsent():
457 if fcd.isabsent() or fco.isabsent():
458 repo.ui.warn(_('warning: %s cannot merge change/delete conflict '
458 repo.ui.warn(_('warning: %s cannot merge change/delete conflict '
459 'for %s\n') % (tool, fcd.path()))
459 'for %s\n') % (tool, fcd.path()))
460 return False, 1, None
460 return False, 1, None
461 a, b, c, back = files
461 a, b, c, back = files
462 out = ""
462 out = ""
463 env = {'HG_FILE': fcd.path(),
463 env = {'HG_FILE': fcd.path(),
464 'HG_MY_NODE': short(mynode),
464 'HG_MY_NODE': short(mynode),
465 'HG_OTHER_NODE': str(fco.changectx()),
465 'HG_OTHER_NODE': str(fco.changectx()),
466 'HG_BASE_NODE': str(fca.changectx()),
466 'HG_BASE_NODE': str(fca.changectx()),
467 'HG_MY_ISLINK': 'l' in fcd.flags(),
467 'HG_MY_ISLINK': 'l' in fcd.flags(),
468 'HG_OTHER_ISLINK': 'l' in fco.flags(),
468 'HG_OTHER_ISLINK': 'l' in fco.flags(),
469 'HG_BASE_ISLINK': 'l' in fca.flags(),
469 'HG_BASE_ISLINK': 'l' in fca.flags(),
470 }
470 }
471
471
472 ui = repo.ui
472 ui = repo.ui
473
473
474 args = _toolstr(ui, tool, "args", '$local $base $other')
474 args = _toolstr(ui, tool, "args", '$local $base $other')
475 if "$output" in args:
475 if "$output" in args:
476 out, a = a, back # read input from backup, write to original
476 out, a = a, back # read input from backup, write to original
477 replace = {'local': a, 'base': b, 'other': c, 'output': out}
477 replace = {'local': a, 'base': b, 'other': c, 'output': out}
478 args = util.interpolate(r'\$', replace, args,
478 args = util.interpolate(r'\$', replace, args,
479 lambda s: util.shellquote(util.localpath(s)))
479 lambda s: util.shellquote(util.localpath(s)))
480 cmd = toolpath + ' ' + args
480 cmd = toolpath + ' ' + args
481 repo.ui.debug('launching merge tool: %s\n' % cmd)
481 repo.ui.debug('launching merge tool: %s\n' % cmd)
482 r = ui.system(cmd, cwd=repo.root, environ=env)
482 r = ui.system(cmd, cwd=repo.root, environ=env)
483 repo.ui.debug('merge tool returned: %s\n' % r)
483 repo.ui.debug('merge tool returned: %s\n' % r)
484 return True, r, False
484 return True, r, False
485
485
486 def _formatconflictmarker(repo, ctx, template, label, pad):
486 def _formatconflictmarker(repo, ctx, template, label, pad):
487 """Applies the given template to the ctx, prefixed by the label.
487 """Applies the given template to the ctx, prefixed by the label.
488
488
489 Pad is the minimum width of the label prefix, so that multiple markers
489 Pad is the minimum width of the label prefix, so that multiple markers
490 can have aligned templated parts.
490 can have aligned templated parts.
491 """
491 """
492 if ctx.node() is None:
492 if ctx.node() is None:
493 ctx = ctx.p1()
493 ctx = ctx.p1()
494
494
495 props = templatekw.keywords.copy()
495 props = templatekw.keywords.copy()
496 props['templ'] = template
496 props['templ'] = template
497 props['ctx'] = ctx
497 props['ctx'] = ctx
498 props['repo'] = repo
498 props['repo'] = repo
499 templateresult = template('conflictmarker', **props)
499 templateresult = template('conflictmarker', **props)
500
500
501 label = ('%s:' % label).ljust(pad + 1)
501 label = ('%s:' % label).ljust(pad + 1)
502 mark = '%s %s' % (label, templater.stringify(templateresult))
502 mark = '%s %s' % (label, templater.stringify(templateresult))
503
503
504 if mark:
504 if mark:
505 mark = mark.splitlines()[0] # split for safety
505 mark = mark.splitlines()[0] # split for safety
506
506
507 # 8 for the prefix of conflict marker lines (e.g. '<<<<<<< ')
507 # 8 for the prefix of conflict marker lines (e.g. '<<<<<<< ')
508 return util.ellipsis(mark, 80 - 8)
508 return util.ellipsis(mark, 80 - 8)
509
509
510 _defaultconflictmarker = ('{node|short} ' +
510 _defaultconflictmarker = ('{node|short} ' +
511 '{ifeq(tags, "tip", "", "{tags} ")}' +
511 '{ifeq(tags, "tip", "", "{tags} ")}' +
512 '{if(bookmarks, "{bookmarks} ")}' +
512 '{if(bookmarks, "{bookmarks} ")}' +
513 '{ifeq(branch, "default", "", "{branch} ")}' +
513 '{ifeq(branch, "default", "", "{branch} ")}' +
514 '- {author|user}: {desc|firstline}')
514 '- {author|user}: {desc|firstline}')
515
515
516 _defaultconflictlabels = ['local', 'other']
516 _defaultconflictlabels = ['local', 'other']
517
517
518 def _formatlabels(repo, fcd, fco, fca, labels):
518 def _formatlabels(repo, fcd, fco, fca, labels):
519 """Formats the given labels using the conflict marker template.
519 """Formats the given labels using the conflict marker template.
520
520
521 Returns a list of formatted labels.
521 Returns a list of formatted labels.
522 """
522 """
523 cd = fcd.changectx()
523 cd = fcd.changectx()
524 co = fco.changectx()
524 co = fco.changectx()
525 ca = fca.changectx()
525 ca = fca.changectx()
526
526
527 ui = repo.ui
527 ui = repo.ui
528 template = ui.config('ui', 'mergemarkertemplate', _defaultconflictmarker)
528 template = ui.config('ui', 'mergemarkertemplate', _defaultconflictmarker)
529 tmpl = templater.templater(None, cache={'conflictmarker': template})
529 tmpl = templater.templater(None, cache={'conflictmarker': template})
530
530
531 pad = max(len(l) for l in labels)
531 pad = max(len(l) for l in labels)
532
532
533 newlabels = [_formatconflictmarker(repo, cd, tmpl, labels[0], pad),
533 newlabels = [_formatconflictmarker(repo, cd, tmpl, labels[0], pad),
534 _formatconflictmarker(repo, co, tmpl, labels[1], pad)]
534 _formatconflictmarker(repo, co, tmpl, labels[1], pad)]
535 if len(labels) > 2:
535 if len(labels) > 2:
536 newlabels.append(_formatconflictmarker(repo, ca, tmpl, labels[2], pad))
536 newlabels.append(_formatconflictmarker(repo, ca, tmpl, labels[2], pad))
537 return newlabels
537 return newlabels
538
538
539 def _filemerge(premerge, repo, mynode, orig, fcd, fco, fca, labels=None):
539 def _filemerge(premerge, repo, mynode, orig, fcd, fco, fca, labels=None):
540 """perform a 3-way merge in the working directory
540 """perform a 3-way merge in the working directory
541
541
542 premerge = whether this is a premerge
542 premerge = whether this is a premerge
543 mynode = parent node before merge
543 mynode = parent node before merge
544 orig = original local filename before merge
544 orig = original local filename before merge
545 fco = other file context
545 fco = other file context
546 fca = ancestor file context
546 fca = ancestor file context
547 fcd = local file context for current/destination file
547 fcd = local file context for current/destination file
548
548
549 Returns whether the merge is complete, the return value of the merge, and
549 Returns whether the merge is complete, the return value of the merge, and
550 a boolean indicating whether the file was deleted from disk."""
550 a boolean indicating whether the file was deleted from disk."""
551
551
552 def temp(prefix, ctx):
552 def temp(prefix, ctx):
553 pre = "%s~%s." % (os.path.basename(ctx.path()), prefix)
553 pre = "%s~%s." % (os.path.basename(ctx.path()), prefix)
554 (fd, name) = tempfile.mkstemp(prefix=pre)
554 (fd, name) = tempfile.mkstemp(prefix=pre)
555 data = repo.wwritedata(ctx.path(), ctx.data())
555 data = repo.wwritedata(ctx.path(), ctx.data())
556 f = os.fdopen(fd, "wb")
556 f = os.fdopen(fd, "wb")
557 f.write(data)
557 f.write(data)
558 f.close()
558 f.close()
559 return name
559 return name
560
560
561 if not fco.cmp(fcd): # files identical?
561 if not fco.cmp(fcd): # files identical?
562 return True, None, False
562 return True, None, False
563
563
564 ui = repo.ui
564 ui = repo.ui
565 fd = fcd.path()
565 fd = fcd.path()
566 binary = fcd.isbinary() or fco.isbinary() or fca.isbinary()
566 binary = fcd.isbinary() or fco.isbinary() or fca.isbinary()
567 symlink = 'l' in fcd.flags() + fco.flags()
567 symlink = 'l' in fcd.flags() + fco.flags()
568 changedelete = fcd.isabsent() or fco.isabsent()
568 changedelete = fcd.isabsent() or fco.isabsent()
569 tool, toolpath = _picktool(repo, ui, fd, binary, symlink, changedelete)
569 tool, toolpath = _picktool(repo, ui, fd, binary, symlink, changedelete)
570 if tool in internals and tool.startswith('internal:'):
570 if tool in internals and tool.startswith('internal:'):
571 # normalize to new-style names (':merge' etc)
571 # normalize to new-style names (':merge' etc)
572 tool = tool[len('internal'):]
572 tool = tool[len('internal'):]
573 ui.debug("picked tool '%s' for %s (binary %s symlink %s changedelete %s)\n"
573 ui.debug("picked tool '%s' for %s (binary %s symlink %s changedelete %s)\n"
574 % (tool, fd, binary, symlink, changedelete))
574 % (tool, fd, binary, symlink, changedelete))
575
575
576 if tool in internals:
576 if tool in internals:
577 func = internals[tool]
577 func = internals[tool]
578 mergetype = func.mergetype
578 mergetype = func.mergetype
579 onfailure = func.onfailure
579 onfailure = func.onfailure
580 precheck = func.precheck
580 precheck = func.precheck
581 else:
581 else:
582 func = _xmerge
582 func = _xmerge
583 mergetype = fullmerge
583 mergetype = fullmerge
584 onfailure = _("merging %s failed!\n")
584 onfailure = _("merging %s failed!\n")
585 precheck = None
585 precheck = None
586
586
587 toolconf = tool, toolpath, binary, symlink
587 toolconf = tool, toolpath, binary, symlink
588
588
589 if mergetype == nomerge:
589 if mergetype == nomerge:
590 r, deleted = func(repo, mynode, orig, fcd, fco, fca, toolconf)
590 r, deleted = func(repo, mynode, orig, fcd, fco, fca, toolconf)
591 return True, r, deleted
591 return True, r, deleted
592
592
593 if premerge:
593 if premerge:
594 if orig != fco.path():
594 if orig != fco.path():
595 ui.status(_("merging %s and %s to %s\n") % (orig, fco.path(), fd))
595 ui.status(_("merging %s and %s to %s\n") % (orig, fco.path(), fd))
596 else:
596 else:
597 ui.status(_("merging %s\n") % fd)
597 ui.status(_("merging %s\n") % fd)
598
598
599 ui.debug("my %s other %s ancestor %s\n" % (fcd, fco, fca))
599 ui.debug("my %s other %s ancestor %s\n" % (fcd, fco, fca))
600
600
601 if precheck and not precheck(repo, mynode, orig, fcd, fco, fca,
601 if precheck and not precheck(repo, mynode, orig, fcd, fco, fca,
602 toolconf):
602 toolconf):
603 if onfailure:
603 if onfailure:
604 ui.warn(onfailure % fd)
604 ui.warn(onfailure % fd)
605 return True, 1, False
605 return True, 1, False
606
606
607 a = repo.wjoin(fd)
607 a = repo.wjoin(fd)
608 b = temp("base", fca)
608 b = temp("base", fca)
609 c = temp("other", fco)
609 c = temp("other", fco)
610 if not fcd.isabsent():
610 if not fcd.isabsent():
611 back = cmdutil.origpath(ui, repo, a)
611 back = cmdutil.origpath(ui, repo, a)
612 if premerge:
612 if premerge:
613 util.copyfile(a, back)
613 util.copyfile(a, back)
614 else:
614 else:
615 back = None
615 back = None
616 files = (a, b, c, back)
616 files = (a, b, c, back)
617
617
618 r = 1
618 r = 1
619 try:
619 try:
620 markerstyle = ui.config('ui', 'mergemarkers', 'basic')
620 markerstyle = ui.config('ui', 'mergemarkers', 'basic')
621 if not labels:
621 if not labels:
622 labels = _defaultconflictlabels
622 labels = _defaultconflictlabels
623 if markerstyle != 'basic':
623 if markerstyle != 'basic':
624 labels = _formatlabels(repo, fcd, fco, fca, labels)
624 labels = _formatlabels(repo, fcd, fco, fca, labels)
625
625
626 if premerge and mergetype == fullmerge:
626 if premerge and mergetype == fullmerge:
627 r = _premerge(repo, fcd, fco, fca, toolconf, files, labels=labels)
627 r = _premerge(repo, fcd, fco, fca, toolconf, files, labels=labels)
628 # complete if premerge successful (r is 0)
628 # complete if premerge successful (r is 0)
629 return not r, r, False
629 return not r, r, False
630
630
631 needcheck, r, deleted = func(repo, mynode, orig, fcd, fco, fca,
631 needcheck, r, deleted = func(repo, mynode, orig, fcd, fco, fca,
632 toolconf, files, labels=labels)
632 toolconf, files, labels=labels)
633
633
634 if needcheck:
634 if needcheck:
635 r = _check(r, ui, tool, fcd, files)
635 r = _check(r, ui, tool, fcd, files)
636
636
637 if r:
637 if r:
638 if onfailure:
638 if onfailure:
639 ui.warn(onfailure % fd)
639 ui.warn(onfailure % fd)
640
640
641 return True, r, deleted
641 return True, r, deleted
642 finally:
642 finally:
643 if not r and back is not None:
643 if not r and back is not None:
644 util.unlink(back)
644 util.unlink(back)
645 util.unlink(b)
645 util.unlink(b)
646 util.unlink(c)
646 util.unlink(c)
647
647
648 def _check(r, ui, tool, fcd, files):
648 def _check(r, ui, tool, fcd, files):
649 fd = fcd.path()
649 fd = fcd.path()
650 a, b, c, back = files
650 a, b, c, back = files
651
651
652 if not r and (_toolbool(ui, tool, "checkconflicts") or
652 if not r and (_toolbool(ui, tool, "checkconflicts") or
653 'conflicts' in _toollist(ui, tool, "check")):
653 'conflicts' in _toollist(ui, tool, "check")):
654 if re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcd.data(),
654 if re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcd.data(),
655 re.MULTILINE):
655 re.MULTILINE):
656 r = 1
656 r = 1
657
657
658 checked = False
658 checked = False
659 if 'prompt' in _toollist(ui, tool, "check"):
659 if 'prompt' in _toollist(ui, tool, "check"):
660 checked = True
660 checked = True
661 if ui.promptchoice(_("was merge of '%s' successful (yn)?"
661 if ui.promptchoice(_("was merge of '%s' successful (yn)?"
662 "$$ &Yes $$ &No") % fd, 1):
662 "$$ &Yes $$ &No") % fd, 1):
663 r = 1
663 r = 1
664
664
665 if not r and not checked and (_toolbool(ui, tool, "checkchanged") or
665 if not r and not checked and (_toolbool(ui, tool, "checkchanged") or
666 'changed' in
666 'changed' in
667 _toollist(ui, tool, "check")):
667 _toollist(ui, tool, "check")):
668 if back is not None and filecmp.cmp(a, back):
668 if back is not None and filecmp.cmp(a, back):
669 if ui.promptchoice(_(" output file %s appears unchanged\n"
669 if ui.promptchoice(_(" output file %s appears unchanged\n"
670 "was merge successful (yn)?"
670 "was merge successful (yn)?"
671 "$$ &Yes $$ &No") % fd, 1):
671 "$$ &Yes $$ &No") % fd, 1):
672 r = 1
672 r = 1
673
673
674 if back is not None and _toolbool(ui, tool, "fixeol"):
674 if back is not None and _toolbool(ui, tool, "fixeol"):
675 _matcheol(a, back)
675 _matcheol(a, back)
676
676
677 return r
677 return r
678
678
679 def premerge(repo, mynode, orig, fcd, fco, fca, labels=None):
679 def premerge(repo, mynode, orig, fcd, fco, fca, labels=None):
680 return _filemerge(True, repo, mynode, orig, fcd, fco, fca, labels=labels)
680 return _filemerge(True, repo, mynode, orig, fcd, fco, fca, labels=labels)
681
681
682 def filemerge(repo, mynode, orig, fcd, fco, fca, labels=None):
682 def filemerge(repo, mynode, orig, fcd, fco, fca, labels=None):
683 return _filemerge(False, repo, mynode, orig, fcd, fco, fca, labels=labels)
683 return _filemerge(False, repo, mynode, orig, fcd, fco, fca, labels=labels)
684
684
685 # tell hggettext to extract docstrings from these functions:
685 # tell hggettext to extract docstrings from these functions:
686 i18nfunctions = internals.values()
686 i18nfunctions = internals.values()
@@ -1,988 +1,992 b''
1 Tests for change/delete conflicts, including:
1 Tests for change/delete conflicts, including:
2 b5605d88dc27: Make ui.prompt repeat on "unrecognized response" again
2 b5605d88dc27: Make ui.prompt repeat on "unrecognized response" again
3 (issue897)
3 (issue897)
4
4
5 840e2b315c1f: Fix misleading error and prompts during update/merge
5 840e2b315c1f: Fix misleading error and prompts during update/merge
6 (issue556)
6 (issue556)
7
7
8 Make sure HGMERGE doesn't interfere with the test
8 Make sure HGMERGE doesn't interfere with the test
9 $ unset HGMERGE
9 $ unset HGMERGE
10
10
11 $ status() {
11 $ status() {
12 > echo "--- status ---"
12 > echo "--- status ---"
13 > hg st -A file1 file2 file3
13 > hg st -A file1 file2 file3
14 > echo "--- resolve --list ---"
14 > echo "--- resolve --list ---"
15 > hg resolve --list file1 file2 file3
15 > hg resolve --list file1 file2 file3
16 > echo "--- debugmergestate ---"
16 > echo "--- debugmergestate ---"
17 > hg debugmergestate
17 > hg debugmergestate
18 > for file in file1 file2 file3; do
18 > for file in file1 file2 file3; do
19 > if [ -f $file ]; then
19 > if [ -f $file ]; then
20 > echo "--- $file ---"
20 > echo "--- $file ---"
21 > cat $file
21 > cat $file
22 > else
22 > else
23 > echo "*** $file does not exist"
23 > echo "*** $file does not exist"
24 > fi
24 > fi
25 > done
25 > done
26 > }
26 > }
27
27
28 $ hg init repo
28 $ hg init repo
29 $ cd repo
29 $ cd repo
30
30
31 $ echo 1 > file1
31 $ echo 1 > file1
32 $ echo 2 > file2
32 $ echo 2 > file2
33 $ echo 3 > file3
33 $ echo 3 > file3
34 $ hg ci -Am 'added files'
34 $ hg ci -Am 'added files'
35 adding file1
35 adding file1
36 adding file2
36 adding file2
37 adding file3
37 adding file3
38
38
39 $ hg rm file1
39 $ hg rm file1
40 $ echo changed >> file2
40 $ echo changed >> file2
41 $ echo changed1 >> file3
41 $ echo changed1 >> file3
42 $ hg ci -m 'removed file1, changed file2, changed file3'
42 $ hg ci -m 'removed file1, changed file2, changed file3'
43
43
44 $ hg co 0
44 $ hg co 0
45 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
45 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
46
46
47 $ echo changed >> file1
47 $ echo changed >> file1
48 $ hg rm file2
48 $ hg rm file2
49 $ echo changed2 >> file3
49 $ echo changed2 >> file3
50 $ hg ci -m 'changed file1, removed file2, changed file3'
50 $ hg ci -m 'changed file1, removed file2, changed file3'
51 created new head
51 created new head
52
52
53
53
54 Non-interactive merge:
54 Non-interactive merge:
55
55
56 $ hg merge -y
56 $ hg merge -y
57 local changed file1 which remote deleted
57 local changed file1 which remote deleted
58 use (c)hanged version, (d)elete, or leave (u)nresolved? c
58 use (c)hanged version, (d)elete, or leave (u)nresolved? u
59 remote changed file2 which local deleted
59 remote changed file2 which local deleted
60 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
60 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
61 merging file3
61 merging file3
62 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
62 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
63 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
63 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
64 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
64 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
65 [1]
65 [1]
66
66
67 $ status
67 $ status
68 --- status ---
68 --- status ---
69 M file2
69 M file2
70 M file3
70 M file3
71 C file1
71 C file1
72 --- resolve --list ---
72 --- resolve --list ---
73 R file1
73 U file1
74 R file2
74 U file2
75 U file3
75 U file3
76 --- debugmergestate ---
76 --- debugmergestate ---
77 * version 2 records
77 * version 2 records
78 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
78 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
79 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
79 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
80 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
80 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
81 local path: file1 (flags "")
81 local path: file1 (flags "")
82 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
82 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
83 other path: file1 (node null)
83 other path: file1 (node null)
84 file: file2 (record type "C", state "r", hash null)
84 file: file2 (record type "C", state "u", hash null)
85 local path: file2 (flags "")
85 local path: file2 (flags "")
86 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
86 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
87 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
87 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
88 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
88 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
89 local path: file3 (flags "")
89 local path: file3 (flags "")
90 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
90 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
91 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
91 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
92 --- file1 ---
92 --- file1 ---
93 1
93 1
94 changed
94 changed
95 --- file2 ---
95 --- file2 ---
96 2
96 2
97 changed
97 changed
98 --- file3 ---
98 --- file3 ---
99 3
99 3
100 <<<<<<< local: 13910f48cf7b - test: changed file1, removed file2, changed file3
100 <<<<<<< local: 13910f48cf7b - test: changed file1, removed file2, changed file3
101 changed2
101 changed2
102 =======
102 =======
103 changed1
103 changed1
104 >>>>>>> other: 10f9a0a634e8 - test: removed file1, changed file2, changed file3
104 >>>>>>> other: 10f9a0a634e8 - test: removed file1, changed file2, changed file3
105
105
106
106
107 Interactive merge:
107 Interactive merge:
108
108
109 $ hg co -C
109 $ hg co -C
110 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
110 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
111
111
112 $ hg merge --config ui.interactive=true <<EOF
112 $ hg merge --config ui.interactive=true <<EOF
113 > c
113 > c
114 > d
114 > d
115 > EOF
115 > EOF
116 local changed file1 which remote deleted
116 local changed file1 which remote deleted
117 use (c)hanged version, (d)elete, or leave (u)nresolved? c
117 use (c)hanged version, (d)elete, or leave (u)nresolved? c
118 remote changed file2 which local deleted
118 remote changed file2 which local deleted
119 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? d
119 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? d
120 merging file3
120 merging file3
121 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
121 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
122 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
122 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
123 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
123 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
124 [1]
124 [1]
125
125
126 $ status
126 $ status
127 --- status ---
127 --- status ---
128 file2: * (glob)
128 file2: * (glob)
129 M file3
129 M file3
130 C file1
130 C file1
131 --- resolve --list ---
131 --- resolve --list ---
132 R file1
132 R file1
133 R file2
133 R file2
134 U file3
134 U file3
135 --- debugmergestate ---
135 --- debugmergestate ---
136 * version 2 records
136 * version 2 records
137 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
137 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
138 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
138 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
139 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
139 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
140 local path: file1 (flags "")
140 local path: file1 (flags "")
141 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
141 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
142 other path: file1 (node null)
142 other path: file1 (node null)
143 file: file2 (record type "C", state "r", hash null)
143 file: file2 (record type "C", state "r", hash null)
144 local path: file2 (flags "")
144 local path: file2 (flags "")
145 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
145 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
146 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
146 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
147 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
147 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
148 local path: file3 (flags "")
148 local path: file3 (flags "")
149 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
149 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
150 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
150 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
151 --- file1 ---
151 --- file1 ---
152 1
152 1
153 changed
153 changed
154 *** file2 does not exist
154 *** file2 does not exist
155 --- file3 ---
155 --- file3 ---
156 3
156 3
157 <<<<<<< local: 13910f48cf7b - test: changed file1, removed file2, changed file3
157 <<<<<<< local: 13910f48cf7b - test: changed file1, removed file2, changed file3
158 changed2
158 changed2
159 =======
159 =======
160 changed1
160 changed1
161 >>>>>>> other: 10f9a0a634e8 - test: removed file1, changed file2, changed file3
161 >>>>>>> other: 10f9a0a634e8 - test: removed file1, changed file2, changed file3
162
162
163
163
164 Interactive merge with bad input:
164 Interactive merge with bad input:
165
165
166 $ hg co -C
166 $ hg co -C
167 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
167 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
168
168
169 $ hg merge --config ui.interactive=true <<EOF
169 $ hg merge --config ui.interactive=true <<EOF
170 > foo
170 > foo
171 > bar
171 > bar
172 > d
172 > d
173 > baz
173 > baz
174 > c
174 > c
175 > EOF
175 > EOF
176 local changed file1 which remote deleted
176 local changed file1 which remote deleted
177 use (c)hanged version, (d)elete, or leave (u)nresolved? foo
177 use (c)hanged version, (d)elete, or leave (u)nresolved? foo
178 unrecognized response
178 unrecognized response
179 local changed file1 which remote deleted
179 local changed file1 which remote deleted
180 use (c)hanged version, (d)elete, or leave (u)nresolved? bar
180 use (c)hanged version, (d)elete, or leave (u)nresolved? bar
181 unrecognized response
181 unrecognized response
182 local changed file1 which remote deleted
182 local changed file1 which remote deleted
183 use (c)hanged version, (d)elete, or leave (u)nresolved? d
183 use (c)hanged version, (d)elete, or leave (u)nresolved? d
184 remote changed file2 which local deleted
184 remote changed file2 which local deleted
185 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? baz
185 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? baz
186 unrecognized response
186 unrecognized response
187 remote changed file2 which local deleted
187 remote changed file2 which local deleted
188 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
188 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
189 merging file3
189 merging file3
190 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
190 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
191 0 files updated, 1 files merged, 1 files removed, 1 files unresolved
191 0 files updated, 1 files merged, 1 files removed, 1 files unresolved
192 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
192 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
193 [1]
193 [1]
194
194
195 $ status
195 $ status
196 --- status ---
196 --- status ---
197 M file2
197 M file2
198 M file3
198 M file3
199 R file1
199 R file1
200 --- resolve --list ---
200 --- resolve --list ---
201 R file1
201 R file1
202 R file2
202 R file2
203 U file3
203 U file3
204 --- debugmergestate ---
204 --- debugmergestate ---
205 * version 2 records
205 * version 2 records
206 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
206 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
207 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
207 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
208 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
208 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
209 local path: file1 (flags "")
209 local path: file1 (flags "")
210 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
210 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
211 other path: file1 (node null)
211 other path: file1 (node null)
212 file: file2 (record type "C", state "r", hash null)
212 file: file2 (record type "C", state "r", hash null)
213 local path: file2 (flags "")
213 local path: file2 (flags "")
214 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
214 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
215 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
215 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
216 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
216 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
217 local path: file3 (flags "")
217 local path: file3 (flags "")
218 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
218 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
219 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
219 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
220 *** file1 does not exist
220 *** file1 does not exist
221 --- file2 ---
221 --- file2 ---
222 2
222 2
223 changed
223 changed
224 --- file3 ---
224 --- file3 ---
225 3
225 3
226 <<<<<<< local: 13910f48cf7b - test: changed file1, removed file2, changed file3
226 <<<<<<< local: 13910f48cf7b - test: changed file1, removed file2, changed file3
227 changed2
227 changed2
228 =======
228 =======
229 changed1
229 changed1
230 >>>>>>> other: 10f9a0a634e8 - test: removed file1, changed file2, changed file3
230 >>>>>>> other: 10f9a0a634e8 - test: removed file1, changed file2, changed file3
231
231
232
232
233 Interactive merge with not enough input:
233 Interactive merge with not enough input:
234
234
235 $ hg co -C
235 $ hg co -C
236 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
236 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
237
237
238 $ hg merge --config ui.interactive=true <<EOF
238 $ hg merge --config ui.interactive=true <<EOF
239 > d
239 > d
240 > EOF
240 > EOF
241 local changed file1 which remote deleted
241 local changed file1 which remote deleted
242 use (c)hanged version, (d)elete, or leave (u)nresolved? d
242 use (c)hanged version, (d)elete, or leave (u)nresolved? d
243 remote changed file2 which local deleted
243 remote changed file2 which local deleted
244 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
244 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
245 merging file3
245 merging file3
246 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
246 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
247 0 files updated, 0 files merged, 1 files removed, 2 files unresolved
247 0 files updated, 0 files merged, 1 files removed, 2 files unresolved
248 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
248 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
249 [1]
249 [1]
250
250
251 $ status
251 $ status
252 --- status ---
252 --- status ---
253 M file2
253 M file2
254 M file3
254 M file3
255 R file1
255 R file1
256 --- resolve --list ---
256 --- resolve --list ---
257 R file1
257 R file1
258 U file2
258 U file2
259 U file3
259 U file3
260 --- debugmergestate ---
260 --- debugmergestate ---
261 * version 2 records
261 * version 2 records
262 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
262 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
263 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
263 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
264 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
264 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
265 local path: file1 (flags "")
265 local path: file1 (flags "")
266 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
266 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
267 other path: file1 (node null)
267 other path: file1 (node null)
268 file: file2 (record type "C", state "u", hash null)
268 file: file2 (record type "C", state "u", hash null)
269 local path: file2 (flags "")
269 local path: file2 (flags "")
270 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
270 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
271 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
271 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
272 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
272 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
273 local path: file3 (flags "")
273 local path: file3 (flags "")
274 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
274 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
275 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
275 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
276 *** file1 does not exist
276 *** file1 does not exist
277 --- file2 ---
277 --- file2 ---
278 2
278 2
279 changed
279 changed
280 --- file3 ---
280 --- file3 ---
281 3
281 3
282 <<<<<<< local: 13910f48cf7b - test: changed file1, removed file2, changed file3
282 <<<<<<< local: 13910f48cf7b - test: changed file1, removed file2, changed file3
283 changed2
283 changed2
284 =======
284 =======
285 changed1
285 changed1
286 >>>>>>> other: 10f9a0a634e8 - test: removed file1, changed file2, changed file3
286 >>>>>>> other: 10f9a0a634e8 - test: removed file1, changed file2, changed file3
287
287
288 Choose local versions of files
288 Choose local versions of files
289
289
290 $ hg co -C
290 $ hg co -C
291 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
291 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
292
292
293 $ hg merge --tool :local
293 $ hg merge --tool :local
294 0 files updated, 3 files merged, 0 files removed, 0 files unresolved
294 0 files updated, 3 files merged, 0 files removed, 0 files unresolved
295 (branch merge, don't forget to commit)
295 (branch merge, don't forget to commit)
296 $ status 2>&1 | tee $TESTTMP/local.status
296 $ status 2>&1 | tee $TESTTMP/local.status
297 --- status ---
297 --- status ---
298 file2: * (glob)
298 file2: * (glob)
299 M file3
299 M file3
300 C file1
300 C file1
301 --- resolve --list ---
301 --- resolve --list ---
302 R file1
302 R file1
303 R file2
303 R file2
304 R file3
304 R file3
305 --- debugmergestate ---
305 --- debugmergestate ---
306 * version 2 records
306 * version 2 records
307 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
307 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
308 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
308 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
309 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
309 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
310 local path: file1 (flags "")
310 local path: file1 (flags "")
311 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
311 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
312 other path: file1 (node null)
312 other path: file1 (node null)
313 file: file2 (record type "C", state "r", hash null)
313 file: file2 (record type "C", state "r", hash null)
314 local path: file2 (flags "")
314 local path: file2 (flags "")
315 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
315 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
316 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
316 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
317 file: file3 (record type "F", state "r", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
317 file: file3 (record type "F", state "r", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
318 local path: file3 (flags "")
318 local path: file3 (flags "")
319 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
319 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
320 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
320 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
321 --- file1 ---
321 --- file1 ---
322 1
322 1
323 changed
323 changed
324 *** file2 does not exist
324 *** file2 does not exist
325 --- file3 ---
325 --- file3 ---
326 3
326 3
327 changed2
327 changed2
328
328
329 Choose other versions of files
329 Choose other versions of files
330
330
331 $ hg co -C
331 $ hg co -C
332 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
332 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
333
333
334 $ hg merge --tool :other
334 $ hg merge --tool :other
335 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
335 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
336 (branch merge, don't forget to commit)
336 (branch merge, don't forget to commit)
337 $ status 2>&1 | tee $TESTTMP/other.status
337 $ status 2>&1 | tee $TESTTMP/other.status
338 --- status ---
338 --- status ---
339 M file2
339 M file2
340 M file3
340 M file3
341 R file1
341 R file1
342 --- resolve --list ---
342 --- resolve --list ---
343 R file1
343 R file1
344 R file2
344 R file2
345 R file3
345 R file3
346 --- debugmergestate ---
346 --- debugmergestate ---
347 * version 2 records
347 * version 2 records
348 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
348 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
349 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
349 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
350 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
350 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
351 local path: file1 (flags "")
351 local path: file1 (flags "")
352 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
352 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
353 other path: file1 (node null)
353 other path: file1 (node null)
354 file: file2 (record type "C", state "r", hash null)
354 file: file2 (record type "C", state "r", hash null)
355 local path: file2 (flags "")
355 local path: file2 (flags "")
356 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
356 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
357 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
357 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
358 file: file3 (record type "F", state "r", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
358 file: file3 (record type "F", state "r", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
359 local path: file3 (flags "")
359 local path: file3 (flags "")
360 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
360 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
361 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
361 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
362 *** file1 does not exist
362 *** file1 does not exist
363 --- file2 ---
363 --- file2 ---
364 2
364 2
365 changed
365 changed
366 --- file3 ---
366 --- file3 ---
367 3
367 3
368 changed1
368 changed1
369
369
370 Fail
370 Fail
371
371
372 $ hg co -C
372 $ hg co -C
373 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
373 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
374
374
375 $ hg merge --tool :fail
375 $ hg merge --tool :fail
376 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
376 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
377 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
377 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
378 [1]
378 [1]
379 $ status 2>&1 | tee $TESTTMP/fail.status
379 $ status 2>&1 | tee $TESTTMP/fail.status
380 --- status ---
380 --- status ---
381 M file2
381 M file2
382 M file3
382 M file3
383 C file1
383 C file1
384 --- resolve --list ---
384 --- resolve --list ---
385 U file1
385 U file1
386 U file2
386 U file2
387 U file3
387 U file3
388 --- debugmergestate ---
388 --- debugmergestate ---
389 * version 2 records
389 * version 2 records
390 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
390 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
391 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
391 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
392 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
392 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
393 local path: file1 (flags "")
393 local path: file1 (flags "")
394 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
394 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
395 other path: file1 (node null)
395 other path: file1 (node null)
396 file: file2 (record type "C", state "u", hash null)
396 file: file2 (record type "C", state "u", hash null)
397 local path: file2 (flags "")
397 local path: file2 (flags "")
398 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
398 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
399 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
399 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
400 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
400 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
401 local path: file3 (flags "")
401 local path: file3 (flags "")
402 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
402 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
403 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
403 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
404 --- file1 ---
404 --- file1 ---
405 1
405 1
406 changed
406 changed
407 --- file2 ---
407 --- file2 ---
408 2
408 2
409 changed
409 changed
410 --- file3 ---
410 --- file3 ---
411 3
411 3
412 changed2
412 changed2
413
413
414 Force prompts with no input (should be similar to :fail)
414 Force prompts with no input (should be similar to :fail)
415
415
416 $ hg co -C
416 $ hg co -C
417 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
417 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
418
418
419 $ hg merge --config ui.interactive=True --tool :prompt
419 $ hg merge --config ui.interactive=True --tool :prompt
420 local changed file1 which remote deleted
420 local changed file1 which remote deleted
421 use (c)hanged version, (d)elete, or leave (u)nresolved?
421 use (c)hanged version, (d)elete, or leave (u)nresolved?
422 remote changed file2 which local deleted
422 remote changed file2 which local deleted
423 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
423 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
424 no tool found to merge file3
424 no tool found to merge file3
425 keep (l)ocal, take (o)ther, or leave (u)nresolved?
425 keep (l)ocal, take (o)ther, or leave (u)nresolved?
426 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
426 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
427 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
427 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
428 [1]
428 [1]
429 $ status 2>&1 | tee $TESTTMP/prompt.status
429 $ status 2>&1 | tee $TESTTMP/prompt.status
430 --- status ---
430 --- status ---
431 M file2
431 M file2
432 M file3
432 M file3
433 C file1
433 C file1
434 --- resolve --list ---
434 --- resolve --list ---
435 U file1
435 U file1
436 U file2
436 U file2
437 U file3
437 U file3
438 --- debugmergestate ---
438 --- debugmergestate ---
439 * version 2 records
439 * version 2 records
440 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
440 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
441 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
441 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
442 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
442 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
443 local path: file1 (flags "")
443 local path: file1 (flags "")
444 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
444 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
445 other path: file1 (node null)
445 other path: file1 (node null)
446 file: file2 (record type "C", state "u", hash null)
446 file: file2 (record type "C", state "u", hash null)
447 local path: file2 (flags "")
447 local path: file2 (flags "")
448 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
448 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
449 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
449 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
450 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
450 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
451 local path: file3 (flags "")
451 local path: file3 (flags "")
452 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
452 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
453 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
453 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
454 --- file1 ---
454 --- file1 ---
455 1
455 1
456 changed
456 changed
457 --- file2 ---
457 --- file2 ---
458 2
458 2
459 changed
459 changed
460 --- file3 ---
460 --- file3 ---
461 3
461 3
462 changed2
462 changed2
463 $ cmp $TESTTMP/fail.status $TESTTMP/prompt.status || diff -U8 $TESTTMP/fail.status $TESTTMP/prompt.status
463 $ cmp $TESTTMP/fail.status $TESTTMP/prompt.status || diff -U8 $TESTTMP/fail.status $TESTTMP/prompt.status
464
464
465
465
466 Force prompts
466 Force prompts
467
467
468 $ hg co -C
468 $ hg co -C
469 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
469 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
470
470
471 $ hg merge --tool :prompt
471 $ hg merge --tool :prompt
472 local changed file1 which remote deleted
472 local changed file1 which remote deleted
473 use (c)hanged version, (d)elete, or leave (u)nresolved? c
473 use (c)hanged version, (d)elete, or leave (u)nresolved? u
474 remote changed file2 which local deleted
474 remote changed file2 which local deleted
475 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
475 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
476 no tool found to merge file3
476 no tool found to merge file3
477 keep (l)ocal, take (o)ther, or leave (u)nresolved? u
477 keep (l)ocal, take (o)ther, or leave (u)nresolved? u
478 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
478 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
479 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
479 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
480 [1]
480 [1]
481 $ status
481 $ status
482 --- status ---
482 --- status ---
483 M file2
483 M file2
484 M file3
484 M file3
485 C file1
485 C file1
486 --- resolve --list ---
486 --- resolve --list ---
487 R file1
487 U file1
488 R file2
488 U file2
489 U file3
489 U file3
490 --- debugmergestate ---
490 --- debugmergestate ---
491 * version 2 records
491 * version 2 records
492 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
492 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
493 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
493 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
494 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
494 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
495 local path: file1 (flags "")
495 local path: file1 (flags "")
496 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
496 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
497 other path: file1 (node null)
497 other path: file1 (node null)
498 file: file2 (record type "C", state "r", hash null)
498 file: file2 (record type "C", state "u", hash null)
499 local path: file2 (flags "")
499 local path: file2 (flags "")
500 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
500 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
501 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
501 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
502 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
502 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
503 local path: file3 (flags "")
503 local path: file3 (flags "")
504 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
504 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
505 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
505 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
506 --- file1 ---
506 --- file1 ---
507 1
507 1
508 changed
508 changed
509 --- file2 ---
509 --- file2 ---
510 2
510 2
511 changed
511 changed
512 --- file3 ---
512 --- file3 ---
513 3
513 3
514 changed2
514 changed2
515
515
516 Choose to merge all files
516 Choose to merge all files
517
517
518 $ hg co -C
518 $ hg co -C
519 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
519 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
520
520
521 $ hg merge --tool :merge3
521 $ hg merge --tool :merge3
522 local changed file1 which remote deleted
522 local changed file1 which remote deleted
523 use (c)hanged version, (d)elete, or leave (u)nresolved? c
523 use (c)hanged version, (d)elete, or leave (u)nresolved? u
524 remote changed file2 which local deleted
524 remote changed file2 which local deleted
525 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
525 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
526 merging file3
526 merging file3
527 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
527 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
528 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
528 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
529 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
529 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
530 [1]
530 [1]
531 $ status
531 $ status
532 --- status ---
532 --- status ---
533 M file2
533 M file2
534 M file3
534 M file3
535 C file1
535 C file1
536 --- resolve --list ---
536 --- resolve --list ---
537 R file1
537 U file1
538 R file2
538 U file2
539 U file3
539 U file3
540 --- debugmergestate ---
540 --- debugmergestate ---
541 * version 2 records
541 * version 2 records
542 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
542 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
543 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
543 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
544 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
544 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
545 local path: file1 (flags "")
545 local path: file1 (flags "")
546 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
546 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
547 other path: file1 (node null)
547 other path: file1 (node null)
548 file: file2 (record type "C", state "r", hash null)
548 file: file2 (record type "C", state "u", hash null)
549 local path: file2 (flags "")
549 local path: file2 (flags "")
550 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
550 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
551 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
551 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
552 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
552 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
553 local path: file3 (flags "")
553 local path: file3 (flags "")
554 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
554 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
555 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
555 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
556 --- file1 ---
556 --- file1 ---
557 1
557 1
558 changed
558 changed
559 --- file2 ---
559 --- file2 ---
560 2
560 2
561 changed
561 changed
562 --- file3 ---
562 --- file3 ---
563 3
563 3
564 <<<<<<< local: 13910f48cf7b - test: changed file1, removed file2, changed file3
564 <<<<<<< local: 13910f48cf7b - test: changed file1, removed file2, changed file3
565 changed2
565 changed2
566 ||||||| base
566 ||||||| base
567 =======
567 =======
568 changed1
568 changed1
569 >>>>>>> other: 10f9a0a634e8 - test: removed file1, changed file2, changed file3
569 >>>>>>> other: 10f9a0a634e8 - test: removed file1, changed file2, changed file3
570
570
571 Exercise transitions between local, other, fail and prompt, and make sure the
571 Exercise transitions between local, other, fail and prompt, and make sure the
572 dirstate stays consistent. (Compare with each other and to the above
572 dirstate stays consistent. (Compare with each other and to the above
573 invocations.)
573 invocations.)
574
574
575 $ testtransitions() {
575 $ testtransitions() {
576 > # this traversal order covers every transition
576 > # this traversal order covers every transition
577 > tools="local other prompt local fail other local prompt other fail prompt fail local"
577 > tools="local other prompt local fail other local prompt other fail prompt fail local"
578 > lasttool="merge3"
578 > lasttool="merge3"
579 > for tool in $tools; do
579 > for tool in $tools; do
580 > echo "=== :$lasttool -> :$tool ==="
580 > echo "=== :$lasttool -> :$tool ==="
581 > ref="$TESTTMP/$tool.status"
581 > ref="$TESTTMP/$tool.status"
582 > hg resolve --unmark --all
582 > hg resolve --unmark --all
583 > hg resolve --tool ":$tool" --all --config ui.interactive=True
583 > hg resolve --tool ":$tool" --all --config ui.interactive=True
584 > status > "$TESTTMP/compare.status" 2>&1
584 > status > "$TESTTMP/compare.status" 2>&1
585 > echo '--- diff of status ---'
585 > echo '--- diff of status ---'
586 > if cmp "$TESTTMP/$tool.status" "$TESTTMP/compare.status" || diff -U8 "$TESTTMP/$tool.status" "$TESTTMP/compare.status"; then
586 > if cmp "$TESTTMP/$tool.status" "$TESTTMP/compare.status" || diff -U8 "$TESTTMP/$tool.status" "$TESTTMP/compare.status"; then
587 > echo '(status identical)'
587 > echo '(status identical)'
588 > fi
588 > fi
589 > lasttool="$tool"
589 > lasttool="$tool"
590 > echo
590 > echo
591 > done
591 > done
592 > }
592 > }
593
593
594 $ testtransitions
594 $ testtransitions
595 === :merge3 -> :local ===
595 === :merge3 -> :local ===
596 (no more unresolved files)
596 (no more unresolved files)
597 --- diff of status ---
597 --- diff of status ---
598 (status identical)
598 (status identical)
599
599
600 === :local -> :other ===
600 === :local -> :other ===
601 (no more unresolved files)
601 (no more unresolved files)
602 --- diff of status ---
602 --- diff of status ---
603 (status identical)
603 (status identical)
604
604
605 === :other -> :prompt ===
605 === :other -> :prompt ===
606 local changed file1 which remote deleted
606 local changed file1 which remote deleted
607 use (c)hanged version, (d)elete, or leave (u)nresolved?
607 use (c)hanged version, (d)elete, or leave (u)nresolved?
608 remote changed file2 which local deleted
608 remote changed file2 which local deleted
609 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
609 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
610 no tool found to merge file3
610 no tool found to merge file3
611 keep (l)ocal, take (o)ther, or leave (u)nresolved?
611 keep (l)ocal, take (o)ther, or leave (u)nresolved?
612 --- diff of status ---
612 --- diff of status ---
613 (status identical)
613 (status identical)
614
614
615 === :prompt -> :local ===
615 === :prompt -> :local ===
616 (no more unresolved files)
616 (no more unresolved files)
617 --- diff of status ---
617 --- diff of status ---
618 (status identical)
618 (status identical)
619
619
620 === :local -> :fail ===
620 === :local -> :fail ===
621 --- diff of status ---
621 --- diff of status ---
622 (status identical)
622 (status identical)
623
623
624 === :fail -> :other ===
624 === :fail -> :other ===
625 (no more unresolved files)
625 (no more unresolved files)
626 --- diff of status ---
626 --- diff of status ---
627 (status identical)
627 (status identical)
628
628
629 === :other -> :local ===
629 === :other -> :local ===
630 (no more unresolved files)
630 (no more unresolved files)
631 --- diff of status ---
631 --- diff of status ---
632 (status identical)
632 (status identical)
633
633
634 === :local -> :prompt ===
634 === :local -> :prompt ===
635 local changed file1 which remote deleted
635 local changed file1 which remote deleted
636 use (c)hanged version, (d)elete, or leave (u)nresolved?
636 use (c)hanged version, (d)elete, or leave (u)nresolved?
637 remote changed file2 which local deleted
637 remote changed file2 which local deleted
638 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
638 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
639 no tool found to merge file3
639 no tool found to merge file3
640 keep (l)ocal, take (o)ther, or leave (u)nresolved?
640 keep (l)ocal, take (o)ther, or leave (u)nresolved?
641 --- diff of status ---
641 --- diff of status ---
642 (status identical)
642 (status identical)
643
643
644 === :prompt -> :other ===
644 === :prompt -> :other ===
645 (no more unresolved files)
645 (no more unresolved files)
646 --- diff of status ---
646 --- diff of status ---
647 (status identical)
647 (status identical)
648
648
649 === :other -> :fail ===
649 === :other -> :fail ===
650 --- diff of status ---
650 --- diff of status ---
651 (status identical)
651 (status identical)
652
652
653 === :fail -> :prompt ===
653 === :fail -> :prompt ===
654 local changed file1 which remote deleted
654 local changed file1 which remote deleted
655 use (c)hanged version, (d)elete, or leave (u)nresolved?
655 use (c)hanged version, (d)elete, or leave (u)nresolved?
656 remote changed file2 which local deleted
656 remote changed file2 which local deleted
657 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
657 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
658 no tool found to merge file3
658 no tool found to merge file3
659 keep (l)ocal, take (o)ther, or leave (u)nresolved?
659 keep (l)ocal, take (o)ther, or leave (u)nresolved?
660 --- diff of status ---
660 --- diff of status ---
661 (status identical)
661 (status identical)
662
662
663 === :prompt -> :fail ===
663 === :prompt -> :fail ===
664 --- diff of status ---
664 --- diff of status ---
665 (status identical)
665 (status identical)
666
666
667 === :fail -> :local ===
667 === :fail -> :local ===
668 (no more unresolved files)
668 (no more unresolved files)
669 --- diff of status ---
669 --- diff of status ---
670 (status identical)
670 (status identical)
671
671
672
672
673
673
674 Non-interactive linear update
674 Non-interactive linear update
675
675
676 $ hg co -C 0
676 $ hg co -C 0
677 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
677 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
678 $ echo changed >> file1
678 $ echo changed >> file1
679 $ hg rm file2
679 $ hg rm file2
680 $ hg update 1 -y
680 $ hg update 1 -y
681 local changed file1 which remote deleted
681 local changed file1 which remote deleted
682 use (c)hanged version, (d)elete, or leave (u)nresolved? c
682 use (c)hanged version, (d)elete, or leave (u)nresolved? u
683 remote changed file2 which local deleted
683 remote changed file2 which local deleted
684 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
684 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
685 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
685 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
686 use 'hg resolve' to retry unresolved file merges
687 [1]
686 $ status
688 $ status
687 --- status ---
689 --- status ---
688 A file1
690 A file1
689 C file2
691 C file2
690 C file3
692 C file3
691 --- resolve --list ---
693 --- resolve --list ---
692 R file1
694 U file1
693 R file2
695 U file2
694 --- debugmergestate ---
696 --- debugmergestate ---
695 * version 2 records
697 * version 2 records
696 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
698 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
697 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
699 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
698 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
700 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
699 local path: file1 (flags "")
701 local path: file1 (flags "")
700 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
702 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
701 other path: file1 (node null)
703 other path: file1 (node null)
702 file: file2 (record type "C", state "r", hash null)
704 file: file2 (record type "C", state "u", hash null)
703 local path: file2 (flags "")
705 local path: file2 (flags "")
704 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
706 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
705 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
707 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
706 --- file1 ---
708 --- file1 ---
707 1
709 1
708 changed
710 changed
709 --- file2 ---
711 --- file2 ---
710 2
712 2
711 changed
713 changed
712 --- file3 ---
714 --- file3 ---
713 3
715 3
714 changed1
716 changed1
715
717
716 Choose local versions of files
718 Choose local versions of files
717
719
718 $ hg co -C 0
720 $ hg co -C 0
719 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
721 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
720 $ echo changed >> file1
722 $ echo changed >> file1
721 $ hg rm file2
723 $ hg rm file2
722 $ hg update 1 --tool :local
724 $ hg update 1 --tool :local
723 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
725 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
724 $ status 2>&1 | tee $TESTTMP/local.status
726 $ status 2>&1 | tee $TESTTMP/local.status
725 --- status ---
727 --- status ---
726 file2: * (glob)
728 file2: * (glob)
727 A file1
729 A file1
728 C file3
730 C file3
729 --- resolve --list ---
731 --- resolve --list ---
730 R file1
732 R file1
731 R file2
733 R file2
732 --- debugmergestate ---
734 --- debugmergestate ---
733 * version 2 records
735 * version 2 records
734 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
736 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
735 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
737 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
736 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
738 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
737 local path: file1 (flags "")
739 local path: file1 (flags "")
738 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
740 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
739 other path: file1 (node null)
741 other path: file1 (node null)
740 file: file2 (record type "C", state "r", hash null)
742 file: file2 (record type "C", state "r", hash null)
741 local path: file2 (flags "")
743 local path: file2 (flags "")
742 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
744 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
743 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
745 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
744 --- file1 ---
746 --- file1 ---
745 1
747 1
746 changed
748 changed
747 *** file2 does not exist
749 *** file2 does not exist
748 --- file3 ---
750 --- file3 ---
749 3
751 3
750 changed1
752 changed1
751
753
752 Choose other versions of files
754 Choose other versions of files
753
755
754 $ hg co -C 0
756 $ hg co -C 0
755 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
757 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
756 $ echo changed >> file1
758 $ echo changed >> file1
757 $ hg rm file2
759 $ hg rm file2
758 $ hg update 1 --tool :other
760 $ hg update 1 --tool :other
759 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
761 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
760 $ status 2>&1 | tee $TESTTMP/other.status
762 $ status 2>&1 | tee $TESTTMP/other.status
761 --- status ---
763 --- status ---
762 file1: * (glob)
764 file1: * (glob)
763 C file2
765 C file2
764 C file3
766 C file3
765 --- resolve --list ---
767 --- resolve --list ---
766 R file1
768 R file1
767 R file2
769 R file2
768 --- debugmergestate ---
770 --- debugmergestate ---
769 * version 2 records
771 * version 2 records
770 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
772 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
771 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
773 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
772 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
774 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
773 local path: file1 (flags "")
775 local path: file1 (flags "")
774 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
776 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
775 other path: file1 (node null)
777 other path: file1 (node null)
776 file: file2 (record type "C", state "r", hash null)
778 file: file2 (record type "C", state "r", hash null)
777 local path: file2 (flags "")
779 local path: file2 (flags "")
778 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
780 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
779 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
781 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
780 *** file1 does not exist
782 *** file1 does not exist
781 --- file2 ---
783 --- file2 ---
782 2
784 2
783 changed
785 changed
784 --- file3 ---
786 --- file3 ---
785 3
787 3
786 changed1
788 changed1
787
789
788 Fail
790 Fail
789
791
790 $ hg co -C 0
792 $ hg co -C 0
791 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
793 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
792 $ echo changed >> file1
794 $ echo changed >> file1
793 $ hg rm file2
795 $ hg rm file2
794 $ hg update 1 --tool :fail
796 $ hg update 1 --tool :fail
795 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
797 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
796 use 'hg resolve' to retry unresolved file merges
798 use 'hg resolve' to retry unresolved file merges
797 [1]
799 [1]
798 $ status 2>&1 | tee $TESTTMP/fail.status
800 $ status 2>&1 | tee $TESTTMP/fail.status
799 --- status ---
801 --- status ---
800 A file1
802 A file1
801 C file2
803 C file2
802 C file3
804 C file3
803 --- resolve --list ---
805 --- resolve --list ---
804 U file1
806 U file1
805 U file2
807 U file2
806 --- debugmergestate ---
808 --- debugmergestate ---
807 * version 2 records
809 * version 2 records
808 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
810 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
809 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
811 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
810 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
812 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
811 local path: file1 (flags "")
813 local path: file1 (flags "")
812 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
814 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
813 other path: file1 (node null)
815 other path: file1 (node null)
814 file: file2 (record type "C", state "u", hash null)
816 file: file2 (record type "C", state "u", hash null)
815 local path: file2 (flags "")
817 local path: file2 (flags "")
816 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
818 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
817 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
819 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
818 --- file1 ---
820 --- file1 ---
819 1
821 1
820 changed
822 changed
821 --- file2 ---
823 --- file2 ---
822 2
824 2
823 changed
825 changed
824 --- file3 ---
826 --- file3 ---
825 3
827 3
826 changed1
828 changed1
827
829
828 Force prompts with no input
830 Force prompts with no input
829
831
830 $ hg co -C 0
832 $ hg co -C 0
831 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
833 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
832 $ echo changed >> file1
834 $ echo changed >> file1
833 $ hg rm file2
835 $ hg rm file2
834 $ hg update 1 --config ui.interactive=True --tool :prompt
836 $ hg update 1 --config ui.interactive=True --tool :prompt
835 local changed file1 which remote deleted
837 local changed file1 which remote deleted
836 use (c)hanged version, (d)elete, or leave (u)nresolved?
838 use (c)hanged version, (d)elete, or leave (u)nresolved?
837 remote changed file2 which local deleted
839 remote changed file2 which local deleted
838 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
840 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
839 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
841 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
840 use 'hg resolve' to retry unresolved file merges
842 use 'hg resolve' to retry unresolved file merges
841 [1]
843 [1]
842 $ status 2>&1 | tee $TESTTMP/prompt.status
844 $ status 2>&1 | tee $TESTTMP/prompt.status
843 --- status ---
845 --- status ---
844 A file1
846 A file1
845 C file2
847 C file2
846 C file3
848 C file3
847 --- resolve --list ---
849 --- resolve --list ---
848 U file1
850 U file1
849 U file2
851 U file2
850 --- debugmergestate ---
852 --- debugmergestate ---
851 * version 2 records
853 * version 2 records
852 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
854 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
853 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
855 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
854 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
856 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
855 local path: file1 (flags "")
857 local path: file1 (flags "")
856 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
858 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
857 other path: file1 (node null)
859 other path: file1 (node null)
858 file: file2 (record type "C", state "u", hash null)
860 file: file2 (record type "C", state "u", hash null)
859 local path: file2 (flags "")
861 local path: file2 (flags "")
860 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
862 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
861 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
863 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
862 --- file1 ---
864 --- file1 ---
863 1
865 1
864 changed
866 changed
865 --- file2 ---
867 --- file2 ---
866 2
868 2
867 changed
869 changed
868 --- file3 ---
870 --- file3 ---
869 3
871 3
870 changed1
872 changed1
871 $ cmp $TESTTMP/fail.status $TESTTMP/prompt.status || diff -U8 $TESTTMP/fail.status $TESTTMP/prompt.status
873 $ cmp $TESTTMP/fail.status $TESTTMP/prompt.status || diff -U8 $TESTTMP/fail.status $TESTTMP/prompt.status
872
874
873 Choose to merge all files
875 Choose to merge all files
874
876
875 $ hg co -C 0
877 $ hg co -C 0
876 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
878 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
877 $ echo changed >> file1
879 $ echo changed >> file1
878 $ hg rm file2
880 $ hg rm file2
879 $ hg update 1 --tool :merge3
881 $ hg update 1 --tool :merge3
880 local changed file1 which remote deleted
882 local changed file1 which remote deleted
881 use (c)hanged version, (d)elete, or leave (u)nresolved? c
883 use (c)hanged version, (d)elete, or leave (u)nresolved? u
882 remote changed file2 which local deleted
884 remote changed file2 which local deleted
883 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
885 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
884 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
886 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
887 use 'hg resolve' to retry unresolved file merges
888 [1]
885 $ status
889 $ status
886 --- status ---
890 --- status ---
887 A file1
891 A file1
888 C file2
892 C file2
889 C file3
893 C file3
890 --- resolve --list ---
894 --- resolve --list ---
891 R file1
895 U file1
892 R file2
896 U file2
893 --- debugmergestate ---
897 --- debugmergestate ---
894 * version 2 records
898 * version 2 records
895 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
899 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
896 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
900 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
897 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
901 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
898 local path: file1 (flags "")
902 local path: file1 (flags "")
899 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
903 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
900 other path: file1 (node null)
904 other path: file1 (node null)
901 file: file2 (record type "C", state "r", hash null)
905 file: file2 (record type "C", state "u", hash null)
902 local path: file2 (flags "")
906 local path: file2 (flags "")
903 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
907 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
904 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
908 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
905 --- file1 ---
909 --- file1 ---
906 1
910 1
907 changed
911 changed
908 --- file2 ---
912 --- file2 ---
909 2
913 2
910 changed
914 changed
911 --- file3 ---
915 --- file3 ---
912 3
916 3
913 changed1
917 changed1
914
918
915 Test transitions between different merge tools
919 Test transitions between different merge tools
916
920
917 $ testtransitions
921 $ testtransitions
918 === :merge3 -> :local ===
922 === :merge3 -> :local ===
919 (no more unresolved files)
923 (no more unresolved files)
920 --- diff of status ---
924 --- diff of status ---
921 (status identical)
925 (status identical)
922
926
923 === :local -> :other ===
927 === :local -> :other ===
924 (no more unresolved files)
928 (no more unresolved files)
925 --- diff of status ---
929 --- diff of status ---
926 (status identical)
930 (status identical)
927
931
928 === :other -> :prompt ===
932 === :other -> :prompt ===
929 local changed file1 which remote deleted
933 local changed file1 which remote deleted
930 use (c)hanged version, (d)elete, or leave (u)nresolved?
934 use (c)hanged version, (d)elete, or leave (u)nresolved?
931 remote changed file2 which local deleted
935 remote changed file2 which local deleted
932 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
936 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
933 --- diff of status ---
937 --- diff of status ---
934 (status identical)
938 (status identical)
935
939
936 === :prompt -> :local ===
940 === :prompt -> :local ===
937 (no more unresolved files)
941 (no more unresolved files)
938 --- diff of status ---
942 --- diff of status ---
939 (status identical)
943 (status identical)
940
944
941 === :local -> :fail ===
945 === :local -> :fail ===
942 --- diff of status ---
946 --- diff of status ---
943 (status identical)
947 (status identical)
944
948
945 === :fail -> :other ===
949 === :fail -> :other ===
946 (no more unresolved files)
950 (no more unresolved files)
947 --- diff of status ---
951 --- diff of status ---
948 (status identical)
952 (status identical)
949
953
950 === :other -> :local ===
954 === :other -> :local ===
951 (no more unresolved files)
955 (no more unresolved files)
952 --- diff of status ---
956 --- diff of status ---
953 (status identical)
957 (status identical)
954
958
955 === :local -> :prompt ===
959 === :local -> :prompt ===
956 local changed file1 which remote deleted
960 local changed file1 which remote deleted
957 use (c)hanged version, (d)elete, or leave (u)nresolved?
961 use (c)hanged version, (d)elete, or leave (u)nresolved?
958 remote changed file2 which local deleted
962 remote changed file2 which local deleted
959 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
963 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
960 --- diff of status ---
964 --- diff of status ---
961 (status identical)
965 (status identical)
962
966
963 === :prompt -> :other ===
967 === :prompt -> :other ===
964 (no more unresolved files)
968 (no more unresolved files)
965 --- diff of status ---
969 --- diff of status ---
966 (status identical)
970 (status identical)
967
971
968 === :other -> :fail ===
972 === :other -> :fail ===
969 --- diff of status ---
973 --- diff of status ---
970 (status identical)
974 (status identical)
971
975
972 === :fail -> :prompt ===
976 === :fail -> :prompt ===
973 local changed file1 which remote deleted
977 local changed file1 which remote deleted
974 use (c)hanged version, (d)elete, or leave (u)nresolved?
978 use (c)hanged version, (d)elete, or leave (u)nresolved?
975 remote changed file2 which local deleted
979 remote changed file2 which local deleted
976 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
980 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
977 --- diff of status ---
981 --- diff of status ---
978 (status identical)
982 (status identical)
979
983
980 === :prompt -> :fail ===
984 === :prompt -> :fail ===
981 --- diff of status ---
985 --- diff of status ---
982 (status identical)
986 (status identical)
983
987
984 === :fail -> :local ===
988 === :fail -> :local ===
985 (no more unresolved files)
989 (no more unresolved files)
986 --- diff of status ---
990 --- diff of status ---
987 (status identical)
991 (status identical)
988
992
@@ -1,782 +1,782 b''
1 Set up a base, local, and remote changeset, as well as the working copy state.
1 Set up a base, local, and remote changeset, as well as the working copy state.
2 Files names are of the form base_remote_local_working-copy. For example,
2 Files names are of the form base_remote_local_working-copy. For example,
3 content1_content2_content1_content2-untracked represents a
3 content1_content2_content1_content2-untracked represents a
4 file that was modified in the remote changeset, left untouched in the
4 file that was modified in the remote changeset, left untouched in the
5 local changeset, and then modified in the working copy to match the
5 local changeset, and then modified in the working copy to match the
6 remote content, then finally forgotten.
6 remote content, then finally forgotten.
7
7
8 $ hg init repo
8 $ hg init repo
9 $ cd repo
9 $ cd repo
10
10
11 Create base changeset
11 Create base changeset
12
12
13 $ python $TESTDIR/generate-working-copy-states.py state 3 1
13 $ python $TESTDIR/generate-working-copy-states.py state 3 1
14 $ hg addremove -q --similarity 0
14 $ hg addremove -q --similarity 0
15 $ hg commit -qm 'base'
15 $ hg commit -qm 'base'
16
16
17 Create remote changeset
17 Create remote changeset
18
18
19 $ python $TESTDIR/generate-working-copy-states.py state 3 2
19 $ python $TESTDIR/generate-working-copy-states.py state 3 2
20 $ hg addremove -q --similarity 0
20 $ hg addremove -q --similarity 0
21 $ hg commit -qm 'remote'
21 $ hg commit -qm 'remote'
22
22
23 Create local changeset
23 Create local changeset
24
24
25 $ hg update -q 0
25 $ hg update -q 0
26 $ python $TESTDIR/generate-working-copy-states.py state 3 3
26 $ python $TESTDIR/generate-working-copy-states.py state 3 3
27 $ hg addremove -q --similarity 0
27 $ hg addremove -q --similarity 0
28 $ hg commit -qm 'local'
28 $ hg commit -qm 'local'
29
29
30 Set up working directory
30 Set up working directory
31
31
32 $ python $TESTDIR/generate-working-copy-states.py state 3 wc
32 $ python $TESTDIR/generate-working-copy-states.py state 3 wc
33 $ hg addremove -q --similarity 0
33 $ hg addremove -q --similarity 0
34 $ hg forget *_*_*_*-untracked
34 $ hg forget *_*_*_*-untracked
35 $ rm *_*_*_missing-*
35 $ rm *_*_*_missing-*
36
36
37 $ hg status -A
37 $ hg status -A
38 M content1_content1_content1_content4-tracked
38 M content1_content1_content1_content4-tracked
39 M content1_content1_content3_content1-tracked
39 M content1_content1_content3_content1-tracked
40 M content1_content1_content3_content4-tracked
40 M content1_content1_content3_content4-tracked
41 M content1_content2_content1_content2-tracked
41 M content1_content2_content1_content2-tracked
42 M content1_content2_content1_content4-tracked
42 M content1_content2_content1_content4-tracked
43 M content1_content2_content2_content1-tracked
43 M content1_content2_content2_content1-tracked
44 M content1_content2_content2_content4-tracked
44 M content1_content2_content2_content4-tracked
45 M content1_content2_content3_content1-tracked
45 M content1_content2_content3_content1-tracked
46 M content1_content2_content3_content2-tracked
46 M content1_content2_content3_content2-tracked
47 M content1_content2_content3_content4-tracked
47 M content1_content2_content3_content4-tracked
48 M content1_missing_content1_content4-tracked
48 M content1_missing_content1_content4-tracked
49 M content1_missing_content3_content1-tracked
49 M content1_missing_content3_content1-tracked
50 M content1_missing_content3_content4-tracked
50 M content1_missing_content3_content4-tracked
51 M missing_content2_content2_content4-tracked
51 M missing_content2_content2_content4-tracked
52 M missing_content2_content3_content2-tracked
52 M missing_content2_content3_content2-tracked
53 M missing_content2_content3_content4-tracked
53 M missing_content2_content3_content4-tracked
54 M missing_missing_content3_content4-tracked
54 M missing_missing_content3_content4-tracked
55 A content1_content1_missing_content1-tracked
55 A content1_content1_missing_content1-tracked
56 A content1_content1_missing_content4-tracked
56 A content1_content1_missing_content4-tracked
57 A content1_content2_missing_content1-tracked
57 A content1_content2_missing_content1-tracked
58 A content1_content2_missing_content2-tracked
58 A content1_content2_missing_content2-tracked
59 A content1_content2_missing_content4-tracked
59 A content1_content2_missing_content4-tracked
60 A content1_missing_missing_content1-tracked
60 A content1_missing_missing_content1-tracked
61 A content1_missing_missing_content4-tracked
61 A content1_missing_missing_content4-tracked
62 A missing_content2_missing_content2-tracked
62 A missing_content2_missing_content2-tracked
63 A missing_content2_missing_content4-tracked
63 A missing_content2_missing_content4-tracked
64 A missing_missing_missing_content4-tracked
64 A missing_missing_missing_content4-tracked
65 R content1_content1_content1_content1-untracked
65 R content1_content1_content1_content1-untracked
66 R content1_content1_content1_content4-untracked
66 R content1_content1_content1_content4-untracked
67 R content1_content1_content1_missing-untracked
67 R content1_content1_content1_missing-untracked
68 R content1_content1_content3_content1-untracked
68 R content1_content1_content3_content1-untracked
69 R content1_content1_content3_content3-untracked
69 R content1_content1_content3_content3-untracked
70 R content1_content1_content3_content4-untracked
70 R content1_content1_content3_content4-untracked
71 R content1_content1_content3_missing-untracked
71 R content1_content1_content3_missing-untracked
72 R content1_content2_content1_content1-untracked
72 R content1_content2_content1_content1-untracked
73 R content1_content2_content1_content2-untracked
73 R content1_content2_content1_content2-untracked
74 R content1_content2_content1_content4-untracked
74 R content1_content2_content1_content4-untracked
75 R content1_content2_content1_missing-untracked
75 R content1_content2_content1_missing-untracked
76 R content1_content2_content2_content1-untracked
76 R content1_content2_content2_content1-untracked
77 R content1_content2_content2_content2-untracked
77 R content1_content2_content2_content2-untracked
78 R content1_content2_content2_content4-untracked
78 R content1_content2_content2_content4-untracked
79 R content1_content2_content2_missing-untracked
79 R content1_content2_content2_missing-untracked
80 R content1_content2_content3_content1-untracked
80 R content1_content2_content3_content1-untracked
81 R content1_content2_content3_content2-untracked
81 R content1_content2_content3_content2-untracked
82 R content1_content2_content3_content3-untracked
82 R content1_content2_content3_content3-untracked
83 R content1_content2_content3_content4-untracked
83 R content1_content2_content3_content4-untracked
84 R content1_content2_content3_missing-untracked
84 R content1_content2_content3_missing-untracked
85 R content1_missing_content1_content1-untracked
85 R content1_missing_content1_content1-untracked
86 R content1_missing_content1_content4-untracked
86 R content1_missing_content1_content4-untracked
87 R content1_missing_content1_missing-untracked
87 R content1_missing_content1_missing-untracked
88 R content1_missing_content3_content1-untracked
88 R content1_missing_content3_content1-untracked
89 R content1_missing_content3_content3-untracked
89 R content1_missing_content3_content3-untracked
90 R content1_missing_content3_content4-untracked
90 R content1_missing_content3_content4-untracked
91 R content1_missing_content3_missing-untracked
91 R content1_missing_content3_missing-untracked
92 R missing_content2_content2_content2-untracked
92 R missing_content2_content2_content2-untracked
93 R missing_content2_content2_content4-untracked
93 R missing_content2_content2_content4-untracked
94 R missing_content2_content2_missing-untracked
94 R missing_content2_content2_missing-untracked
95 R missing_content2_content3_content2-untracked
95 R missing_content2_content3_content2-untracked
96 R missing_content2_content3_content3-untracked
96 R missing_content2_content3_content3-untracked
97 R missing_content2_content3_content4-untracked
97 R missing_content2_content3_content4-untracked
98 R missing_content2_content3_missing-untracked
98 R missing_content2_content3_missing-untracked
99 R missing_missing_content3_content3-untracked
99 R missing_missing_content3_content3-untracked
100 R missing_missing_content3_content4-untracked
100 R missing_missing_content3_content4-untracked
101 R missing_missing_content3_missing-untracked
101 R missing_missing_content3_missing-untracked
102 ! content1_content1_content1_missing-tracked
102 ! content1_content1_content1_missing-tracked
103 ! content1_content1_content3_missing-tracked
103 ! content1_content1_content3_missing-tracked
104 ! content1_content1_missing_missing-tracked
104 ! content1_content1_missing_missing-tracked
105 ! content1_content2_content1_missing-tracked
105 ! content1_content2_content1_missing-tracked
106 ! content1_content2_content2_missing-tracked
106 ! content1_content2_content2_missing-tracked
107 ! content1_content2_content3_missing-tracked
107 ! content1_content2_content3_missing-tracked
108 ! content1_content2_missing_missing-tracked
108 ! content1_content2_missing_missing-tracked
109 ! content1_missing_content1_missing-tracked
109 ! content1_missing_content1_missing-tracked
110 ! content1_missing_content3_missing-tracked
110 ! content1_missing_content3_missing-tracked
111 ! content1_missing_missing_missing-tracked
111 ! content1_missing_missing_missing-tracked
112 ! missing_content2_content2_missing-tracked
112 ! missing_content2_content2_missing-tracked
113 ! missing_content2_content3_missing-tracked
113 ! missing_content2_content3_missing-tracked
114 ! missing_content2_missing_missing-tracked
114 ! missing_content2_missing_missing-tracked
115 ! missing_missing_content3_missing-tracked
115 ! missing_missing_content3_missing-tracked
116 ! missing_missing_missing_missing-tracked
116 ! missing_missing_missing_missing-tracked
117 ? content1_content1_missing_content1-untracked
117 ? content1_content1_missing_content1-untracked
118 ? content1_content1_missing_content4-untracked
118 ? content1_content1_missing_content4-untracked
119 ? content1_content2_missing_content1-untracked
119 ? content1_content2_missing_content1-untracked
120 ? content1_content2_missing_content2-untracked
120 ? content1_content2_missing_content2-untracked
121 ? content1_content2_missing_content4-untracked
121 ? content1_content2_missing_content4-untracked
122 ? content1_missing_missing_content1-untracked
122 ? content1_missing_missing_content1-untracked
123 ? content1_missing_missing_content4-untracked
123 ? content1_missing_missing_content4-untracked
124 ? missing_content2_missing_content2-untracked
124 ? missing_content2_missing_content2-untracked
125 ? missing_content2_missing_content4-untracked
125 ? missing_content2_missing_content4-untracked
126 ? missing_missing_missing_content4-untracked
126 ? missing_missing_missing_content4-untracked
127 C content1_content1_content1_content1-tracked
127 C content1_content1_content1_content1-tracked
128 C content1_content1_content3_content3-tracked
128 C content1_content1_content3_content3-tracked
129 C content1_content2_content1_content1-tracked
129 C content1_content2_content1_content1-tracked
130 C content1_content2_content2_content2-tracked
130 C content1_content2_content2_content2-tracked
131 C content1_content2_content3_content3-tracked
131 C content1_content2_content3_content3-tracked
132 C content1_missing_content1_content1-tracked
132 C content1_missing_content1_content1-tracked
133 C content1_missing_content3_content3-tracked
133 C content1_missing_content3_content3-tracked
134 C missing_content2_content2_content2-tracked
134 C missing_content2_content2_content2-tracked
135 C missing_content2_content3_content3-tracked
135 C missing_content2_content3_content3-tracked
136 C missing_missing_content3_content3-tracked
136 C missing_missing_content3_content3-tracked
137
137
138 Merge with remote
138 Merge with remote
139
139
140 # Notes:
140 # Notes:
141 # - local and remote changed content1_content2_*_content2-untracked
141 # - local and remote changed content1_content2_*_content2-untracked
142 # in the same way, so it could potentially be left alone
142 # in the same way, so it could potentially be left alone
143
143
144 $ hg merge -f --tool internal:merge3 'desc("remote")'
144 $ hg merge -f --tool internal:merge3 'desc("remote")'
145 local changed content1_missing_content1_content4-tracked which remote deleted
145 local changed content1_missing_content1_content4-tracked which remote deleted
146 use (c)hanged version, (d)elete, or leave (u)nresolved? c
146 use (c)hanged version, (d)elete, or leave (u)nresolved? u
147 local changed content1_missing_content3_content3-tracked which remote deleted
147 local changed content1_missing_content3_content3-tracked which remote deleted
148 use (c)hanged version, (d)elete, or leave (u)nresolved? c
148 use (c)hanged version, (d)elete, or leave (u)nresolved? u
149 local changed content1_missing_content3_content4-tracked which remote deleted
149 local changed content1_missing_content3_content4-tracked which remote deleted
150 use (c)hanged version, (d)elete, or leave (u)nresolved? c
150 use (c)hanged version, (d)elete, or leave (u)nresolved? u
151 local changed content1_missing_missing_content4-tracked which remote deleted
151 local changed content1_missing_missing_content4-tracked which remote deleted
152 use (c)hanged version, (d)elete, or leave (u)nresolved? c
152 use (c)hanged version, (d)elete, or leave (u)nresolved? u
153 remote changed content1_content2_content1_content1-untracked which local deleted
153 remote changed content1_content2_content1_content1-untracked which local deleted
154 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
154 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
155 remote changed content1_content2_content1_content2-untracked which local deleted
155 remote changed content1_content2_content1_content2-untracked which local deleted
156 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
156 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
157 remote changed content1_content2_content1_content4-untracked which local deleted
157 remote changed content1_content2_content1_content4-untracked which local deleted
158 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
158 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
159 remote changed content1_content2_content1_missing-tracked which local deleted
159 remote changed content1_content2_content1_missing-tracked which local deleted
160 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
160 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
161 remote changed content1_content2_content1_missing-untracked which local deleted
161 remote changed content1_content2_content1_missing-untracked which local deleted
162 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
162 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
163 remote changed content1_content2_content2_content1-untracked which local deleted
163 remote changed content1_content2_content2_content1-untracked which local deleted
164 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
164 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
165 remote changed content1_content2_content2_content2-untracked which local deleted
165 remote changed content1_content2_content2_content2-untracked which local deleted
166 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
166 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
167 remote changed content1_content2_content2_content4-untracked which local deleted
167 remote changed content1_content2_content2_content4-untracked which local deleted
168 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
168 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
169 remote changed content1_content2_content2_missing-tracked which local deleted
169 remote changed content1_content2_content2_missing-tracked which local deleted
170 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
170 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
171 remote changed content1_content2_content2_missing-untracked which local deleted
171 remote changed content1_content2_content2_missing-untracked which local deleted
172 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
172 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
173 remote changed content1_content2_content3_content1-untracked which local deleted
173 remote changed content1_content2_content3_content1-untracked which local deleted
174 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
174 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
175 remote changed content1_content2_content3_content2-untracked which local deleted
175 remote changed content1_content2_content3_content2-untracked which local deleted
176 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
176 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
177 remote changed content1_content2_content3_content3-untracked which local deleted
177 remote changed content1_content2_content3_content3-untracked which local deleted
178 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
178 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
179 remote changed content1_content2_content3_content4-untracked which local deleted
179 remote changed content1_content2_content3_content4-untracked which local deleted
180 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
180 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
181 remote changed content1_content2_content3_missing-tracked which local deleted
181 remote changed content1_content2_content3_missing-tracked which local deleted
182 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
182 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
183 remote changed content1_content2_content3_missing-untracked which local deleted
183 remote changed content1_content2_content3_missing-untracked which local deleted
184 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
184 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
185 remote changed content1_content2_missing_content1-untracked which local deleted
185 remote changed content1_content2_missing_content1-untracked which local deleted
186 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
186 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
187 remote changed content1_content2_missing_content2-untracked which local deleted
187 remote changed content1_content2_missing_content2-untracked which local deleted
188 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
188 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
189 remote changed content1_content2_missing_content4-untracked which local deleted
189 remote changed content1_content2_missing_content4-untracked which local deleted
190 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
190 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
191 remote changed content1_content2_missing_missing-tracked which local deleted
191 remote changed content1_content2_missing_missing-tracked which local deleted
192 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
192 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
193 remote changed content1_content2_missing_missing-untracked which local deleted
193 remote changed content1_content2_missing_missing-untracked which local deleted
194 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
194 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
195 merging content1_content2_content1_content4-tracked
195 merging content1_content2_content1_content4-tracked
196 merging content1_content2_content2_content1-tracked
196 merging content1_content2_content2_content1-tracked
197 merging content1_content2_content2_content4-tracked
197 merging content1_content2_content2_content4-tracked
198 merging content1_content2_content3_content1-tracked
198 merging content1_content2_content3_content1-tracked
199 merging content1_content2_content3_content3-tracked
199 merging content1_content2_content3_content3-tracked
200 merging content1_content2_content3_content4-tracked
200 merging content1_content2_content3_content4-tracked
201 merging content1_content2_missing_content1-tracked
201 merging content1_content2_missing_content1-tracked
202 merging content1_content2_missing_content4-tracked
202 merging content1_content2_missing_content4-tracked
203 merging missing_content2_content2_content4-tracked
203 merging missing_content2_content2_content4-tracked
204 merging missing_content2_content3_content3-tracked
204 merging missing_content2_content3_content3-tracked
205 merging missing_content2_content3_content4-tracked
205 merging missing_content2_content3_content4-tracked
206 merging missing_content2_missing_content4-tracked
206 merging missing_content2_missing_content4-tracked
207 merging missing_content2_missing_content4-untracked
207 merging missing_content2_missing_content4-untracked
208 warning: conflicts while merging content1_content2_content1_content4-tracked! (edit, then use 'hg resolve --mark')
208 warning: conflicts while merging content1_content2_content1_content4-tracked! (edit, then use 'hg resolve --mark')
209 warning: conflicts while merging content1_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
209 warning: conflicts while merging content1_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
210 warning: conflicts while merging content1_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
210 warning: conflicts while merging content1_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
211 warning: conflicts while merging content1_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
211 warning: conflicts while merging content1_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
212 warning: conflicts while merging content1_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
212 warning: conflicts while merging content1_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
213 warning: conflicts while merging missing_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
213 warning: conflicts while merging missing_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
214 warning: conflicts while merging missing_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
214 warning: conflicts while merging missing_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
215 warning: conflicts while merging missing_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
215 warning: conflicts while merging missing_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
216 warning: conflicts while merging missing_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
216 warning: conflicts while merging missing_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
217 warning: conflicts while merging missing_content2_missing_content4-untracked! (edit, then use 'hg resolve --mark')
217 warning: conflicts while merging missing_content2_missing_content4-untracked! (edit, then use 'hg resolve --mark')
218 18 files updated, 28 files merged, 8 files removed, 10 files unresolved
218 18 files updated, 3 files merged, 8 files removed, 35 files unresolved
219 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
219 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
220 [1]
220 [1]
221
221
222 Check which files need to be resolved (should correspond to the output above).
222 Check which files need to be resolved (should correspond to the output above).
223 This should be the files for which the base (1st filename segment), the remote
223 This should be the files for which the base (1st filename segment), the remote
224 (2nd segment) and the working copy (4th segment) are all different.
224 (2nd segment) and the working copy (4th segment) are all different.
225
225
226 Interestingly, one untracked file got merged and added, which corresponds to the
226 Interestingly, one untracked file got merged and added, which corresponds to the
227 odd 'if force and branchmerge and different' case in manifestmerge().
227 odd 'if force and branchmerge and different' case in manifestmerge().
228
228
229 $ hg resolve -l
229 $ hg resolve -l
230 R content1_content2_content1_content1-untracked
230 U content1_content2_content1_content1-untracked
231 R content1_content2_content1_content2-untracked
231 U content1_content2_content1_content2-untracked
232 U content1_content2_content1_content4-tracked
232 U content1_content2_content1_content4-tracked
233 R content1_content2_content1_content4-untracked
233 U content1_content2_content1_content4-untracked
234 R content1_content2_content1_missing-tracked
234 U content1_content2_content1_missing-tracked
235 R content1_content2_content1_missing-untracked
235 U content1_content2_content1_missing-untracked
236 R content1_content2_content2_content1-tracked
236 R content1_content2_content2_content1-tracked
237 R content1_content2_content2_content1-untracked
237 U content1_content2_content2_content1-untracked
238 R content1_content2_content2_content2-untracked
238 U content1_content2_content2_content2-untracked
239 U content1_content2_content2_content4-tracked
239 U content1_content2_content2_content4-tracked
240 R content1_content2_content2_content4-untracked
240 U content1_content2_content2_content4-untracked
241 R content1_content2_content2_missing-tracked
241 U content1_content2_content2_missing-tracked
242 R content1_content2_content2_missing-untracked
242 U content1_content2_content2_missing-untracked
243 R content1_content2_content3_content1-tracked
243 R content1_content2_content3_content1-tracked
244 R content1_content2_content3_content1-untracked
244 U content1_content2_content3_content1-untracked
245 R content1_content2_content3_content2-untracked
245 U content1_content2_content3_content2-untracked
246 U content1_content2_content3_content3-tracked
246 U content1_content2_content3_content3-tracked
247 R content1_content2_content3_content3-untracked
247 U content1_content2_content3_content3-untracked
248 U content1_content2_content3_content4-tracked
248 U content1_content2_content3_content4-tracked
249 R content1_content2_content3_content4-untracked
249 U content1_content2_content3_content4-untracked
250 R content1_content2_content3_missing-tracked
250 U content1_content2_content3_missing-tracked
251 R content1_content2_content3_missing-untracked
251 U content1_content2_content3_missing-untracked
252 R content1_content2_missing_content1-tracked
252 R content1_content2_missing_content1-tracked
253 R content1_content2_missing_content1-untracked
253 U content1_content2_missing_content1-untracked
254 R content1_content2_missing_content2-untracked
254 U content1_content2_missing_content2-untracked
255 U content1_content2_missing_content4-tracked
255 U content1_content2_missing_content4-tracked
256 R content1_content2_missing_content4-untracked
256 U content1_content2_missing_content4-untracked
257 R content1_content2_missing_missing-tracked
257 U content1_content2_missing_missing-tracked
258 R content1_content2_missing_missing-untracked
258 U content1_content2_missing_missing-untracked
259 R content1_missing_content1_content4-tracked
259 U content1_missing_content1_content4-tracked
260 R content1_missing_content3_content3-tracked
260 U content1_missing_content3_content3-tracked
261 R content1_missing_content3_content4-tracked
261 U content1_missing_content3_content4-tracked
262 R content1_missing_missing_content4-tracked
262 U content1_missing_missing_content4-tracked
263 U missing_content2_content2_content4-tracked
263 U missing_content2_content2_content4-tracked
264 U missing_content2_content3_content3-tracked
264 U missing_content2_content3_content3-tracked
265 U missing_content2_content3_content4-tracked
265 U missing_content2_content3_content4-tracked
266 U missing_content2_missing_content4-tracked
266 U missing_content2_missing_content4-tracked
267 U missing_content2_missing_content4-untracked
267 U missing_content2_missing_content4-untracked
268
268
269 Check status and file content
269 Check status and file content
270
270
271 Some files get added (e.g. content1_content2_content1_content1-untracked)
271 Some files get added (e.g. content1_content2_content1_content1-untracked)
272
272
273 It is not intuitive that content1_content2_content1_content4-tracked gets
273 It is not intuitive that content1_content2_content1_content4-tracked gets
274 merged while content1_content2_content1_content4-untracked gets overwritten.
274 merged while content1_content2_content1_content4-untracked gets overwritten.
275 Any *_content2_*-untracked triggers the modified/deleted prompt and then gets
275 Any *_content2_*-untracked triggers the modified/deleted prompt and then gets
276 overwritten.
276 overwritten.
277
277
278 A lot of untracked files become tracked, for example
278 A lot of untracked files become tracked, for example
279 content1_content2_content2_content2-untracked.
279 content1_content2_content2_content2-untracked.
280
280
281 *_missing_missing_missing-tracked is reported as removed ('R'), which
281 *_missing_missing_missing-tracked is reported as removed ('R'), which
282 doesn't make sense since the file did not exist in the parent, but on the
282 doesn't make sense since the file did not exist in the parent, but on the
283 other hand, merged-in additions are reported as modifications, which is
283 other hand, merged-in additions are reported as modifications, which is
284 almost as strange.
284 almost as strange.
285
285
286 missing_missing_content3_missing-tracked becomes removed ('R'), even though
286 missing_missing_content3_missing-tracked becomes removed ('R'), even though
287 the remote side did not touch the file
287 the remote side did not touch the file
288
288
289 $ checkstatus() {
289 $ checkstatus() {
290 > for f in `python $TESTDIR/generate-working-copy-states.py filelist 3`
290 > for f in `python $TESTDIR/generate-working-copy-states.py filelist 3`
291 > do
291 > do
292 > echo
292 > echo
293 > hg status -A $f
293 > hg status -A $f
294 > if test -f $f
294 > if test -f $f
295 > then
295 > then
296 > cat $f
296 > cat $f
297 > else
297 > else
298 > echo '<missing>'
298 > echo '<missing>'
299 > fi
299 > fi
300 > done
300 > done
301 > }
301 > }
302 $ checkstatus 2>&1 | tee $TESTTMP/status1
302 $ checkstatus 2>&1 | tee $TESTTMP/status1
303
303
304 C content1_content1_content1_content1-tracked
304 C content1_content1_content1_content1-tracked
305 content1
305 content1
306
306
307 R content1_content1_content1_content1-untracked
307 R content1_content1_content1_content1-untracked
308 content1
308 content1
309
309
310 M content1_content1_content1_content4-tracked
310 M content1_content1_content1_content4-tracked
311 content4
311 content4
312
312
313 R content1_content1_content1_content4-untracked
313 R content1_content1_content1_content4-untracked
314 content4
314 content4
315
315
316 ! content1_content1_content1_missing-tracked
316 ! content1_content1_content1_missing-tracked
317 <missing>
317 <missing>
318
318
319 R content1_content1_content1_missing-untracked
319 R content1_content1_content1_missing-untracked
320 <missing>
320 <missing>
321
321
322 M content1_content1_content3_content1-tracked
322 M content1_content1_content3_content1-tracked
323 content1
323 content1
324
324
325 R content1_content1_content3_content1-untracked
325 R content1_content1_content3_content1-untracked
326 content1
326 content1
327
327
328 C content1_content1_content3_content3-tracked
328 C content1_content1_content3_content3-tracked
329 content3
329 content3
330
330
331 R content1_content1_content3_content3-untracked
331 R content1_content1_content3_content3-untracked
332 content3
332 content3
333
333
334 M content1_content1_content3_content4-tracked
334 M content1_content1_content3_content4-tracked
335 content4
335 content4
336
336
337 R content1_content1_content3_content4-untracked
337 R content1_content1_content3_content4-untracked
338 content4
338 content4
339
339
340 ! content1_content1_content3_missing-tracked
340 ! content1_content1_content3_missing-tracked
341 <missing>
341 <missing>
342
342
343 R content1_content1_content3_missing-untracked
343 R content1_content1_content3_missing-untracked
344 <missing>
344 <missing>
345
345
346 A content1_content1_missing_content1-tracked
346 A content1_content1_missing_content1-tracked
347 content1
347 content1
348
348
349 ? content1_content1_missing_content1-untracked
349 ? content1_content1_missing_content1-untracked
350 content1
350 content1
351
351
352 A content1_content1_missing_content4-tracked
352 A content1_content1_missing_content4-tracked
353 content4
353 content4
354
354
355 ? content1_content1_missing_content4-untracked
355 ? content1_content1_missing_content4-untracked
356 content4
356 content4
357
357
358 ! content1_content1_missing_missing-tracked
358 ! content1_content1_missing_missing-tracked
359 <missing>
359 <missing>
360
360
361 content1_content1_missing_missing-untracked: * (glob)
361 content1_content1_missing_missing-untracked: * (glob)
362 <missing>
362 <missing>
363
363
364 M content1_content2_content1_content1-tracked
364 M content1_content2_content1_content1-tracked
365 content2
365 content2
366
366
367 M content1_content2_content1_content1-untracked
367 M content1_content2_content1_content1-untracked
368 content2
368 content2
369
369
370 M content1_content2_content1_content2-tracked
370 M content1_content2_content1_content2-tracked
371 content2
371 content2
372
372
373 M content1_content2_content1_content2-untracked
373 M content1_content2_content1_content2-untracked
374 content2
374 content2
375
375
376 M content1_content2_content1_content4-tracked
376 M content1_content2_content1_content4-tracked
377 <<<<<<< local: 0447570f1af6 - test: local
377 <<<<<<< local: 0447570f1af6 - test: local
378 content4
378 content4
379 ||||||| base
379 ||||||| base
380 content1
380 content1
381 =======
381 =======
382 content2
382 content2
383 >>>>>>> other: 85100b8c675b - test: remote
383 >>>>>>> other: 85100b8c675b - test: remote
384
384
385 M content1_content2_content1_content4-untracked
385 M content1_content2_content1_content4-untracked
386 content2
386 content2
387
387
388 M content1_content2_content1_missing-tracked
388 M content1_content2_content1_missing-tracked
389 content2
389 content2
390
390
391 M content1_content2_content1_missing-untracked
391 M content1_content2_content1_missing-untracked
392 content2
392 content2
393
393
394 M content1_content2_content2_content1-tracked
394 M content1_content2_content2_content1-tracked
395 content2
395 content2
396
396
397 M content1_content2_content2_content1-untracked
397 M content1_content2_content2_content1-untracked
398 content2
398 content2
399
399
400 C content1_content2_content2_content2-tracked
400 C content1_content2_content2_content2-tracked
401 content2
401 content2
402
402
403 M content1_content2_content2_content2-untracked
403 M content1_content2_content2_content2-untracked
404 content2
404 content2
405
405
406 M content1_content2_content2_content4-tracked
406 M content1_content2_content2_content4-tracked
407 <<<<<<< local: 0447570f1af6 - test: local
407 <<<<<<< local: 0447570f1af6 - test: local
408 content4
408 content4
409 ||||||| base
409 ||||||| base
410 content1
410 content1
411 =======
411 =======
412 content2
412 content2
413 >>>>>>> other: 85100b8c675b - test: remote
413 >>>>>>> other: 85100b8c675b - test: remote
414
414
415 M content1_content2_content2_content4-untracked
415 M content1_content2_content2_content4-untracked
416 content2
416 content2
417
417
418 M content1_content2_content2_missing-tracked
418 M content1_content2_content2_missing-tracked
419 content2
419 content2
420
420
421 M content1_content2_content2_missing-untracked
421 M content1_content2_content2_missing-untracked
422 content2
422 content2
423
423
424 M content1_content2_content3_content1-tracked
424 M content1_content2_content3_content1-tracked
425 content2
425 content2
426
426
427 M content1_content2_content3_content1-untracked
427 M content1_content2_content3_content1-untracked
428 content2
428 content2
429
429
430 M content1_content2_content3_content2-tracked
430 M content1_content2_content3_content2-tracked
431 content2
431 content2
432
432
433 M content1_content2_content3_content2-untracked
433 M content1_content2_content3_content2-untracked
434 content2
434 content2
435
435
436 M content1_content2_content3_content3-tracked
436 M content1_content2_content3_content3-tracked
437 <<<<<<< local: 0447570f1af6 - test: local
437 <<<<<<< local: 0447570f1af6 - test: local
438 content3
438 content3
439 ||||||| base
439 ||||||| base
440 content1
440 content1
441 =======
441 =======
442 content2
442 content2
443 >>>>>>> other: 85100b8c675b - test: remote
443 >>>>>>> other: 85100b8c675b - test: remote
444
444
445 M content1_content2_content3_content3-untracked
445 M content1_content2_content3_content3-untracked
446 content2
446 content2
447
447
448 M content1_content2_content3_content4-tracked
448 M content1_content2_content3_content4-tracked
449 <<<<<<< local: 0447570f1af6 - test: local
449 <<<<<<< local: 0447570f1af6 - test: local
450 content4
450 content4
451 ||||||| base
451 ||||||| base
452 content1
452 content1
453 =======
453 =======
454 content2
454 content2
455 >>>>>>> other: 85100b8c675b - test: remote
455 >>>>>>> other: 85100b8c675b - test: remote
456
456
457 M content1_content2_content3_content4-untracked
457 M content1_content2_content3_content4-untracked
458 content2
458 content2
459
459
460 M content1_content2_content3_missing-tracked
460 M content1_content2_content3_missing-tracked
461 content2
461 content2
462
462
463 M content1_content2_content3_missing-untracked
463 M content1_content2_content3_missing-untracked
464 content2
464 content2
465
465
466 M content1_content2_missing_content1-tracked
466 M content1_content2_missing_content1-tracked
467 content2
467 content2
468
468
469 M content1_content2_missing_content1-untracked
469 M content1_content2_missing_content1-untracked
470 content2
470 content2
471
471
472 M content1_content2_missing_content2-tracked
472 M content1_content2_missing_content2-tracked
473 content2
473 content2
474
474
475 M content1_content2_missing_content2-untracked
475 M content1_content2_missing_content2-untracked
476 content2
476 content2
477
477
478 M content1_content2_missing_content4-tracked
478 M content1_content2_missing_content4-tracked
479 <<<<<<< local: 0447570f1af6 - test: local
479 <<<<<<< local: 0447570f1af6 - test: local
480 content4
480 content4
481 ||||||| base
481 ||||||| base
482 content1
482 content1
483 =======
483 =======
484 content2
484 content2
485 >>>>>>> other: 85100b8c675b - test: remote
485 >>>>>>> other: 85100b8c675b - test: remote
486
486
487 M content1_content2_missing_content4-untracked
487 M content1_content2_missing_content4-untracked
488 content2
488 content2
489
489
490 M content1_content2_missing_missing-tracked
490 M content1_content2_missing_missing-tracked
491 content2
491 content2
492
492
493 M content1_content2_missing_missing-untracked
493 M content1_content2_missing_missing-untracked
494 content2
494 content2
495
495
496 R content1_missing_content1_content1-tracked
496 R content1_missing_content1_content1-tracked
497 <missing>
497 <missing>
498
498
499 R content1_missing_content1_content1-untracked
499 R content1_missing_content1_content1-untracked
500 content1
500 content1
501
501
502 M content1_missing_content1_content4-tracked
502 M content1_missing_content1_content4-tracked
503 content4
503 content4
504
504
505 R content1_missing_content1_content4-untracked
505 R content1_missing_content1_content4-untracked
506 content4
506 content4
507
507
508 R content1_missing_content1_missing-tracked
508 R content1_missing_content1_missing-tracked
509 <missing>
509 <missing>
510
510
511 R content1_missing_content1_missing-untracked
511 R content1_missing_content1_missing-untracked
512 <missing>
512 <missing>
513
513
514 R content1_missing_content3_content1-tracked
514 R content1_missing_content3_content1-tracked
515 <missing>
515 <missing>
516
516
517 R content1_missing_content3_content1-untracked
517 R content1_missing_content3_content1-untracked
518 content1
518 content1
519
519
520 C content1_missing_content3_content3-tracked
520 C content1_missing_content3_content3-tracked
521 content3
521 content3
522
522
523 R content1_missing_content3_content3-untracked
523 R content1_missing_content3_content3-untracked
524 content3
524 content3
525
525
526 M content1_missing_content3_content4-tracked
526 M content1_missing_content3_content4-tracked
527 content4
527 content4
528
528
529 R content1_missing_content3_content4-untracked
529 R content1_missing_content3_content4-untracked
530 content4
530 content4
531
531
532 R content1_missing_content3_missing-tracked
532 R content1_missing_content3_missing-tracked
533 <missing>
533 <missing>
534
534
535 R content1_missing_content3_missing-untracked
535 R content1_missing_content3_missing-untracked
536 <missing>
536 <missing>
537
537
538 R content1_missing_missing_content1-tracked
538 R content1_missing_missing_content1-tracked
539 <missing>
539 <missing>
540
540
541 ? content1_missing_missing_content1-untracked
541 ? content1_missing_missing_content1-untracked
542 content1
542 content1
543
543
544 A content1_missing_missing_content4-tracked
544 A content1_missing_missing_content4-tracked
545 content4
545 content4
546
546
547 ? content1_missing_missing_content4-untracked
547 ? content1_missing_missing_content4-untracked
548 content4
548 content4
549
549
550 R content1_missing_missing_missing-tracked
550 R content1_missing_missing_missing-tracked
551 <missing>
551 <missing>
552
552
553 content1_missing_missing_missing-untracked: * (glob)
553 content1_missing_missing_missing-untracked: * (glob)
554 <missing>
554 <missing>
555
555
556 C missing_content2_content2_content2-tracked
556 C missing_content2_content2_content2-tracked
557 content2
557 content2
558
558
559 M missing_content2_content2_content2-untracked
559 M missing_content2_content2_content2-untracked
560 content2
560 content2
561
561
562 M missing_content2_content2_content4-tracked
562 M missing_content2_content2_content4-tracked
563 <<<<<<< local: 0447570f1af6 - test: local
563 <<<<<<< local: 0447570f1af6 - test: local
564 content4
564 content4
565 ||||||| base
565 ||||||| base
566 =======
566 =======
567 content2
567 content2
568 >>>>>>> other: 85100b8c675b - test: remote
568 >>>>>>> other: 85100b8c675b - test: remote
569
569
570 M missing_content2_content2_content4-untracked
570 M missing_content2_content2_content4-untracked
571 content2
571 content2
572
572
573 M missing_content2_content2_missing-tracked
573 M missing_content2_content2_missing-tracked
574 content2
574 content2
575
575
576 M missing_content2_content2_missing-untracked
576 M missing_content2_content2_missing-untracked
577 content2
577 content2
578
578
579 M missing_content2_content3_content2-tracked
579 M missing_content2_content3_content2-tracked
580 content2
580 content2
581
581
582 M missing_content2_content3_content2-untracked
582 M missing_content2_content3_content2-untracked
583 content2
583 content2
584
584
585 M missing_content2_content3_content3-tracked
585 M missing_content2_content3_content3-tracked
586 <<<<<<< local: 0447570f1af6 - test: local
586 <<<<<<< local: 0447570f1af6 - test: local
587 content3
587 content3
588 ||||||| base
588 ||||||| base
589 =======
589 =======
590 content2
590 content2
591 >>>>>>> other: 85100b8c675b - test: remote
591 >>>>>>> other: 85100b8c675b - test: remote
592
592
593 M missing_content2_content3_content3-untracked
593 M missing_content2_content3_content3-untracked
594 content2
594 content2
595
595
596 M missing_content2_content3_content4-tracked
596 M missing_content2_content3_content4-tracked
597 <<<<<<< local: 0447570f1af6 - test: local
597 <<<<<<< local: 0447570f1af6 - test: local
598 content4
598 content4
599 ||||||| base
599 ||||||| base
600 =======
600 =======
601 content2
601 content2
602 >>>>>>> other: 85100b8c675b - test: remote
602 >>>>>>> other: 85100b8c675b - test: remote
603
603
604 M missing_content2_content3_content4-untracked
604 M missing_content2_content3_content4-untracked
605 content2
605 content2
606
606
607 M missing_content2_content3_missing-tracked
607 M missing_content2_content3_missing-tracked
608 content2
608 content2
609
609
610 M missing_content2_content3_missing-untracked
610 M missing_content2_content3_missing-untracked
611 content2
611 content2
612
612
613 M missing_content2_missing_content2-tracked
613 M missing_content2_missing_content2-tracked
614 content2
614 content2
615
615
616 M missing_content2_missing_content2-untracked
616 M missing_content2_missing_content2-untracked
617 content2
617 content2
618
618
619 M missing_content2_missing_content4-tracked
619 M missing_content2_missing_content4-tracked
620 <<<<<<< local: 0447570f1af6 - test: local
620 <<<<<<< local: 0447570f1af6 - test: local
621 content4
621 content4
622 ||||||| base
622 ||||||| base
623 =======
623 =======
624 content2
624 content2
625 >>>>>>> other: 85100b8c675b - test: remote
625 >>>>>>> other: 85100b8c675b - test: remote
626
626
627 M missing_content2_missing_content4-untracked
627 M missing_content2_missing_content4-untracked
628 <<<<<<< local: 0447570f1af6 - test: local
628 <<<<<<< local: 0447570f1af6 - test: local
629 content4
629 content4
630 ||||||| base
630 ||||||| base
631 =======
631 =======
632 content2
632 content2
633 >>>>>>> other: 85100b8c675b - test: remote
633 >>>>>>> other: 85100b8c675b - test: remote
634
634
635 M missing_content2_missing_missing-tracked
635 M missing_content2_missing_missing-tracked
636 content2
636 content2
637
637
638 M missing_content2_missing_missing-untracked
638 M missing_content2_missing_missing-untracked
639 content2
639 content2
640
640
641 C missing_missing_content3_content3-tracked
641 C missing_missing_content3_content3-tracked
642 content3
642 content3
643
643
644 R missing_missing_content3_content3-untracked
644 R missing_missing_content3_content3-untracked
645 content3
645 content3
646
646
647 M missing_missing_content3_content4-tracked
647 M missing_missing_content3_content4-tracked
648 content4
648 content4
649
649
650 R missing_missing_content3_content4-untracked
650 R missing_missing_content3_content4-untracked
651 content4
651 content4
652
652
653 R missing_missing_content3_missing-tracked
653 R missing_missing_content3_missing-tracked
654 <missing>
654 <missing>
655
655
656 R missing_missing_content3_missing-untracked
656 R missing_missing_content3_missing-untracked
657 <missing>
657 <missing>
658
658
659 A missing_missing_missing_content4-tracked
659 A missing_missing_missing_content4-tracked
660 content4
660 content4
661
661
662 ? missing_missing_missing_content4-untracked
662 ? missing_missing_missing_content4-untracked
663 content4
663 content4
664
664
665 R missing_missing_missing_missing-tracked
665 R missing_missing_missing_missing-tracked
666 <missing>
666 <missing>
667
667
668 missing_missing_missing_missing-untracked: * (glob)
668 missing_missing_missing_missing-untracked: * (glob)
669 <missing>
669 <missing>
670
670
671 $ for f in `python $TESTDIR/generate-working-copy-states.py filelist 3`
671 $ for f in `python $TESTDIR/generate-working-copy-states.py filelist 3`
672 > do
672 > do
673 > if test -f ${f}.orig
673 > if test -f ${f}.orig
674 > then
674 > then
675 > echo ${f}.orig:
675 > echo ${f}.orig:
676 > cat ${f}.orig
676 > cat ${f}.orig
677 > fi
677 > fi
678 > done
678 > done
679 content1_content2_content1_content4-tracked.orig:
679 content1_content2_content1_content4-tracked.orig:
680 content4
680 content4
681 content1_content2_content2_content4-tracked.orig:
681 content1_content2_content2_content4-tracked.orig:
682 content4
682 content4
683 content1_content2_content3_content3-tracked.orig:
683 content1_content2_content3_content3-tracked.orig:
684 content3
684 content3
685 content1_content2_content3_content4-tracked.orig:
685 content1_content2_content3_content4-tracked.orig:
686 content4
686 content4
687 content1_content2_missing_content4-tracked.orig:
687 content1_content2_missing_content4-tracked.orig:
688 content4
688 content4
689 missing_content2_content2_content4-tracked.orig:
689 missing_content2_content2_content4-tracked.orig:
690 content4
690 content4
691 missing_content2_content3_content3-tracked.orig:
691 missing_content2_content3_content3-tracked.orig:
692 content3
692 content3
693 missing_content2_content3_content4-tracked.orig:
693 missing_content2_content3_content4-tracked.orig:
694 content4
694 content4
695 missing_content2_missing_content4-tracked.orig:
695 missing_content2_missing_content4-tracked.orig:
696 content4
696 content4
697 missing_content2_missing_content4-untracked.orig:
697 missing_content2_missing_content4-untracked.orig:
698 content4
698 content4
699
699
700 Re-resolve and check status
700 Re-resolve and check status
701
701
702 $ hg resolve --unmark --all
702 $ hg resolve --unmark --all
703 $ hg resolve --all --tool :local
703 $ hg resolve --all --tool :local
704 (no more unresolved files)
704 (no more unresolved files)
705 $ hg resolve --unmark --all
705 $ hg resolve --unmark --all
706 $ hg resolve --all --tool internal:merge3
706 $ hg resolve --all --tool internal:merge3
707 remote changed content1_content2_content1_content1-untracked which local deleted
707 remote changed content1_content2_content1_content1-untracked which local deleted
708 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
708 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
709 remote changed content1_content2_content1_content2-untracked which local deleted
709 remote changed content1_content2_content1_content2-untracked which local deleted
710 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
710 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
711 merging content1_content2_content1_content4-tracked
711 merging content1_content2_content1_content4-tracked
712 remote changed content1_content2_content1_content4-untracked which local deleted
712 remote changed content1_content2_content1_content4-untracked which local deleted
713 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
713 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
714 remote changed content1_content2_content1_missing-tracked which local deleted
714 remote changed content1_content2_content1_missing-tracked which local deleted
715 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
715 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
716 remote changed content1_content2_content1_missing-untracked which local deleted
716 remote changed content1_content2_content1_missing-untracked which local deleted
717 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
717 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
718 merging content1_content2_content2_content1-tracked
718 merging content1_content2_content2_content1-tracked
719 remote changed content1_content2_content2_content1-untracked which local deleted
719 remote changed content1_content2_content2_content1-untracked which local deleted
720 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
720 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
721 remote changed content1_content2_content2_content2-untracked which local deleted
721 remote changed content1_content2_content2_content2-untracked which local deleted
722 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
722 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
723 merging content1_content2_content2_content4-tracked
723 merging content1_content2_content2_content4-tracked
724 remote changed content1_content2_content2_content4-untracked which local deleted
724 remote changed content1_content2_content2_content4-untracked which local deleted
725 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
725 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
726 remote changed content1_content2_content2_missing-tracked which local deleted
726 remote changed content1_content2_content2_missing-tracked which local deleted
727 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
727 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
728 remote changed content1_content2_content2_missing-untracked which local deleted
728 remote changed content1_content2_content2_missing-untracked which local deleted
729 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
729 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
730 merging content1_content2_content3_content1-tracked
730 merging content1_content2_content3_content1-tracked
731 remote changed content1_content2_content3_content1-untracked which local deleted
731 remote changed content1_content2_content3_content1-untracked which local deleted
732 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
732 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
733 remote changed content1_content2_content3_content2-untracked which local deleted
733 remote changed content1_content2_content3_content2-untracked which local deleted
734 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
734 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
735 merging content1_content2_content3_content3-tracked
735 merging content1_content2_content3_content3-tracked
736 remote changed content1_content2_content3_content3-untracked which local deleted
736 remote changed content1_content2_content3_content3-untracked which local deleted
737 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
737 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
738 merging content1_content2_content3_content4-tracked
738 merging content1_content2_content3_content4-tracked
739 remote changed content1_content2_content3_content4-untracked which local deleted
739 remote changed content1_content2_content3_content4-untracked which local deleted
740 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
740 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
741 remote changed content1_content2_content3_missing-tracked which local deleted
741 remote changed content1_content2_content3_missing-tracked which local deleted
742 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
742 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
743 remote changed content1_content2_content3_missing-untracked which local deleted
743 remote changed content1_content2_content3_missing-untracked which local deleted
744 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
744 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
745 merging content1_content2_missing_content1-tracked
745 merging content1_content2_missing_content1-tracked
746 remote changed content1_content2_missing_content1-untracked which local deleted
746 remote changed content1_content2_missing_content1-untracked which local deleted
747 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
747 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
748 remote changed content1_content2_missing_content2-untracked which local deleted
748 remote changed content1_content2_missing_content2-untracked which local deleted
749 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
749 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
750 merging content1_content2_missing_content4-tracked
750 merging content1_content2_missing_content4-tracked
751 remote changed content1_content2_missing_content4-untracked which local deleted
751 remote changed content1_content2_missing_content4-untracked which local deleted
752 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
752 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
753 remote changed content1_content2_missing_missing-tracked which local deleted
753 remote changed content1_content2_missing_missing-tracked which local deleted
754 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
754 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
755 remote changed content1_content2_missing_missing-untracked which local deleted
755 remote changed content1_content2_missing_missing-untracked which local deleted
756 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
756 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
757 local changed content1_missing_content1_content4-tracked which remote deleted
757 local changed content1_missing_content1_content4-tracked which remote deleted
758 use (c)hanged version, (d)elete, or leave (u)nresolved? c
758 use (c)hanged version, (d)elete, or leave (u)nresolved? u
759 local changed content1_missing_content3_content3-tracked which remote deleted
759 local changed content1_missing_content3_content3-tracked which remote deleted
760 use (c)hanged version, (d)elete, or leave (u)nresolved? c
760 use (c)hanged version, (d)elete, or leave (u)nresolved? u
761 local changed content1_missing_content3_content4-tracked which remote deleted
761 local changed content1_missing_content3_content4-tracked which remote deleted
762 use (c)hanged version, (d)elete, or leave (u)nresolved? c
762 use (c)hanged version, (d)elete, or leave (u)nresolved? u
763 local changed content1_missing_missing_content4-tracked which remote deleted
763 local changed content1_missing_missing_content4-tracked which remote deleted
764 use (c)hanged version, (d)elete, or leave (u)nresolved? c
764 use (c)hanged version, (d)elete, or leave (u)nresolved? u
765 merging missing_content2_content2_content4-tracked
765 merging missing_content2_content2_content4-tracked
766 merging missing_content2_content3_content3-tracked
766 merging missing_content2_content3_content3-tracked
767 merging missing_content2_content3_content4-tracked
767 merging missing_content2_content3_content4-tracked
768 merging missing_content2_missing_content4-tracked
768 merging missing_content2_missing_content4-tracked
769 merging missing_content2_missing_content4-untracked
769 merging missing_content2_missing_content4-untracked
770 warning: conflicts while merging content1_content2_content1_content4-tracked! (edit, then use 'hg resolve --mark')
770 warning: conflicts while merging content1_content2_content1_content4-tracked! (edit, then use 'hg resolve --mark')
771 warning: conflicts while merging content1_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
771 warning: conflicts while merging content1_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
772 warning: conflicts while merging content1_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
772 warning: conflicts while merging content1_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
773 warning: conflicts while merging content1_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
773 warning: conflicts while merging content1_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
774 warning: conflicts while merging content1_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
774 warning: conflicts while merging content1_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
775 warning: conflicts while merging missing_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
775 warning: conflicts while merging missing_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
776 warning: conflicts while merging missing_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
776 warning: conflicts while merging missing_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
777 warning: conflicts while merging missing_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
777 warning: conflicts while merging missing_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
778 warning: conflicts while merging missing_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
778 warning: conflicts while merging missing_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
779 warning: conflicts while merging missing_content2_missing_content4-untracked! (edit, then use 'hg resolve --mark')
779 warning: conflicts while merging missing_content2_missing_content4-untracked! (edit, then use 'hg resolve --mark')
780 [1]
780 [1]
781 $ checkstatus > $TESTTMP/status2 2>&1
781 $ checkstatus > $TESTTMP/status2 2>&1
782 $ cmp $TESTTMP/status1 $TESTTMP/status2 || diff -U8 $TESTTMP/status1 $TESTTMP/status2
782 $ cmp $TESTTMP/status1 $TESTTMP/status2 || diff -U8 $TESTTMP/status1 $TESTTMP/status2
@@ -1,114 +1,115 b''
1 $ hg init
1 $ hg init
2
2
3 $ echo foo > foo
3 $ echo foo > foo
4 $ echo bar > bar
4 $ echo bar > bar
5 $ hg ci -qAm 'add foo bar'
5 $ hg ci -qAm 'add foo bar'
6
6
7 $ echo foo2 >> foo
7 $ echo foo2 >> foo
8 $ echo bleh > bar
8 $ echo bleh > bar
9 $ hg ci -m 'change foo bar'
9 $ hg ci -m 'change foo bar'
10
10
11 $ hg up -qC 0
11 $ hg up -qC 0
12 $ hg mv foo foo1
12 $ hg mv foo foo1
13 $ echo foo1 > foo1
13 $ echo foo1 > foo1
14 $ hg cat foo >> foo1
14 $ hg cat foo >> foo1
15 $ hg ci -m 'mv foo foo1'
15 $ hg ci -m 'mv foo foo1'
16 created new head
16 created new head
17
17
18 $ hg merge
18 $ hg merge
19 merging foo1 and foo to foo1
19 merging foo1 and foo to foo1
20 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
20 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
21 (branch merge, don't forget to commit)
21 (branch merge, don't forget to commit)
22
22
23 $ hg debugstate --nodates
23 $ hg debugstate --nodates
24 m 0 -2 unset bar
24 m 0 -2 unset bar
25 m 0 -2 unset foo1
25 m 0 -2 unset foo1
26 copy: foo -> foo1
26 copy: foo -> foo1
27
27
28 $ hg st -q
28 $ hg st -q
29 M bar
29 M bar
30 M foo1
30 M foo1
31
31
32
32
33 Removing foo1 and bar:
33 Removing foo1 and bar:
34
34
35 $ cp foo1 F
35 $ cp foo1 F
36 $ cp bar B
36 $ cp bar B
37 $ hg rm -f foo1 bar
37 $ hg rm -f foo1 bar
38
38
39 $ hg debugstate --nodates
39 $ hg debugstate --nodates
40 r 0 -1 set bar
40 r 0 -1 set bar
41 r 0 -1 set foo1
41 r 0 -1 set foo1
42 copy: foo -> foo1
42 copy: foo -> foo1
43
43
44 $ hg st -qC
44 $ hg st -qC
45 R bar
45 R bar
46 R foo1
46 R foo1
47
47
48
48
49 Re-adding foo1 and bar:
49 Re-adding foo1 and bar:
50
50
51 $ cp F foo1
51 $ cp F foo1
52 $ cp B bar
52 $ cp B bar
53 $ hg add -v foo1 bar
53 $ hg add -v foo1 bar
54 adding bar
54 adding bar
55 adding foo1
55 adding foo1
56
56
57 $ hg debugstate --nodates
57 $ hg debugstate --nodates
58 n 0 -2 unset bar
58 n 0 -2 unset bar
59 n 0 -2 unset foo1
59 n 0 -2 unset foo1
60 copy: foo -> foo1
60 copy: foo -> foo1
61
61
62 $ hg st -qC
62 $ hg st -qC
63 M bar
63 M bar
64 M foo1
64 M foo1
65 foo
65 foo
66
66
67
67
68 Reverting foo1 and bar:
68 Reverting foo1 and bar:
69
69
70 $ hg revert -vr . foo1 bar
70 $ hg revert -vr . foo1 bar
71 saving current version of bar as bar.orig
71 saving current version of bar as bar.orig
72 reverting bar
72 reverting bar
73 saving current version of foo1 as foo1.orig
73 saving current version of foo1 as foo1.orig
74 reverting foo1
74 reverting foo1
75
75
76 $ hg debugstate --nodates
76 $ hg debugstate --nodates
77 n 0 -2 unset bar
77 n 0 -2 unset bar
78 n 0 -2 unset foo1
78 n 0 -2 unset foo1
79 copy: foo -> foo1
79 copy: foo -> foo1
80
80
81 $ hg st -qC
81 $ hg st -qC
82 M bar
82 M bar
83 M foo1
83 M foo1
84 foo
84 foo
85
85
86 $ hg diff
86 $ hg diff
87
87
88 Merge should not overwrite local file that is untracked after remove
88 Merge should not overwrite local file that is untracked after remove
89
89
90 $ rm *
90 $ rm *
91 $ hg up -qC
91 $ hg up -qC
92 $ hg rm bar
92 $ hg rm bar
93 $ hg ci -m 'remove bar'
93 $ hg ci -m 'remove bar'
94 $ echo 'memories of buried pirate treasure' > bar
94 $ echo 'memories of buried pirate treasure' > bar
95 $ hg merge
95 $ hg merge
96 bar: untracked file differs
96 bar: untracked file differs
97 abort: untracked files in working directory differ from files in requested revision
97 abort: untracked files in working directory differ from files in requested revision
98 [255]
98 [255]
99 $ cat bar
99 $ cat bar
100 memories of buried pirate treasure
100 memories of buried pirate treasure
101
101
102 Those who use force will lose
102 Those who use force will lose
103
103
104 $ hg merge -f
104 $ hg merge -f
105 remote changed bar which local deleted
105 remote changed bar which local deleted
106 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
106 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
107 merging foo1 and foo to foo1
107 merging foo1 and foo to foo1
108 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
108 0 files updated, 1 files merged, 0 files removed, 1 files unresolved
109 (branch merge, don't forget to commit)
109 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
110 [1]
110 $ cat bar
111 $ cat bar
111 bleh
112 bleh
112 $ hg st
113 $ hg st
113 M bar
114 M bar
114 M foo1
115 M foo1
@@ -1,1055 +1,1057 b''
1
1
2 $ mkdir -p t
2 $ mkdir -p t
3 $ cd t
3 $ cd t
4 $ cat <<EOF > merge
4 $ cat <<EOF > merge
5 > import sys, os
5 > import sys, os
6 > f = open(sys.argv[1], "wb")
6 > f = open(sys.argv[1], "wb")
7 > f.write("merge %s %s %s" % (sys.argv[1], sys.argv[2], sys.argv[3]))
7 > f.write("merge %s %s %s" % (sys.argv[1], sys.argv[2], sys.argv[3]))
8 > f.close()
8 > f.close()
9 > EOF
9 > EOF
10
10
11 perform a test merge with possible renaming
11 perform a test merge with possible renaming
12 args:
12 args:
13 $1 = action in local branch
13 $1 = action in local branch
14 $2 = action in remote branch
14 $2 = action in remote branch
15 $3 = action in working dir
15 $3 = action in working dir
16 $4 = expected result
16 $4 = expected result
17
17
18 $ tm()
18 $ tm()
19 > {
19 > {
20 > hg init t
20 > hg init t
21 > cd t
21 > cd t
22 > echo "[merge]" >> .hg/hgrc
22 > echo "[merge]" >> .hg/hgrc
23 > echo "followcopies = 1" >> .hg/hgrc
23 > echo "followcopies = 1" >> .hg/hgrc
24 >
24 >
25 > # base
25 > # base
26 > echo base > a
26 > echo base > a
27 > echo base > rev # used to force commits
27 > echo base > rev # used to force commits
28 > hg add a rev
28 > hg add a rev
29 > hg ci -m "base"
29 > hg ci -m "base"
30 >
30 >
31 > # remote
31 > # remote
32 > echo remote > rev
32 > echo remote > rev
33 > if [ "$2" != "" ] ; then $2 ; fi
33 > if [ "$2" != "" ] ; then $2 ; fi
34 > hg ci -m "remote"
34 > hg ci -m "remote"
35 >
35 >
36 > # local
36 > # local
37 > hg co -q 0
37 > hg co -q 0
38 > echo local > rev
38 > echo local > rev
39 > if [ "$1" != "" ] ; then $1 ; fi
39 > if [ "$1" != "" ] ; then $1 ; fi
40 > hg ci -m "local"
40 > hg ci -m "local"
41 >
41 >
42 > # working dir
42 > # working dir
43 > echo local > rev
43 > echo local > rev
44 > if [ "$3" != "" ] ; then $3 ; fi
44 > if [ "$3" != "" ] ; then $3 ; fi
45 >
45 >
46 > # merge
46 > # merge
47 > echo "--------------"
47 > echo "--------------"
48 > echo "test L:$1 R:$2 W:$3 - $4"
48 > echo "test L:$1 R:$2 W:$3 - $4"
49 > echo "--------------"
49 > echo "--------------"
50 > hg merge -y --debug --traceback --tool="python ../merge"
50 > hg merge -y --debug --traceback --tool="python ../merge"
51 >
51 >
52 > echo "--------------"
52 > echo "--------------"
53 > hg status -camC -X rev
53 > hg status -camC -X rev
54 >
54 >
55 > hg ci -m "merge"
55 > hg ci -m "merge"
56 >
56 >
57 > echo "--------------"
57 > echo "--------------"
58 > echo
58 > echo
59 >
59 >
60 > cd ..
60 > cd ..
61 > rm -r t
61 > rm -r t
62 > }
62 > }
63 $ up() {
63 $ up() {
64 > cp rev $1
64 > cp rev $1
65 > hg add $1 2> /dev/null
65 > hg add $1 2> /dev/null
66 > if [ "$2" != "" ] ; then
66 > if [ "$2" != "" ] ; then
67 > cp rev $2
67 > cp rev $2
68 > hg add $2 2> /dev/null
68 > hg add $2 2> /dev/null
69 > fi
69 > fi
70 > }
70 > }
71 $ uc() { up $1; hg cp $1 $2; } # update + copy
71 $ uc() { up $1; hg cp $1 $2; } # update + copy
72 $ um() { up $1; hg mv $1 $2; }
72 $ um() { up $1; hg mv $1 $2; }
73 $ nc() { hg cp $1 $2; } # just copy
73 $ nc() { hg cp $1 $2; } # just copy
74 $ nm() { hg mv $1 $2; } # just move
74 $ nm() { hg mv $1 $2; } # just move
75 $ tm "up a " "nc a b" " " "1 get local a to b"
75 $ tm "up a " "nc a b" " " "1 get local a to b"
76 created new head
76 created new head
77 --------------
77 --------------
78 test L:up a R:nc a b W: - 1 get local a to b
78 test L:up a R:nc a b W: - 1 get local a to b
79 --------------
79 --------------
80 searching for copies back to rev 1
80 searching for copies back to rev 1
81 unmatched files in other:
81 unmatched files in other:
82 b
82 b
83 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
83 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
84 src: 'a' -> dst: 'b' *
84 src: 'a' -> dst: 'b' *
85 checking for directory renames
85 checking for directory renames
86 resolving manifests
86 resolving manifests
87 branchmerge: True, force: False, partial: False
87 branchmerge: True, force: False, partial: False
88 ancestor: 924404dff337, local: e300d1c794ec+, remote: 4ce40f5aca24
88 ancestor: 924404dff337, local: e300d1c794ec+, remote: 4ce40f5aca24
89 preserving a for resolve of b
89 preserving a for resolve of b
90 preserving rev for resolve of rev
90 preserving rev for resolve of rev
91 a: remote unchanged -> k
91 a: remote unchanged -> k
92 b: remote copied from a -> m (premerge)
92 b: remote copied from a -> m (premerge)
93 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
93 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
94 merging a and b to b
94 merging a and b to b
95 my b@e300d1c794ec+ other b@4ce40f5aca24 ancestor a@924404dff337
95 my b@e300d1c794ec+ other b@4ce40f5aca24 ancestor a@924404dff337
96 premerge successful
96 premerge successful
97 rev: versions differ -> m (premerge)
97 rev: versions differ -> m (premerge)
98 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
98 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
99 merging rev
99 merging rev
100 my rev@e300d1c794ec+ other rev@4ce40f5aca24 ancestor rev@924404dff337
100 my rev@e300d1c794ec+ other rev@4ce40f5aca24 ancestor rev@924404dff337
101 rev: versions differ -> m (merge)
101 rev: versions differ -> m (merge)
102 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
102 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
103 my rev@e300d1c794ec+ other rev@4ce40f5aca24 ancestor rev@924404dff337
103 my rev@e300d1c794ec+ other rev@4ce40f5aca24 ancestor rev@924404dff337
104 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
104 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
105 merge tool returned: 0
105 merge tool returned: 0
106 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
106 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
107 (branch merge, don't forget to commit)
107 (branch merge, don't forget to commit)
108 --------------
108 --------------
109 M b
109 M b
110 a
110 a
111 C a
111 C a
112 --------------
112 --------------
113
113
114 $ tm "nc a b" "up a " " " "2 get rem change to a and b"
114 $ tm "nc a b" "up a " " " "2 get rem change to a and b"
115 created new head
115 created new head
116 --------------
116 --------------
117 test L:nc a b R:up a W: - 2 get rem change to a and b
117 test L:nc a b R:up a W: - 2 get rem change to a and b
118 --------------
118 --------------
119 searching for copies back to rev 1
119 searching for copies back to rev 1
120 unmatched files in local:
120 unmatched files in local:
121 b
121 b
122 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
122 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
123 src: 'a' -> dst: 'b' *
123 src: 'a' -> dst: 'b' *
124 checking for directory renames
124 checking for directory renames
125 resolving manifests
125 resolving manifests
126 branchmerge: True, force: False, partial: False
126 branchmerge: True, force: False, partial: False
127 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: f4db7e329e71
127 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: f4db7e329e71
128 preserving b for resolve of b
128 preserving b for resolve of b
129 preserving rev for resolve of rev
129 preserving rev for resolve of rev
130 a: remote is newer -> g
130 a: remote is newer -> g
131 getting a
131 getting a
132 b: local copied/moved from a -> m (premerge)
132 b: local copied/moved from a -> m (premerge)
133 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
133 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
134 merging b and a to b
134 merging b and a to b
135 my b@86a2aa42fc76+ other a@f4db7e329e71 ancestor a@924404dff337
135 my b@86a2aa42fc76+ other a@f4db7e329e71 ancestor a@924404dff337
136 premerge successful
136 premerge successful
137 rev: versions differ -> m (premerge)
137 rev: versions differ -> m (premerge)
138 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
138 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
139 merging rev
139 merging rev
140 my rev@86a2aa42fc76+ other rev@f4db7e329e71 ancestor rev@924404dff337
140 my rev@86a2aa42fc76+ other rev@f4db7e329e71 ancestor rev@924404dff337
141 rev: versions differ -> m (merge)
141 rev: versions differ -> m (merge)
142 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
142 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
143 my rev@86a2aa42fc76+ other rev@f4db7e329e71 ancestor rev@924404dff337
143 my rev@86a2aa42fc76+ other rev@f4db7e329e71 ancestor rev@924404dff337
144 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
144 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
145 merge tool returned: 0
145 merge tool returned: 0
146 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
146 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
147 (branch merge, don't forget to commit)
147 (branch merge, don't forget to commit)
148 --------------
148 --------------
149 M a
149 M a
150 M b
150 M b
151 a
151 a
152 --------------
152 --------------
153
153
154 $ tm "up a " "nm a b" " " "3 get local a change to b, remove a"
154 $ tm "up a " "nm a b" " " "3 get local a change to b, remove a"
155 created new head
155 created new head
156 --------------
156 --------------
157 test L:up a R:nm a b W: - 3 get local a change to b, remove a
157 test L:up a R:nm a b W: - 3 get local a change to b, remove a
158 --------------
158 --------------
159 searching for copies back to rev 1
159 searching for copies back to rev 1
160 unmatched files in other:
160 unmatched files in other:
161 b
161 b
162 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
162 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
163 src: 'a' -> dst: 'b' *
163 src: 'a' -> dst: 'b' *
164 checking for directory renames
164 checking for directory renames
165 resolving manifests
165 resolving manifests
166 branchmerge: True, force: False, partial: False
166 branchmerge: True, force: False, partial: False
167 ancestor: 924404dff337, local: e300d1c794ec+, remote: bdb19105162a
167 ancestor: 924404dff337, local: e300d1c794ec+, remote: bdb19105162a
168 preserving a for resolve of b
168 preserving a for resolve of b
169 preserving rev for resolve of rev
169 preserving rev for resolve of rev
170 removing a
170 removing a
171 b: remote moved from a -> m (premerge)
171 b: remote moved from a -> m (premerge)
172 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
172 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
173 merging a and b to b
173 merging a and b to b
174 my b@e300d1c794ec+ other b@bdb19105162a ancestor a@924404dff337
174 my b@e300d1c794ec+ other b@bdb19105162a ancestor a@924404dff337
175 premerge successful
175 premerge successful
176 rev: versions differ -> m (premerge)
176 rev: versions differ -> m (premerge)
177 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
177 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
178 merging rev
178 merging rev
179 my rev@e300d1c794ec+ other rev@bdb19105162a ancestor rev@924404dff337
179 my rev@e300d1c794ec+ other rev@bdb19105162a ancestor rev@924404dff337
180 rev: versions differ -> m (merge)
180 rev: versions differ -> m (merge)
181 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
181 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
182 my rev@e300d1c794ec+ other rev@bdb19105162a ancestor rev@924404dff337
182 my rev@e300d1c794ec+ other rev@bdb19105162a ancestor rev@924404dff337
183 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
183 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
184 merge tool returned: 0
184 merge tool returned: 0
185 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
185 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
186 (branch merge, don't forget to commit)
186 (branch merge, don't forget to commit)
187 --------------
187 --------------
188 M b
188 M b
189 a
189 a
190 --------------
190 --------------
191
191
192 $ tm "nm a b" "up a " " " "4 get remote change to b"
192 $ tm "nm a b" "up a " " " "4 get remote change to b"
193 created new head
193 created new head
194 --------------
194 --------------
195 test L:nm a b R:up a W: - 4 get remote change to b
195 test L:nm a b R:up a W: - 4 get remote change to b
196 --------------
196 --------------
197 searching for copies back to rev 1
197 searching for copies back to rev 1
198 unmatched files in local:
198 unmatched files in local:
199 b
199 b
200 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
200 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
201 src: 'a' -> dst: 'b' *
201 src: 'a' -> dst: 'b' *
202 checking for directory renames
202 checking for directory renames
203 resolving manifests
203 resolving manifests
204 branchmerge: True, force: False, partial: False
204 branchmerge: True, force: False, partial: False
205 ancestor: 924404dff337, local: 02963e448370+, remote: f4db7e329e71
205 ancestor: 924404dff337, local: 02963e448370+, remote: f4db7e329e71
206 preserving b for resolve of b
206 preserving b for resolve of b
207 preserving rev for resolve of rev
207 preserving rev for resolve of rev
208 b: local copied/moved from a -> m (premerge)
208 b: local copied/moved from a -> m (premerge)
209 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
209 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
210 merging b and a to b
210 merging b and a to b
211 my b@02963e448370+ other a@f4db7e329e71 ancestor a@924404dff337
211 my b@02963e448370+ other a@f4db7e329e71 ancestor a@924404dff337
212 premerge successful
212 premerge successful
213 rev: versions differ -> m (premerge)
213 rev: versions differ -> m (premerge)
214 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
214 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
215 merging rev
215 merging rev
216 my rev@02963e448370+ other rev@f4db7e329e71 ancestor rev@924404dff337
216 my rev@02963e448370+ other rev@f4db7e329e71 ancestor rev@924404dff337
217 rev: versions differ -> m (merge)
217 rev: versions differ -> m (merge)
218 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
218 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
219 my rev@02963e448370+ other rev@f4db7e329e71 ancestor rev@924404dff337
219 my rev@02963e448370+ other rev@f4db7e329e71 ancestor rev@924404dff337
220 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
220 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
221 merge tool returned: 0
221 merge tool returned: 0
222 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
222 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
223 (branch merge, don't forget to commit)
223 (branch merge, don't forget to commit)
224 --------------
224 --------------
225 M b
225 M b
226 a
226 a
227 --------------
227 --------------
228
228
229 $ tm " " "nc a b" " " "5 get b"
229 $ tm " " "nc a b" " " "5 get b"
230 created new head
230 created new head
231 --------------
231 --------------
232 test L: R:nc a b W: - 5 get b
232 test L: R:nc a b W: - 5 get b
233 --------------
233 --------------
234 searching for copies back to rev 1
234 searching for copies back to rev 1
235 unmatched files in other:
235 unmatched files in other:
236 b
236 b
237 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
237 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
238 src: 'a' -> dst: 'b'
238 src: 'a' -> dst: 'b'
239 checking for directory renames
239 checking for directory renames
240 resolving manifests
240 resolving manifests
241 branchmerge: True, force: False, partial: False
241 branchmerge: True, force: False, partial: False
242 ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: 4ce40f5aca24
242 ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: 4ce40f5aca24
243 preserving rev for resolve of rev
243 preserving rev for resolve of rev
244 b: remote created -> g
244 b: remote created -> g
245 getting b
245 getting b
246 rev: versions differ -> m (premerge)
246 rev: versions differ -> m (premerge)
247 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
247 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
248 merging rev
248 merging rev
249 my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
249 my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
250 rev: versions differ -> m (merge)
250 rev: versions differ -> m (merge)
251 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
251 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
252 my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
252 my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
253 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
253 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
254 merge tool returned: 0
254 merge tool returned: 0
255 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
255 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
256 (branch merge, don't forget to commit)
256 (branch merge, don't forget to commit)
257 --------------
257 --------------
258 M b
258 M b
259 C a
259 C a
260 --------------
260 --------------
261
261
262 $ tm "nc a b" " " " " "6 nothing"
262 $ tm "nc a b" " " " " "6 nothing"
263 created new head
263 created new head
264 --------------
264 --------------
265 test L:nc a b R: W: - 6 nothing
265 test L:nc a b R: W: - 6 nothing
266 --------------
266 --------------
267 searching for copies back to rev 1
267 searching for copies back to rev 1
268 unmatched files in local:
268 unmatched files in local:
269 b
269 b
270 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
270 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
271 src: 'a' -> dst: 'b'
271 src: 'a' -> dst: 'b'
272 checking for directory renames
272 checking for directory renames
273 resolving manifests
273 resolving manifests
274 branchmerge: True, force: False, partial: False
274 branchmerge: True, force: False, partial: False
275 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 97c705ade336
275 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 97c705ade336
276 preserving rev for resolve of rev
276 preserving rev for resolve of rev
277 rev: versions differ -> m (premerge)
277 rev: versions differ -> m (premerge)
278 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
278 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
279 merging rev
279 merging rev
280 my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
280 my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
281 rev: versions differ -> m (merge)
281 rev: versions differ -> m (merge)
282 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
282 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
283 my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
283 my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
284 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
284 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
285 merge tool returned: 0
285 merge tool returned: 0
286 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
286 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
287 (branch merge, don't forget to commit)
287 (branch merge, don't forget to commit)
288 --------------
288 --------------
289 C a
289 C a
290 C b
290 C b
291 --------------
291 --------------
292
292
293 $ tm " " "nm a b" " " "7 get b"
293 $ tm " " "nm a b" " " "7 get b"
294 created new head
294 created new head
295 --------------
295 --------------
296 test L: R:nm a b W: - 7 get b
296 test L: R:nm a b W: - 7 get b
297 --------------
297 --------------
298 searching for copies back to rev 1
298 searching for copies back to rev 1
299 unmatched files in other:
299 unmatched files in other:
300 b
300 b
301 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
301 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
302 src: 'a' -> dst: 'b'
302 src: 'a' -> dst: 'b'
303 checking for directory renames
303 checking for directory renames
304 resolving manifests
304 resolving manifests
305 branchmerge: True, force: False, partial: False
305 branchmerge: True, force: False, partial: False
306 ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: bdb19105162a
306 ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: bdb19105162a
307 preserving rev for resolve of rev
307 preserving rev for resolve of rev
308 a: other deleted -> r
308 a: other deleted -> r
309 removing a
309 removing a
310 b: remote created -> g
310 b: remote created -> g
311 getting b
311 getting b
312 rev: versions differ -> m (premerge)
312 rev: versions differ -> m (premerge)
313 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
313 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
314 merging rev
314 merging rev
315 my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
315 my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
316 rev: versions differ -> m (merge)
316 rev: versions differ -> m (merge)
317 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
317 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
318 my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
318 my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
319 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
319 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
320 merge tool returned: 0
320 merge tool returned: 0
321 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
321 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
322 (branch merge, don't forget to commit)
322 (branch merge, don't forget to commit)
323 --------------
323 --------------
324 M b
324 M b
325 --------------
325 --------------
326
326
327 $ tm "nm a b" " " " " "8 nothing"
327 $ tm "nm a b" " " " " "8 nothing"
328 created new head
328 created new head
329 --------------
329 --------------
330 test L:nm a b R: W: - 8 nothing
330 test L:nm a b R: W: - 8 nothing
331 --------------
331 --------------
332 searching for copies back to rev 1
332 searching for copies back to rev 1
333 unmatched files in local:
333 unmatched files in local:
334 b
334 b
335 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
335 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
336 src: 'a' -> dst: 'b'
336 src: 'a' -> dst: 'b'
337 checking for directory renames
337 checking for directory renames
338 resolving manifests
338 resolving manifests
339 branchmerge: True, force: False, partial: False
339 branchmerge: True, force: False, partial: False
340 ancestor: 924404dff337, local: 02963e448370+, remote: 97c705ade336
340 ancestor: 924404dff337, local: 02963e448370+, remote: 97c705ade336
341 preserving rev for resolve of rev
341 preserving rev for resolve of rev
342 rev: versions differ -> m (premerge)
342 rev: versions differ -> m (premerge)
343 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
343 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
344 merging rev
344 merging rev
345 my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
345 my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
346 rev: versions differ -> m (merge)
346 rev: versions differ -> m (merge)
347 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
347 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
348 my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
348 my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
349 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
349 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
350 merge tool returned: 0
350 merge tool returned: 0
351 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
351 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
352 (branch merge, don't forget to commit)
352 (branch merge, don't forget to commit)
353 --------------
353 --------------
354 C b
354 C b
355 --------------
355 --------------
356
356
357 $ tm "um a b" "um a b" " " "9 do merge with ancestor in a"
357 $ tm "um a b" "um a b" " " "9 do merge with ancestor in a"
358 created new head
358 created new head
359 --------------
359 --------------
360 test L:um a b R:um a b W: - 9 do merge with ancestor in a
360 test L:um a b R:um a b W: - 9 do merge with ancestor in a
361 --------------
361 --------------
362 searching for copies back to rev 1
362 searching for copies back to rev 1
363 unmatched files new in both:
363 unmatched files new in both:
364 b
364 b
365 resolving manifests
365 resolving manifests
366 branchmerge: True, force: False, partial: False
366 branchmerge: True, force: False, partial: False
367 ancestor: 924404dff337, local: 62e7bf090eba+, remote: 49b6d8032493
367 ancestor: 924404dff337, local: 62e7bf090eba+, remote: 49b6d8032493
368 preserving b for resolve of b
368 preserving b for resolve of b
369 preserving rev for resolve of rev
369 preserving rev for resolve of rev
370 b: both renamed from a -> m (premerge)
370 b: both renamed from a -> m (premerge)
371 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
371 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
372 merging b
372 merging b
373 my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
373 my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
374 rev: versions differ -> m (premerge)
374 rev: versions differ -> m (premerge)
375 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
375 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
376 merging rev
376 merging rev
377 my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
377 my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
378 b: both renamed from a -> m (merge)
378 b: both renamed from a -> m (merge)
379 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
379 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
380 my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
380 my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
381 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
381 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
382 merge tool returned: 0
382 merge tool returned: 0
383 rev: versions differ -> m (merge)
383 rev: versions differ -> m (merge)
384 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
384 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
385 my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
385 my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
386 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
386 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
387 merge tool returned: 0
387 merge tool returned: 0
388 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
388 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
389 (branch merge, don't forget to commit)
389 (branch merge, don't forget to commit)
390 --------------
390 --------------
391 M b
391 M b
392 --------------
392 --------------
393
393
394
394
395 m "um a c" "um x c" " " "10 do merge with no ancestor"
395 m "um a c" "um x c" " " "10 do merge with no ancestor"
396
396
397 $ tm "nm a b" "nm a c" " " "11 get c, keep b"
397 $ tm "nm a b" "nm a c" " " "11 get c, keep b"
398 created new head
398 created new head
399 --------------
399 --------------
400 test L:nm a b R:nm a c W: - 11 get c, keep b
400 test L:nm a b R:nm a c W: - 11 get c, keep b
401 --------------
401 --------------
402 searching for copies back to rev 1
402 searching for copies back to rev 1
403 unmatched files in local:
403 unmatched files in local:
404 b
404 b
405 unmatched files in other:
405 unmatched files in other:
406 c
406 c
407 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
407 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
408 src: 'a' -> dst: 'b' !
408 src: 'a' -> dst: 'b' !
409 src: 'a' -> dst: 'c' !
409 src: 'a' -> dst: 'c' !
410 checking for directory renames
410 checking for directory renames
411 resolving manifests
411 resolving manifests
412 branchmerge: True, force: False, partial: False
412 branchmerge: True, force: False, partial: False
413 ancestor: 924404dff337, local: 02963e448370+, remote: fe905ef2c33e
413 ancestor: 924404dff337, local: 02963e448370+, remote: fe905ef2c33e
414 note: possible conflict - a was renamed multiple times to:
414 note: possible conflict - a was renamed multiple times to:
415 b
415 b
416 c
416 c
417 preserving rev for resolve of rev
417 preserving rev for resolve of rev
418 c: remote created -> g
418 c: remote created -> g
419 getting c
419 getting c
420 rev: versions differ -> m (premerge)
420 rev: versions differ -> m (premerge)
421 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
421 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
422 merging rev
422 merging rev
423 my rev@02963e448370+ other rev@fe905ef2c33e ancestor rev@924404dff337
423 my rev@02963e448370+ other rev@fe905ef2c33e ancestor rev@924404dff337
424 rev: versions differ -> m (merge)
424 rev: versions differ -> m (merge)
425 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
425 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
426 my rev@02963e448370+ other rev@fe905ef2c33e ancestor rev@924404dff337
426 my rev@02963e448370+ other rev@fe905ef2c33e ancestor rev@924404dff337
427 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
427 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
428 merge tool returned: 0
428 merge tool returned: 0
429 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
429 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
430 (branch merge, don't forget to commit)
430 (branch merge, don't forget to commit)
431 --------------
431 --------------
432 M c
432 M c
433 C b
433 C b
434 --------------
434 --------------
435
435
436 $ tm "nc a b" "up b " " " "12 merge b no ancestor"
436 $ tm "nc a b" "up b " " " "12 merge b no ancestor"
437 created new head
437 created new head
438 --------------
438 --------------
439 test L:nc a b R:up b W: - 12 merge b no ancestor
439 test L:nc a b R:up b W: - 12 merge b no ancestor
440 --------------
440 --------------
441 searching for copies back to rev 1
441 searching for copies back to rev 1
442 unmatched files new in both:
442 unmatched files new in both:
443 b
443 b
444 resolving manifests
444 resolving manifests
445 branchmerge: True, force: False, partial: False
445 branchmerge: True, force: False, partial: False
446 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: af30c7647fc7
446 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: af30c7647fc7
447 preserving b for resolve of b
447 preserving b for resolve of b
448 preserving rev for resolve of rev
448 preserving rev for resolve of rev
449 b: both created -> m (premerge)
449 b: both created -> m (premerge)
450 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
450 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
451 merging b
451 merging b
452 my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
452 my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
453 rev: versions differ -> m (premerge)
453 rev: versions differ -> m (premerge)
454 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
454 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
455 merging rev
455 merging rev
456 my rev@86a2aa42fc76+ other rev@af30c7647fc7 ancestor rev@924404dff337
456 my rev@86a2aa42fc76+ other rev@af30c7647fc7 ancestor rev@924404dff337
457 b: both created -> m (merge)
457 b: both created -> m (merge)
458 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
458 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
459 my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
459 my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
460 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
460 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
461 merge tool returned: 0
461 merge tool returned: 0
462 rev: versions differ -> m (merge)
462 rev: versions differ -> m (merge)
463 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
463 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
464 my rev@86a2aa42fc76+ other rev@af30c7647fc7 ancestor rev@924404dff337
464 my rev@86a2aa42fc76+ other rev@af30c7647fc7 ancestor rev@924404dff337
465 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
465 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
466 merge tool returned: 0
466 merge tool returned: 0
467 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
467 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
468 (branch merge, don't forget to commit)
468 (branch merge, don't forget to commit)
469 --------------
469 --------------
470 M b
470 M b
471 C a
471 C a
472 --------------
472 --------------
473
473
474 $ tm "up b " "nm a b" " " "13 merge b no ancestor"
474 $ tm "up b " "nm a b" " " "13 merge b no ancestor"
475 created new head
475 created new head
476 --------------
476 --------------
477 test L:up b R:nm a b W: - 13 merge b no ancestor
477 test L:up b R:nm a b W: - 13 merge b no ancestor
478 --------------
478 --------------
479 searching for copies back to rev 1
479 searching for copies back to rev 1
480 unmatched files new in both:
480 unmatched files new in both:
481 b
481 b
482 resolving manifests
482 resolving manifests
483 branchmerge: True, force: False, partial: False
483 branchmerge: True, force: False, partial: False
484 ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a
484 ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a
485 preserving b for resolve of b
485 preserving b for resolve of b
486 preserving rev for resolve of rev
486 preserving rev for resolve of rev
487 a: other deleted -> r
487 a: other deleted -> r
488 removing a
488 removing a
489 b: both created -> m (premerge)
489 b: both created -> m (premerge)
490 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
490 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
491 merging b
491 merging b
492 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
492 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
493 rev: versions differ -> m (premerge)
493 rev: versions differ -> m (premerge)
494 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
494 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
495 merging rev
495 merging rev
496 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
496 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
497 b: both created -> m (merge)
497 b: both created -> m (merge)
498 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
498 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
499 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
499 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
500 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
500 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
501 merge tool returned: 0
501 merge tool returned: 0
502 rev: versions differ -> m (merge)
502 rev: versions differ -> m (merge)
503 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
503 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
504 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
504 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
505 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
505 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
506 merge tool returned: 0
506 merge tool returned: 0
507 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
507 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
508 (branch merge, don't forget to commit)
508 (branch merge, don't forget to commit)
509 --------------
509 --------------
510 M b
510 M b
511 --------------
511 --------------
512
512
513 $ tm "nc a b" "up a b" " " "14 merge b no ancestor"
513 $ tm "nc a b" "up a b" " " "14 merge b no ancestor"
514 created new head
514 created new head
515 --------------
515 --------------
516 test L:nc a b R:up a b W: - 14 merge b no ancestor
516 test L:nc a b R:up a b W: - 14 merge b no ancestor
517 --------------
517 --------------
518 searching for copies back to rev 1
518 searching for copies back to rev 1
519 unmatched files new in both:
519 unmatched files new in both:
520 b
520 b
521 resolving manifests
521 resolving manifests
522 branchmerge: True, force: False, partial: False
522 branchmerge: True, force: False, partial: False
523 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a
523 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a
524 preserving b for resolve of b
524 preserving b for resolve of b
525 preserving rev for resolve of rev
525 preserving rev for resolve of rev
526 a: remote is newer -> g
526 a: remote is newer -> g
527 getting a
527 getting a
528 b: both created -> m (premerge)
528 b: both created -> m (premerge)
529 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
529 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
530 merging b
530 merging b
531 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
531 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
532 rev: versions differ -> m (premerge)
532 rev: versions differ -> m (premerge)
533 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
533 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
534 merging rev
534 merging rev
535 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
535 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
536 b: both created -> m (merge)
536 b: both created -> m (merge)
537 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
537 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
538 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
538 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
539 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
539 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
540 merge tool returned: 0
540 merge tool returned: 0
541 rev: versions differ -> m (merge)
541 rev: versions differ -> m (merge)
542 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
542 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
543 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
543 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
544 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
544 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
545 merge tool returned: 0
545 merge tool returned: 0
546 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
546 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
547 (branch merge, don't forget to commit)
547 (branch merge, don't forget to commit)
548 --------------
548 --------------
549 M a
549 M a
550 M b
550 M b
551 --------------
551 --------------
552
552
553 $ tm "up b " "nm a b" " " "15 merge b no ancestor, remove a"
553 $ tm "up b " "nm a b" " " "15 merge b no ancestor, remove a"
554 created new head
554 created new head
555 --------------
555 --------------
556 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
556 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
557 --------------
557 --------------
558 searching for copies back to rev 1
558 searching for copies back to rev 1
559 unmatched files new in both:
559 unmatched files new in both:
560 b
560 b
561 resolving manifests
561 resolving manifests
562 branchmerge: True, force: False, partial: False
562 branchmerge: True, force: False, partial: False
563 ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a
563 ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a
564 preserving b for resolve of b
564 preserving b for resolve of b
565 preserving rev for resolve of rev
565 preserving rev for resolve of rev
566 a: other deleted -> r
566 a: other deleted -> r
567 removing a
567 removing a
568 b: both created -> m (premerge)
568 b: both created -> m (premerge)
569 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
569 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
570 merging b
570 merging b
571 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
571 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
572 rev: versions differ -> m (premerge)
572 rev: versions differ -> m (premerge)
573 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
573 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
574 merging rev
574 merging rev
575 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
575 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
576 b: both created -> m (merge)
576 b: both created -> m (merge)
577 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
577 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
578 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
578 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
579 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
579 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
580 merge tool returned: 0
580 merge tool returned: 0
581 rev: versions differ -> m (merge)
581 rev: versions differ -> m (merge)
582 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
582 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
583 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
583 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
584 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
584 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
585 merge tool returned: 0
585 merge tool returned: 0
586 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
586 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
587 (branch merge, don't forget to commit)
587 (branch merge, don't forget to commit)
588 --------------
588 --------------
589 M b
589 M b
590 --------------
590 --------------
591
591
592 $ tm "nc a b" "up a b" " " "16 get a, merge b no ancestor"
592 $ tm "nc a b" "up a b" " " "16 get a, merge b no ancestor"
593 created new head
593 created new head
594 --------------
594 --------------
595 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
595 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
596 --------------
596 --------------
597 searching for copies back to rev 1
597 searching for copies back to rev 1
598 unmatched files new in both:
598 unmatched files new in both:
599 b
599 b
600 resolving manifests
600 resolving manifests
601 branchmerge: True, force: False, partial: False
601 branchmerge: True, force: False, partial: False
602 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a
602 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a
603 preserving b for resolve of b
603 preserving b for resolve of b
604 preserving rev for resolve of rev
604 preserving rev for resolve of rev
605 a: remote is newer -> g
605 a: remote is newer -> g
606 getting a
606 getting a
607 b: both created -> m (premerge)
607 b: both created -> m (premerge)
608 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
608 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
609 merging b
609 merging b
610 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
610 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
611 rev: versions differ -> m (premerge)
611 rev: versions differ -> m (premerge)
612 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
612 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
613 merging rev
613 merging rev
614 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
614 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
615 b: both created -> m (merge)
615 b: both created -> m (merge)
616 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
616 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
617 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
617 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
618 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
618 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
619 merge tool returned: 0
619 merge tool returned: 0
620 rev: versions differ -> m (merge)
620 rev: versions differ -> m (merge)
621 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
621 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
622 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
622 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
623 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
623 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
624 merge tool returned: 0
624 merge tool returned: 0
625 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
625 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
626 (branch merge, don't forget to commit)
626 (branch merge, don't forget to commit)
627 --------------
627 --------------
628 M a
628 M a
629 M b
629 M b
630 --------------
630 --------------
631
631
632 $ tm "up a b" "nc a b" " " "17 keep a, merge b no ancestor"
632 $ tm "up a b" "nc a b" " " "17 keep a, merge b no ancestor"
633 created new head
633 created new head
634 --------------
634 --------------
635 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
635 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
636 --------------
636 --------------
637 searching for copies back to rev 1
637 searching for copies back to rev 1
638 unmatched files new in both:
638 unmatched files new in both:
639 b
639 b
640 resolving manifests
640 resolving manifests
641 branchmerge: True, force: False, partial: False
641 branchmerge: True, force: False, partial: False
642 ancestor: 924404dff337, local: 0b76e65c8289+, remote: 4ce40f5aca24
642 ancestor: 924404dff337, local: 0b76e65c8289+, remote: 4ce40f5aca24
643 preserving b for resolve of b
643 preserving b for resolve of b
644 preserving rev for resolve of rev
644 preserving rev for resolve of rev
645 a: remote unchanged -> k
645 a: remote unchanged -> k
646 b: both created -> m (premerge)
646 b: both created -> m (premerge)
647 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
647 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
648 merging b
648 merging b
649 my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
649 my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
650 rev: versions differ -> m (premerge)
650 rev: versions differ -> m (premerge)
651 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
651 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
652 merging rev
652 merging rev
653 my rev@0b76e65c8289+ other rev@4ce40f5aca24 ancestor rev@924404dff337
653 my rev@0b76e65c8289+ other rev@4ce40f5aca24 ancestor rev@924404dff337
654 b: both created -> m (merge)
654 b: both created -> m (merge)
655 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
655 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
656 my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
656 my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
657 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
657 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
658 merge tool returned: 0
658 merge tool returned: 0
659 rev: versions differ -> m (merge)
659 rev: versions differ -> m (merge)
660 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
660 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
661 my rev@0b76e65c8289+ other rev@4ce40f5aca24 ancestor rev@924404dff337
661 my rev@0b76e65c8289+ other rev@4ce40f5aca24 ancestor rev@924404dff337
662 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
662 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
663 merge tool returned: 0
663 merge tool returned: 0
664 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
664 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
665 (branch merge, don't forget to commit)
665 (branch merge, don't forget to commit)
666 --------------
666 --------------
667 M b
667 M b
668 C a
668 C a
669 --------------
669 --------------
670
670
671 $ tm "nm a b" "up a b" " " "18 merge b no ancestor"
671 $ tm "nm a b" "up a b" " " "18 merge b no ancestor"
672 created new head
672 created new head
673 --------------
673 --------------
674 test L:nm a b R:up a b W: - 18 merge b no ancestor
674 test L:nm a b R:up a b W: - 18 merge b no ancestor
675 --------------
675 --------------
676 searching for copies back to rev 1
676 searching for copies back to rev 1
677 unmatched files new in both:
677 unmatched files new in both:
678 b
678 b
679 resolving manifests
679 resolving manifests
680 branchmerge: True, force: False, partial: False
680 branchmerge: True, force: False, partial: False
681 ancestor: 924404dff337, local: 02963e448370+, remote: 8dbce441892a
681 ancestor: 924404dff337, local: 02963e448370+, remote: 8dbce441892a
682 preserving b for resolve of b
682 preserving b for resolve of b
683 preserving rev for resolve of rev
683 preserving rev for resolve of rev
684 a: prompt deleted/changed -> m (premerge)
684 a: prompt deleted/changed -> m (premerge)
685 picked tool ':prompt' for a (binary False symlink False changedelete True)
685 picked tool ':prompt' for a (binary False symlink False changedelete True)
686 remote changed a which local deleted
686 remote changed a which local deleted
687 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
687 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
688 b: both created -> m (premerge)
688 b: both created -> m (premerge)
689 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
689 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
690 merging b
690 merging b
691 my b@02963e448370+ other b@8dbce441892a ancestor b@000000000000
691 my b@02963e448370+ other b@8dbce441892a ancestor b@000000000000
692 rev: versions differ -> m (premerge)
692 rev: versions differ -> m (premerge)
693 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
693 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
694 merging rev
694 merging rev
695 my rev@02963e448370+ other rev@8dbce441892a ancestor rev@924404dff337
695 my rev@02963e448370+ other rev@8dbce441892a ancestor rev@924404dff337
696 b: both created -> m (merge)
696 b: both created -> m (merge)
697 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
697 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
698 my b@02963e448370+ other b@8dbce441892a ancestor b@000000000000
698 my b@02963e448370+ other b@8dbce441892a ancestor b@000000000000
699 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
699 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
700 merge tool returned: 0
700 merge tool returned: 0
701 rev: versions differ -> m (merge)
701 rev: versions differ -> m (merge)
702 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
702 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
703 my rev@02963e448370+ other rev@8dbce441892a ancestor rev@924404dff337
703 my rev@02963e448370+ other rev@8dbce441892a ancestor rev@924404dff337
704 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
704 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
705 merge tool returned: 0
705 merge tool returned: 0
706 0 files updated, 3 files merged, 0 files removed, 0 files unresolved
706 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
707 (branch merge, don't forget to commit)
707 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
708 --------------
708 --------------
709 M a
709 M a
710 M b
710 M b
711 abort: unresolved merge conflicts (see "hg help resolve")
711 --------------
712 --------------
712
713
713 $ tm "up a b" "nm a b" " " "19 merge b no ancestor, prompt remove a"
714 $ tm "up a b" "nm a b" " " "19 merge b no ancestor, prompt remove a"
714 created new head
715 created new head
715 --------------
716 --------------
716 test L:up a b R:nm a b W: - 19 merge b no ancestor, prompt remove a
717 test L:up a b R:nm a b W: - 19 merge b no ancestor, prompt remove a
717 --------------
718 --------------
718 searching for copies back to rev 1
719 searching for copies back to rev 1
719 unmatched files new in both:
720 unmatched files new in both:
720 b
721 b
721 resolving manifests
722 resolving manifests
722 branchmerge: True, force: False, partial: False
723 branchmerge: True, force: False, partial: False
723 ancestor: 924404dff337, local: 0b76e65c8289+, remote: bdb19105162a
724 ancestor: 924404dff337, local: 0b76e65c8289+, remote: bdb19105162a
724 preserving a for resolve of a
725 preserving a for resolve of a
725 preserving b for resolve of b
726 preserving b for resolve of b
726 preserving rev for resolve of rev
727 preserving rev for resolve of rev
727 a: prompt changed/deleted -> m (premerge)
728 a: prompt changed/deleted -> m (premerge)
728 picked tool ':prompt' for a (binary False symlink False changedelete True)
729 picked tool ':prompt' for a (binary False symlink False changedelete True)
729 local changed a which remote deleted
730 local changed a which remote deleted
730 use (c)hanged version, (d)elete, or leave (u)nresolved? c
731 use (c)hanged version, (d)elete, or leave (u)nresolved? u
731 b: both created -> m (premerge)
732 b: both created -> m (premerge)
732 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
733 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
733 merging b
734 merging b
734 my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
735 my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
735 rev: versions differ -> m (premerge)
736 rev: versions differ -> m (premerge)
736 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
737 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
737 merging rev
738 merging rev
738 my rev@0b76e65c8289+ other rev@bdb19105162a ancestor rev@924404dff337
739 my rev@0b76e65c8289+ other rev@bdb19105162a ancestor rev@924404dff337
739 b: both created -> m (merge)
740 b: both created -> m (merge)
740 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
741 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
741 my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
742 my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
742 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
743 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
743 merge tool returned: 0
744 merge tool returned: 0
744 rev: versions differ -> m (merge)
745 rev: versions differ -> m (merge)
745 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
746 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
746 my rev@0b76e65c8289+ other rev@bdb19105162a ancestor rev@924404dff337
747 my rev@0b76e65c8289+ other rev@bdb19105162a ancestor rev@924404dff337
747 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
748 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
748 merge tool returned: 0
749 merge tool returned: 0
749 0 files updated, 3 files merged, 0 files removed, 0 files unresolved
750 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
750 (branch merge, don't forget to commit)
751 use 'hg resolve' to retry unresolved file merges or 'hg update -C .' to abandon
751 --------------
752 --------------
752 M b
753 M b
753 C a
754 C a
755 abort: unresolved merge conflicts (see "hg help resolve")
754 --------------
756 --------------
755
757
756 $ tm "up a " "um a b" " " "20 merge a and b to b, remove a"
758 $ tm "up a " "um a b" " " "20 merge a and b to b, remove a"
757 created new head
759 created new head
758 --------------
760 --------------
759 test L:up a R:um a b W: - 20 merge a and b to b, remove a
761 test L:up a R:um a b W: - 20 merge a and b to b, remove a
760 --------------
762 --------------
761 searching for copies back to rev 1
763 searching for copies back to rev 1
762 unmatched files in other:
764 unmatched files in other:
763 b
765 b
764 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
766 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
765 src: 'a' -> dst: 'b' *
767 src: 'a' -> dst: 'b' *
766 checking for directory renames
768 checking for directory renames
767 resolving manifests
769 resolving manifests
768 branchmerge: True, force: False, partial: False
770 branchmerge: True, force: False, partial: False
769 ancestor: 924404dff337, local: e300d1c794ec+, remote: 49b6d8032493
771 ancestor: 924404dff337, local: e300d1c794ec+, remote: 49b6d8032493
770 preserving a for resolve of b
772 preserving a for resolve of b
771 preserving rev for resolve of rev
773 preserving rev for resolve of rev
772 removing a
774 removing a
773 b: remote moved from a -> m (premerge)
775 b: remote moved from a -> m (premerge)
774 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
776 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
775 merging a and b to b
777 merging a and b to b
776 my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
778 my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
777 rev: versions differ -> m (premerge)
779 rev: versions differ -> m (premerge)
778 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
780 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
779 merging rev
781 merging rev
780 my rev@e300d1c794ec+ other rev@49b6d8032493 ancestor rev@924404dff337
782 my rev@e300d1c794ec+ other rev@49b6d8032493 ancestor rev@924404dff337
781 b: remote moved from a -> m (merge)
783 b: remote moved from a -> m (merge)
782 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
784 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
783 my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
785 my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
784 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
786 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
785 merge tool returned: 0
787 merge tool returned: 0
786 rev: versions differ -> m (merge)
788 rev: versions differ -> m (merge)
787 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
789 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
788 my rev@e300d1c794ec+ other rev@49b6d8032493 ancestor rev@924404dff337
790 my rev@e300d1c794ec+ other rev@49b6d8032493 ancestor rev@924404dff337
789 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
791 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
790 merge tool returned: 0
792 merge tool returned: 0
791 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
793 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
792 (branch merge, don't forget to commit)
794 (branch merge, don't forget to commit)
793 --------------
795 --------------
794 M b
796 M b
795 a
797 a
796 --------------
798 --------------
797
799
798 $ tm "um a b" "up a " " " "21 merge a and b to b"
800 $ tm "um a b" "up a " " " "21 merge a and b to b"
799 created new head
801 created new head
800 --------------
802 --------------
801 test L:um a b R:up a W: - 21 merge a and b to b
803 test L:um a b R:up a W: - 21 merge a and b to b
802 --------------
804 --------------
803 searching for copies back to rev 1
805 searching for copies back to rev 1
804 unmatched files in local:
806 unmatched files in local:
805 b
807 b
806 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
808 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
807 src: 'a' -> dst: 'b' *
809 src: 'a' -> dst: 'b' *
808 checking for directory renames
810 checking for directory renames
809 resolving manifests
811 resolving manifests
810 branchmerge: True, force: False, partial: False
812 branchmerge: True, force: False, partial: False
811 ancestor: 924404dff337, local: 62e7bf090eba+, remote: f4db7e329e71
813 ancestor: 924404dff337, local: 62e7bf090eba+, remote: f4db7e329e71
812 preserving b for resolve of b
814 preserving b for resolve of b
813 preserving rev for resolve of rev
815 preserving rev for resolve of rev
814 b: local copied/moved from a -> m (premerge)
816 b: local copied/moved from a -> m (premerge)
815 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
817 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
816 merging b and a to b
818 merging b and a to b
817 my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
819 my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
818 rev: versions differ -> m (premerge)
820 rev: versions differ -> m (premerge)
819 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
821 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
820 merging rev
822 merging rev
821 my rev@62e7bf090eba+ other rev@f4db7e329e71 ancestor rev@924404dff337
823 my rev@62e7bf090eba+ other rev@f4db7e329e71 ancestor rev@924404dff337
822 b: local copied/moved from a -> m (merge)
824 b: local copied/moved from a -> m (merge)
823 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
825 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
824 my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
826 my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
825 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
827 launching merge tool: python ../merge *$TESTTMP/t/t/b* * * (glob)
826 merge tool returned: 0
828 merge tool returned: 0
827 rev: versions differ -> m (merge)
829 rev: versions differ -> m (merge)
828 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
830 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
829 my rev@62e7bf090eba+ other rev@f4db7e329e71 ancestor rev@924404dff337
831 my rev@62e7bf090eba+ other rev@f4db7e329e71 ancestor rev@924404dff337
830 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
832 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
831 merge tool returned: 0
833 merge tool returned: 0
832 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
834 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
833 (branch merge, don't forget to commit)
835 (branch merge, don't forget to commit)
834 --------------
836 --------------
835 M b
837 M b
836 a
838 a
837 --------------
839 --------------
838
840
839
841
840 m "nm a b" "um x a" " " "22 get a, keep b"
842 m "nm a b" "um x a" " " "22 get a, keep b"
841
843
842 $ tm "nm a b" "up a c" " " "23 get c, keep b"
844 $ tm "nm a b" "up a c" " " "23 get c, keep b"
843 created new head
845 created new head
844 --------------
846 --------------
845 test L:nm a b R:up a c W: - 23 get c, keep b
847 test L:nm a b R:up a c W: - 23 get c, keep b
846 --------------
848 --------------
847 searching for copies back to rev 1
849 searching for copies back to rev 1
848 unmatched files in local:
850 unmatched files in local:
849 b
851 b
850 unmatched files in other:
852 unmatched files in other:
851 c
853 c
852 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
854 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
853 src: 'a' -> dst: 'b' *
855 src: 'a' -> dst: 'b' *
854 checking for directory renames
856 checking for directory renames
855 resolving manifests
857 resolving manifests
856 branchmerge: True, force: False, partial: False
858 branchmerge: True, force: False, partial: False
857 ancestor: 924404dff337, local: 02963e448370+, remote: 2b958612230f
859 ancestor: 924404dff337, local: 02963e448370+, remote: 2b958612230f
858 preserving b for resolve of b
860 preserving b for resolve of b
859 preserving rev for resolve of rev
861 preserving rev for resolve of rev
860 c: remote created -> g
862 c: remote created -> g
861 getting c
863 getting c
862 b: local copied/moved from a -> m (premerge)
864 b: local copied/moved from a -> m (premerge)
863 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
865 picked tool 'python ../merge' for b (binary False symlink False changedelete False)
864 merging b and a to b
866 merging b and a to b
865 my b@02963e448370+ other a@2b958612230f ancestor a@924404dff337
867 my b@02963e448370+ other a@2b958612230f ancestor a@924404dff337
866 premerge successful
868 premerge successful
867 rev: versions differ -> m (premerge)
869 rev: versions differ -> m (premerge)
868 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
870 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
869 merging rev
871 merging rev
870 my rev@02963e448370+ other rev@2b958612230f ancestor rev@924404dff337
872 my rev@02963e448370+ other rev@2b958612230f ancestor rev@924404dff337
871 rev: versions differ -> m (merge)
873 rev: versions differ -> m (merge)
872 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
874 picked tool 'python ../merge' for rev (binary False symlink False changedelete False)
873 my rev@02963e448370+ other rev@2b958612230f ancestor rev@924404dff337
875 my rev@02963e448370+ other rev@2b958612230f ancestor rev@924404dff337
874 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
876 launching merge tool: python ../merge *$TESTTMP/t/t/rev* * * (glob)
875 merge tool returned: 0
877 merge tool returned: 0
876 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
878 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
877 (branch merge, don't forget to commit)
879 (branch merge, don't forget to commit)
878 --------------
880 --------------
879 M b
881 M b
880 a
882 a
881 M c
883 M c
882 --------------
884 --------------
883
885
884
886
885 $ cd ..
887 $ cd ..
886
888
887
889
888 Systematic and terse testing of merge merges and ancestor calculation:
890 Systematic and terse testing of merge merges and ancestor calculation:
889
891
890 Expected result:
892 Expected result:
891
893
892 \ a m1 m2 dst
894 \ a m1 m2 dst
893 0 - f f f "versions differ"
895 0 - f f f "versions differ"
894 1 f g g g "versions differ"
896 1 f g g g "versions differ"
895 2 f f f f "versions differ"
897 2 f f f f "versions differ"
896 3 f f g f+g "remote copied to " + f
898 3 f f g f+g "remote copied to " + f
897 4 f f g g "remote moved to " + f
899 4 f f g g "remote moved to " + f
898 5 f g f f+g "local copied to " + f2
900 5 f g f f+g "local copied to " + f2
899 6 f g f g "local moved to " + f2
901 6 f g f g "local moved to " + f2
900 7 - (f) f f "remote differs from untracked local"
902 7 - (f) f f "remote differs from untracked local"
901 8 f (f) f f "remote differs from untracked local"
903 8 f (f) f f "remote differs from untracked local"
902
904
903 $ hg init ancestortest
905 $ hg init ancestortest
904 $ cd ancestortest
906 $ cd ancestortest
905 $ for x in 1 2 3 4 5 6 8; do mkdir $x; echo a > $x/f; done
907 $ for x in 1 2 3 4 5 6 8; do mkdir $x; echo a > $x/f; done
906 $ hg ci -Aqm "a"
908 $ hg ci -Aqm "a"
907 $ mkdir 0
909 $ mkdir 0
908 $ touch 0/f
910 $ touch 0/f
909 $ hg mv 1/f 1/g
911 $ hg mv 1/f 1/g
910 $ hg cp 5/f 5/g
912 $ hg cp 5/f 5/g
911 $ hg mv 6/f 6/g
913 $ hg mv 6/f 6/g
912 $ hg rm 8/f
914 $ hg rm 8/f
913 $ for x in */*; do echo m1 > $x; done
915 $ for x in */*; do echo m1 > $x; done
914 $ hg ci -Aqm "m1"
916 $ hg ci -Aqm "m1"
915 $ hg up -qr0
917 $ hg up -qr0
916 $ mkdir 0 7
918 $ mkdir 0 7
917 $ touch 0/f 7/f
919 $ touch 0/f 7/f
918 $ hg mv 1/f 1/g
920 $ hg mv 1/f 1/g
919 $ hg cp 3/f 3/g
921 $ hg cp 3/f 3/g
920 $ hg mv 4/f 4/g
922 $ hg mv 4/f 4/g
921 $ for x in */*; do echo m2 > $x; done
923 $ for x in */*; do echo m2 > $x; done
922 $ hg ci -Aqm "m2"
924 $ hg ci -Aqm "m2"
923 $ hg up -qr1
925 $ hg up -qr1
924 $ mkdir 7 8
926 $ mkdir 7 8
925 $ echo m > 7/f
927 $ echo m > 7/f
926 $ echo m > 8/f
928 $ echo m > 8/f
927 $ hg merge -f --tool internal:dump -v --debug -r2 | sed '/^resolving manifests/,$d' 2> /dev/null
929 $ hg merge -f --tool internal:dump -v --debug -r2 | sed '/^resolving manifests/,$d' 2> /dev/null
928 searching for copies back to rev 1
930 searching for copies back to rev 1
929 unmatched files in local:
931 unmatched files in local:
930 5/g
932 5/g
931 6/g
933 6/g
932 unmatched files in other:
934 unmatched files in other:
933 3/g
935 3/g
934 4/g
936 4/g
935 7/f
937 7/f
936 unmatched files new in both:
938 unmatched files new in both:
937 0/f
939 0/f
938 1/g
940 1/g
939 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
941 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
940 src: '3/f' -> dst: '3/g' *
942 src: '3/f' -> dst: '3/g' *
941 src: '4/f' -> dst: '4/g' *
943 src: '4/f' -> dst: '4/g' *
942 src: '5/f' -> dst: '5/g' *
944 src: '5/f' -> dst: '5/g' *
943 src: '6/f' -> dst: '6/g' *
945 src: '6/f' -> dst: '6/g' *
944 checking for directory renames
946 checking for directory renames
945 $ hg mani
947 $ hg mani
946 0/f
948 0/f
947 1/g
949 1/g
948 2/f
950 2/f
949 3/f
951 3/f
950 4/f
952 4/f
951 5/f
953 5/f
952 5/g
954 5/g
953 6/g
955 6/g
954 $ for f in */*; do echo $f:; cat $f; done
956 $ for f in */*; do echo $f:; cat $f; done
955 0/f:
957 0/f:
956 m1
958 m1
957 0/f.base:
959 0/f.base:
958 0/f.local:
960 0/f.local:
959 m1
961 m1
960 0/f.orig:
962 0/f.orig:
961 m1
963 m1
962 0/f.other:
964 0/f.other:
963 m2
965 m2
964 1/g:
966 1/g:
965 m1
967 m1
966 1/g.base:
968 1/g.base:
967 a
969 a
968 1/g.local:
970 1/g.local:
969 m1
971 m1
970 1/g.orig:
972 1/g.orig:
971 m1
973 m1
972 1/g.other:
974 1/g.other:
973 m2
975 m2
974 2/f:
976 2/f:
975 m1
977 m1
976 2/f.base:
978 2/f.base:
977 a
979 a
978 2/f.local:
980 2/f.local:
979 m1
981 m1
980 2/f.orig:
982 2/f.orig:
981 m1
983 m1
982 2/f.other:
984 2/f.other:
983 m2
985 m2
984 3/f:
986 3/f:
985 m1
987 m1
986 3/f.base:
988 3/f.base:
987 a
989 a
988 3/f.local:
990 3/f.local:
989 m1
991 m1
990 3/f.orig:
992 3/f.orig:
991 m1
993 m1
992 3/f.other:
994 3/f.other:
993 m2
995 m2
994 3/g:
996 3/g:
995 m1
997 m1
996 3/g.base:
998 3/g.base:
997 a
999 a
998 3/g.local:
1000 3/g.local:
999 m1
1001 m1
1000 3/g.orig:
1002 3/g.orig:
1001 m1
1003 m1
1002 3/g.other:
1004 3/g.other:
1003 m2
1005 m2
1004 4/g:
1006 4/g:
1005 m1
1007 m1
1006 4/g.base:
1008 4/g.base:
1007 a
1009 a
1008 4/g.local:
1010 4/g.local:
1009 m1
1011 m1
1010 4/g.orig:
1012 4/g.orig:
1011 m1
1013 m1
1012 4/g.other:
1014 4/g.other:
1013 m2
1015 m2
1014 5/f:
1016 5/f:
1015 m1
1017 m1
1016 5/f.base:
1018 5/f.base:
1017 a
1019 a
1018 5/f.local:
1020 5/f.local:
1019 m1
1021 m1
1020 5/f.orig:
1022 5/f.orig:
1021 m1
1023 m1
1022 5/f.other:
1024 5/f.other:
1023 m2
1025 m2
1024 5/g:
1026 5/g:
1025 m1
1027 m1
1026 5/g.base:
1028 5/g.base:
1027 a
1029 a
1028 5/g.local:
1030 5/g.local:
1029 m1
1031 m1
1030 5/g.orig:
1032 5/g.orig:
1031 m1
1033 m1
1032 5/g.other:
1034 5/g.other:
1033 m2
1035 m2
1034 6/g:
1036 6/g:
1035 m1
1037 m1
1036 6/g.base:
1038 6/g.base:
1037 a
1039 a
1038 6/g.local:
1040 6/g.local:
1039 m1
1041 m1
1040 6/g.orig:
1042 6/g.orig:
1041 m1
1043 m1
1042 6/g.other:
1044 6/g.other:
1043 m2
1045 m2
1044 7/f:
1046 7/f:
1045 m
1047 m
1046 7/f.base:
1048 7/f.base:
1047 7/f.local:
1049 7/f.local:
1048 m
1050 m
1049 7/f.orig:
1051 7/f.orig:
1050 m
1052 m
1051 7/f.other:
1053 7/f.other:
1052 m2
1054 m2
1053 8/f:
1055 8/f:
1054 m2
1056 m2
1055 $ cd ..
1057 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now