##// END OF EJS Templates
filemerge: make last line of prompts <40 english chars (issue6158)...
Kyle Lippincott -
r42765:4764e843 default
parent child Browse files
Show More
@@ -1,1065 +1,1073 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 contextlib
10 import contextlib
11 import os
11 import os
12 import re
12 import re
13 import shutil
13 import shutil
14
14
15 from .i18n import _
15 from .i18n import _
16 from .node import (
16 from .node import (
17 hex,
17 hex,
18 nullid,
18 nullid,
19 short,
19 short,
20 )
20 )
21
21
22 from . import (
22 from . import (
23 encoding,
23 encoding,
24 error,
24 error,
25 formatter,
25 formatter,
26 match,
26 match,
27 pycompat,
27 pycompat,
28 registrar,
28 registrar,
29 scmutil,
29 scmutil,
30 simplemerge,
30 simplemerge,
31 tagmerge,
31 tagmerge,
32 templatekw,
32 templatekw,
33 templater,
33 templater,
34 templateutil,
34 templateutil,
35 util,
35 util,
36 )
36 )
37
37
38 from .utils import (
38 from .utils import (
39 procutil,
39 procutil,
40 stringutil,
40 stringutil,
41 )
41 )
42
42
43 def _toolstr(ui, tool, part, *args):
43 def _toolstr(ui, tool, part, *args):
44 return ui.config("merge-tools", tool + "." + part, *args)
44 return ui.config("merge-tools", tool + "." + part, *args)
45
45
46 def _toolbool(ui, tool, part,*args):
46 def _toolbool(ui, tool, part,*args):
47 return ui.configbool("merge-tools", tool + "." + part, *args)
47 return ui.configbool("merge-tools", tool + "." + part, *args)
48
48
49 def _toollist(ui, tool, part):
49 def _toollist(ui, tool, part):
50 return ui.configlist("merge-tools", tool + "." + part)
50 return ui.configlist("merge-tools", tool + "." + part)
51
51
52 internals = {}
52 internals = {}
53 # Merge tools to document.
53 # Merge tools to document.
54 internalsdoc = {}
54 internalsdoc = {}
55
55
56 internaltool = registrar.internalmerge()
56 internaltool = registrar.internalmerge()
57
57
58 # internal tool merge types
58 # internal tool merge types
59 nomerge = internaltool.nomerge
59 nomerge = internaltool.nomerge
60 mergeonly = internaltool.mergeonly # just the full merge, no premerge
60 mergeonly = internaltool.mergeonly # just the full merge, no premerge
61 fullmerge = internaltool.fullmerge # both premerge and merge
61 fullmerge = internaltool.fullmerge # both premerge and merge
62
62
63 # IMPORTANT: keep the last line of this prompt very short ("What do you want to
64 # do?") because of issue6158, ideally to <40 English characters (to allow other
65 # languages that may take more columns to still have a chance to fit in an
66 # 80-column screen).
63 _localchangedotherdeletedmsg = _(
67 _localchangedotherdeletedmsg = _(
64 "file '%(fd)s' was deleted in other%(o)s but was modified in local%(l)s.\n"
68 "file '%(fd)s' was deleted in other%(o)s but was modified in local%(l)s.\n"
65 "What do you want to do?\n"
69 "You can use (c)hanged version, (d)elete, or leave (u)nresolved.\n"
66 "use (c)hanged version, (d)elete, or leave (u)nresolved?"
70 "What do you want to do?"
67 "$$ &Changed $$ &Delete $$ &Unresolved")
71 "$$ &Changed $$ &Delete $$ &Unresolved")
68
72
69 _otherchangedlocaldeletedmsg = _(
73 _otherchangedlocaldeletedmsg = _(
70 "file '%(fd)s' was deleted in local%(l)s but was modified in other%(o)s.\n"
74 "file '%(fd)s' was deleted in local%(l)s but was modified in other%(o)s.\n"
71 "What do you want to do?\n"
75 "You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.\n"
72 "use (c)hanged version, leave (d)eleted, or "
76 "What do you want to do?"
73 "leave (u)nresolved?"
74 "$$ &Changed $$ &Deleted $$ &Unresolved")
77 "$$ &Changed $$ &Deleted $$ &Unresolved")
75
78
76 class absentfilectx(object):
79 class absentfilectx(object):
77 """Represents a file that's ostensibly in a context but is actually not
80 """Represents a file that's ostensibly in a context but is actually not
78 present in it.
81 present in it.
79
82
80 This is here because it's very specific to the filemerge code for now --
83 This is here because it's very specific to the filemerge code for now --
81 other code is likely going to break with the values this returns."""
84 other code is likely going to break with the values this returns."""
82 def __init__(self, ctx, f):
85 def __init__(self, ctx, f):
83 self._ctx = ctx
86 self._ctx = ctx
84 self._f = f
87 self._f = f
85
88
86 def path(self):
89 def path(self):
87 return self._f
90 return self._f
88
91
89 def size(self):
92 def size(self):
90 return None
93 return None
91
94
92 def data(self):
95 def data(self):
93 return None
96 return None
94
97
95 def filenode(self):
98 def filenode(self):
96 return nullid
99 return nullid
97
100
98 _customcmp = True
101 _customcmp = True
99 def cmp(self, fctx):
102 def cmp(self, fctx):
100 """compare with other file context
103 """compare with other file context
101
104
102 returns True if different from fctx.
105 returns True if different from fctx.
103 """
106 """
104 return not (fctx.isabsent() and
107 return not (fctx.isabsent() and
105 fctx.ctx() == self.ctx() and
108 fctx.ctx() == self.ctx() and
106 fctx.path() == self.path())
109 fctx.path() == self.path())
107
110
108 def flags(self):
111 def flags(self):
109 return ''
112 return ''
110
113
111 def changectx(self):
114 def changectx(self):
112 return self._ctx
115 return self._ctx
113
116
114 def isbinary(self):
117 def isbinary(self):
115 return False
118 return False
116
119
117 def isabsent(self):
120 def isabsent(self):
118 return True
121 return True
119
122
120 def _findtool(ui, tool):
123 def _findtool(ui, tool):
121 if tool in internals:
124 if tool in internals:
122 return tool
125 return tool
123 cmd = _toolstr(ui, tool, "executable", tool)
126 cmd = _toolstr(ui, tool, "executable", tool)
124 if cmd.startswith('python:'):
127 if cmd.startswith('python:'):
125 return cmd
128 return cmd
126 return findexternaltool(ui, tool)
129 return findexternaltool(ui, tool)
127
130
128 def _quotetoolpath(cmd):
131 def _quotetoolpath(cmd):
129 if cmd.startswith('python:'):
132 if cmd.startswith('python:'):
130 return cmd
133 return cmd
131 return procutil.shellquote(cmd)
134 return procutil.shellquote(cmd)
132
135
133 def findexternaltool(ui, tool):
136 def findexternaltool(ui, tool):
134 for kn in ("regkey", "regkeyalt"):
137 for kn in ("regkey", "regkeyalt"):
135 k = _toolstr(ui, tool, kn)
138 k = _toolstr(ui, tool, kn)
136 if not k:
139 if not k:
137 continue
140 continue
138 p = util.lookupreg(k, _toolstr(ui, tool, "regname"))
141 p = util.lookupreg(k, _toolstr(ui, tool, "regname"))
139 if p:
142 if p:
140 p = procutil.findexe(p + _toolstr(ui, tool, "regappend", ""))
143 p = procutil.findexe(p + _toolstr(ui, tool, "regappend", ""))
141 if p:
144 if p:
142 return p
145 return p
143 exe = _toolstr(ui, tool, "executable", tool)
146 exe = _toolstr(ui, tool, "executable", tool)
144 return procutil.findexe(util.expandpath(exe))
147 return procutil.findexe(util.expandpath(exe))
145
148
146 def _picktool(repo, ui, path, binary, symlink, changedelete):
149 def _picktool(repo, ui, path, binary, symlink, changedelete):
147 strictcheck = ui.configbool('merge', 'strict-capability-check')
150 strictcheck = ui.configbool('merge', 'strict-capability-check')
148
151
149 def hascapability(tool, capability, strict=False):
152 def hascapability(tool, capability, strict=False):
150 if tool in internals:
153 if tool in internals:
151 return strict and internals[tool].capabilities.get(capability)
154 return strict and internals[tool].capabilities.get(capability)
152 return _toolbool(ui, tool, capability)
155 return _toolbool(ui, tool, capability)
153
156
154 def supportscd(tool):
157 def supportscd(tool):
155 return tool in internals and internals[tool].mergetype == nomerge
158 return tool in internals and internals[tool].mergetype == nomerge
156
159
157 def check(tool, pat, symlink, binary, changedelete):
160 def check(tool, pat, symlink, binary, changedelete):
158 tmsg = tool
161 tmsg = tool
159 if pat:
162 if pat:
160 tmsg = _("%s (for pattern %s)") % (tool, pat)
163 tmsg = _("%s (for pattern %s)") % (tool, pat)
161 if not _findtool(ui, tool):
164 if not _findtool(ui, tool):
162 if pat: # explicitly requested tool deserves a warning
165 if pat: # explicitly requested tool deserves a warning
163 ui.warn(_("couldn't find merge tool %s\n") % tmsg)
166 ui.warn(_("couldn't find merge tool %s\n") % tmsg)
164 else: # configured but non-existing tools are more silent
167 else: # configured but non-existing tools are more silent
165 ui.note(_("couldn't find merge tool %s\n") % tmsg)
168 ui.note(_("couldn't find merge tool %s\n") % tmsg)
166 elif symlink and not hascapability(tool, "symlink", strictcheck):
169 elif symlink and not hascapability(tool, "symlink", strictcheck):
167 ui.warn(_("tool %s can't handle symlinks\n") % tmsg)
170 ui.warn(_("tool %s can't handle symlinks\n") % tmsg)
168 elif binary and not hascapability(tool, "binary", strictcheck):
171 elif binary and not hascapability(tool, "binary", strictcheck):
169 ui.warn(_("tool %s can't handle binary\n") % tmsg)
172 ui.warn(_("tool %s can't handle binary\n") % tmsg)
170 elif changedelete and not supportscd(tool):
173 elif changedelete and not supportscd(tool):
171 # the nomerge tools are the only tools that support change/delete
174 # the nomerge tools are the only tools that support change/delete
172 # conflicts
175 # conflicts
173 pass
176 pass
174 elif not procutil.gui() and _toolbool(ui, tool, "gui"):
177 elif not procutil.gui() and _toolbool(ui, tool, "gui"):
175 ui.warn(_("tool %s requires a GUI\n") % tmsg)
178 ui.warn(_("tool %s requires a GUI\n") % tmsg)
176 else:
179 else:
177 return True
180 return True
178 return False
181 return False
179
182
180 # internal config: ui.forcemerge
183 # internal config: ui.forcemerge
181 # forcemerge comes from command line arguments, highest priority
184 # forcemerge comes from command line arguments, highest priority
182 force = ui.config('ui', 'forcemerge')
185 force = ui.config('ui', 'forcemerge')
183 if force:
186 if force:
184 toolpath = _findtool(ui, force)
187 toolpath = _findtool(ui, force)
185 if changedelete and not supportscd(toolpath):
188 if changedelete and not supportscd(toolpath):
186 return ":prompt", None
189 return ":prompt", None
187 else:
190 else:
188 if toolpath:
191 if toolpath:
189 return (force, _quotetoolpath(toolpath))
192 return (force, _quotetoolpath(toolpath))
190 else:
193 else:
191 # mimic HGMERGE if given tool not found
194 # mimic HGMERGE if given tool not found
192 return (force, force)
195 return (force, force)
193
196
194 # HGMERGE takes next precedence
197 # HGMERGE takes next precedence
195 hgmerge = encoding.environ.get("HGMERGE")
198 hgmerge = encoding.environ.get("HGMERGE")
196 if hgmerge:
199 if hgmerge:
197 if changedelete and not supportscd(hgmerge):
200 if changedelete and not supportscd(hgmerge):
198 return ":prompt", None
201 return ":prompt", None
199 else:
202 else:
200 return (hgmerge, hgmerge)
203 return (hgmerge, hgmerge)
201
204
202 # then patterns
205 # then patterns
203
206
204 # whether binary capability should be checked strictly
207 # whether binary capability should be checked strictly
205 binarycap = binary and strictcheck
208 binarycap = binary and strictcheck
206
209
207 for pat, tool in ui.configitems("merge-patterns"):
210 for pat, tool in ui.configitems("merge-patterns"):
208 mf = match.match(repo.root, '', [pat])
211 mf = match.match(repo.root, '', [pat])
209 if mf(path) and check(tool, pat, symlink, binarycap, changedelete):
212 if mf(path) and check(tool, pat, symlink, binarycap, changedelete):
210 if binary and not hascapability(tool, "binary", strict=True):
213 if binary and not hascapability(tool, "binary", strict=True):
211 ui.warn(_("warning: check merge-patterns configurations,"
214 ui.warn(_("warning: check merge-patterns configurations,"
212 " if %r for binary file %r is unintentional\n"
215 " if %r for binary file %r is unintentional\n"
213 "(see 'hg help merge-tools'"
216 "(see 'hg help merge-tools'"
214 " for binary files capability)\n")
217 " for binary files capability)\n")
215 % (pycompat.bytestr(tool), pycompat.bytestr(path)))
218 % (pycompat.bytestr(tool), pycompat.bytestr(path)))
216 toolpath = _findtool(ui, tool)
219 toolpath = _findtool(ui, tool)
217 return (tool, _quotetoolpath(toolpath))
220 return (tool, _quotetoolpath(toolpath))
218
221
219 # then merge tools
222 # then merge tools
220 tools = {}
223 tools = {}
221 disabled = set()
224 disabled = set()
222 for k, v in ui.configitems("merge-tools"):
225 for k, v in ui.configitems("merge-tools"):
223 t = k.split('.')[0]
226 t = k.split('.')[0]
224 if t not in tools:
227 if t not in tools:
225 tools[t] = int(_toolstr(ui, t, "priority"))
228 tools[t] = int(_toolstr(ui, t, "priority"))
226 if _toolbool(ui, t, "disabled"):
229 if _toolbool(ui, t, "disabled"):
227 disabled.add(t)
230 disabled.add(t)
228 names = tools.keys()
231 names = tools.keys()
229 tools = sorted([(-p, tool) for tool, p in tools.items()
232 tools = sorted([(-p, tool) for tool, p in tools.items()
230 if tool not in disabled])
233 if tool not in disabled])
231 uimerge = ui.config("ui", "merge")
234 uimerge = ui.config("ui", "merge")
232 if uimerge:
235 if uimerge:
233 # external tools defined in uimerge won't be able to handle
236 # external tools defined in uimerge won't be able to handle
234 # change/delete conflicts
237 # change/delete conflicts
235 if check(uimerge, path, symlink, binary, changedelete):
238 if check(uimerge, path, symlink, binary, changedelete):
236 if uimerge not in names and not changedelete:
239 if uimerge not in names and not changedelete:
237 return (uimerge, uimerge)
240 return (uimerge, uimerge)
238 tools.insert(0, (None, uimerge)) # highest priority
241 tools.insert(0, (None, uimerge)) # highest priority
239 tools.append((None, "hgmerge")) # the old default, if found
242 tools.append((None, "hgmerge")) # the old default, if found
240 for p, t in tools:
243 for p, t in tools:
241 if check(t, None, symlink, binary, changedelete):
244 if check(t, None, symlink, binary, changedelete):
242 toolpath = _findtool(ui, t)
245 toolpath = _findtool(ui, t)
243 return (t, _quotetoolpath(toolpath))
246 return (t, _quotetoolpath(toolpath))
244
247
245 # internal merge or prompt as last resort
248 # internal merge or prompt as last resort
246 if symlink or binary or changedelete:
249 if symlink or binary or changedelete:
247 if not changedelete and len(tools):
250 if not changedelete and len(tools):
248 # any tool is rejected by capability for symlink or binary
251 # any tool is rejected by capability for symlink or binary
249 ui.warn(_("no tool found to merge %s\n") % path)
252 ui.warn(_("no tool found to merge %s\n") % path)
250 return ":prompt", None
253 return ":prompt", None
251 return ":merge", None
254 return ":merge", None
252
255
253 def _eoltype(data):
256 def _eoltype(data):
254 "Guess the EOL type of a file"
257 "Guess the EOL type of a file"
255 if '\0' in data: # binary
258 if '\0' in data: # binary
256 return None
259 return None
257 if '\r\n' in data: # Windows
260 if '\r\n' in data: # Windows
258 return '\r\n'
261 return '\r\n'
259 if '\r' in data: # Old Mac
262 if '\r' in data: # Old Mac
260 return '\r'
263 return '\r'
261 if '\n' in data: # UNIX
264 if '\n' in data: # UNIX
262 return '\n'
265 return '\n'
263 return None # unknown
266 return None # unknown
264
267
265 def _matcheol(file, back):
268 def _matcheol(file, back):
266 "Convert EOL markers in a file to match origfile"
269 "Convert EOL markers in a file to match origfile"
267 tostyle = _eoltype(back.data()) # No repo.wread filters?
270 tostyle = _eoltype(back.data()) # No repo.wread filters?
268 if tostyle:
271 if tostyle:
269 data = util.readfile(file)
272 data = util.readfile(file)
270 style = _eoltype(data)
273 style = _eoltype(data)
271 if style:
274 if style:
272 newdata = data.replace(style, tostyle)
275 newdata = data.replace(style, tostyle)
273 if newdata != data:
276 if newdata != data:
274 util.writefile(file, newdata)
277 util.writefile(file, newdata)
275
278
276 @internaltool('prompt', nomerge)
279 @internaltool('prompt', nomerge)
277 def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
280 def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
278 """Asks the user which of the local `p1()` or the other `p2()` version to
281 """Asks the user which of the local `p1()` or the other `p2()` version to
279 keep as the merged version."""
282 keep as the merged version."""
280 ui = repo.ui
283 ui = repo.ui
281 fd = fcd.path()
284 fd = fcd.path()
282 uipathfn = scmutil.getuipathfn(repo)
285 uipathfn = scmutil.getuipathfn(repo)
283
286
284 # Avoid prompting during an in-memory merge since it doesn't support merge
287 # Avoid prompting during an in-memory merge since it doesn't support merge
285 # conflicts.
288 # conflicts.
286 if fcd.changectx().isinmemory():
289 if fcd.changectx().isinmemory():
287 raise error.InMemoryMergeConflictsError('in-memory merge does not '
290 raise error.InMemoryMergeConflictsError('in-memory merge does not '
288 'support file conflicts')
291 'support file conflicts')
289
292
290 prompts = partextras(labels)
293 prompts = partextras(labels)
291 prompts['fd'] = uipathfn(fd)
294 prompts['fd'] = uipathfn(fd)
292 try:
295 try:
293 if fco.isabsent():
296 if fco.isabsent():
294 index = ui.promptchoice(
297 index = ui.promptchoice(
295 _localchangedotherdeletedmsg % prompts, 2)
298 _localchangedotherdeletedmsg % prompts, 2)
296 choice = ['local', 'other', 'unresolved'][index]
299 choice = ['local', 'other', 'unresolved'][index]
297 elif fcd.isabsent():
300 elif fcd.isabsent():
298 index = ui.promptchoice(
301 index = ui.promptchoice(
299 _otherchangedlocaldeletedmsg % prompts, 2)
302 _otherchangedlocaldeletedmsg % prompts, 2)
300 choice = ['other', 'local', 'unresolved'][index]
303 choice = ['other', 'local', 'unresolved'][index]
301 else:
304 else:
305 # IMPORTANT: keep the last line of this prompt ("What do you want to
306 # do?") very short, see comment next to _localchangedotherdeletedmsg
307 # at the top of the file for details.
302 index = ui.promptchoice(
308 index = ui.promptchoice(
303 _("keep (l)ocal%(l)s, take (o)ther%(o)s, or leave (u)nresolved"
309 _("file '%(fd)s' needs to be resolved.\n"
304 " for %(fd)s?"
310 "You can keep (l)ocal%(l)s, take (o)ther%(o)s, or leave "
311 "(u)nresolved.\n"
312 "What do you want to do?"
305 "$$ &Local $$ &Other $$ &Unresolved") % prompts, 2)
313 "$$ &Local $$ &Other $$ &Unresolved") % prompts, 2)
306 choice = ['local', 'other', 'unresolved'][index]
314 choice = ['local', 'other', 'unresolved'][index]
307
315
308 if choice == 'other':
316 if choice == 'other':
309 return _iother(repo, mynode, orig, fcd, fco, fca, toolconf,
317 return _iother(repo, mynode, orig, fcd, fco, fca, toolconf,
310 labels)
318 labels)
311 elif choice == 'local':
319 elif choice == 'local':
312 return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf,
320 return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf,
313 labels)
321 labels)
314 elif choice == 'unresolved':
322 elif choice == 'unresolved':
315 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
323 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
316 labels)
324 labels)
317 except error.ResponseExpected:
325 except error.ResponseExpected:
318 ui.write("\n")
326 ui.write("\n")
319 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
327 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
320 labels)
328 labels)
321
329
322 @internaltool('local', nomerge)
330 @internaltool('local', nomerge)
323 def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
331 def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
324 """Uses the local `p1()` version of files as the merged version."""
332 """Uses the local `p1()` version of files as the merged version."""
325 return 0, fcd.isabsent()
333 return 0, fcd.isabsent()
326
334
327 @internaltool('other', nomerge)
335 @internaltool('other', nomerge)
328 def _iother(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
336 def _iother(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
329 """Uses the other `p2()` version of files as the merged version."""
337 """Uses the other `p2()` version of files as the merged version."""
330 if fco.isabsent():
338 if fco.isabsent():
331 # local changed, remote deleted -- 'deleted' picked
339 # local changed, remote deleted -- 'deleted' picked
332 _underlyingfctxifabsent(fcd).remove()
340 _underlyingfctxifabsent(fcd).remove()
333 deleted = True
341 deleted = True
334 else:
342 else:
335 _underlyingfctxifabsent(fcd).write(fco.data(), fco.flags())
343 _underlyingfctxifabsent(fcd).write(fco.data(), fco.flags())
336 deleted = False
344 deleted = False
337 return 0, deleted
345 return 0, deleted
338
346
339 @internaltool('fail', nomerge)
347 @internaltool('fail', nomerge)
340 def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
348 def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
341 """
349 """
342 Rather than attempting to merge files that were modified on both
350 Rather than attempting to merge files that were modified on both
343 branches, it marks them as unresolved. The resolve command must be
351 branches, it marks them as unresolved. The resolve command must be
344 used to resolve these conflicts."""
352 used to resolve these conflicts."""
345 # for change/delete conflicts write out the changed version, then fail
353 # for change/delete conflicts write out the changed version, then fail
346 if fcd.isabsent():
354 if fcd.isabsent():
347 _underlyingfctxifabsent(fcd).write(fco.data(), fco.flags())
355 _underlyingfctxifabsent(fcd).write(fco.data(), fco.flags())
348 return 1, False
356 return 1, False
349
357
350 def _underlyingfctxifabsent(filectx):
358 def _underlyingfctxifabsent(filectx):
351 """Sometimes when resolving, our fcd is actually an absentfilectx, but
359 """Sometimes when resolving, our fcd is actually an absentfilectx, but
352 we want to write to it (to do the resolve). This helper returns the
360 we want to write to it (to do the resolve). This helper returns the
353 underyling workingfilectx in that case.
361 underyling workingfilectx in that case.
354 """
362 """
355 if filectx.isabsent():
363 if filectx.isabsent():
356 return filectx.changectx()[filectx.path()]
364 return filectx.changectx()[filectx.path()]
357 else:
365 else:
358 return filectx
366 return filectx
359
367
360 def _premerge(repo, fcd, fco, fca, toolconf, files, labels=None):
368 def _premerge(repo, fcd, fco, fca, toolconf, files, labels=None):
361 tool, toolpath, binary, symlink, scriptfn = toolconf
369 tool, toolpath, binary, symlink, scriptfn = toolconf
362 if symlink or fcd.isabsent() or fco.isabsent():
370 if symlink or fcd.isabsent() or fco.isabsent():
363 return 1
371 return 1
364 unused, unused, unused, back = files
372 unused, unused, unused, back = files
365
373
366 ui = repo.ui
374 ui = repo.ui
367
375
368 validkeep = ['keep', 'keep-merge3']
376 validkeep = ['keep', 'keep-merge3']
369
377
370 # do we attempt to simplemerge first?
378 # do we attempt to simplemerge first?
371 try:
379 try:
372 premerge = _toolbool(ui, tool, "premerge", not binary)
380 premerge = _toolbool(ui, tool, "premerge", not binary)
373 except error.ConfigError:
381 except error.ConfigError:
374 premerge = _toolstr(ui, tool, "premerge", "").lower()
382 premerge = _toolstr(ui, tool, "premerge", "").lower()
375 if premerge not in validkeep:
383 if premerge not in validkeep:
376 _valid = ', '.join(["'" + v + "'" for v in validkeep])
384 _valid = ', '.join(["'" + v + "'" for v in validkeep])
377 raise error.ConfigError(_("%s.premerge not valid "
385 raise error.ConfigError(_("%s.premerge not valid "
378 "('%s' is neither boolean nor %s)") %
386 "('%s' is neither boolean nor %s)") %
379 (tool, premerge, _valid))
387 (tool, premerge, _valid))
380
388
381 if premerge:
389 if premerge:
382 if premerge == 'keep-merge3':
390 if premerge == 'keep-merge3':
383 if not labels:
391 if not labels:
384 labels = _defaultconflictlabels
392 labels = _defaultconflictlabels
385 if len(labels) < 3:
393 if len(labels) < 3:
386 labels.append('base')
394 labels.append('base')
387 r = simplemerge.simplemerge(ui, fcd, fca, fco, quiet=True, label=labels)
395 r = simplemerge.simplemerge(ui, fcd, fca, fco, quiet=True, label=labels)
388 if not r:
396 if not r:
389 ui.debug(" premerge successful\n")
397 ui.debug(" premerge successful\n")
390 return 0
398 return 0
391 if premerge not in validkeep:
399 if premerge not in validkeep:
392 # restore from backup and try again
400 # restore from backup and try again
393 _restorebackup(fcd, back)
401 _restorebackup(fcd, back)
394 return 1 # continue merging
402 return 1 # continue merging
395
403
396 def _mergecheck(repo, mynode, orig, fcd, fco, fca, toolconf):
404 def _mergecheck(repo, mynode, orig, fcd, fco, fca, toolconf):
397 tool, toolpath, binary, symlink, scriptfn = toolconf
405 tool, toolpath, binary, symlink, scriptfn = toolconf
398 uipathfn = scmutil.getuipathfn(repo)
406 uipathfn = scmutil.getuipathfn(repo)
399 if symlink:
407 if symlink:
400 repo.ui.warn(_('warning: internal %s cannot merge symlinks '
408 repo.ui.warn(_('warning: internal %s cannot merge symlinks '
401 'for %s\n') % (tool, uipathfn(fcd.path())))
409 'for %s\n') % (tool, uipathfn(fcd.path())))
402 return False
410 return False
403 if fcd.isabsent() or fco.isabsent():
411 if fcd.isabsent() or fco.isabsent():
404 repo.ui.warn(_('warning: internal %s cannot merge change/delete '
412 repo.ui.warn(_('warning: internal %s cannot merge change/delete '
405 'conflict for %s\n') % (tool, uipathfn(fcd.path())))
413 'conflict for %s\n') % (tool, uipathfn(fcd.path())))
406 return False
414 return False
407 return True
415 return True
408
416
409 def _merge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels, mode):
417 def _merge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels, mode):
410 """
418 """
411 Uses the internal non-interactive simple merge algorithm for merging
419 Uses the internal non-interactive simple merge algorithm for merging
412 files. It will fail if there are any conflicts and leave markers in
420 files. It will fail if there are any conflicts and leave markers in
413 the partially merged file. Markers will have two sections, one for each side
421 the partially merged file. Markers will have two sections, one for each side
414 of merge, unless mode equals 'union' which suppresses the markers."""
422 of merge, unless mode equals 'union' which suppresses the markers."""
415 ui = repo.ui
423 ui = repo.ui
416
424
417 r = simplemerge.simplemerge(ui, fcd, fca, fco, label=labels, mode=mode)
425 r = simplemerge.simplemerge(ui, fcd, fca, fco, label=labels, mode=mode)
418 return True, r, False
426 return True, r, False
419
427
420 @internaltool('union', fullmerge,
428 @internaltool('union', fullmerge,
421 _("warning: conflicts while merging %s! "
429 _("warning: conflicts while merging %s! "
422 "(edit, then use 'hg resolve --mark')\n"),
430 "(edit, then use 'hg resolve --mark')\n"),
423 precheck=_mergecheck)
431 precheck=_mergecheck)
424 def _iunion(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
432 def _iunion(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
425 """
433 """
426 Uses the internal non-interactive simple merge algorithm for merging
434 Uses the internal non-interactive simple merge algorithm for merging
427 files. It will use both left and right sides for conflict regions.
435 files. It will use both left and right sides for conflict regions.
428 No markers are inserted."""
436 No markers are inserted."""
429 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
437 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
430 files, labels, 'union')
438 files, labels, 'union')
431
439
432 @internaltool('merge', fullmerge,
440 @internaltool('merge', fullmerge,
433 _("warning: conflicts while merging %s! "
441 _("warning: conflicts while merging %s! "
434 "(edit, then use 'hg resolve --mark')\n"),
442 "(edit, then use 'hg resolve --mark')\n"),
435 precheck=_mergecheck)
443 precheck=_mergecheck)
436 def _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
444 def _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
437 """
445 """
438 Uses the internal non-interactive simple merge algorithm for merging
446 Uses the internal non-interactive simple merge algorithm for merging
439 files. It will fail if there are any conflicts and leave markers in
447 files. It will fail if there are any conflicts and leave markers in
440 the partially merged file. Markers will have two sections, one for each side
448 the partially merged file. Markers will have two sections, one for each side
441 of merge."""
449 of merge."""
442 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
450 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
443 files, labels, 'merge')
451 files, labels, 'merge')
444
452
445 @internaltool('merge3', fullmerge,
453 @internaltool('merge3', fullmerge,
446 _("warning: conflicts while merging %s! "
454 _("warning: conflicts while merging %s! "
447 "(edit, then use 'hg resolve --mark')\n"),
455 "(edit, then use 'hg resolve --mark')\n"),
448 precheck=_mergecheck)
456 precheck=_mergecheck)
449 def _imerge3(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
457 def _imerge3(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
450 """
458 """
451 Uses the internal non-interactive simple merge algorithm for merging
459 Uses the internal non-interactive simple merge algorithm for merging
452 files. It will fail if there are any conflicts and leave markers in
460 files. It will fail if there are any conflicts and leave markers in
453 the partially merged file. Marker will have three sections, one from each
461 the partially merged file. Marker will have three sections, one from each
454 side of the merge and one for the base content."""
462 side of the merge and one for the base content."""
455 if not labels:
463 if not labels:
456 labels = _defaultconflictlabels
464 labels = _defaultconflictlabels
457 if len(labels) < 3:
465 if len(labels) < 3:
458 labels.append('base')
466 labels.append('base')
459 return _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels)
467 return _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels)
460
468
461 def _imergeauto(repo, mynode, orig, fcd, fco, fca, toolconf, files,
469 def _imergeauto(repo, mynode, orig, fcd, fco, fca, toolconf, files,
462 labels=None, localorother=None):
470 labels=None, localorother=None):
463 """
471 """
464 Generic driver for _imergelocal and _imergeother
472 Generic driver for _imergelocal and _imergeother
465 """
473 """
466 assert localorother is not None
474 assert localorother is not None
467 r = simplemerge.simplemerge(repo.ui, fcd, fca, fco, label=labels,
475 r = simplemerge.simplemerge(repo.ui, fcd, fca, fco, label=labels,
468 localorother=localorother)
476 localorother=localorother)
469 return True, r
477 return True, r
470
478
471 @internaltool('merge-local', mergeonly, precheck=_mergecheck)
479 @internaltool('merge-local', mergeonly, precheck=_mergecheck)
472 def _imergelocal(*args, **kwargs):
480 def _imergelocal(*args, **kwargs):
473 """
481 """
474 Like :merge, but resolve all conflicts non-interactively in favor
482 Like :merge, but resolve all conflicts non-interactively in favor
475 of the local `p1()` changes."""
483 of the local `p1()` changes."""
476 success, status = _imergeauto(localorother='local', *args, **kwargs)
484 success, status = _imergeauto(localorother='local', *args, **kwargs)
477 return success, status, False
485 return success, status, False
478
486
479 @internaltool('merge-other', mergeonly, precheck=_mergecheck)
487 @internaltool('merge-other', mergeonly, precheck=_mergecheck)
480 def _imergeother(*args, **kwargs):
488 def _imergeother(*args, **kwargs):
481 """
489 """
482 Like :merge, but resolve all conflicts non-interactively in favor
490 Like :merge, but resolve all conflicts non-interactively in favor
483 of the other `p2()` changes."""
491 of the other `p2()` changes."""
484 success, status = _imergeauto(localorother='other', *args, **kwargs)
492 success, status = _imergeauto(localorother='other', *args, **kwargs)
485 return success, status, False
493 return success, status, False
486
494
487 @internaltool('tagmerge', mergeonly,
495 @internaltool('tagmerge', mergeonly,
488 _("automatic tag merging of %s failed! "
496 _("automatic tag merging of %s failed! "
489 "(use 'hg resolve --tool :merge' or another merge "
497 "(use 'hg resolve --tool :merge' or another merge "
490 "tool of your choice)\n"))
498 "tool of your choice)\n"))
491 def _itagmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
499 def _itagmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
492 """
500 """
493 Uses the internal tag merge algorithm (experimental).
501 Uses the internal tag merge algorithm (experimental).
494 """
502 """
495 success, status = tagmerge.merge(repo, fcd, fco, fca)
503 success, status = tagmerge.merge(repo, fcd, fco, fca)
496 return success, status, False
504 return success, status, False
497
505
498 @internaltool('dump', fullmerge, binary=True, symlink=True)
506 @internaltool('dump', fullmerge, binary=True, symlink=True)
499 def _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
507 def _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
500 """
508 """
501 Creates three versions of the files to merge, containing the
509 Creates three versions of the files to merge, containing the
502 contents of local, other and base. These files can then be used to
510 contents of local, other and base. These files can then be used to
503 perform a merge manually. If the file to be merged is named
511 perform a merge manually. If the file to be merged is named
504 ``a.txt``, these files will accordingly be named ``a.txt.local``,
512 ``a.txt``, these files will accordingly be named ``a.txt.local``,
505 ``a.txt.other`` and ``a.txt.base`` and they will be placed in the
513 ``a.txt.other`` and ``a.txt.base`` and they will be placed in the
506 same directory as ``a.txt``.
514 same directory as ``a.txt``.
507
515
508 This implies premerge. Therefore, files aren't dumped, if premerge
516 This implies premerge. Therefore, files aren't dumped, if premerge
509 runs successfully. Use :forcedump to forcibly write files out.
517 runs successfully. Use :forcedump to forcibly write files out.
510 """
518 """
511 a = _workingpath(repo, fcd)
519 a = _workingpath(repo, fcd)
512 fd = fcd.path()
520 fd = fcd.path()
513
521
514 from . import context
522 from . import context
515 if isinstance(fcd, context.overlayworkingfilectx):
523 if isinstance(fcd, context.overlayworkingfilectx):
516 raise error.InMemoryMergeConflictsError('in-memory merge does not '
524 raise error.InMemoryMergeConflictsError('in-memory merge does not '
517 'support the :dump tool.')
525 'support the :dump tool.')
518
526
519 util.writefile(a + ".local", fcd.decodeddata())
527 util.writefile(a + ".local", fcd.decodeddata())
520 repo.wwrite(fd + ".other", fco.data(), fco.flags())
528 repo.wwrite(fd + ".other", fco.data(), fco.flags())
521 repo.wwrite(fd + ".base", fca.data(), fca.flags())
529 repo.wwrite(fd + ".base", fca.data(), fca.flags())
522 return False, 1, False
530 return False, 1, False
523
531
524 @internaltool('forcedump', mergeonly, binary=True, symlink=True)
532 @internaltool('forcedump', mergeonly, binary=True, symlink=True)
525 def _forcedump(repo, mynode, orig, fcd, fco, fca, toolconf, files,
533 def _forcedump(repo, mynode, orig, fcd, fco, fca, toolconf, files,
526 labels=None):
534 labels=None):
527 """
535 """
528 Creates three versions of the files as same as :dump, but omits premerge.
536 Creates three versions of the files as same as :dump, but omits premerge.
529 """
537 """
530 return _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files,
538 return _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files,
531 labels=labels)
539 labels=labels)
532
540
533 def _xmergeimm(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
541 def _xmergeimm(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
534 # In-memory merge simply raises an exception on all external merge tools,
542 # In-memory merge simply raises an exception on all external merge tools,
535 # for now.
543 # for now.
536 #
544 #
537 # It would be possible to run most tools with temporary files, but this
545 # It would be possible to run most tools with temporary files, but this
538 # raises the question of what to do if the user only partially resolves the
546 # raises the question of what to do if the user only partially resolves the
539 # file -- we can't leave a merge state. (Copy to somewhere in the .hg/
547 # file -- we can't leave a merge state. (Copy to somewhere in the .hg/
540 # directory and tell the user how to get it is my best idea, but it's
548 # directory and tell the user how to get it is my best idea, but it's
541 # clunky.)
549 # clunky.)
542 raise error.InMemoryMergeConflictsError('in-memory merge does not support '
550 raise error.InMemoryMergeConflictsError('in-memory merge does not support '
543 'external merge tools')
551 'external merge tools')
544
552
545 def _describemerge(ui, repo, mynode, fcl, fcb, fco, env, toolpath, args):
553 def _describemerge(ui, repo, mynode, fcl, fcb, fco, env, toolpath, args):
546 tmpl = ui.config('ui', 'pre-merge-tool-output-template')
554 tmpl = ui.config('ui', 'pre-merge-tool-output-template')
547 if not tmpl:
555 if not tmpl:
548 return
556 return
549
557
550 mappingdict = templateutil.mappingdict
558 mappingdict = templateutil.mappingdict
551 props = {'ctx': fcl.changectx(),
559 props = {'ctx': fcl.changectx(),
552 'node': hex(mynode),
560 'node': hex(mynode),
553 'path': fcl.path(),
561 'path': fcl.path(),
554 'local': mappingdict({'ctx': fcl.changectx(),
562 'local': mappingdict({'ctx': fcl.changectx(),
555 'fctx': fcl,
563 'fctx': fcl,
556 'node': hex(mynode),
564 'node': hex(mynode),
557 'name': _('local'),
565 'name': _('local'),
558 'islink': 'l' in fcl.flags(),
566 'islink': 'l' in fcl.flags(),
559 'label': env['HG_MY_LABEL']}),
567 'label': env['HG_MY_LABEL']}),
560 'base': mappingdict({'ctx': fcb.changectx(),
568 'base': mappingdict({'ctx': fcb.changectx(),
561 'fctx': fcb,
569 'fctx': fcb,
562 'name': _('base'),
570 'name': _('base'),
563 'islink': 'l' in fcb.flags(),
571 'islink': 'l' in fcb.flags(),
564 'label': env['HG_BASE_LABEL']}),
572 'label': env['HG_BASE_LABEL']}),
565 'other': mappingdict({'ctx': fco.changectx(),
573 'other': mappingdict({'ctx': fco.changectx(),
566 'fctx': fco,
574 'fctx': fco,
567 'name': _('other'),
575 'name': _('other'),
568 'islink': 'l' in fco.flags(),
576 'islink': 'l' in fco.flags(),
569 'label': env['HG_OTHER_LABEL']}),
577 'label': env['HG_OTHER_LABEL']}),
570 'toolpath': toolpath,
578 'toolpath': toolpath,
571 'toolargs': args}
579 'toolargs': args}
572
580
573 # TODO: make all of this something that can be specified on a per-tool basis
581 # TODO: make all of this something that can be specified on a per-tool basis
574 tmpl = templater.unquotestring(tmpl)
582 tmpl = templater.unquotestring(tmpl)
575
583
576 # Not using cmdutil.rendertemplate here since it causes errors importing
584 # Not using cmdutil.rendertemplate here since it causes errors importing
577 # things for us to import cmdutil.
585 # things for us to import cmdutil.
578 tres = formatter.templateresources(ui, repo)
586 tres = formatter.templateresources(ui, repo)
579 t = formatter.maketemplater(ui, tmpl, defaults=templatekw.keywords,
587 t = formatter.maketemplater(ui, tmpl, defaults=templatekw.keywords,
580 resources=tres)
588 resources=tres)
581 ui.status(t.renderdefault(props))
589 ui.status(t.renderdefault(props))
582
590
583 def _xmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
591 def _xmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
584 tool, toolpath, binary, symlink, scriptfn = toolconf
592 tool, toolpath, binary, symlink, scriptfn = toolconf
585 uipathfn = scmutil.getuipathfn(repo)
593 uipathfn = scmutil.getuipathfn(repo)
586 if fcd.isabsent() or fco.isabsent():
594 if fcd.isabsent() or fco.isabsent():
587 repo.ui.warn(_('warning: %s cannot merge change/delete conflict '
595 repo.ui.warn(_('warning: %s cannot merge change/delete conflict '
588 'for %s\n') % (tool, uipathfn(fcd.path())))
596 'for %s\n') % (tool, uipathfn(fcd.path())))
589 return False, 1, None
597 return False, 1, None
590 unused, unused, unused, back = files
598 unused, unused, unused, back = files
591 localpath = _workingpath(repo, fcd)
599 localpath = _workingpath(repo, fcd)
592 args = _toolstr(repo.ui, tool, "args")
600 args = _toolstr(repo.ui, tool, "args")
593
601
594 with _maketempfiles(repo, fco, fca, repo.wvfs.join(back.path()),
602 with _maketempfiles(repo, fco, fca, repo.wvfs.join(back.path()),
595 "$output" in args) as temppaths:
603 "$output" in args) as temppaths:
596 basepath, otherpath, localoutputpath = temppaths
604 basepath, otherpath, localoutputpath = temppaths
597 outpath = ""
605 outpath = ""
598 mylabel, otherlabel = labels[:2]
606 mylabel, otherlabel = labels[:2]
599 if len(labels) >= 3:
607 if len(labels) >= 3:
600 baselabel = labels[2]
608 baselabel = labels[2]
601 else:
609 else:
602 baselabel = 'base'
610 baselabel = 'base'
603 env = {'HG_FILE': fcd.path(),
611 env = {'HG_FILE': fcd.path(),
604 'HG_MY_NODE': short(mynode),
612 'HG_MY_NODE': short(mynode),
605 'HG_OTHER_NODE': short(fco.changectx().node()),
613 'HG_OTHER_NODE': short(fco.changectx().node()),
606 'HG_BASE_NODE': short(fca.changectx().node()),
614 'HG_BASE_NODE': short(fca.changectx().node()),
607 'HG_MY_ISLINK': 'l' in fcd.flags(),
615 'HG_MY_ISLINK': 'l' in fcd.flags(),
608 'HG_OTHER_ISLINK': 'l' in fco.flags(),
616 'HG_OTHER_ISLINK': 'l' in fco.flags(),
609 'HG_BASE_ISLINK': 'l' in fca.flags(),
617 'HG_BASE_ISLINK': 'l' in fca.flags(),
610 'HG_MY_LABEL': mylabel,
618 'HG_MY_LABEL': mylabel,
611 'HG_OTHER_LABEL': otherlabel,
619 'HG_OTHER_LABEL': otherlabel,
612 'HG_BASE_LABEL': baselabel,
620 'HG_BASE_LABEL': baselabel,
613 }
621 }
614 ui = repo.ui
622 ui = repo.ui
615
623
616 if "$output" in args:
624 if "$output" in args:
617 # read input from backup, write to original
625 # read input from backup, write to original
618 outpath = localpath
626 outpath = localpath
619 localpath = localoutputpath
627 localpath = localoutputpath
620 replace = {'local': localpath, 'base': basepath, 'other': otherpath,
628 replace = {'local': localpath, 'base': basepath, 'other': otherpath,
621 'output': outpath, 'labellocal': mylabel,
629 'output': outpath, 'labellocal': mylabel,
622 'labelother': otherlabel, 'labelbase': baselabel}
630 'labelother': otherlabel, 'labelbase': baselabel}
623 args = util.interpolate(
631 args = util.interpolate(
624 br'\$', replace, args,
632 br'\$', replace, args,
625 lambda s: procutil.shellquote(util.localpath(s)))
633 lambda s: procutil.shellquote(util.localpath(s)))
626 if _toolbool(ui, tool, "gui"):
634 if _toolbool(ui, tool, "gui"):
627 repo.ui.status(_('running merge tool %s for file %s\n') %
635 repo.ui.status(_('running merge tool %s for file %s\n') %
628 (tool, uipathfn(fcd.path())))
636 (tool, uipathfn(fcd.path())))
629 if scriptfn is None:
637 if scriptfn is None:
630 cmd = toolpath + ' ' + args
638 cmd = toolpath + ' ' + args
631 repo.ui.debug('launching merge tool: %s\n' % cmd)
639 repo.ui.debug('launching merge tool: %s\n' % cmd)
632 _describemerge(ui, repo, mynode, fcd, fca, fco, env, toolpath, args)
640 _describemerge(ui, repo, mynode, fcd, fca, fco, env, toolpath, args)
633 r = ui.system(cmd, cwd=repo.root, environ=env,
641 r = ui.system(cmd, cwd=repo.root, environ=env,
634 blockedtag='mergetool')
642 blockedtag='mergetool')
635 else:
643 else:
636 repo.ui.debug('launching python merge script: %s:%s\n' %
644 repo.ui.debug('launching python merge script: %s:%s\n' %
637 (toolpath, scriptfn))
645 (toolpath, scriptfn))
638 r = 0
646 r = 0
639 try:
647 try:
640 # avoid cycle cmdutil->merge->filemerge->extensions->cmdutil
648 # avoid cycle cmdutil->merge->filemerge->extensions->cmdutil
641 from . import extensions
649 from . import extensions
642 mod = extensions.loadpath(toolpath, 'hgmerge.%s' % tool)
650 mod = extensions.loadpath(toolpath, 'hgmerge.%s' % tool)
643 except Exception:
651 except Exception:
644 raise error.Abort(_("loading python merge script failed: %s") %
652 raise error.Abort(_("loading python merge script failed: %s") %
645 toolpath)
653 toolpath)
646 mergefn = getattr(mod, scriptfn, None)
654 mergefn = getattr(mod, scriptfn, None)
647 if mergefn is None:
655 if mergefn is None:
648 raise error.Abort(_("%s does not have function: %s") %
656 raise error.Abort(_("%s does not have function: %s") %
649 (toolpath, scriptfn))
657 (toolpath, scriptfn))
650 argslist = procutil.shellsplit(args)
658 argslist = procutil.shellsplit(args)
651 # avoid cycle cmdutil->merge->filemerge->hook->extensions->cmdutil
659 # avoid cycle cmdutil->merge->filemerge->hook->extensions->cmdutil
652 from . import hook
660 from . import hook
653 ret, raised = hook.pythonhook(ui, repo, "merge", toolpath,
661 ret, raised = hook.pythonhook(ui, repo, "merge", toolpath,
654 mergefn, {'args': argslist}, True)
662 mergefn, {'args': argslist}, True)
655 if raised:
663 if raised:
656 r = 1
664 r = 1
657 repo.ui.debug('merge tool returned: %d\n' % r)
665 repo.ui.debug('merge tool returned: %d\n' % r)
658 return True, r, False
666 return True, r, False
659
667
660 def _formatconflictmarker(ctx, template, label, pad):
668 def _formatconflictmarker(ctx, template, label, pad):
661 """Applies the given template to the ctx, prefixed by the label.
669 """Applies the given template to the ctx, prefixed by the label.
662
670
663 Pad is the minimum width of the label prefix, so that multiple markers
671 Pad is the minimum width of the label prefix, so that multiple markers
664 can have aligned templated parts.
672 can have aligned templated parts.
665 """
673 """
666 if ctx.node() is None:
674 if ctx.node() is None:
667 ctx = ctx.p1()
675 ctx = ctx.p1()
668
676
669 props = {'ctx': ctx}
677 props = {'ctx': ctx}
670 templateresult = template.renderdefault(props)
678 templateresult = template.renderdefault(props)
671
679
672 label = ('%s:' % label).ljust(pad + 1)
680 label = ('%s:' % label).ljust(pad + 1)
673 mark = '%s %s' % (label, templateresult)
681 mark = '%s %s' % (label, templateresult)
674
682
675 if mark:
683 if mark:
676 mark = mark.splitlines()[0] # split for safety
684 mark = mark.splitlines()[0] # split for safety
677
685
678 # 8 for the prefix of conflict marker lines (e.g. '<<<<<<< ')
686 # 8 for the prefix of conflict marker lines (e.g. '<<<<<<< ')
679 return stringutil.ellipsis(mark, 80 - 8)
687 return stringutil.ellipsis(mark, 80 - 8)
680
688
681 _defaultconflictlabels = ['local', 'other']
689 _defaultconflictlabels = ['local', 'other']
682
690
683 def _formatlabels(repo, fcd, fco, fca, labels, tool=None):
691 def _formatlabels(repo, fcd, fco, fca, labels, tool=None):
684 """Formats the given labels using the conflict marker template.
692 """Formats the given labels using the conflict marker template.
685
693
686 Returns a list of formatted labels.
694 Returns a list of formatted labels.
687 """
695 """
688 cd = fcd.changectx()
696 cd = fcd.changectx()
689 co = fco.changectx()
697 co = fco.changectx()
690 ca = fca.changectx()
698 ca = fca.changectx()
691
699
692 ui = repo.ui
700 ui = repo.ui
693 template = ui.config('ui', 'mergemarkertemplate')
701 template = ui.config('ui', 'mergemarkertemplate')
694 if tool is not None:
702 if tool is not None:
695 template = _toolstr(ui, tool, 'mergemarkertemplate', template)
703 template = _toolstr(ui, tool, 'mergemarkertemplate', template)
696 template = templater.unquotestring(template)
704 template = templater.unquotestring(template)
697 tres = formatter.templateresources(ui, repo)
705 tres = formatter.templateresources(ui, repo)
698 tmpl = formatter.maketemplater(ui, template, defaults=templatekw.keywords,
706 tmpl = formatter.maketemplater(ui, template, defaults=templatekw.keywords,
699 resources=tres)
707 resources=tres)
700
708
701 pad = max(len(l) for l in labels)
709 pad = max(len(l) for l in labels)
702
710
703 newlabels = [_formatconflictmarker(cd, tmpl, labels[0], pad),
711 newlabels = [_formatconflictmarker(cd, tmpl, labels[0], pad),
704 _formatconflictmarker(co, tmpl, labels[1], pad)]
712 _formatconflictmarker(co, tmpl, labels[1], pad)]
705 if len(labels) > 2:
713 if len(labels) > 2:
706 newlabels.append(_formatconflictmarker(ca, tmpl, labels[2], pad))
714 newlabels.append(_formatconflictmarker(ca, tmpl, labels[2], pad))
707 return newlabels
715 return newlabels
708
716
709 def partextras(labels):
717 def partextras(labels):
710 """Return a dictionary of extra labels for use in prompts to the user
718 """Return a dictionary of extra labels for use in prompts to the user
711
719
712 Intended use is in strings of the form "(l)ocal%(l)s".
720 Intended use is in strings of the form "(l)ocal%(l)s".
713 """
721 """
714 if labels is None:
722 if labels is None:
715 return {
723 return {
716 "l": "",
724 "l": "",
717 "o": "",
725 "o": "",
718 }
726 }
719
727
720 return {
728 return {
721 "l": " [%s]" % labels[0],
729 "l": " [%s]" % labels[0],
722 "o": " [%s]" % labels[1],
730 "o": " [%s]" % labels[1],
723 }
731 }
724
732
725 def _restorebackup(fcd, back):
733 def _restorebackup(fcd, back):
726 # TODO: Add a workingfilectx.write(otherfilectx) path so we can use
734 # TODO: Add a workingfilectx.write(otherfilectx) path so we can use
727 # util.copy here instead.
735 # util.copy here instead.
728 fcd.write(back.data(), fcd.flags())
736 fcd.write(back.data(), fcd.flags())
729
737
730 def _makebackup(repo, ui, wctx, fcd, premerge):
738 def _makebackup(repo, ui, wctx, fcd, premerge):
731 """Makes and returns a filectx-like object for ``fcd``'s backup file.
739 """Makes and returns a filectx-like object for ``fcd``'s backup file.
732
740
733 In addition to preserving the user's pre-existing modifications to `fcd`
741 In addition to preserving the user's pre-existing modifications to `fcd`
734 (if any), the backup is used to undo certain premerges, confirm whether a
742 (if any), the backup is used to undo certain premerges, confirm whether a
735 merge changed anything, and determine what line endings the new file should
743 merge changed anything, and determine what line endings the new file should
736 have.
744 have.
737
745
738 Backups only need to be written once (right before the premerge) since their
746 Backups only need to be written once (right before the premerge) since their
739 content doesn't change afterwards.
747 content doesn't change afterwards.
740 """
748 """
741 if fcd.isabsent():
749 if fcd.isabsent():
742 return None
750 return None
743 # TODO: Break this import cycle somehow. (filectx -> ctx -> fileset ->
751 # TODO: Break this import cycle somehow. (filectx -> ctx -> fileset ->
744 # merge -> filemerge). (I suspect the fileset import is the weakest link)
752 # merge -> filemerge). (I suspect the fileset import is the weakest link)
745 from . import context
753 from . import context
746 back = scmutil.backuppath(ui, repo, fcd.path())
754 back = scmutil.backuppath(ui, repo, fcd.path())
747 inworkingdir = (back.startswith(repo.wvfs.base) and not
755 inworkingdir = (back.startswith(repo.wvfs.base) and not
748 back.startswith(repo.vfs.base))
756 back.startswith(repo.vfs.base))
749 if isinstance(fcd, context.overlayworkingfilectx) and inworkingdir:
757 if isinstance(fcd, context.overlayworkingfilectx) and inworkingdir:
750 # If the backup file is to be in the working directory, and we're
758 # If the backup file is to be in the working directory, and we're
751 # merging in-memory, we must redirect the backup to the memory context
759 # merging in-memory, we must redirect the backup to the memory context
752 # so we don't disturb the working directory.
760 # so we don't disturb the working directory.
753 relpath = back[len(repo.wvfs.base) + 1:]
761 relpath = back[len(repo.wvfs.base) + 1:]
754 if premerge:
762 if premerge:
755 wctx[relpath].write(fcd.data(), fcd.flags())
763 wctx[relpath].write(fcd.data(), fcd.flags())
756 return wctx[relpath]
764 return wctx[relpath]
757 else:
765 else:
758 if premerge:
766 if premerge:
759 # Otherwise, write to wherever path the user specified the backups
767 # Otherwise, write to wherever path the user specified the backups
760 # should go. We still need to switch based on whether the source is
768 # should go. We still need to switch based on whether the source is
761 # in-memory so we can use the fast path of ``util.copy`` if both are
769 # in-memory so we can use the fast path of ``util.copy`` if both are
762 # on disk.
770 # on disk.
763 if isinstance(fcd, context.overlayworkingfilectx):
771 if isinstance(fcd, context.overlayworkingfilectx):
764 util.writefile(back, fcd.data())
772 util.writefile(back, fcd.data())
765 else:
773 else:
766 a = _workingpath(repo, fcd)
774 a = _workingpath(repo, fcd)
767 util.copyfile(a, back)
775 util.copyfile(a, back)
768 # A arbitraryfilectx is returned, so we can run the same functions on
776 # A arbitraryfilectx is returned, so we can run the same functions on
769 # the backup context regardless of where it lives.
777 # the backup context regardless of where it lives.
770 return context.arbitraryfilectx(back, repo=repo)
778 return context.arbitraryfilectx(back, repo=repo)
771
779
772 @contextlib.contextmanager
780 @contextlib.contextmanager
773 def _maketempfiles(repo, fco, fca, localpath, uselocalpath):
781 def _maketempfiles(repo, fco, fca, localpath, uselocalpath):
774 """Writes out `fco` and `fca` as temporary files, and (if uselocalpath)
782 """Writes out `fco` and `fca` as temporary files, and (if uselocalpath)
775 copies `localpath` to another temporary file, so an external merge tool may
783 copies `localpath` to another temporary file, so an external merge tool may
776 use them.
784 use them.
777 """
785 """
778 tmproot = None
786 tmproot = None
779 tmprootprefix = repo.ui.config('experimental', 'mergetempdirprefix')
787 tmprootprefix = repo.ui.config('experimental', 'mergetempdirprefix')
780 if tmprootprefix:
788 if tmprootprefix:
781 tmproot = pycompat.mkdtemp(prefix=tmprootprefix)
789 tmproot = pycompat.mkdtemp(prefix=tmprootprefix)
782
790
783 def maketempfrompath(prefix, path):
791 def maketempfrompath(prefix, path):
784 fullbase, ext = os.path.splitext(path)
792 fullbase, ext = os.path.splitext(path)
785 pre = "%s~%s" % (os.path.basename(fullbase), prefix)
793 pre = "%s~%s" % (os.path.basename(fullbase), prefix)
786 if tmproot:
794 if tmproot:
787 name = os.path.join(tmproot, pre)
795 name = os.path.join(tmproot, pre)
788 if ext:
796 if ext:
789 name += ext
797 name += ext
790 f = open(name, r"wb")
798 f = open(name, r"wb")
791 else:
799 else:
792 fd, name = pycompat.mkstemp(prefix=pre + '.', suffix=ext)
800 fd, name = pycompat.mkstemp(prefix=pre + '.', suffix=ext)
793 f = os.fdopen(fd, r"wb")
801 f = os.fdopen(fd, r"wb")
794 return f, name
802 return f, name
795
803
796 def tempfromcontext(prefix, ctx):
804 def tempfromcontext(prefix, ctx):
797 f, name = maketempfrompath(prefix, ctx.path())
805 f, name = maketempfrompath(prefix, ctx.path())
798 data = repo.wwritedata(ctx.path(), ctx.data())
806 data = repo.wwritedata(ctx.path(), ctx.data())
799 f.write(data)
807 f.write(data)
800 f.close()
808 f.close()
801 return name
809 return name
802
810
803 b = tempfromcontext("base", fca)
811 b = tempfromcontext("base", fca)
804 c = tempfromcontext("other", fco)
812 c = tempfromcontext("other", fco)
805 d = localpath
813 d = localpath
806 if uselocalpath:
814 if uselocalpath:
807 # We start off with this being the backup filename, so remove the .orig
815 # We start off with this being the backup filename, so remove the .orig
808 # to make syntax-highlighting more likely.
816 # to make syntax-highlighting more likely.
809 if d.endswith('.orig'):
817 if d.endswith('.orig'):
810 d, _ = os.path.splitext(d)
818 d, _ = os.path.splitext(d)
811 f, d = maketempfrompath("local", d)
819 f, d = maketempfrompath("local", d)
812 with open(localpath, 'rb') as src:
820 with open(localpath, 'rb') as src:
813 f.write(src.read())
821 f.write(src.read())
814 f.close()
822 f.close()
815
823
816 try:
824 try:
817 yield b, c, d
825 yield b, c, d
818 finally:
826 finally:
819 if tmproot:
827 if tmproot:
820 shutil.rmtree(tmproot)
828 shutil.rmtree(tmproot)
821 else:
829 else:
822 util.unlink(b)
830 util.unlink(b)
823 util.unlink(c)
831 util.unlink(c)
824 # if not uselocalpath, d is the 'orig'/backup file which we
832 # if not uselocalpath, d is the 'orig'/backup file which we
825 # shouldn't delete.
833 # shouldn't delete.
826 if d and uselocalpath:
834 if d and uselocalpath:
827 util.unlink(d)
835 util.unlink(d)
828
836
829 def _filemerge(premerge, repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
837 def _filemerge(premerge, repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
830 """perform a 3-way merge in the working directory
838 """perform a 3-way merge in the working directory
831
839
832 premerge = whether this is a premerge
840 premerge = whether this is a premerge
833 mynode = parent node before merge
841 mynode = parent node before merge
834 orig = original local filename before merge
842 orig = original local filename before merge
835 fco = other file context
843 fco = other file context
836 fca = ancestor file context
844 fca = ancestor file context
837 fcd = local file context for current/destination file
845 fcd = local file context for current/destination file
838
846
839 Returns whether the merge is complete, the return value of the merge, and
847 Returns whether the merge is complete, the return value of the merge, and
840 a boolean indicating whether the file was deleted from disk."""
848 a boolean indicating whether the file was deleted from disk."""
841
849
842 if not fco.cmp(fcd): # files identical?
850 if not fco.cmp(fcd): # files identical?
843 return True, None, False
851 return True, None, False
844
852
845 ui = repo.ui
853 ui = repo.ui
846 fd = fcd.path()
854 fd = fcd.path()
847 uipathfn = scmutil.getuipathfn(repo)
855 uipathfn = scmutil.getuipathfn(repo)
848 fduipath = uipathfn(fd)
856 fduipath = uipathfn(fd)
849 binary = fcd.isbinary() or fco.isbinary() or fca.isbinary()
857 binary = fcd.isbinary() or fco.isbinary() or fca.isbinary()
850 symlink = 'l' in fcd.flags() + fco.flags()
858 symlink = 'l' in fcd.flags() + fco.flags()
851 changedelete = fcd.isabsent() or fco.isabsent()
859 changedelete = fcd.isabsent() or fco.isabsent()
852 tool, toolpath = _picktool(repo, ui, fd, binary, symlink, changedelete)
860 tool, toolpath = _picktool(repo, ui, fd, binary, symlink, changedelete)
853 scriptfn = None
861 scriptfn = None
854 if tool in internals and tool.startswith('internal:'):
862 if tool in internals and tool.startswith('internal:'):
855 # normalize to new-style names (':merge' etc)
863 # normalize to new-style names (':merge' etc)
856 tool = tool[len('internal'):]
864 tool = tool[len('internal'):]
857 if toolpath and toolpath.startswith('python:'):
865 if toolpath and toolpath.startswith('python:'):
858 invalidsyntax = False
866 invalidsyntax = False
859 if toolpath.count(':') >= 2:
867 if toolpath.count(':') >= 2:
860 script, scriptfn = toolpath[7:].rsplit(':', 1)
868 script, scriptfn = toolpath[7:].rsplit(':', 1)
861 if not scriptfn:
869 if not scriptfn:
862 invalidsyntax = True
870 invalidsyntax = True
863 # missing :callable can lead to spliting on windows drive letter
871 # missing :callable can lead to spliting on windows drive letter
864 if '\\' in scriptfn or '/' in scriptfn:
872 if '\\' in scriptfn or '/' in scriptfn:
865 invalidsyntax = True
873 invalidsyntax = True
866 else:
874 else:
867 invalidsyntax = True
875 invalidsyntax = True
868 if invalidsyntax:
876 if invalidsyntax:
869 raise error.Abort(_("invalid 'python:' syntax: %s") % toolpath)
877 raise error.Abort(_("invalid 'python:' syntax: %s") % toolpath)
870 toolpath = script
878 toolpath = script
871 ui.debug("picked tool '%s' for %s (binary %s symlink %s changedelete %s)\n"
879 ui.debug("picked tool '%s' for %s (binary %s symlink %s changedelete %s)\n"
872 % (tool, fduipath, pycompat.bytestr(binary),
880 % (tool, fduipath, pycompat.bytestr(binary),
873 pycompat.bytestr(symlink), pycompat.bytestr(changedelete)))
881 pycompat.bytestr(symlink), pycompat.bytestr(changedelete)))
874
882
875 if tool in internals:
883 if tool in internals:
876 func = internals[tool]
884 func = internals[tool]
877 mergetype = func.mergetype
885 mergetype = func.mergetype
878 onfailure = func.onfailure
886 onfailure = func.onfailure
879 precheck = func.precheck
887 precheck = func.precheck
880 isexternal = False
888 isexternal = False
881 else:
889 else:
882 if wctx.isinmemory():
890 if wctx.isinmemory():
883 func = _xmergeimm
891 func = _xmergeimm
884 else:
892 else:
885 func = _xmerge
893 func = _xmerge
886 mergetype = fullmerge
894 mergetype = fullmerge
887 onfailure = _("merging %s failed!\n")
895 onfailure = _("merging %s failed!\n")
888 precheck = None
896 precheck = None
889 isexternal = True
897 isexternal = True
890
898
891 toolconf = tool, toolpath, binary, symlink, scriptfn
899 toolconf = tool, toolpath, binary, symlink, scriptfn
892
900
893 if mergetype == nomerge:
901 if mergetype == nomerge:
894 r, deleted = func(repo, mynode, orig, fcd, fco, fca, toolconf, labels)
902 r, deleted = func(repo, mynode, orig, fcd, fco, fca, toolconf, labels)
895 return True, r, deleted
903 return True, r, deleted
896
904
897 if premerge:
905 if premerge:
898 if orig != fco.path():
906 if orig != fco.path():
899 ui.status(_("merging %s and %s to %s\n") %
907 ui.status(_("merging %s and %s to %s\n") %
900 (uipathfn(orig), uipathfn(fco.path()), fduipath))
908 (uipathfn(orig), uipathfn(fco.path()), fduipath))
901 else:
909 else:
902 ui.status(_("merging %s\n") % fduipath)
910 ui.status(_("merging %s\n") % fduipath)
903
911
904 ui.debug("my %s other %s ancestor %s\n" % (fcd, fco, fca))
912 ui.debug("my %s other %s ancestor %s\n" % (fcd, fco, fca))
905
913
906 if precheck and not precheck(repo, mynode, orig, fcd, fco, fca,
914 if precheck and not precheck(repo, mynode, orig, fcd, fco, fca,
907 toolconf):
915 toolconf):
908 if onfailure:
916 if onfailure:
909 if wctx.isinmemory():
917 if wctx.isinmemory():
910 raise error.InMemoryMergeConflictsError('in-memory merge does '
918 raise error.InMemoryMergeConflictsError('in-memory merge does '
911 'not support merge '
919 'not support merge '
912 'conflicts')
920 'conflicts')
913 ui.warn(onfailure % fduipath)
921 ui.warn(onfailure % fduipath)
914 return True, 1, False
922 return True, 1, False
915
923
916 back = _makebackup(repo, ui, wctx, fcd, premerge)
924 back = _makebackup(repo, ui, wctx, fcd, premerge)
917 files = (None, None, None, back)
925 files = (None, None, None, back)
918 r = 1
926 r = 1
919 try:
927 try:
920 internalmarkerstyle = ui.config('ui', 'mergemarkers')
928 internalmarkerstyle = ui.config('ui', 'mergemarkers')
921 if isexternal:
929 if isexternal:
922 markerstyle = _toolstr(ui, tool, 'mergemarkers')
930 markerstyle = _toolstr(ui, tool, 'mergemarkers')
923 else:
931 else:
924 markerstyle = internalmarkerstyle
932 markerstyle = internalmarkerstyle
925
933
926 if not labels:
934 if not labels:
927 labels = _defaultconflictlabels
935 labels = _defaultconflictlabels
928 formattedlabels = labels
936 formattedlabels = labels
929 if markerstyle != 'basic':
937 if markerstyle != 'basic':
930 formattedlabels = _formatlabels(repo, fcd, fco, fca, labels,
938 formattedlabels = _formatlabels(repo, fcd, fco, fca, labels,
931 tool=tool)
939 tool=tool)
932
940
933 if premerge and mergetype == fullmerge:
941 if premerge and mergetype == fullmerge:
934 # conflict markers generated by premerge will use 'detailed'
942 # conflict markers generated by premerge will use 'detailed'
935 # settings if either ui.mergemarkers or the tool's mergemarkers
943 # settings if either ui.mergemarkers or the tool's mergemarkers
936 # setting is 'detailed'. This way tools can have basic labels in
944 # setting is 'detailed'. This way tools can have basic labels in
937 # space-constrained areas of the UI, but still get full information
945 # space-constrained areas of the UI, but still get full information
938 # in conflict markers if premerge is 'keep' or 'keep-merge3'.
946 # in conflict markers if premerge is 'keep' or 'keep-merge3'.
939 premergelabels = labels
947 premergelabels = labels
940 labeltool = None
948 labeltool = None
941 if markerstyle != 'basic':
949 if markerstyle != 'basic':
942 # respect 'tool's mergemarkertemplate (which defaults to
950 # respect 'tool's mergemarkertemplate (which defaults to
943 # ui.mergemarkertemplate)
951 # ui.mergemarkertemplate)
944 labeltool = tool
952 labeltool = tool
945 if internalmarkerstyle != 'basic' or markerstyle != 'basic':
953 if internalmarkerstyle != 'basic' or markerstyle != 'basic':
946 premergelabels = _formatlabels(repo, fcd, fco, fca,
954 premergelabels = _formatlabels(repo, fcd, fco, fca,
947 premergelabels, tool=labeltool)
955 premergelabels, tool=labeltool)
948
956
949 r = _premerge(repo, fcd, fco, fca, toolconf, files,
957 r = _premerge(repo, fcd, fco, fca, toolconf, files,
950 labels=premergelabels)
958 labels=premergelabels)
951 # complete if premerge successful (r is 0)
959 # complete if premerge successful (r is 0)
952 return not r, r, False
960 return not r, r, False
953
961
954 needcheck, r, deleted = func(repo, mynode, orig, fcd, fco, fca,
962 needcheck, r, deleted = func(repo, mynode, orig, fcd, fco, fca,
955 toolconf, files, labels=formattedlabels)
963 toolconf, files, labels=formattedlabels)
956
964
957 if needcheck:
965 if needcheck:
958 r = _check(repo, r, ui, tool, fcd, files)
966 r = _check(repo, r, ui, tool, fcd, files)
959
967
960 if r:
968 if r:
961 if onfailure:
969 if onfailure:
962 if wctx.isinmemory():
970 if wctx.isinmemory():
963 raise error.InMemoryMergeConflictsError('in-memory merge '
971 raise error.InMemoryMergeConflictsError('in-memory merge '
964 'does not support '
972 'does not support '
965 'merge conflicts')
973 'merge conflicts')
966 ui.warn(onfailure % fduipath)
974 ui.warn(onfailure % fduipath)
967 _onfilemergefailure(ui)
975 _onfilemergefailure(ui)
968
976
969 return True, r, deleted
977 return True, r, deleted
970 finally:
978 finally:
971 if not r and back is not None:
979 if not r and back is not None:
972 back.remove()
980 back.remove()
973
981
974 def _haltmerge():
982 def _haltmerge():
975 msg = _('merge halted after failed merge (see hg resolve)')
983 msg = _('merge halted after failed merge (see hg resolve)')
976 raise error.InterventionRequired(msg)
984 raise error.InterventionRequired(msg)
977
985
978 def _onfilemergefailure(ui):
986 def _onfilemergefailure(ui):
979 action = ui.config('merge', 'on-failure')
987 action = ui.config('merge', 'on-failure')
980 if action == 'prompt':
988 if action == 'prompt':
981 msg = _('continue merge operation (yn)?' '$$ &Yes $$ &No')
989 msg = _('continue merge operation (yn)?' '$$ &Yes $$ &No')
982 if ui.promptchoice(msg, 0) == 1:
990 if ui.promptchoice(msg, 0) == 1:
983 _haltmerge()
991 _haltmerge()
984 if action == 'halt':
992 if action == 'halt':
985 _haltmerge()
993 _haltmerge()
986 # default action is 'continue', in which case we neither prompt nor halt
994 # default action is 'continue', in which case we neither prompt nor halt
987
995
988 def hasconflictmarkers(data):
996 def hasconflictmarkers(data):
989 return bool(re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", data,
997 return bool(re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", data,
990 re.MULTILINE))
998 re.MULTILINE))
991
999
992 def _check(repo, r, ui, tool, fcd, files):
1000 def _check(repo, r, ui, tool, fcd, files):
993 fd = fcd.path()
1001 fd = fcd.path()
994 uipathfn = scmutil.getuipathfn(repo)
1002 uipathfn = scmutil.getuipathfn(repo)
995 unused, unused, unused, back = files
1003 unused, unused, unused, back = files
996
1004
997 if not r and (_toolbool(ui, tool, "checkconflicts") or
1005 if not r and (_toolbool(ui, tool, "checkconflicts") or
998 'conflicts' in _toollist(ui, tool, "check")):
1006 'conflicts' in _toollist(ui, tool, "check")):
999 if hasconflictmarkers(fcd.data()):
1007 if hasconflictmarkers(fcd.data()):
1000 r = 1
1008 r = 1
1001
1009
1002 checked = False
1010 checked = False
1003 if 'prompt' in _toollist(ui, tool, "check"):
1011 if 'prompt' in _toollist(ui, tool, "check"):
1004 checked = True
1012 checked = True
1005 if ui.promptchoice(_("was merge of '%s' successful (yn)?"
1013 if ui.promptchoice(_("was merge of '%s' successful (yn)?"
1006 "$$ &Yes $$ &No") % uipathfn(fd), 1):
1014 "$$ &Yes $$ &No") % uipathfn(fd), 1):
1007 r = 1
1015 r = 1
1008
1016
1009 if not r and not checked and (_toolbool(ui, tool, "checkchanged") or
1017 if not r and not checked and (_toolbool(ui, tool, "checkchanged") or
1010 'changed' in
1018 'changed' in
1011 _toollist(ui, tool, "check")):
1019 _toollist(ui, tool, "check")):
1012 if back is not None and not fcd.cmp(back):
1020 if back is not None and not fcd.cmp(back):
1013 if ui.promptchoice(_(" output file %s appears unchanged\n"
1021 if ui.promptchoice(_(" output file %s appears unchanged\n"
1014 "was merge successful (yn)?"
1022 "was merge successful (yn)?"
1015 "$$ &Yes $$ &No") % uipathfn(fd), 1):
1023 "$$ &Yes $$ &No") % uipathfn(fd), 1):
1016 r = 1
1024 r = 1
1017
1025
1018 if back is not None and _toolbool(ui, tool, "fixeol"):
1026 if back is not None and _toolbool(ui, tool, "fixeol"):
1019 _matcheol(_workingpath(repo, fcd), back)
1027 _matcheol(_workingpath(repo, fcd), back)
1020
1028
1021 return r
1029 return r
1022
1030
1023 def _workingpath(repo, ctx):
1031 def _workingpath(repo, ctx):
1024 return repo.wjoin(ctx.path())
1032 return repo.wjoin(ctx.path())
1025
1033
1026 def premerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
1034 def premerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
1027 return _filemerge(True, repo, wctx, mynode, orig, fcd, fco, fca,
1035 return _filemerge(True, repo, wctx, mynode, orig, fcd, fco, fca,
1028 labels=labels)
1036 labels=labels)
1029
1037
1030 def filemerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
1038 def filemerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
1031 return _filemerge(False, repo, wctx, mynode, orig, fcd, fco, fca,
1039 return _filemerge(False, repo, wctx, mynode, orig, fcd, fco, fca,
1032 labels=labels)
1040 labels=labels)
1033
1041
1034 def loadinternalmerge(ui, extname, registrarobj):
1042 def loadinternalmerge(ui, extname, registrarobj):
1035 """Load internal merge tool from specified registrarobj
1043 """Load internal merge tool from specified registrarobj
1036 """
1044 """
1037 for name, func in registrarobj._table.iteritems():
1045 for name, func in registrarobj._table.iteritems():
1038 fullname = ':' + name
1046 fullname = ':' + name
1039 internals[fullname] = func
1047 internals[fullname] = func
1040 internals['internal:' + name] = func
1048 internals['internal:' + name] = func
1041 internalsdoc[fullname] = func
1049 internalsdoc[fullname] = func
1042
1050
1043 capabilities = sorted([k for k, v in func.capabilities.items() if v])
1051 capabilities = sorted([k for k, v in func.capabilities.items() if v])
1044 if capabilities:
1052 if capabilities:
1045 capdesc = " (actual capabilities: %s)" % ', '.join(capabilities)
1053 capdesc = " (actual capabilities: %s)" % ', '.join(capabilities)
1046 func.__doc__ = (func.__doc__ +
1054 func.__doc__ = (func.__doc__ +
1047 pycompat.sysstr("\n\n%s" % capdesc))
1055 pycompat.sysstr("\n\n%s" % capdesc))
1048
1056
1049 # to put i18n comments into hg.pot for automatically generated texts
1057 # to put i18n comments into hg.pot for automatically generated texts
1050
1058
1051 # i18n: "binary" and "symlink" are keywords
1059 # i18n: "binary" and "symlink" are keywords
1052 # i18n: this text is added automatically
1060 # i18n: this text is added automatically
1053 _(" (actual capabilities: binary, symlink)")
1061 _(" (actual capabilities: binary, symlink)")
1054 # i18n: "binary" is keyword
1062 # i18n: "binary" is keyword
1055 # i18n: this text is added automatically
1063 # i18n: this text is added automatically
1056 _(" (actual capabilities: binary)")
1064 _(" (actual capabilities: binary)")
1057 # i18n: "symlink" is keyword
1065 # i18n: "symlink" is keyword
1058 # i18n: this text is added automatically
1066 # i18n: this text is added automatically
1059 _(" (actual capabilities: symlink)")
1067 _(" (actual capabilities: symlink)")
1060
1068
1061 # load built-in merge tools explicitly to setup internalsdoc
1069 # load built-in merge tools explicitly to setup internalsdoc
1062 loadinternalmerge(None, None, internaltool)
1070 loadinternalmerge(None, None, internaltool)
1063
1071
1064 # tell hggettext to extract docstrings from these functions:
1072 # tell hggettext to extract docstrings from these functions:
1065 i18nfunctions = internals.values()
1073 i18nfunctions = internals.values()
@@ -1,1319 +1,1319 b''
1 $ hg init
1 $ hg init
2
2
3 Setup:
3 Setup:
4
4
5 $ echo a >> a
5 $ echo a >> a
6 $ hg ci -Am 'base'
6 $ hg ci -Am 'base'
7 adding a
7 adding a
8
8
9 Refuse to amend public csets:
9 Refuse to amend public csets:
10
10
11 $ hg phase -r . -p
11 $ hg phase -r . -p
12 $ hg ci --amend
12 $ hg ci --amend
13 abort: cannot amend public changesets
13 abort: cannot amend public changesets
14 (see 'hg help phases' for details)
14 (see 'hg help phases' for details)
15 [255]
15 [255]
16 $ hg phase -r . -f -d
16 $ hg phase -r . -f -d
17
17
18 $ echo a >> a
18 $ echo a >> a
19 $ hg ci -Am 'base1'
19 $ hg ci -Am 'base1'
20
20
21 Nothing to amend:
21 Nothing to amend:
22
22
23 $ hg ci --amend -m 'base1'
23 $ hg ci --amend -m 'base1'
24 nothing changed
24 nothing changed
25 [1]
25 [1]
26
26
27 $ cat >> $HGRCPATH <<EOF
27 $ cat >> $HGRCPATH <<EOF
28 > [hooks]
28 > [hooks]
29 > pretxncommit.foo = sh -c "echo \\"pretxncommit \$HG_NODE\\"; hg id -r \$HG_NODE"
29 > pretxncommit.foo = sh -c "echo \\"pretxncommit \$HG_NODE\\"; hg id -r \$HG_NODE"
30 > EOF
30 > EOF
31
31
32 Amending changeset with changes in working dir:
32 Amending changeset with changes in working dir:
33 (and check that --message does not trigger an editor)
33 (and check that --message does not trigger an editor)
34
34
35 $ echo a >> a
35 $ echo a >> a
36 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -m 'amend base1'
36 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -m 'amend base1'
37 pretxncommit 43f1ba15f28a50abf0aae529cf8a16bfced7b149
37 pretxncommit 43f1ba15f28a50abf0aae529cf8a16bfced7b149
38 43f1ba15f28a tip
38 43f1ba15f28a tip
39 saved backup bundle to $TESTTMP/.hg/strip-backup/489edb5b847d-5ab4f721-amend.hg
39 saved backup bundle to $TESTTMP/.hg/strip-backup/489edb5b847d-5ab4f721-amend.hg
40 $ echo 'pretxncommit.foo = ' >> $HGRCPATH
40 $ echo 'pretxncommit.foo = ' >> $HGRCPATH
41 $ hg diff -c .
41 $ hg diff -c .
42 diff -r ad120869acf0 -r 43f1ba15f28a a
42 diff -r ad120869acf0 -r 43f1ba15f28a a
43 --- a/a Thu Jan 01 00:00:00 1970 +0000
43 --- a/a Thu Jan 01 00:00:00 1970 +0000
44 +++ b/a Thu Jan 01 00:00:00 1970 +0000
44 +++ b/a Thu Jan 01 00:00:00 1970 +0000
45 @@ -1,1 +1,3 @@
45 @@ -1,1 +1,3 @@
46 a
46 a
47 +a
47 +a
48 +a
48 +a
49 $ hg log
49 $ hg log
50 changeset: 1:43f1ba15f28a
50 changeset: 1:43f1ba15f28a
51 tag: tip
51 tag: tip
52 user: test
52 user: test
53 date: Thu Jan 01 00:00:00 1970 +0000
53 date: Thu Jan 01 00:00:00 1970 +0000
54 summary: amend base1
54 summary: amend base1
55
55
56 changeset: 0:ad120869acf0
56 changeset: 0:ad120869acf0
57 user: test
57 user: test
58 date: Thu Jan 01 00:00:00 1970 +0000
58 date: Thu Jan 01 00:00:00 1970 +0000
59 summary: base
59 summary: base
60
60
61
61
62 Check proper abort for empty message
62 Check proper abort for empty message
63
63
64 $ cat > editor.sh << '__EOF__'
64 $ cat > editor.sh << '__EOF__'
65 > #!/bin/sh
65 > #!/bin/sh
66 > echo "" > "$1"
66 > echo "" > "$1"
67 > __EOF__
67 > __EOF__
68
68
69 Update the existing file to ensure that the dirstate is not in pending state
69 Update the existing file to ensure that the dirstate is not in pending state
70 (where the status of some files in the working copy is not known yet). This in
70 (where the status of some files in the working copy is not known yet). This in
71 turn ensures that when the transaction is aborted due to an empty message during
71 turn ensures that when the transaction is aborted due to an empty message during
72 the amend, there should be no rollback.
72 the amend, there should be no rollback.
73 $ echo a >> a
73 $ echo a >> a
74
74
75 $ echo b > b
75 $ echo b > b
76 $ hg add b
76 $ hg add b
77 $ hg summary
77 $ hg summary
78 parent: 1:43f1ba15f28a tip
78 parent: 1:43f1ba15f28a tip
79 amend base1
79 amend base1
80 branch: default
80 branch: default
81 commit: 1 modified, 1 added, 1 unknown
81 commit: 1 modified, 1 added, 1 unknown
82 update: (current)
82 update: (current)
83 phases: 2 draft
83 phases: 2 draft
84 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend
84 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend
85 abort: empty commit message
85 abort: empty commit message
86 [255]
86 [255]
87 $ hg summary
87 $ hg summary
88 parent: 1:43f1ba15f28a tip
88 parent: 1:43f1ba15f28a tip
89 amend base1
89 amend base1
90 branch: default
90 branch: default
91 commit: 1 modified, 1 added, 1 unknown
91 commit: 1 modified, 1 added, 1 unknown
92 update: (current)
92 update: (current)
93 phases: 2 draft
93 phases: 2 draft
94
94
95 Add new file along with modified existing file:
95 Add new file along with modified existing file:
96 $ hg ci --amend -m 'amend base1 new file'
96 $ hg ci --amend -m 'amend base1 new file'
97 saved backup bundle to $TESTTMP/.hg/strip-backup/43f1ba15f28a-007467c2-amend.hg
97 saved backup bundle to $TESTTMP/.hg/strip-backup/43f1ba15f28a-007467c2-amend.hg
98
98
99 Remove file that was added in amended commit:
99 Remove file that was added in amended commit:
100 (and test logfile option)
100 (and test logfile option)
101 (and test that logfile option do not trigger an editor)
101 (and test that logfile option do not trigger an editor)
102
102
103 $ hg rm b
103 $ hg rm b
104 $ echo 'amend base1 remove new file' > ../logfile
104 $ echo 'amend base1 remove new file' > ../logfile
105 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg ci --amend --logfile ../logfile
105 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg ci --amend --logfile ../logfile
106 saved backup bundle to $TESTTMP/.hg/strip-backup/c16295aaf401-1ada9901-amend.hg
106 saved backup bundle to $TESTTMP/.hg/strip-backup/c16295aaf401-1ada9901-amend.hg
107
107
108 $ hg cat b
108 $ hg cat b
109 b: no such file in rev 47343646fa3d
109 b: no such file in rev 47343646fa3d
110 [1]
110 [1]
111
111
112 No changes, just a different message:
112 No changes, just a different message:
113
113
114 $ hg ci -v --amend -m 'no changes, new message'
114 $ hg ci -v --amend -m 'no changes, new message'
115 amending changeset 47343646fa3d
115 amending changeset 47343646fa3d
116 copying changeset 47343646fa3d to ad120869acf0
116 copying changeset 47343646fa3d to ad120869acf0
117 committing files:
117 committing files:
118 a
118 a
119 committing manifest
119 committing manifest
120 committing changelog
120 committing changelog
121 1 changesets found
121 1 changesets found
122 uncompressed size of bundle content:
122 uncompressed size of bundle content:
123 254 (changelog)
123 254 (changelog)
124 163 (manifests)
124 163 (manifests)
125 131 a
125 131 a
126 saved backup bundle to $TESTTMP/.hg/strip-backup/47343646fa3d-c2758885-amend.hg
126 saved backup bundle to $TESTTMP/.hg/strip-backup/47343646fa3d-c2758885-amend.hg
127 1 changesets found
127 1 changesets found
128 uncompressed size of bundle content:
128 uncompressed size of bundle content:
129 250 (changelog)
129 250 (changelog)
130 163 (manifests)
130 163 (manifests)
131 131 a
131 131 a
132 adding branch
132 adding branch
133 adding changesets
133 adding changesets
134 adding manifests
134 adding manifests
135 adding file changes
135 adding file changes
136 added 1 changesets with 1 changes to 1 files
136 added 1 changesets with 1 changes to 1 files
137 committed changeset 1:401431e913a1
137 committed changeset 1:401431e913a1
138 $ hg diff -c .
138 $ hg diff -c .
139 diff -r ad120869acf0 -r 401431e913a1 a
139 diff -r ad120869acf0 -r 401431e913a1 a
140 --- a/a Thu Jan 01 00:00:00 1970 +0000
140 --- a/a Thu Jan 01 00:00:00 1970 +0000
141 +++ b/a Thu Jan 01 00:00:00 1970 +0000
141 +++ b/a Thu Jan 01 00:00:00 1970 +0000
142 @@ -1,1 +1,4 @@
142 @@ -1,1 +1,4 @@
143 a
143 a
144 +a
144 +a
145 +a
145 +a
146 +a
146 +a
147 $ hg log
147 $ hg log
148 changeset: 1:401431e913a1
148 changeset: 1:401431e913a1
149 tag: tip
149 tag: tip
150 user: test
150 user: test
151 date: Thu Jan 01 00:00:00 1970 +0000
151 date: Thu Jan 01 00:00:00 1970 +0000
152 summary: no changes, new message
152 summary: no changes, new message
153
153
154 changeset: 0:ad120869acf0
154 changeset: 0:ad120869acf0
155 user: test
155 user: test
156 date: Thu Jan 01 00:00:00 1970 +0000
156 date: Thu Jan 01 00:00:00 1970 +0000
157 summary: base
157 summary: base
158
158
159
159
160 Disable default date on commit so when -d isn't given, the old date is preserved:
160 Disable default date on commit so when -d isn't given, the old date is preserved:
161
161
162 $ echo '[defaults]' >> $HGRCPATH
162 $ echo '[defaults]' >> $HGRCPATH
163 $ echo 'commit=' >> $HGRCPATH
163 $ echo 'commit=' >> $HGRCPATH
164
164
165 Test -u/-d:
165 Test -u/-d:
166
166
167 $ cat > .hg/checkeditform.sh <<EOF
167 $ cat > .hg/checkeditform.sh <<EOF
168 > env | grep HGEDITFORM
168 > env | grep HGEDITFORM
169 > true
169 > true
170 > EOF
170 > EOF
171 $ HGEDITOR="sh .hg/checkeditform.sh" hg ci --amend -u foo -d '1 0'
171 $ HGEDITOR="sh .hg/checkeditform.sh" hg ci --amend -u foo -d '1 0'
172 HGEDITFORM=commit.amend.normal
172 HGEDITFORM=commit.amend.normal
173 saved backup bundle to $TESTTMP/.hg/strip-backup/401431e913a1-5e8e532c-amend.hg
173 saved backup bundle to $TESTTMP/.hg/strip-backup/401431e913a1-5e8e532c-amend.hg
174 $ echo a >> a
174 $ echo a >> a
175 $ hg ci --amend -u foo -d '1 0'
175 $ hg ci --amend -u foo -d '1 0'
176 saved backup bundle to $TESTTMP/.hg/strip-backup/d96b1d28ae33-677e0afb-amend.hg
176 saved backup bundle to $TESTTMP/.hg/strip-backup/d96b1d28ae33-677e0afb-amend.hg
177 $ hg log -r .
177 $ hg log -r .
178 changeset: 1:a9a13940fc03
178 changeset: 1:a9a13940fc03
179 tag: tip
179 tag: tip
180 user: foo
180 user: foo
181 date: Thu Jan 01 00:00:01 1970 +0000
181 date: Thu Jan 01 00:00:01 1970 +0000
182 summary: no changes, new message
182 summary: no changes, new message
183
183
184
184
185 Open editor with old commit message if a message isn't given otherwise:
185 Open editor with old commit message if a message isn't given otherwise:
186
186
187 $ cat > editor.sh << '__EOF__'
187 $ cat > editor.sh << '__EOF__'
188 > #!/bin/sh
188 > #!/bin/sh
189 > cat $1
189 > cat $1
190 > echo "another precious commit message" > "$1"
190 > echo "another precious commit message" > "$1"
191 > __EOF__
191 > __EOF__
192
192
193 at first, test saving last-message.txt
193 at first, test saving last-message.txt
194
194
195 $ cat > .hg/hgrc << '__EOF__'
195 $ cat > .hg/hgrc << '__EOF__'
196 > [hooks]
196 > [hooks]
197 > pretxncommit.test-saving-last-message = false
197 > pretxncommit.test-saving-last-message = false
198 > __EOF__
198 > __EOF__
199
199
200 $ rm -f .hg/last-message.txt
200 $ rm -f .hg/last-message.txt
201 $ hg commit --amend -v -m "message given from command line"
201 $ hg commit --amend -v -m "message given from command line"
202 amending changeset a9a13940fc03
202 amending changeset a9a13940fc03
203 copying changeset a9a13940fc03 to ad120869acf0
203 copying changeset a9a13940fc03 to ad120869acf0
204 committing files:
204 committing files:
205 a
205 a
206 committing manifest
206 committing manifest
207 committing changelog
207 committing changelog
208 running hook pretxncommit.test-saving-last-message: false
208 running hook pretxncommit.test-saving-last-message: false
209 transaction abort!
209 transaction abort!
210 rollback completed
210 rollback completed
211 abort: pretxncommit.test-saving-last-message hook exited with status 1
211 abort: pretxncommit.test-saving-last-message hook exited with status 1
212 [255]
212 [255]
213 $ cat .hg/last-message.txt
213 $ cat .hg/last-message.txt
214 message given from command line (no-eol)
214 message given from command line (no-eol)
215
215
216 $ rm -f .hg/last-message.txt
216 $ rm -f .hg/last-message.txt
217 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
217 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
218 amending changeset a9a13940fc03
218 amending changeset a9a13940fc03
219 copying changeset a9a13940fc03 to ad120869acf0
219 copying changeset a9a13940fc03 to ad120869acf0
220 no changes, new message
220 no changes, new message
221
221
222
222
223 HG: Enter commit message. Lines beginning with 'HG:' are removed.
223 HG: Enter commit message. Lines beginning with 'HG:' are removed.
224 HG: Leave message empty to abort commit.
224 HG: Leave message empty to abort commit.
225 HG: --
225 HG: --
226 HG: user: foo
226 HG: user: foo
227 HG: branch 'default'
227 HG: branch 'default'
228 HG: changed a
228 HG: changed a
229 committing files:
229 committing files:
230 a
230 a
231 committing manifest
231 committing manifest
232 committing changelog
232 committing changelog
233 running hook pretxncommit.test-saving-last-message: false
233 running hook pretxncommit.test-saving-last-message: false
234 transaction abort!
234 transaction abort!
235 rollback completed
235 rollback completed
236 abort: pretxncommit.test-saving-last-message hook exited with status 1
236 abort: pretxncommit.test-saving-last-message hook exited with status 1
237 [255]
237 [255]
238
238
239 $ cat .hg/last-message.txt
239 $ cat .hg/last-message.txt
240 another precious commit message
240 another precious commit message
241
241
242 $ cat > .hg/hgrc << '__EOF__'
242 $ cat > .hg/hgrc << '__EOF__'
243 > [hooks]
243 > [hooks]
244 > pretxncommit.test-saving-last-message =
244 > pretxncommit.test-saving-last-message =
245 > __EOF__
245 > __EOF__
246
246
247 then, test editing custom commit message
247 then, test editing custom commit message
248
248
249 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
249 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
250 amending changeset a9a13940fc03
250 amending changeset a9a13940fc03
251 copying changeset a9a13940fc03 to ad120869acf0
251 copying changeset a9a13940fc03 to ad120869acf0
252 no changes, new message
252 no changes, new message
253
253
254
254
255 HG: Enter commit message. Lines beginning with 'HG:' are removed.
255 HG: Enter commit message. Lines beginning with 'HG:' are removed.
256 HG: Leave message empty to abort commit.
256 HG: Leave message empty to abort commit.
257 HG: --
257 HG: --
258 HG: user: foo
258 HG: user: foo
259 HG: branch 'default'
259 HG: branch 'default'
260 HG: changed a
260 HG: changed a
261 committing files:
261 committing files:
262 a
262 a
263 committing manifest
263 committing manifest
264 committing changelog
264 committing changelog
265 1 changesets found
265 1 changesets found
266 uncompressed size of bundle content:
266 uncompressed size of bundle content:
267 249 (changelog)
267 249 (changelog)
268 163 (manifests)
268 163 (manifests)
269 133 a
269 133 a
270 saved backup bundle to $TESTTMP/.hg/strip-backup/a9a13940fc03-7c2e8674-amend.hg
270 saved backup bundle to $TESTTMP/.hg/strip-backup/a9a13940fc03-7c2e8674-amend.hg
271 1 changesets found
271 1 changesets found
272 uncompressed size of bundle content:
272 uncompressed size of bundle content:
273 257 (changelog)
273 257 (changelog)
274 163 (manifests)
274 163 (manifests)
275 133 a
275 133 a
276 adding branch
276 adding branch
277 adding changesets
277 adding changesets
278 adding manifests
278 adding manifests
279 adding file changes
279 adding file changes
280 added 1 changesets with 1 changes to 1 files
280 added 1 changesets with 1 changes to 1 files
281 committed changeset 1:64a124ba1b44
281 committed changeset 1:64a124ba1b44
282
282
283 Same, but with changes in working dir (different code path):
283 Same, but with changes in working dir (different code path):
284
284
285 $ echo a >> a
285 $ echo a >> a
286 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
286 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
287 amending changeset 64a124ba1b44
287 amending changeset 64a124ba1b44
288 another precious commit message
288 another precious commit message
289
289
290
290
291 HG: Enter commit message. Lines beginning with 'HG:' are removed.
291 HG: Enter commit message. Lines beginning with 'HG:' are removed.
292 HG: Leave message empty to abort commit.
292 HG: Leave message empty to abort commit.
293 HG: --
293 HG: --
294 HG: user: foo
294 HG: user: foo
295 HG: branch 'default'
295 HG: branch 'default'
296 HG: changed a
296 HG: changed a
297 committing files:
297 committing files:
298 a
298 a
299 committing manifest
299 committing manifest
300 committing changelog
300 committing changelog
301 1 changesets found
301 1 changesets found
302 uncompressed size of bundle content:
302 uncompressed size of bundle content:
303 257 (changelog)
303 257 (changelog)
304 163 (manifests)
304 163 (manifests)
305 133 a
305 133 a
306 saved backup bundle to $TESTTMP/.hg/strip-backup/64a124ba1b44-10374b8f-amend.hg
306 saved backup bundle to $TESTTMP/.hg/strip-backup/64a124ba1b44-10374b8f-amend.hg
307 1 changesets found
307 1 changesets found
308 uncompressed size of bundle content:
308 uncompressed size of bundle content:
309 257 (changelog)
309 257 (changelog)
310 163 (manifests)
310 163 (manifests)
311 135 a
311 135 a
312 adding branch
312 adding branch
313 adding changesets
313 adding changesets
314 adding manifests
314 adding manifests
315 adding file changes
315 adding file changes
316 added 1 changesets with 1 changes to 1 files
316 added 1 changesets with 1 changes to 1 files
317 committed changeset 1:7892795b8e38
317 committed changeset 1:7892795b8e38
318
318
319 $ rm editor.sh
319 $ rm editor.sh
320 $ hg log -r .
320 $ hg log -r .
321 changeset: 1:7892795b8e38
321 changeset: 1:7892795b8e38
322 tag: tip
322 tag: tip
323 user: foo
323 user: foo
324 date: Thu Jan 01 00:00:01 1970 +0000
324 date: Thu Jan 01 00:00:01 1970 +0000
325 summary: another precious commit message
325 summary: another precious commit message
326
326
327
327
328 Moving bookmarks, preserve active bookmark:
328 Moving bookmarks, preserve active bookmark:
329
329
330 $ hg book book1
330 $ hg book book1
331 $ hg book book2
331 $ hg book book2
332 $ hg ci --amend -m 'move bookmarks'
332 $ hg ci --amend -m 'move bookmarks'
333 saved backup bundle to $TESTTMP/.hg/strip-backup/7892795b8e38-3fb46217-amend.hg
333 saved backup bundle to $TESTTMP/.hg/strip-backup/7892795b8e38-3fb46217-amend.hg
334 $ hg book
334 $ hg book
335 book1 1:8311f17e2616
335 book1 1:8311f17e2616
336 * book2 1:8311f17e2616
336 * book2 1:8311f17e2616
337 $ echo a >> a
337 $ echo a >> a
338 $ hg ci --amend -m 'move bookmarks'
338 $ hg ci --amend -m 'move bookmarks'
339 saved backup bundle to $TESTTMP/.hg/strip-backup/8311f17e2616-f0504fe3-amend.hg
339 saved backup bundle to $TESTTMP/.hg/strip-backup/8311f17e2616-f0504fe3-amend.hg
340 $ hg book
340 $ hg book
341 book1 1:a3b65065808c
341 book1 1:a3b65065808c
342 * book2 1:a3b65065808c
342 * book2 1:a3b65065808c
343
343
344 abort does not loose bookmarks
344 abort does not loose bookmarks
345
345
346 $ cat > editor.sh << '__EOF__'
346 $ cat > editor.sh << '__EOF__'
347 > #!/bin/sh
347 > #!/bin/sh
348 > echo "" > "$1"
348 > echo "" > "$1"
349 > __EOF__
349 > __EOF__
350 $ echo a >> a
350 $ echo a >> a
351 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend
351 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend
352 abort: empty commit message
352 abort: empty commit message
353 [255]
353 [255]
354 $ hg book
354 $ hg book
355 book1 1:a3b65065808c
355 book1 1:a3b65065808c
356 * book2 1:a3b65065808c
356 * book2 1:a3b65065808c
357 $ hg revert -Caq
357 $ hg revert -Caq
358 $ rm editor.sh
358 $ rm editor.sh
359
359
360 $ echo '[defaults]' >> $HGRCPATH
360 $ echo '[defaults]' >> $HGRCPATH
361 $ echo "commit=-d '0 0'" >> $HGRCPATH
361 $ echo "commit=-d '0 0'" >> $HGRCPATH
362
362
363 Moving branches:
363 Moving branches:
364
364
365 $ hg branch foo
365 $ hg branch foo
366 marked working directory as branch foo
366 marked working directory as branch foo
367 (branches are permanent and global, did you want a bookmark?)
367 (branches are permanent and global, did you want a bookmark?)
368 $ echo a >> a
368 $ echo a >> a
369 $ hg ci -m 'branch foo'
369 $ hg ci -m 'branch foo'
370 $ hg branch default -f
370 $ hg branch default -f
371 marked working directory as branch default
371 marked working directory as branch default
372 $ hg ci --amend -m 'back to default'
372 $ hg ci --amend -m 'back to default'
373 saved backup bundle to $TESTTMP/.hg/strip-backup/f8339a38efe1-c18453c9-amend.hg
373 saved backup bundle to $TESTTMP/.hg/strip-backup/f8339a38efe1-c18453c9-amend.hg
374 $ hg branches
374 $ hg branches
375 default 2:9c07515f2650
375 default 2:9c07515f2650
376
376
377 Close branch:
377 Close branch:
378
378
379 $ hg up -q 0
379 $ hg up -q 0
380 $ echo b >> b
380 $ echo b >> b
381 $ hg branch foo
381 $ hg branch foo
382 marked working directory as branch foo
382 marked working directory as branch foo
383 (branches are permanent and global, did you want a bookmark?)
383 (branches are permanent and global, did you want a bookmark?)
384 $ hg ci -Am 'fork'
384 $ hg ci -Am 'fork'
385 adding b
385 adding b
386 $ echo b >> b
386 $ echo b >> b
387 $ hg ci -mb
387 $ hg ci -mb
388 $ hg ci --amend --close-branch -m 'closing branch foo'
388 $ hg ci --amend --close-branch -m 'closing branch foo'
389 saved backup bundle to $TESTTMP/.hg/strip-backup/c962248fa264-54245dc7-amend.hg
389 saved backup bundle to $TESTTMP/.hg/strip-backup/c962248fa264-54245dc7-amend.hg
390
390
391 Same thing, different code path:
391 Same thing, different code path:
392
392
393 $ echo b >> b
393 $ echo b >> b
394 $ hg ci -m 'reopen branch'
394 $ hg ci -m 'reopen branch'
395 reopening closed branch head 4
395 reopening closed branch head 4
396 $ echo b >> b
396 $ echo b >> b
397 $ hg ci --amend --close-branch
397 $ hg ci --amend --close-branch
398 saved backup bundle to $TESTTMP/.hg/strip-backup/027371728205-b900d9fa-amend.hg
398 saved backup bundle to $TESTTMP/.hg/strip-backup/027371728205-b900d9fa-amend.hg
399 $ hg branches
399 $ hg branches
400 default 2:9c07515f2650
400 default 2:9c07515f2650
401
401
402 Refuse to amend during a merge:
402 Refuse to amend during a merge:
403
403
404 $ hg up -q default
404 $ hg up -q default
405 $ hg merge foo
405 $ hg merge foo
406 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
406 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
407 (branch merge, don't forget to commit)
407 (branch merge, don't forget to commit)
408 $ hg ci --amend
408 $ hg ci --amend
409 abort: cannot amend while merging
409 abort: cannot amend while merging
410 [255]
410 [255]
411 $ hg ci -m 'merge'
411 $ hg ci -m 'merge'
412
412
413 Refuse to amend if there is a merge conflict (issue5805):
413 Refuse to amend if there is a merge conflict (issue5805):
414
414
415 $ hg up -q foo
415 $ hg up -q foo
416 $ echo c > a
416 $ echo c > a
417 $ hg up default -t :fail
417 $ hg up default -t :fail
418 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
418 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
419 use 'hg resolve' to retry unresolved file merges
419 use 'hg resolve' to retry unresolved file merges
420 [1]
420 [1]
421 $ hg resolve -l
421 $ hg resolve -l
422 U a
422 U a
423
423
424 $ hg ci --amend
424 $ hg ci --amend
425 abort: unresolved merge conflicts (see 'hg help resolve')
425 abort: unresolved merge conflicts (see 'hg help resolve')
426 [255]
426 [255]
427
427
428 $ hg up -qC .
428 $ hg up -qC .
429
429
430 Follow copies/renames:
430 Follow copies/renames:
431
431
432 $ hg mv b c
432 $ hg mv b c
433 $ hg ci -m 'b -> c'
433 $ hg ci -m 'b -> c'
434 $ hg mv c d
434 $ hg mv c d
435 $ hg ci --amend -m 'b -> d'
435 $ hg ci --amend -m 'b -> d'
436 saved backup bundle to $TESTTMP/.hg/strip-backup/42f3f27a067d-f23cc9f7-amend.hg
436 saved backup bundle to $TESTTMP/.hg/strip-backup/42f3f27a067d-f23cc9f7-amend.hg
437 $ hg st --rev '.^' --copies d
437 $ hg st --rev '.^' --copies d
438 A d
438 A d
439 b
439 b
440 $ hg cp d e
440 $ hg cp d e
441 $ hg ci -m 'e = d'
441 $ hg ci -m 'e = d'
442 $ hg cp e f
442 $ hg cp e f
443 $ hg ci --amend -m 'f = d'
443 $ hg ci --amend -m 'f = d'
444 saved backup bundle to $TESTTMP/.hg/strip-backup/9198f73182d5-251d584a-amend.hg
444 saved backup bundle to $TESTTMP/.hg/strip-backup/9198f73182d5-251d584a-amend.hg
445 $ hg st --rev '.^' --copies f
445 $ hg st --rev '.^' --copies f
446 A f
446 A f
447 d
447 d
448
448
449 $ mv f f.orig
449 $ mv f f.orig
450 $ hg rm -A f
450 $ hg rm -A f
451 $ hg ci -m removef
451 $ hg ci -m removef
452 $ hg cp a f
452 $ hg cp a f
453 $ mv f.orig f
453 $ mv f.orig f
454 $ hg ci --amend -m replacef
454 $ hg ci --amend -m replacef
455 saved backup bundle to $TESTTMP/.hg/strip-backup/f0993ab6b482-eda301bf-amend.hg
455 saved backup bundle to $TESTTMP/.hg/strip-backup/f0993ab6b482-eda301bf-amend.hg
456 $ hg st --change . --copies
456 $ hg st --change . --copies
457 $ hg log -r . --template "{file_copies}\n"
457 $ hg log -r . --template "{file_copies}\n"
458
458
459
459
460 Move added file (issue3410):
460 Move added file (issue3410):
461
461
462 $ echo g >> g
462 $ echo g >> g
463 $ hg ci -Am g
463 $ hg ci -Am g
464 adding g
464 adding g
465 $ hg mv g h
465 $ hg mv g h
466 $ hg ci --amend
466 $ hg ci --amend
467 saved backup bundle to $TESTTMP/.hg/strip-backup/58585e3f095c-0f5ebcda-amend.hg
467 saved backup bundle to $TESTTMP/.hg/strip-backup/58585e3f095c-0f5ebcda-amend.hg
468 $ hg st --change . --copies h
468 $ hg st --change . --copies h
469 A h
469 A h
470 $ hg log -r . --template "{file_copies}\n"
470 $ hg log -r . --template "{file_copies}\n"
471
471
472
472
473 Can't rollback an amend:
473 Can't rollback an amend:
474
474
475 $ hg rollback
475 $ hg rollback
476 no rollback information available
476 no rollback information available
477 [1]
477 [1]
478
478
479 Preserve extra dict (issue3430):
479 Preserve extra dict (issue3430):
480
480
481 $ hg branch a
481 $ hg branch a
482 marked working directory as branch a
482 marked working directory as branch a
483 (branches are permanent and global, did you want a bookmark?)
483 (branches are permanent and global, did you want a bookmark?)
484 $ echo a >> a
484 $ echo a >> a
485 $ hg ci -ma
485 $ hg ci -ma
486 $ hg ci --amend -m "a'"
486 $ hg ci --amend -m "a'"
487 saved backup bundle to $TESTTMP/.hg/strip-backup/39a162f1d65e-9dfe13d8-amend.hg
487 saved backup bundle to $TESTTMP/.hg/strip-backup/39a162f1d65e-9dfe13d8-amend.hg
488 $ hg log -r . --template "{branch}\n"
488 $ hg log -r . --template "{branch}\n"
489 a
489 a
490 $ hg ci --amend -m "a''"
490 $ hg ci --amend -m "a''"
491 saved backup bundle to $TESTTMP/.hg/strip-backup/d5ca7b1ac72b-0b4c1a34-amend.hg
491 saved backup bundle to $TESTTMP/.hg/strip-backup/d5ca7b1ac72b-0b4c1a34-amend.hg
492 $ hg log -r . --template "{branch}\n"
492 $ hg log -r . --template "{branch}\n"
493 a
493 a
494
494
495 Also preserve other entries in the dict that are in the old commit,
495 Also preserve other entries in the dict that are in the old commit,
496 first graft something so there's an additional entry:
496 first graft something so there's an additional entry:
497
497
498 $ hg up 0 -q
498 $ hg up 0 -q
499 $ echo z > z
499 $ echo z > z
500 $ hg ci -Am 'fork'
500 $ hg ci -Am 'fork'
501 adding z
501 adding z
502 created new head
502 created new head
503 $ hg up 11
503 $ hg up 11
504 5 files updated, 0 files merged, 1 files removed, 0 files unresolved
504 5 files updated, 0 files merged, 1 files removed, 0 files unresolved
505 $ hg graft 12
505 $ hg graft 12
506 grafting 12:2647734878ef "fork" (tip)
506 grafting 12:2647734878ef "fork" (tip)
507 $ hg ci --amend -m 'graft amend'
507 $ hg ci --amend -m 'graft amend'
508 saved backup bundle to $TESTTMP/.hg/strip-backup/fe8c6f7957ca-25638666-amend.hg
508 saved backup bundle to $TESTTMP/.hg/strip-backup/fe8c6f7957ca-25638666-amend.hg
509 $ hg log -r . --debug | grep extra
509 $ hg log -r . --debug | grep extra
510 extra: amend_source=fe8c6f7957ca1665ed77496ed7a07657d469ac60
510 extra: amend_source=fe8c6f7957ca1665ed77496ed7a07657d469ac60
511 extra: branch=a
511 extra: branch=a
512 extra: source=2647734878ef0236dda712fae9c1651cf694ea8a
512 extra: source=2647734878ef0236dda712fae9c1651cf694ea8a
513
513
514 Preserve phase
514 Preserve phase
515
515
516 $ hg phase '.^::.'
516 $ hg phase '.^::.'
517 11: draft
517 11: draft
518 13: draft
518 13: draft
519 $ hg phase --secret --force .
519 $ hg phase --secret --force .
520 $ hg phase '.^::.'
520 $ hg phase '.^::.'
521 11: draft
521 11: draft
522 13: secret
522 13: secret
523 $ hg commit --amend -m 'amend for phase' -q
523 $ hg commit --amend -m 'amend for phase' -q
524 $ hg phase '.^::.'
524 $ hg phase '.^::.'
525 11: draft
525 11: draft
526 13: secret
526 13: secret
527
527
528 Test amend with obsolete
528 Test amend with obsolete
529 ---------------------------
529 ---------------------------
530
530
531 Enable obsolete
531 Enable obsolete
532
532
533 $ cat >> $HGRCPATH << EOF
533 $ cat >> $HGRCPATH << EOF
534 > [experimental]
534 > [experimental]
535 > evolution.createmarkers=True
535 > evolution.createmarkers=True
536 > evolution.allowunstable=True
536 > evolution.allowunstable=True
537 > EOF
537 > EOF
538
538
539 Amend with no files changes
539 Amend with no files changes
540
540
541 $ hg id -n
541 $ hg id -n
542 13
542 13
543 $ hg ci --amend -m 'babar'
543 $ hg ci --amend -m 'babar'
544 $ hg id -n
544 $ hg id -n
545 14
545 14
546 $ hg log -Gl 3 --style=compact
546 $ hg log -Gl 3 --style=compact
547 @ 14[tip]:11 682950e85999 1970-01-01 00:00 +0000 test
547 @ 14[tip]:11 682950e85999 1970-01-01 00:00 +0000 test
548 | babar
548 | babar
549 |
549 |
550 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
550 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
551 | | fork
551 | | fork
552 | ~
552 | ~
553 o 11 0ddb275cfad1 1970-01-01 00:00 +0000 test
553 o 11 0ddb275cfad1 1970-01-01 00:00 +0000 test
554 | a''
554 | a''
555 ~
555 ~
556 $ hg log -Gl 4 --hidden --style=compact
556 $ hg log -Gl 4 --hidden --style=compact
557 @ 14[tip]:11 682950e85999 1970-01-01 00:00 +0000 test
557 @ 14[tip]:11 682950e85999 1970-01-01 00:00 +0000 test
558 | babar
558 | babar
559 |
559 |
560 | x 13:11 5167600b0f7a 1970-01-01 00:00 +0000 test
560 | x 13:11 5167600b0f7a 1970-01-01 00:00 +0000 test
561 |/ amend for phase
561 |/ amend for phase
562 |
562 |
563 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
563 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
564 | | fork
564 | | fork
565 | ~
565 | ~
566 o 11 0ddb275cfad1 1970-01-01 00:00 +0000 test
566 o 11 0ddb275cfad1 1970-01-01 00:00 +0000 test
567 | a''
567 | a''
568 ~
568 ~
569
569
570 Amend with files changes
570 Amend with files changes
571
571
572 (note: the extra commit over 15 is a temporary junk I would be happy to get
572 (note: the extra commit over 15 is a temporary junk I would be happy to get
573 ride of)
573 ride of)
574
574
575 $ echo 'babar' >> a
575 $ echo 'babar' >> a
576 $ hg commit --amend
576 $ hg commit --amend
577 $ hg log -Gl 6 --hidden --style=compact
577 $ hg log -Gl 6 --hidden --style=compact
578 @ 15[tip]:11 a5b42b49b0d5 1970-01-01 00:00 +0000 test
578 @ 15[tip]:11 a5b42b49b0d5 1970-01-01 00:00 +0000 test
579 | babar
579 | babar
580 |
580 |
581 | x 14:11 682950e85999 1970-01-01 00:00 +0000 test
581 | x 14:11 682950e85999 1970-01-01 00:00 +0000 test
582 |/ babar
582 |/ babar
583 |
583 |
584 | x 13:11 5167600b0f7a 1970-01-01 00:00 +0000 test
584 | x 13:11 5167600b0f7a 1970-01-01 00:00 +0000 test
585 |/ amend for phase
585 |/ amend for phase
586 |
586 |
587 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
587 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
588 | | fork
588 | | fork
589 | ~
589 | ~
590 o 11 0ddb275cfad1 1970-01-01 00:00 +0000 test
590 o 11 0ddb275cfad1 1970-01-01 00:00 +0000 test
591 | a''
591 | a''
592 |
592 |
593 o 10 5fa75032e226 1970-01-01 00:00 +0000 test
593 o 10 5fa75032e226 1970-01-01 00:00 +0000 test
594 | g
594 | g
595 ~
595 ~
596
596
597
597
598 Test that amend does not make it easy to create obsolescence cycle
598 Test that amend does not make it easy to create obsolescence cycle
599 ---------------------------------------------------------------------
599 ---------------------------------------------------------------------
600
600
601 $ hg id -r 14 --hidden
601 $ hg id -r 14 --hidden
602 682950e85999 (a)
602 682950e85999 (a)
603 $ hg revert -ar 14 --hidden
603 $ hg revert -ar 14 --hidden
604 reverting a
604 reverting a
605 $ hg commit --amend
605 $ hg commit --amend
606 $ hg id
606 $ hg id
607 37973c7e0b61 (a) tip
607 37973c7e0b61 (a) tip
608
608
609 Test that rewriting leaving instability behind is allowed
609 Test that rewriting leaving instability behind is allowed
610 ---------------------------------------------------------------------
610 ---------------------------------------------------------------------
611
611
612 $ hg up '.^'
612 $ hg up '.^'
613 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
613 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
614 $ echo 'b' >> a
614 $ echo 'b' >> a
615 $ hg log --style compact -r 'children(.)'
615 $ hg log --style compact -r 'children(.)'
616 16[tip]:11 37973c7e0b61 1970-01-01 00:00 +0000 test
616 16[tip]:11 37973c7e0b61 1970-01-01 00:00 +0000 test
617 babar
617 babar
618
618
619 $ hg commit --amend
619 $ hg commit --amend
620 1 new orphan changesets
620 1 new orphan changesets
621 $ hg log -r 'orphan()'
621 $ hg log -r 'orphan()'
622 changeset: 16:37973c7e0b61
622 changeset: 16:37973c7e0b61
623 branch: a
623 branch: a
624 parent: 11:0ddb275cfad1
624 parent: 11:0ddb275cfad1
625 user: test
625 user: test
626 date: Thu Jan 01 00:00:00 1970 +0000
626 date: Thu Jan 01 00:00:00 1970 +0000
627 instability: orphan
627 instability: orphan
628 summary: babar
628 summary: babar
629
629
630
630
631 Amend a merge changeset (with renames and conflicts from the second parent):
631 Amend a merge changeset (with renames and conflicts from the second parent):
632
632
633 $ hg up -q default
633 $ hg up -q default
634 $ hg branch -q bar
634 $ hg branch -q bar
635 $ hg cp a aa
635 $ hg cp a aa
636 $ hg mv z zz
636 $ hg mv z zz
637 $ echo cc > cc
637 $ echo cc > cc
638 $ hg add cc
638 $ hg add cc
639 $ hg ci -m aazzcc
639 $ hg ci -m aazzcc
640 $ hg up -q default
640 $ hg up -q default
641 $ echo a >> a
641 $ echo a >> a
642 $ echo dd > cc
642 $ echo dd > cc
643 $ hg add cc
643 $ hg add cc
644 $ hg ci -m aa
644 $ hg ci -m aa
645 $ hg merge -q bar
645 $ hg merge -q bar
646 warning: conflicts while merging cc! (edit, then use 'hg resolve --mark')
646 warning: conflicts while merging cc! (edit, then use 'hg resolve --mark')
647 [1]
647 [1]
648 $ hg resolve -m cc
648 $ hg resolve -m cc
649 (no more unresolved files)
649 (no more unresolved files)
650 $ hg ci -m 'merge bar'
650 $ hg ci -m 'merge bar'
651 $ hg log --config diff.git=1 -pr .
651 $ hg log --config diff.git=1 -pr .
652 changeset: 20:163cfd7219f7
652 changeset: 20:163cfd7219f7
653 tag: tip
653 tag: tip
654 parent: 19:30d96aeaf27b
654 parent: 19:30d96aeaf27b
655 parent: 18:1aa437659d19
655 parent: 18:1aa437659d19
656 user: test
656 user: test
657 date: Thu Jan 01 00:00:00 1970 +0000
657 date: Thu Jan 01 00:00:00 1970 +0000
658 summary: merge bar
658 summary: merge bar
659
659
660 diff --git a/a b/aa
660 diff --git a/a b/aa
661 copy from a
661 copy from a
662 copy to aa
662 copy to aa
663 diff --git a/cc b/cc
663 diff --git a/cc b/cc
664 --- a/cc
664 --- a/cc
665 +++ b/cc
665 +++ b/cc
666 @@ -1,1 +1,5 @@
666 @@ -1,1 +1,5 @@
667 +<<<<<<< working copy: 30d96aeaf27b - test: aa
667 +<<<<<<< working copy: 30d96aeaf27b - test: aa
668 dd
668 dd
669 +=======
669 +=======
670 +cc
670 +cc
671 +>>>>>>> merge rev: 1aa437659d19 bar - test: aazzcc
671 +>>>>>>> merge rev: 1aa437659d19 bar - test: aazzcc
672 diff --git a/z b/zz
672 diff --git a/z b/zz
673 rename from z
673 rename from z
674 rename to zz
674 rename to zz
675
675
676 $ hg debugrename aa
676 $ hg debugrename aa
677 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
677 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
678 $ hg debugrename zz
678 $ hg debugrename zz
679 zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
679 zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
680 $ hg debugrename cc
680 $ hg debugrename cc
681 cc not renamed
681 cc not renamed
682 $ HGEDITOR="sh .hg/checkeditform.sh" hg ci --amend -m 'merge bar (amend message)' --edit
682 $ HGEDITOR="sh .hg/checkeditform.sh" hg ci --amend -m 'merge bar (amend message)' --edit
683 HGEDITFORM=commit.amend.merge
683 HGEDITFORM=commit.amend.merge
684 $ hg log --config diff.git=1 -pr .
684 $ hg log --config diff.git=1 -pr .
685 changeset: 21:bca52d4ed186
685 changeset: 21:bca52d4ed186
686 tag: tip
686 tag: tip
687 parent: 19:30d96aeaf27b
687 parent: 19:30d96aeaf27b
688 parent: 18:1aa437659d19
688 parent: 18:1aa437659d19
689 user: test
689 user: test
690 date: Thu Jan 01 00:00:00 1970 +0000
690 date: Thu Jan 01 00:00:00 1970 +0000
691 summary: merge bar (amend message)
691 summary: merge bar (amend message)
692
692
693 diff --git a/a b/aa
693 diff --git a/a b/aa
694 copy from a
694 copy from a
695 copy to aa
695 copy to aa
696 diff --git a/cc b/cc
696 diff --git a/cc b/cc
697 --- a/cc
697 --- a/cc
698 +++ b/cc
698 +++ b/cc
699 @@ -1,1 +1,5 @@
699 @@ -1,1 +1,5 @@
700 +<<<<<<< working copy: 30d96aeaf27b - test: aa
700 +<<<<<<< working copy: 30d96aeaf27b - test: aa
701 dd
701 dd
702 +=======
702 +=======
703 +cc
703 +cc
704 +>>>>>>> merge rev: 1aa437659d19 bar - test: aazzcc
704 +>>>>>>> merge rev: 1aa437659d19 bar - test: aazzcc
705 diff --git a/z b/zz
705 diff --git a/z b/zz
706 rename from z
706 rename from z
707 rename to zz
707 rename to zz
708
708
709 $ hg debugrename aa
709 $ hg debugrename aa
710 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
710 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
711 $ hg debugrename zz
711 $ hg debugrename zz
712 zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
712 zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
713 $ hg debugrename cc
713 $ hg debugrename cc
714 cc not renamed
714 cc not renamed
715 $ hg mv zz z
715 $ hg mv zz z
716 $ hg ci --amend -m 'merge bar (undo rename)'
716 $ hg ci --amend -m 'merge bar (undo rename)'
717 $ hg log --config diff.git=1 -pr .
717 $ hg log --config diff.git=1 -pr .
718 changeset: 22:12594a98ca3f
718 changeset: 22:12594a98ca3f
719 tag: tip
719 tag: tip
720 parent: 19:30d96aeaf27b
720 parent: 19:30d96aeaf27b
721 parent: 18:1aa437659d19
721 parent: 18:1aa437659d19
722 user: test
722 user: test
723 date: Thu Jan 01 00:00:00 1970 +0000
723 date: Thu Jan 01 00:00:00 1970 +0000
724 summary: merge bar (undo rename)
724 summary: merge bar (undo rename)
725
725
726 diff --git a/a b/aa
726 diff --git a/a b/aa
727 copy from a
727 copy from a
728 copy to aa
728 copy to aa
729 diff --git a/cc b/cc
729 diff --git a/cc b/cc
730 --- a/cc
730 --- a/cc
731 +++ b/cc
731 +++ b/cc
732 @@ -1,1 +1,5 @@
732 @@ -1,1 +1,5 @@
733 +<<<<<<< working copy: 30d96aeaf27b - test: aa
733 +<<<<<<< working copy: 30d96aeaf27b - test: aa
734 dd
734 dd
735 +=======
735 +=======
736 +cc
736 +cc
737 +>>>>>>> merge rev: 1aa437659d19 bar - test: aazzcc
737 +>>>>>>> merge rev: 1aa437659d19 bar - test: aazzcc
738
738
739 $ hg debugrename z
739 $ hg debugrename z
740 z not renamed
740 z not renamed
741
741
742 Amend a merge changeset (with renames during the merge):
742 Amend a merge changeset (with renames during the merge):
743
743
744 $ hg up -q bar
744 $ hg up -q bar
745 $ echo x > x
745 $ echo x > x
746 $ hg add x
746 $ hg add x
747 $ hg ci -m x
747 $ hg ci -m x
748 $ hg up -q default
748 $ hg up -q default
749 $ hg merge -q bar
749 $ hg merge -q bar
750 $ hg mv aa aaa
750 $ hg mv aa aaa
751 $ echo aa >> aaa
751 $ echo aa >> aaa
752 $ hg ci -m 'merge bar again'
752 $ hg ci -m 'merge bar again'
753 $ hg log --config diff.git=1 -pr .
753 $ hg log --config diff.git=1 -pr .
754 changeset: 24:dffde028b388
754 changeset: 24:dffde028b388
755 tag: tip
755 tag: tip
756 parent: 22:12594a98ca3f
756 parent: 22:12594a98ca3f
757 parent: 23:4c94d5bc65f5
757 parent: 23:4c94d5bc65f5
758 user: test
758 user: test
759 date: Thu Jan 01 00:00:00 1970 +0000
759 date: Thu Jan 01 00:00:00 1970 +0000
760 summary: merge bar again
760 summary: merge bar again
761
761
762 diff --git a/aa b/aa
762 diff --git a/aa b/aa
763 deleted file mode 100644
763 deleted file mode 100644
764 --- a/aa
764 --- a/aa
765 +++ /dev/null
765 +++ /dev/null
766 @@ -1,2 +0,0 @@
766 @@ -1,2 +0,0 @@
767 -a
767 -a
768 -a
768 -a
769 diff --git a/aaa b/aaa
769 diff --git a/aaa b/aaa
770 new file mode 100644
770 new file mode 100644
771 --- /dev/null
771 --- /dev/null
772 +++ b/aaa
772 +++ b/aaa
773 @@ -0,0 +1,3 @@
773 @@ -0,0 +1,3 @@
774 +a
774 +a
775 +a
775 +a
776 +aa
776 +aa
777 diff --git a/x b/x
777 diff --git a/x b/x
778 new file mode 100644
778 new file mode 100644
779 --- /dev/null
779 --- /dev/null
780 +++ b/x
780 +++ b/x
781 @@ -0,0 +1,1 @@
781 @@ -0,0 +1,1 @@
782 +x
782 +x
783
783
784 $ hg debugrename aaa
784 $ hg debugrename aaa
785 aaa renamed from aa:37d9b5d994eab34eda9c16b195ace52c7b129980
785 aaa renamed from aa:37d9b5d994eab34eda9c16b195ace52c7b129980
786
786
787 Update to p1 with 'aaa' modified. 'aaa' was renamed from 'aa' in p2. 'aa' exists
787 Update to p1 with 'aaa' modified. 'aaa' was renamed from 'aa' in p2. 'aa' exists
788 in p1 too, but it was recorded as copied from p2.
788 in p1 too, but it was recorded as copied from p2.
789 $ echo modified >> aaa
789 $ echo modified >> aaa
790 $ hg co -m '.^' -t :merge3
790 $ hg co -m '.^' -t :merge3
791 file 'aaa' was deleted in other [destination] but was modified in local [working copy].
791 file 'aaa' was deleted in other [destination] but was modified in local [working copy].
792 What do you want to do?
792 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
793 use (c)hanged version, (d)elete, or leave (u)nresolved? u
793 What do you want to do? u
794 1 files updated, 0 files merged, 1 files removed, 1 files unresolved
794 1 files updated, 0 files merged, 1 files removed, 1 files unresolved
795 use 'hg resolve' to retry unresolved file merges
795 use 'hg resolve' to retry unresolved file merges
796 [1]
796 [1]
797 $ hg co -C tip
797 $ hg co -C tip
798 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
798 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
799
799
800 $ hg mv aaa aa
800 $ hg mv aaa aa
801 $ hg ci --amend -m 'merge bar again (undo rename)'
801 $ hg ci --amend -m 'merge bar again (undo rename)'
802 $ hg log --config diff.git=1 -pr .
802 $ hg log --config diff.git=1 -pr .
803 changeset: 25:18e3ba160489
803 changeset: 25:18e3ba160489
804 tag: tip
804 tag: tip
805 parent: 22:12594a98ca3f
805 parent: 22:12594a98ca3f
806 parent: 23:4c94d5bc65f5
806 parent: 23:4c94d5bc65f5
807 user: test
807 user: test
808 date: Thu Jan 01 00:00:00 1970 +0000
808 date: Thu Jan 01 00:00:00 1970 +0000
809 summary: merge bar again (undo rename)
809 summary: merge bar again (undo rename)
810
810
811 diff --git a/aa b/aa
811 diff --git a/aa b/aa
812 --- a/aa
812 --- a/aa
813 +++ b/aa
813 +++ b/aa
814 @@ -1,2 +1,3 @@
814 @@ -1,2 +1,3 @@
815 a
815 a
816 a
816 a
817 +aa
817 +aa
818 diff --git a/x b/x
818 diff --git a/x b/x
819 new file mode 100644
819 new file mode 100644
820 --- /dev/null
820 --- /dev/null
821 +++ b/x
821 +++ b/x
822 @@ -0,0 +1,1 @@
822 @@ -0,0 +1,1 @@
823 +x
823 +x
824
824
825 $ hg debugrename aa
825 $ hg debugrename aa
826 aa not renamed
826 aa not renamed
827 $ hg debugrename -r '.^' aa
827 $ hg debugrename -r '.^' aa
828 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
828 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
829
829
830 Amend a merge changeset (with manifest-level conflicts):
830 Amend a merge changeset (with manifest-level conflicts):
831
831
832 $ hg up -q bar
832 $ hg up -q bar
833 $ hg rm aa
833 $ hg rm aa
834 $ hg ci -m 'rm aa'
834 $ hg ci -m 'rm aa'
835 $ hg up -q default
835 $ hg up -q default
836 $ echo aa >> aa
836 $ echo aa >> aa
837 $ hg ci -m aa
837 $ hg ci -m aa
838 $ hg merge -q bar --config ui.interactive=True << EOF
838 $ hg merge -q bar --config ui.interactive=True << EOF
839 > c
839 > c
840 > EOF
840 > EOF
841 file 'aa' was deleted in other [merge rev] but was modified in local [working copy].
841 file 'aa' was deleted in other [merge rev] but was modified in local [working copy].
842 What do you want to do?
842 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
843 use (c)hanged version, (d)elete, or leave (u)nresolved? c
843 What do you want to do? c
844 $ hg ci -m 'merge bar (with conflicts)'
844 $ hg ci -m 'merge bar (with conflicts)'
845 $ hg log --config diff.git=1 -pr .
845 $ hg log --config diff.git=1 -pr .
846 changeset: 28:b4c3035e2544
846 changeset: 28:b4c3035e2544
847 tag: tip
847 tag: tip
848 parent: 27:4b216ca5ba97
848 parent: 27:4b216ca5ba97
849 parent: 26:67db8847a540
849 parent: 26:67db8847a540
850 user: test
850 user: test
851 date: Thu Jan 01 00:00:00 1970 +0000
851 date: Thu Jan 01 00:00:00 1970 +0000
852 summary: merge bar (with conflicts)
852 summary: merge bar (with conflicts)
853
853
854
854
855 $ hg rm aa
855 $ hg rm aa
856 $ hg ci --amend -m 'merge bar (with conflicts, amended)'
856 $ hg ci --amend -m 'merge bar (with conflicts, amended)'
857 $ hg log --config diff.git=1 -pr .
857 $ hg log --config diff.git=1 -pr .
858 changeset: 29:1205ed810051
858 changeset: 29:1205ed810051
859 tag: tip
859 tag: tip
860 parent: 27:4b216ca5ba97
860 parent: 27:4b216ca5ba97
861 parent: 26:67db8847a540
861 parent: 26:67db8847a540
862 user: test
862 user: test
863 date: Thu Jan 01 00:00:00 1970 +0000
863 date: Thu Jan 01 00:00:00 1970 +0000
864 summary: merge bar (with conflicts, amended)
864 summary: merge bar (with conflicts, amended)
865
865
866 diff --git a/aa b/aa
866 diff --git a/aa b/aa
867 deleted file mode 100644
867 deleted file mode 100644
868 --- a/aa
868 --- a/aa
869 +++ /dev/null
869 +++ /dev/null
870 @@ -1,4 +0,0 @@
870 @@ -1,4 +0,0 @@
871 -a
871 -a
872 -a
872 -a
873 -aa
873 -aa
874 -aa
874 -aa
875
875
876 Issue 3445: amending with --close-branch a commit that created a new head should fail
876 Issue 3445: amending with --close-branch a commit that created a new head should fail
877 This shouldn't be possible:
877 This shouldn't be possible:
878
878
879 $ hg up -q default
879 $ hg up -q default
880 $ hg branch closewithamend
880 $ hg branch closewithamend
881 marked working directory as branch closewithamend
881 marked working directory as branch closewithamend
882 $ echo foo > foo
882 $ echo foo > foo
883 $ hg add foo
883 $ hg add foo
884 $ hg ci -m..
884 $ hg ci -m..
885 $ hg ci --amend --close-branch -m 'closing'
885 $ hg ci --amend --close-branch -m 'closing'
886 abort: can only close branch heads
886 abort: can only close branch heads
887 [255]
887 [255]
888
888
889 This silliness fails:
889 This silliness fails:
890
890
891 $ hg branch silliness
891 $ hg branch silliness
892 marked working directory as branch silliness
892 marked working directory as branch silliness
893 $ echo b >> b
893 $ echo b >> b
894 $ hg ci --close-branch -m'open and close'
894 $ hg ci --close-branch -m'open and close'
895 abort: branch "silliness" has no heads to close
895 abort: branch "silliness" has no heads to close
896 [255]
896 [255]
897
897
898 Test that amend with --secret creates new secret changeset forcibly
898 Test that amend with --secret creates new secret changeset forcibly
899 ---------------------------------------------------------------------
899 ---------------------------------------------------------------------
900
900
901 $ hg phase '.^::.'
901 $ hg phase '.^::.'
902 29: draft
902 29: draft
903 30: draft
903 30: draft
904 $ hg commit --amend --secret -m 'amend as secret' -q
904 $ hg commit --amend --secret -m 'amend as secret' -q
905 $ hg phase '.^::.'
905 $ hg phase '.^::.'
906 29: draft
906 29: draft
907 31: secret
907 31: secret
908
908
909 Test that amend with --edit invokes editor forcibly
909 Test that amend with --edit invokes editor forcibly
910 ---------------------------------------------------
910 ---------------------------------------------------
911
911
912 $ hg parents --template "{desc}\n"
912 $ hg parents --template "{desc}\n"
913 amend as secret
913 amend as secret
914 $ HGEDITOR=cat hg commit --amend -m "editor should be suppressed"
914 $ HGEDITOR=cat hg commit --amend -m "editor should be suppressed"
915 $ hg parents --template "{desc}\n"
915 $ hg parents --template "{desc}\n"
916 editor should be suppressed
916 editor should be suppressed
917
917
918 $ hg status --rev '.^1::.'
918 $ hg status --rev '.^1::.'
919 A foo
919 A foo
920 $ HGEDITOR=cat hg commit --amend -m "editor should be invoked" --edit
920 $ HGEDITOR=cat hg commit --amend -m "editor should be invoked" --edit
921 editor should be invoked
921 editor should be invoked
922
922
923
923
924 HG: Enter commit message. Lines beginning with 'HG:' are removed.
924 HG: Enter commit message. Lines beginning with 'HG:' are removed.
925 HG: Leave message empty to abort commit.
925 HG: Leave message empty to abort commit.
926 HG: --
926 HG: --
927 HG: user: test
927 HG: user: test
928 HG: branch 'silliness'
928 HG: branch 'silliness'
929 HG: added foo
929 HG: added foo
930 $ hg parents --template "{desc}\n"
930 $ hg parents --template "{desc}\n"
931 editor should be invoked
931 editor should be invoked
932
932
933 Test that amend with --no-edit avoids the editor
933 Test that amend with --no-edit avoids the editor
934 ------------------------------------------------
934 ------------------------------------------------
935
935
936 $ hg commit --amend -m "before anything happens"
936 $ hg commit --amend -m "before anything happens"
937 $ hg parents --template "{desc}\n"
937 $ hg parents --template "{desc}\n"
938 before anything happens
938 before anything happens
939 $ HGEDITOR=cat hg commit --amend --no-edit -m "editor should be suppressed"
939 $ HGEDITOR=cat hg commit --amend --no-edit -m "editor should be suppressed"
940 $ hg parents --template "{desc}\n"
940 $ hg parents --template "{desc}\n"
941 editor should be suppressed
941 editor should be suppressed
942
942
943 (We need a file change here since we won't have a message change)
943 (We need a file change here since we won't have a message change)
944 $ cp foo foo.orig
944 $ cp foo foo.orig
945 $ echo hi >> foo
945 $ echo hi >> foo
946 $ HGEDITOR=cat hg commit --amend --no-edit
946 $ HGEDITOR=cat hg commit --amend --no-edit
947 $ hg parents --template "{desc}\n"
947 $ hg parents --template "{desc}\n"
948 editor should be suppressed
948 editor should be suppressed
949 $ hg status -mar
949 $ hg status -mar
950 (Let's undo adding that "hi" so later tests don't need to be adjusted)
950 (Let's undo adding that "hi" so later tests don't need to be adjusted)
951 $ mv foo.orig foo
951 $ mv foo.orig foo
952 $ hg commit --amend --no-edit
952 $ hg commit --amend --no-edit
953
953
954 Test that "diff()" in committemplate works correctly for amending
954 Test that "diff()" in committemplate works correctly for amending
955 -----------------------------------------------------------------
955 -----------------------------------------------------------------
956
956
957 $ cat >> .hg/hgrc <<EOF
957 $ cat >> .hg/hgrc <<EOF
958 > [committemplate]
958 > [committemplate]
959 > changeset.commit.amend = {desc}\n
959 > changeset.commit.amend = {desc}\n
960 > HG: M: {file_mods}
960 > HG: M: {file_mods}
961 > HG: A: {file_adds}
961 > HG: A: {file_adds}
962 > HG: R: {file_dels}
962 > HG: R: {file_dels}
963 > {splitlines(diff()) % 'HG: {line}\n'}
963 > {splitlines(diff()) % 'HG: {line}\n'}
964 > EOF
964 > EOF
965
965
966 $ hg parents --template "M: {file_mods}\nA: {file_adds}\nR: {file_dels}\n"
966 $ hg parents --template "M: {file_mods}\nA: {file_adds}\nR: {file_dels}\n"
967 M:
967 M:
968 A: foo
968 A: foo
969 R:
969 R:
970 $ hg status -amr
970 $ hg status -amr
971 $ HGEDITOR=cat hg commit --amend -e -m "expecting diff of foo"
971 $ HGEDITOR=cat hg commit --amend -e -m "expecting diff of foo"
972 expecting diff of foo
972 expecting diff of foo
973
973
974 HG: M:
974 HG: M:
975 HG: A: foo
975 HG: A: foo
976 HG: R:
976 HG: R:
977 HG: diff -r 1205ed810051 foo
977 HG: diff -r 1205ed810051 foo
978 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
978 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
979 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
979 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
980 HG: @@ -0,0 +1,1 @@
980 HG: @@ -0,0 +1,1 @@
981 HG: +foo
981 HG: +foo
982
982
983 $ echo y > y
983 $ echo y > y
984 $ hg add y
984 $ hg add y
985 $ HGEDITOR=cat hg commit --amend -e -m "expecting diff of foo and y"
985 $ HGEDITOR=cat hg commit --amend -e -m "expecting diff of foo and y"
986 expecting diff of foo and y
986 expecting diff of foo and y
987
987
988 HG: M:
988 HG: M:
989 HG: A: foo y
989 HG: A: foo y
990 HG: R:
990 HG: R:
991 HG: diff -r 1205ed810051 foo
991 HG: diff -r 1205ed810051 foo
992 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
992 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
993 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
993 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
994 HG: @@ -0,0 +1,1 @@
994 HG: @@ -0,0 +1,1 @@
995 HG: +foo
995 HG: +foo
996 HG: diff -r 1205ed810051 y
996 HG: diff -r 1205ed810051 y
997 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
997 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
998 HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
998 HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
999 HG: @@ -0,0 +1,1 @@
999 HG: @@ -0,0 +1,1 @@
1000 HG: +y
1000 HG: +y
1001
1001
1002 $ hg rm a
1002 $ hg rm a
1003 $ HGEDITOR=cat hg commit --amend -e -m "expecting diff of a, foo and y"
1003 $ HGEDITOR=cat hg commit --amend -e -m "expecting diff of a, foo and y"
1004 expecting diff of a, foo and y
1004 expecting diff of a, foo and y
1005
1005
1006 HG: M:
1006 HG: M:
1007 HG: A: foo y
1007 HG: A: foo y
1008 HG: R: a
1008 HG: R: a
1009 HG: diff -r 1205ed810051 a
1009 HG: diff -r 1205ed810051 a
1010 HG: --- a/a Thu Jan 01 00:00:00 1970 +0000
1010 HG: --- a/a Thu Jan 01 00:00:00 1970 +0000
1011 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1011 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1012 HG: @@ -1,2 +0,0 @@
1012 HG: @@ -1,2 +0,0 @@
1013 HG: -a
1013 HG: -a
1014 HG: -a
1014 HG: -a
1015 HG: diff -r 1205ed810051 foo
1015 HG: diff -r 1205ed810051 foo
1016 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1016 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1017 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
1017 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
1018 HG: @@ -0,0 +1,1 @@
1018 HG: @@ -0,0 +1,1 @@
1019 HG: +foo
1019 HG: +foo
1020 HG: diff -r 1205ed810051 y
1020 HG: diff -r 1205ed810051 y
1021 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1021 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1022 HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
1022 HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
1023 HG: @@ -0,0 +1,1 @@
1023 HG: @@ -0,0 +1,1 @@
1024 HG: +y
1024 HG: +y
1025
1025
1026 $ hg rm x
1026 $ hg rm x
1027 $ HGEDITOR=cat hg commit --amend -e -m "expecting diff of a, foo, x and y"
1027 $ HGEDITOR=cat hg commit --amend -e -m "expecting diff of a, foo, x and y"
1028 expecting diff of a, foo, x and y
1028 expecting diff of a, foo, x and y
1029
1029
1030 HG: M:
1030 HG: M:
1031 HG: A: foo y
1031 HG: A: foo y
1032 HG: R: a x
1032 HG: R: a x
1033 HG: diff -r 1205ed810051 a
1033 HG: diff -r 1205ed810051 a
1034 HG: --- a/a Thu Jan 01 00:00:00 1970 +0000
1034 HG: --- a/a Thu Jan 01 00:00:00 1970 +0000
1035 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1035 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1036 HG: @@ -1,2 +0,0 @@
1036 HG: @@ -1,2 +0,0 @@
1037 HG: -a
1037 HG: -a
1038 HG: -a
1038 HG: -a
1039 HG: diff -r 1205ed810051 foo
1039 HG: diff -r 1205ed810051 foo
1040 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1040 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1041 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
1041 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
1042 HG: @@ -0,0 +1,1 @@
1042 HG: @@ -0,0 +1,1 @@
1043 HG: +foo
1043 HG: +foo
1044 HG: diff -r 1205ed810051 x
1044 HG: diff -r 1205ed810051 x
1045 HG: --- a/x Thu Jan 01 00:00:00 1970 +0000
1045 HG: --- a/x Thu Jan 01 00:00:00 1970 +0000
1046 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1046 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1047 HG: @@ -1,1 +0,0 @@
1047 HG: @@ -1,1 +0,0 @@
1048 HG: -x
1048 HG: -x
1049 HG: diff -r 1205ed810051 y
1049 HG: diff -r 1205ed810051 y
1050 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1050 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1051 HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
1051 HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
1052 HG: @@ -0,0 +1,1 @@
1052 HG: @@ -0,0 +1,1 @@
1053 HG: +y
1053 HG: +y
1054
1054
1055 $ echo cccc >> cc
1055 $ echo cccc >> cc
1056 $ hg status -amr
1056 $ hg status -amr
1057 M cc
1057 M cc
1058 $ HGEDITOR=cat hg commit --amend -e -m "cc should be excluded" -X cc
1058 $ HGEDITOR=cat hg commit --amend -e -m "cc should be excluded" -X cc
1059 cc should be excluded
1059 cc should be excluded
1060
1060
1061 HG: M:
1061 HG: M:
1062 HG: A: foo y
1062 HG: A: foo y
1063 HG: R: a x
1063 HG: R: a x
1064 HG: diff -r 1205ed810051 a
1064 HG: diff -r 1205ed810051 a
1065 HG: --- a/a Thu Jan 01 00:00:00 1970 +0000
1065 HG: --- a/a Thu Jan 01 00:00:00 1970 +0000
1066 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1066 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1067 HG: @@ -1,2 +0,0 @@
1067 HG: @@ -1,2 +0,0 @@
1068 HG: -a
1068 HG: -a
1069 HG: -a
1069 HG: -a
1070 HG: diff -r 1205ed810051 foo
1070 HG: diff -r 1205ed810051 foo
1071 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1071 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1072 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
1072 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
1073 HG: @@ -0,0 +1,1 @@
1073 HG: @@ -0,0 +1,1 @@
1074 HG: +foo
1074 HG: +foo
1075 HG: diff -r 1205ed810051 x
1075 HG: diff -r 1205ed810051 x
1076 HG: --- a/x Thu Jan 01 00:00:00 1970 +0000
1076 HG: --- a/x Thu Jan 01 00:00:00 1970 +0000
1077 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1077 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1078 HG: @@ -1,1 +0,0 @@
1078 HG: @@ -1,1 +0,0 @@
1079 HG: -x
1079 HG: -x
1080 HG: diff -r 1205ed810051 y
1080 HG: diff -r 1205ed810051 y
1081 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1081 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1082 HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
1082 HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
1083 HG: @@ -0,0 +1,1 @@
1083 HG: @@ -0,0 +1,1 @@
1084 HG: +y
1084 HG: +y
1085
1085
1086 Check for issue4405
1086 Check for issue4405
1087 -------------------
1087 -------------------
1088
1088
1089 Setup the repo with a file that gets moved in a second commit.
1089 Setup the repo with a file that gets moved in a second commit.
1090 $ hg init repo
1090 $ hg init repo
1091 $ cd repo
1091 $ cd repo
1092 $ touch a0
1092 $ touch a0
1093 $ hg add a0
1093 $ hg add a0
1094 $ hg commit -m a0
1094 $ hg commit -m a0
1095 $ hg mv a0 a1
1095 $ hg mv a0 a1
1096 $ hg commit -m a1
1096 $ hg commit -m a1
1097 $ hg up -q 0
1097 $ hg up -q 0
1098 $ hg log -G --template '{rev} {desc}'
1098 $ hg log -G --template '{rev} {desc}'
1099 o 1 a1
1099 o 1 a1
1100 |
1100 |
1101 @ 0 a0
1101 @ 0 a0
1102
1102
1103
1103
1104 Now we branch the repro, but re-use the file contents, so we have a divergence
1104 Now we branch the repro, but re-use the file contents, so we have a divergence
1105 in the file revlog topology and the changelog topology.
1105 in the file revlog topology and the changelog topology.
1106 $ hg revert --rev 1 --all
1106 $ hg revert --rev 1 --all
1107 removing a0
1107 removing a0
1108 adding a1
1108 adding a1
1109 $ hg ci -qm 'a1-amend'
1109 $ hg ci -qm 'a1-amend'
1110 $ hg log -G --template '{rev} {desc}'
1110 $ hg log -G --template '{rev} {desc}'
1111 @ 2 a1-amend
1111 @ 2 a1-amend
1112 |
1112 |
1113 | o 1 a1
1113 | o 1 a1
1114 |/
1114 |/
1115 o 0 a0
1115 o 0 a0
1116
1116
1117
1117
1118 The way mercurial does amends is by folding the working copy and old commit
1118 The way mercurial does amends is by folding the working copy and old commit
1119 together into another commit (rev 3). During this process, _findlimit is called
1119 together into another commit (rev 3). During this process, _findlimit is called
1120 to check how far back to look for the transitive closure of file copy
1120 to check how far back to look for the transitive closure of file copy
1121 information, but due to the divergence of the filelog and changelog graph
1121 information, but due to the divergence of the filelog and changelog graph
1122 topologies, before _findlimit was fixed, it returned a rev which was not far
1122 topologies, before _findlimit was fixed, it returned a rev which was not far
1123 enough back in this case.
1123 enough back in this case.
1124 $ hg mv a1 a2
1124 $ hg mv a1 a2
1125 $ hg status --copies --rev 0
1125 $ hg status --copies --rev 0
1126 A a2
1126 A a2
1127 a0
1127 a0
1128 R a0
1128 R a0
1129 $ hg ci --amend -q
1129 $ hg ci --amend -q
1130 $ hg log -G --template '{rev} {desc}'
1130 $ hg log -G --template '{rev} {desc}'
1131 @ 3 a1-amend
1131 @ 3 a1-amend
1132 |
1132 |
1133 | o 1 a1
1133 | o 1 a1
1134 |/
1134 |/
1135 o 0 a0
1135 o 0 a0
1136
1136
1137
1137
1138 Before the fix, the copy information was lost.
1138 Before the fix, the copy information was lost.
1139 $ hg status --copies --rev 0
1139 $ hg status --copies --rev 0
1140 A a2
1140 A a2
1141 a0
1141 a0
1142 R a0
1142 R a0
1143 $ cd ..
1143 $ cd ..
1144
1144
1145 Check that amend properly preserve rename from directory rename (issue-4516)
1145 Check that amend properly preserve rename from directory rename (issue-4516)
1146
1146
1147 If a parent of the merge renames a full directory, any files added to the old
1147 If a parent of the merge renames a full directory, any files added to the old
1148 directory in the other parent will be renamed to the new directory. For some
1148 directory in the other parent will be renamed to the new directory. For some
1149 reason, the rename metadata was when amending such merge. This test ensure we
1149 reason, the rename metadata was when amending such merge. This test ensure we
1150 do not regress. We have a dedicated repo because it needs a setup with renamed
1150 do not regress. We have a dedicated repo because it needs a setup with renamed
1151 directory)
1151 directory)
1152
1152
1153 $ hg init issue4516
1153 $ hg init issue4516
1154 $ cd issue4516
1154 $ cd issue4516
1155 $ mkdir olddirname
1155 $ mkdir olddirname
1156 $ echo line1 > olddirname/commonfile.py
1156 $ echo line1 > olddirname/commonfile.py
1157 $ hg add olddirname/commonfile.py
1157 $ hg add olddirname/commonfile.py
1158 $ hg ci -m first
1158 $ hg ci -m first
1159
1159
1160 $ hg branch newdirname
1160 $ hg branch newdirname
1161 marked working directory as branch newdirname
1161 marked working directory as branch newdirname
1162 (branches are permanent and global, did you want a bookmark?)
1162 (branches are permanent and global, did you want a bookmark?)
1163 $ hg mv olddirname newdirname
1163 $ hg mv olddirname newdirname
1164 moving olddirname/commonfile.py to newdirname/commonfile.py
1164 moving olddirname/commonfile.py to newdirname/commonfile.py
1165 $ hg ci -m rename
1165 $ hg ci -m rename
1166
1166
1167 $ hg update default
1167 $ hg update default
1168 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1168 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1169 $ echo line1 > olddirname/newfile.py
1169 $ echo line1 > olddirname/newfile.py
1170 $ hg add olddirname/newfile.py
1170 $ hg add olddirname/newfile.py
1171 $ hg ci -m log
1171 $ hg ci -m log
1172
1172
1173 $ hg up newdirname
1173 $ hg up newdirname
1174 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
1174 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
1175 $ # create newdirname/newfile.py
1175 $ # create newdirname/newfile.py
1176 $ hg merge default
1176 $ hg merge default
1177 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1177 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1178 (branch merge, don't forget to commit)
1178 (branch merge, don't forget to commit)
1179 $ hg ci -m add
1179 $ hg ci -m add
1180 $
1180 $
1181 $ hg debugrename newdirname/newfile.py
1181 $ hg debugrename newdirname/newfile.py
1182 newdirname/newfile.py renamed from olddirname/newfile.py:690b295714aed510803d3020da9c70fca8336def
1182 newdirname/newfile.py renamed from olddirname/newfile.py:690b295714aed510803d3020da9c70fca8336def
1183 $ hg status -C --change .
1183 $ hg status -C --change .
1184 A newdirname/newfile.py
1184 A newdirname/newfile.py
1185 $ hg status -C --rev 1
1185 $ hg status -C --rev 1
1186 A newdirname/newfile.py
1186 A newdirname/newfile.py
1187 $ hg status -C --rev 2
1187 $ hg status -C --rev 2
1188 A newdirname/commonfile.py
1188 A newdirname/commonfile.py
1189 olddirname/commonfile.py
1189 olddirname/commonfile.py
1190 A newdirname/newfile.py
1190 A newdirname/newfile.py
1191 olddirname/newfile.py
1191 olddirname/newfile.py
1192 R olddirname/commonfile.py
1192 R olddirname/commonfile.py
1193 R olddirname/newfile.py
1193 R olddirname/newfile.py
1194 $ hg debugindex newdirname/newfile.py
1194 $ hg debugindex newdirname/newfile.py
1195 rev linkrev nodeid p1 p2
1195 rev linkrev nodeid p1 p2
1196 0 3 34a4d536c0c0 000000000000 000000000000
1196 0 3 34a4d536c0c0 000000000000 000000000000
1197
1197
1198 $ echo a >> newdirname/commonfile.py
1198 $ echo a >> newdirname/commonfile.py
1199 $ hg ci --amend -m bug
1199 $ hg ci --amend -m bug
1200 $ hg debugrename newdirname/newfile.py
1200 $ hg debugrename newdirname/newfile.py
1201 newdirname/newfile.py renamed from olddirname/newfile.py:690b295714aed510803d3020da9c70fca8336def
1201 newdirname/newfile.py renamed from olddirname/newfile.py:690b295714aed510803d3020da9c70fca8336def
1202 $ hg debugindex newdirname/newfile.py
1202 $ hg debugindex newdirname/newfile.py
1203 rev linkrev nodeid p1 p2
1203 rev linkrev nodeid p1 p2
1204 0 3 34a4d536c0c0 000000000000 000000000000
1204 0 3 34a4d536c0c0 000000000000 000000000000
1205
1205
1206 #if execbit
1206 #if execbit
1207
1207
1208 Test if amend preserves executable bit changes
1208 Test if amend preserves executable bit changes
1209 $ chmod +x newdirname/commonfile.py
1209 $ chmod +x newdirname/commonfile.py
1210 $ hg ci -m chmod
1210 $ hg ci -m chmod
1211 $ hg ci --amend -m "chmod amended"
1211 $ hg ci --amend -m "chmod amended"
1212 $ hg ci --amend -m "chmod amended second time"
1212 $ hg ci --amend -m "chmod amended second time"
1213 $ hg log -p --git -r .
1213 $ hg log -p --git -r .
1214 changeset: 7:b1326f52dddf
1214 changeset: 7:b1326f52dddf
1215 branch: newdirname
1215 branch: newdirname
1216 tag: tip
1216 tag: tip
1217 parent: 4:7fd235f7cb2f
1217 parent: 4:7fd235f7cb2f
1218 user: test
1218 user: test
1219 date: Thu Jan 01 00:00:00 1970 +0000
1219 date: Thu Jan 01 00:00:00 1970 +0000
1220 summary: chmod amended second time
1220 summary: chmod amended second time
1221
1221
1222 diff --git a/newdirname/commonfile.py b/newdirname/commonfile.py
1222 diff --git a/newdirname/commonfile.py b/newdirname/commonfile.py
1223 old mode 100644
1223 old mode 100644
1224 new mode 100755
1224 new mode 100755
1225
1225
1226 #endif
1226 #endif
1227
1227
1228 Test amend with file inclusion options
1228 Test amend with file inclusion options
1229 --------------------------------------
1229 --------------------------------------
1230
1230
1231 These tests ensure that we are always amending some files that were part of the
1231 These tests ensure that we are always amending some files that were part of the
1232 pre-amend commit. We want to test that the remaining files in the pre-amend
1232 pre-amend commit. We want to test that the remaining files in the pre-amend
1233 commit were not changed in the amended commit. We do so by performing a diff of
1233 commit were not changed in the amended commit. We do so by performing a diff of
1234 the amended commit against its parent commit.
1234 the amended commit against its parent commit.
1235 $ cd ..
1235 $ cd ..
1236 $ hg init testfileinclusions
1236 $ hg init testfileinclusions
1237 $ cd testfileinclusions
1237 $ cd testfileinclusions
1238 $ echo a > a
1238 $ echo a > a
1239 $ echo b > b
1239 $ echo b > b
1240 $ hg commit -Aqm "Adding a and b"
1240 $ hg commit -Aqm "Adding a and b"
1241
1241
1242 Only add changes to a particular file
1242 Only add changes to a particular file
1243 $ echo a >> a
1243 $ echo a >> a
1244 $ echo b >> b
1244 $ echo b >> b
1245 $ hg commit --amend -I a
1245 $ hg commit --amend -I a
1246 $ hg diff --git -r null -r .
1246 $ hg diff --git -r null -r .
1247 diff --git a/a b/a
1247 diff --git a/a b/a
1248 new file mode 100644
1248 new file mode 100644
1249 --- /dev/null
1249 --- /dev/null
1250 +++ b/a
1250 +++ b/a
1251 @@ -0,0 +1,2 @@
1251 @@ -0,0 +1,2 @@
1252 +a
1252 +a
1253 +a
1253 +a
1254 diff --git a/b b/b
1254 diff --git a/b b/b
1255 new file mode 100644
1255 new file mode 100644
1256 --- /dev/null
1256 --- /dev/null
1257 +++ b/b
1257 +++ b/b
1258 @@ -0,0 +1,1 @@
1258 @@ -0,0 +1,1 @@
1259 +b
1259 +b
1260
1260
1261 $ echo a >> a
1261 $ echo a >> a
1262 $ hg commit --amend b
1262 $ hg commit --amend b
1263 $ hg diff --git -r null -r .
1263 $ hg diff --git -r null -r .
1264 diff --git a/a b/a
1264 diff --git a/a b/a
1265 new file mode 100644
1265 new file mode 100644
1266 --- /dev/null
1266 --- /dev/null
1267 +++ b/a
1267 +++ b/a
1268 @@ -0,0 +1,2 @@
1268 @@ -0,0 +1,2 @@
1269 +a
1269 +a
1270 +a
1270 +a
1271 diff --git a/b b/b
1271 diff --git a/b b/b
1272 new file mode 100644
1272 new file mode 100644
1273 --- /dev/null
1273 --- /dev/null
1274 +++ b/b
1274 +++ b/b
1275 @@ -0,0 +1,2 @@
1275 @@ -0,0 +1,2 @@
1276 +b
1276 +b
1277 +b
1277 +b
1278
1278
1279 Exclude changes to a particular file
1279 Exclude changes to a particular file
1280 $ echo b >> b
1280 $ echo b >> b
1281 $ hg commit --amend -X a
1281 $ hg commit --amend -X a
1282 $ hg diff --git -r null -r .
1282 $ hg diff --git -r null -r .
1283 diff --git a/a b/a
1283 diff --git a/a b/a
1284 new file mode 100644
1284 new file mode 100644
1285 --- /dev/null
1285 --- /dev/null
1286 +++ b/a
1286 +++ b/a
1287 @@ -0,0 +1,2 @@
1287 @@ -0,0 +1,2 @@
1288 +a
1288 +a
1289 +a
1289 +a
1290 diff --git a/b b/b
1290 diff --git a/b b/b
1291 new file mode 100644
1291 new file mode 100644
1292 --- /dev/null
1292 --- /dev/null
1293 +++ b/b
1293 +++ b/b
1294 @@ -0,0 +1,3 @@
1294 @@ -0,0 +1,3 @@
1295 +b
1295 +b
1296 +b
1296 +b
1297 +b
1297 +b
1298
1298
1299 Check the addremove flag
1299 Check the addremove flag
1300 $ echo c > c
1300 $ echo c > c
1301 $ rm a
1301 $ rm a
1302 $ hg commit --amend -A
1302 $ hg commit --amend -A
1303 removing a
1303 removing a
1304 adding c
1304 adding c
1305 $ hg diff --git -r null -r .
1305 $ hg diff --git -r null -r .
1306 diff --git a/b b/b
1306 diff --git a/b b/b
1307 new file mode 100644
1307 new file mode 100644
1308 --- /dev/null
1308 --- /dev/null
1309 +++ b/b
1309 +++ b/b
1310 @@ -0,0 +1,3 @@
1310 @@ -0,0 +1,3 @@
1311 +b
1311 +b
1312 +b
1312 +b
1313 +b
1313 +b
1314 diff --git a/c b/c
1314 diff --git a/c b/c
1315 new file mode 100644
1315 new file mode 100644
1316 --- /dev/null
1316 --- /dev/null
1317 +++ b/c
1317 +++ b/c
1318 @@ -0,0 +1,1 @@
1318 @@ -0,0 +1,1 @@
1319 +c
1319 +c
@@ -1,171 +1,171 b''
1 Test for the full copytracing algorithm
1 Test for the full copytracing algorithm
2 =======================================
2 =======================================
3
3
4 $ hg init t
4 $ hg init t
5 $ cd t
5 $ cd t
6
6
7 $ echo 1 > a
7 $ echo 1 > a
8 $ hg ci -qAm "first"
8 $ hg ci -qAm "first"
9
9
10 $ hg cp a b
10 $ hg cp a b
11 $ hg mv a c
11 $ hg mv a c
12 $ echo 2 >> b
12 $ echo 2 >> b
13 $ echo 2 >> c
13 $ echo 2 >> c
14
14
15 $ hg ci -qAm "second"
15 $ hg ci -qAm "second"
16
16
17 $ hg co -C 0
17 $ hg co -C 0
18 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
18 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
19
19
20 $ echo 0 > a
20 $ echo 0 > a
21 $ echo 1 >> a
21 $ echo 1 >> a
22
22
23 $ hg ci -qAm "other"
23 $ hg ci -qAm "other"
24
24
25 $ hg merge --debug
25 $ hg merge --debug
26 unmatched files in other:
26 unmatched files in other:
27 b
27 b
28 c
28 c
29 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
29 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
30 src: 'a' -> dst: 'b' *
30 src: 'a' -> dst: 'b' *
31 src: 'a' -> dst: 'c' *
31 src: 'a' -> dst: 'c' *
32 checking for directory renames
32 checking for directory renames
33 resolving manifests
33 resolving manifests
34 branchmerge: True, force: False, partial: False
34 branchmerge: True, force: False, partial: False
35 ancestor: b8bf91eeebbc, local: add3f11052fa+, remote: 17c05bb7fcb6
35 ancestor: b8bf91eeebbc, local: add3f11052fa+, remote: 17c05bb7fcb6
36 preserving a for resolve of b
36 preserving a for resolve of b
37 preserving a for resolve of c
37 preserving a for resolve of c
38 removing a
38 removing a
39 starting 4 threads for background file closing (?)
39 starting 4 threads for background file closing (?)
40 b: remote moved from a -> m (premerge)
40 b: remote moved from a -> m (premerge)
41 picked tool ':merge' for b (binary False symlink False changedelete False)
41 picked tool ':merge' for b (binary False symlink False changedelete False)
42 merging a and b to b
42 merging a and b to b
43 my b@add3f11052fa+ other b@17c05bb7fcb6 ancestor a@b8bf91eeebbc
43 my b@add3f11052fa+ other b@17c05bb7fcb6 ancestor a@b8bf91eeebbc
44 premerge successful
44 premerge successful
45 c: remote moved from a -> m (premerge)
45 c: remote moved from a -> m (premerge)
46 picked tool ':merge' for c (binary False symlink False changedelete False)
46 picked tool ':merge' for c (binary False symlink False changedelete False)
47 merging a and c to c
47 merging a and c to c
48 my c@add3f11052fa+ other c@17c05bb7fcb6 ancestor a@b8bf91eeebbc
48 my c@add3f11052fa+ other c@17c05bb7fcb6 ancestor a@b8bf91eeebbc
49 premerge successful
49 premerge successful
50 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
50 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
51 (branch merge, don't forget to commit)
51 (branch merge, don't forget to commit)
52
52
53 file b
53 file b
54 $ cat b
54 $ cat b
55 0
55 0
56 1
56 1
57 2
57 2
58
58
59 file c
59 file c
60 $ cat c
60 $ cat c
61 0
61 0
62 1
62 1
63 2
63 2
64
64
65 Test disabling copy tracing
65 Test disabling copy tracing
66
66
67 - first verify copy metadata was kept
67 - first verify copy metadata was kept
68
68
69 $ hg up -qC 2
69 $ hg up -qC 2
70 $ hg rebase --keep -d 1 -b 2 --config extensions.rebase=
70 $ hg rebase --keep -d 1 -b 2 --config extensions.rebase=
71 rebasing 2:add3f11052fa "other" (tip)
71 rebasing 2:add3f11052fa "other" (tip)
72 merging b and a to b
72 merging b and a to b
73 merging c and a to c
73 merging c and a to c
74
74
75 $ cat b
75 $ cat b
76 0
76 0
77 1
77 1
78 2
78 2
79
79
80 - next verify copy metadata is lost when disabled
80 - next verify copy metadata is lost when disabled
81
81
82 $ hg strip -r . --config extensions.strip=
82 $ hg strip -r . --config extensions.strip=
83 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
83 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
84 saved backup bundle to $TESTTMP/t/.hg/strip-backup/550bd84c0cd3-fc575957-backup.hg
84 saved backup bundle to $TESTTMP/t/.hg/strip-backup/550bd84c0cd3-fc575957-backup.hg
85 $ hg up -qC 2
85 $ hg up -qC 2
86 $ hg rebase --keep -d 1 -b 2 --config extensions.rebase= --config experimental.copytrace=off --config ui.interactive=True << EOF
86 $ hg rebase --keep -d 1 -b 2 --config extensions.rebase= --config experimental.copytrace=off --config ui.interactive=True << EOF
87 > c
87 > c
88 > EOF
88 > EOF
89 rebasing 2:add3f11052fa "other" (tip)
89 rebasing 2:add3f11052fa "other" (tip)
90 file 'a' was deleted in local [dest] but was modified in other [source].
90 file 'a' was deleted in local [dest] but was modified in other [source].
91 What do you want to do?
91 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
92 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
92 What do you want to do? c
93
93
94 $ cat b
94 $ cat b
95 1
95 1
96 2
96 2
97
97
98 $ cd ..
98 $ cd ..
99
99
100 Verify disabling copy tracing still keeps copies from rebase source
100 Verify disabling copy tracing still keeps copies from rebase source
101
101
102 $ hg init copydisable
102 $ hg init copydisable
103 $ cd copydisable
103 $ cd copydisable
104 $ touch a
104 $ touch a
105 $ hg ci -Aqm 'add a'
105 $ hg ci -Aqm 'add a'
106 $ touch b
106 $ touch b
107 $ hg ci -Aqm 'add b, c'
107 $ hg ci -Aqm 'add b, c'
108 $ hg cp b x
108 $ hg cp b x
109 $ echo x >> x
109 $ echo x >> x
110 $ hg ci -qm 'copy b->x'
110 $ hg ci -qm 'copy b->x'
111 $ hg up -q 1
111 $ hg up -q 1
112 $ touch z
112 $ touch z
113 $ hg ci -Aqm 'add z'
113 $ hg ci -Aqm 'add z'
114 $ hg log -G -T '{rev} {desc}\n'
114 $ hg log -G -T '{rev} {desc}\n'
115 @ 3 add z
115 @ 3 add z
116 |
116 |
117 | o 2 copy b->x
117 | o 2 copy b->x
118 |/
118 |/
119 o 1 add b, c
119 o 1 add b, c
120 |
120 |
121 o 0 add a
121 o 0 add a
122
122
123 $ hg rebase -d . -b 2 --config extensions.rebase= --config experimental.copytrace=off
123 $ hg rebase -d . -b 2 --config extensions.rebase= --config experimental.copytrace=off
124 rebasing 2:6adcf8c12e7d "copy b->x"
124 rebasing 2:6adcf8c12e7d "copy b->x"
125 saved backup bundle to $TESTTMP/copydisable/.hg/strip-backup/6adcf8c12e7d-ce4b3e75-rebase.hg
125 saved backup bundle to $TESTTMP/copydisable/.hg/strip-backup/6adcf8c12e7d-ce4b3e75-rebase.hg
126 $ hg up -q 3
126 $ hg up -q 3
127 $ hg log -f x -T '{rev} {desc}\n'
127 $ hg log -f x -T '{rev} {desc}\n'
128 3 copy b->x
128 3 copy b->x
129 1 add b, c
129 1 add b, c
130
130
131 $ cd ../
131 $ cd ../
132
132
133 Verify we duplicate existing copies, instead of detecting them
133 Verify we duplicate existing copies, instead of detecting them
134
134
135 $ hg init copydisable3
135 $ hg init copydisable3
136 $ cd copydisable3
136 $ cd copydisable3
137 $ touch a
137 $ touch a
138 $ hg ci -Aqm 'add a'
138 $ hg ci -Aqm 'add a'
139 $ hg cp a b
139 $ hg cp a b
140 $ hg ci -Aqm 'copy a->b'
140 $ hg ci -Aqm 'copy a->b'
141 $ hg mv b c
141 $ hg mv b c
142 $ hg ci -Aqm 'move b->c'
142 $ hg ci -Aqm 'move b->c'
143 $ hg up -q 0
143 $ hg up -q 0
144 $ hg cp a b
144 $ hg cp a b
145 $ echo b >> b
145 $ echo b >> b
146 $ hg ci -Aqm 'copy a->b (2)'
146 $ hg ci -Aqm 'copy a->b (2)'
147 $ hg log -G -T '{rev} {desc}\n'
147 $ hg log -G -T '{rev} {desc}\n'
148 @ 3 copy a->b (2)
148 @ 3 copy a->b (2)
149 |
149 |
150 | o 2 move b->c
150 | o 2 move b->c
151 | |
151 | |
152 | o 1 copy a->b
152 | o 1 copy a->b
153 |/
153 |/
154 o 0 add a
154 o 0 add a
155
155
156 $ hg rebase -d 2 -s 3 --config extensions.rebase= --config experimental.copytrace=off
156 $ hg rebase -d 2 -s 3 --config extensions.rebase= --config experimental.copytrace=off
157 rebasing 3:47e1a9e6273b "copy a->b (2)" (tip)
157 rebasing 3:47e1a9e6273b "copy a->b (2)" (tip)
158 saved backup bundle to $TESTTMP/copydisable3/.hg/strip-backup/47e1a9e6273b-2d099c59-rebase.hg
158 saved backup bundle to $TESTTMP/copydisable3/.hg/strip-backup/47e1a9e6273b-2d099c59-rebase.hg
159
159
160 $ hg log -G -f b
160 $ hg log -G -f b
161 @ changeset: 3:76024fb4b05b
161 @ changeset: 3:76024fb4b05b
162 : tag: tip
162 : tag: tip
163 : user: test
163 : user: test
164 : date: Thu Jan 01 00:00:00 1970 +0000
164 : date: Thu Jan 01 00:00:00 1970 +0000
165 : summary: copy a->b (2)
165 : summary: copy a->b (2)
166 :
166 :
167 o changeset: 0:ac82d8b1f7c4
167 o changeset: 0:ac82d8b1f7c4
168 user: test
168 user: test
169 date: Thu Jan 01 00:00:00 1970 +0000
169 date: Thu Jan 01 00:00:00 1970 +0000
170 summary: add a
170 summary: add a
171
171
@@ -1,720 +1,720 b''
1 Test for the heuristic copytracing algorithm
1 Test for the heuristic copytracing algorithm
2 ============================================
2 ============================================
3
3
4 $ cat >> $TESTTMP/copytrace.sh << '__EOF__'
4 $ cat >> $TESTTMP/copytrace.sh << '__EOF__'
5 > initclient() {
5 > initclient() {
6 > cat >> $1/.hg/hgrc <<EOF
6 > cat >> $1/.hg/hgrc <<EOF
7 > [experimental]
7 > [experimental]
8 > copytrace = heuristics
8 > copytrace = heuristics
9 > copytrace.sourcecommitlimit = -1
9 > copytrace.sourcecommitlimit = -1
10 > EOF
10 > EOF
11 > }
11 > }
12 > __EOF__
12 > __EOF__
13 $ . "$TESTTMP/copytrace.sh"
13 $ . "$TESTTMP/copytrace.sh"
14
14
15 $ cat >> $HGRCPATH << EOF
15 $ cat >> $HGRCPATH << EOF
16 > [extensions]
16 > [extensions]
17 > rebase=
17 > rebase=
18 > [alias]
18 > [alias]
19 > l = log -G -T 'rev: {rev}\ndesc: {desc}\n'
19 > l = log -G -T 'rev: {rev}\ndesc: {desc}\n'
20 > pl = log -G -T 'rev: {rev}, phase: {phase}\ndesc: {desc}\n'
20 > pl = log -G -T 'rev: {rev}, phase: {phase}\ndesc: {desc}\n'
21 > EOF
21 > EOF
22
22
23 NOTE: calling initclient() set copytrace.sourcecommitlimit=-1 as we want to
23 NOTE: calling initclient() set copytrace.sourcecommitlimit=-1 as we want to
24 prevent the full copytrace algorithm to run and test the heuristic algorithm
24 prevent the full copytrace algorithm to run and test the heuristic algorithm
25 without complexing the test cases with public and draft commits.
25 without complexing the test cases with public and draft commits.
26
26
27 Check filename heuristics (same dirname and same basename)
27 Check filename heuristics (same dirname and same basename)
28 ----------------------------------------------------------
28 ----------------------------------------------------------
29
29
30 $ hg init repo
30 $ hg init repo
31 $ initclient repo
31 $ initclient repo
32 $ cd repo
32 $ cd repo
33 $ echo a > a
33 $ echo a > a
34 $ mkdir dir
34 $ mkdir dir
35 $ echo a > dir/file.txt
35 $ echo a > dir/file.txt
36 $ hg addremove
36 $ hg addremove
37 adding a
37 adding a
38 adding dir/file.txt
38 adding dir/file.txt
39 $ hg ci -m initial
39 $ hg ci -m initial
40 $ hg mv a b
40 $ hg mv a b
41 $ hg mv -q dir dir2
41 $ hg mv -q dir dir2
42 $ hg ci -m 'mv a b, mv dir/ dir2/'
42 $ hg ci -m 'mv a b, mv dir/ dir2/'
43 $ hg up -q 0
43 $ hg up -q 0
44 $ echo b > a
44 $ echo b > a
45 $ echo b > dir/file.txt
45 $ echo b > dir/file.txt
46 $ hg ci -qm 'mod a, mod dir/file.txt'
46 $ hg ci -qm 'mod a, mod dir/file.txt'
47
47
48 $ hg l
48 $ hg l
49 @ rev: 2
49 @ rev: 2
50 | desc: mod a, mod dir/file.txt
50 | desc: mod a, mod dir/file.txt
51 | o rev: 1
51 | o rev: 1
52 |/ desc: mv a b, mv dir/ dir2/
52 |/ desc: mv a b, mv dir/ dir2/
53 o rev: 0
53 o rev: 0
54 desc: initial
54 desc: initial
55
55
56 $ hg rebase -s . -d 1
56 $ hg rebase -s . -d 1
57 rebasing 2:557f403c0afd "mod a, mod dir/file.txt" (tip)
57 rebasing 2:557f403c0afd "mod a, mod dir/file.txt" (tip)
58 merging b and a to b
58 merging b and a to b
59 merging dir2/file.txt and dir/file.txt to dir2/file.txt
59 merging dir2/file.txt and dir/file.txt to dir2/file.txt
60 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/557f403c0afd-9926eeff-rebase.hg
60 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/557f403c0afd-9926eeff-rebase.hg
61 $ cd ..
61 $ cd ..
62 $ rm -rf repo
62 $ rm -rf repo
63
63
64 Make sure filename heuristics do not when they are not related
64 Make sure filename heuristics do not when they are not related
65 --------------------------------------------------------------
65 --------------------------------------------------------------
66
66
67 $ hg init repo
67 $ hg init repo
68 $ initclient repo
68 $ initclient repo
69 $ cd repo
69 $ cd repo
70 $ echo 'somecontent' > a
70 $ echo 'somecontent' > a
71 $ hg add a
71 $ hg add a
72 $ hg ci -m initial
72 $ hg ci -m initial
73 $ hg rm a
73 $ hg rm a
74 $ echo 'completelydifferentcontext' > b
74 $ echo 'completelydifferentcontext' > b
75 $ hg add b
75 $ hg add b
76 $ hg ci -m 'rm a, add b'
76 $ hg ci -m 'rm a, add b'
77 $ hg up -q 0
77 $ hg up -q 0
78 $ printf 'somecontent\nmoarcontent' > a
78 $ printf 'somecontent\nmoarcontent' > a
79 $ hg ci -qm 'mode a'
79 $ hg ci -qm 'mode a'
80
80
81 $ hg l
81 $ hg l
82 @ rev: 2
82 @ rev: 2
83 | desc: mode a
83 | desc: mode a
84 | o rev: 1
84 | o rev: 1
85 |/ desc: rm a, add b
85 |/ desc: rm a, add b
86 o rev: 0
86 o rev: 0
87 desc: initial
87 desc: initial
88
88
89 $ hg rebase -s . -d 1
89 $ hg rebase -s . -d 1
90 rebasing 2:d526312210b9 "mode a" (tip)
90 rebasing 2:d526312210b9 "mode a" (tip)
91 file 'a' was deleted in local [dest] but was modified in other [source].
91 file 'a' was deleted in local [dest] but was modified in other [source].
92 What do you want to do?
92 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
93 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
93 What do you want to do? u
94 unresolved conflicts (see hg resolve, then hg rebase --continue)
94 unresolved conflicts (see hg resolve, then hg rebase --continue)
95 [1]
95 [1]
96
96
97 $ cd ..
97 $ cd ..
98 $ rm -rf repo
98 $ rm -rf repo
99
99
100 Test when lca didn't modified the file that was moved
100 Test when lca didn't modified the file that was moved
101 -----------------------------------------------------
101 -----------------------------------------------------
102
102
103 $ hg init repo
103 $ hg init repo
104 $ initclient repo
104 $ initclient repo
105 $ cd repo
105 $ cd repo
106 $ echo 'somecontent' > a
106 $ echo 'somecontent' > a
107 $ hg add a
107 $ hg add a
108 $ hg ci -m initial
108 $ hg ci -m initial
109 $ echo c > c
109 $ echo c > c
110 $ hg add c
110 $ hg add c
111 $ hg ci -m randomcommit
111 $ hg ci -m randomcommit
112 $ hg mv a b
112 $ hg mv a b
113 $ hg ci -m 'mv a b'
113 $ hg ci -m 'mv a b'
114 $ hg up -q 1
114 $ hg up -q 1
115 $ echo b > a
115 $ echo b > a
116 $ hg ci -qm 'mod a'
116 $ hg ci -qm 'mod a'
117
117
118 $ hg pl
118 $ hg pl
119 @ rev: 3, phase: draft
119 @ rev: 3, phase: draft
120 | desc: mod a
120 | desc: mod a
121 | o rev: 2, phase: draft
121 | o rev: 2, phase: draft
122 |/ desc: mv a b
122 |/ desc: mv a b
123 o rev: 1, phase: draft
123 o rev: 1, phase: draft
124 | desc: randomcommit
124 | desc: randomcommit
125 o rev: 0, phase: draft
125 o rev: 0, phase: draft
126 desc: initial
126 desc: initial
127
127
128 $ hg rebase -s . -d 2
128 $ hg rebase -s . -d 2
129 rebasing 3:9d5cf99c3d9f "mod a" (tip)
129 rebasing 3:9d5cf99c3d9f "mod a" (tip)
130 merging b and a to b
130 merging b and a to b
131 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/9d5cf99c3d9f-f02358cc-rebase.hg
131 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/9d5cf99c3d9f-f02358cc-rebase.hg
132 $ cd ..
132 $ cd ..
133 $ rm -rf repo
133 $ rm -rf repo
134
134
135 Rebase "backwards"
135 Rebase "backwards"
136 ------------------
136 ------------------
137
137
138 $ hg init repo
138 $ hg init repo
139 $ initclient repo
139 $ initclient repo
140 $ cd repo
140 $ cd repo
141 $ echo 'somecontent' > a
141 $ echo 'somecontent' > a
142 $ hg add a
142 $ hg add a
143 $ hg ci -m initial
143 $ hg ci -m initial
144 $ echo c > c
144 $ echo c > c
145 $ hg add c
145 $ hg add c
146 $ hg ci -m randomcommit
146 $ hg ci -m randomcommit
147 $ hg mv a b
147 $ hg mv a b
148 $ hg ci -m 'mv a b'
148 $ hg ci -m 'mv a b'
149 $ hg up -q 2
149 $ hg up -q 2
150 $ echo b > b
150 $ echo b > b
151 $ hg ci -qm 'mod b'
151 $ hg ci -qm 'mod b'
152
152
153 $ hg l
153 $ hg l
154 @ rev: 3
154 @ rev: 3
155 | desc: mod b
155 | desc: mod b
156 o rev: 2
156 o rev: 2
157 | desc: mv a b
157 | desc: mv a b
158 o rev: 1
158 o rev: 1
159 | desc: randomcommit
159 | desc: randomcommit
160 o rev: 0
160 o rev: 0
161 desc: initial
161 desc: initial
162
162
163 $ hg rebase -s . -d 0
163 $ hg rebase -s . -d 0
164 rebasing 3:fbe97126b396 "mod b" (tip)
164 rebasing 3:fbe97126b396 "mod b" (tip)
165 merging a and b to a
165 merging a and b to a
166 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/fbe97126b396-cf5452a1-rebase.hg
166 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/fbe97126b396-cf5452a1-rebase.hg
167 $ cd ..
167 $ cd ..
168 $ rm -rf repo
168 $ rm -rf repo
169
169
170 Check a few potential move candidates
170 Check a few potential move candidates
171 -------------------------------------
171 -------------------------------------
172
172
173 $ hg init repo
173 $ hg init repo
174 $ initclient repo
174 $ initclient repo
175 $ cd repo
175 $ cd repo
176 $ mkdir dir
176 $ mkdir dir
177 $ echo a > dir/a
177 $ echo a > dir/a
178 $ hg add dir/a
178 $ hg add dir/a
179 $ hg ci -qm initial
179 $ hg ci -qm initial
180 $ hg mv dir/a dir/b
180 $ hg mv dir/a dir/b
181 $ hg ci -qm 'mv dir/a dir/b'
181 $ hg ci -qm 'mv dir/a dir/b'
182 $ mkdir dir2
182 $ mkdir dir2
183 $ echo b > dir2/a
183 $ echo b > dir2/a
184 $ hg add dir2/a
184 $ hg add dir2/a
185 $ hg ci -qm 'create dir2/a'
185 $ hg ci -qm 'create dir2/a'
186 $ hg up -q 0
186 $ hg up -q 0
187 $ echo b > dir/a
187 $ echo b > dir/a
188 $ hg ci -qm 'mod dir/a'
188 $ hg ci -qm 'mod dir/a'
189
189
190 $ hg l
190 $ hg l
191 @ rev: 3
191 @ rev: 3
192 | desc: mod dir/a
192 | desc: mod dir/a
193 | o rev: 2
193 | o rev: 2
194 | | desc: create dir2/a
194 | | desc: create dir2/a
195 | o rev: 1
195 | o rev: 1
196 |/ desc: mv dir/a dir/b
196 |/ desc: mv dir/a dir/b
197 o rev: 0
197 o rev: 0
198 desc: initial
198 desc: initial
199
199
200 $ hg rebase -s . -d 2
200 $ hg rebase -s . -d 2
201 rebasing 3:6b2f4cece40f "mod dir/a" (tip)
201 rebasing 3:6b2f4cece40f "mod dir/a" (tip)
202 merging dir/b and dir/a to dir/b
202 merging dir/b and dir/a to dir/b
203 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/6b2f4cece40f-503efe60-rebase.hg
203 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/6b2f4cece40f-503efe60-rebase.hg
204 $ cd ..
204 $ cd ..
205 $ rm -rf repo
205 $ rm -rf repo
206
206
207 Test the copytrace.movecandidateslimit with many move candidates
207 Test the copytrace.movecandidateslimit with many move candidates
208 ----------------------------------------------------------------
208 ----------------------------------------------------------------
209
209
210 $ hg init repo
210 $ hg init repo
211 $ initclient repo
211 $ initclient repo
212 $ cd repo
212 $ cd repo
213 $ echo a > a
213 $ echo a > a
214 $ hg add a
214 $ hg add a
215 $ hg ci -m initial
215 $ hg ci -m initial
216 $ hg mv a foo
216 $ hg mv a foo
217 $ echo a > b
217 $ echo a > b
218 $ echo a > c
218 $ echo a > c
219 $ echo a > d
219 $ echo a > d
220 $ echo a > e
220 $ echo a > e
221 $ echo a > f
221 $ echo a > f
222 $ echo a > g
222 $ echo a > g
223 $ hg add b
223 $ hg add b
224 $ hg add c
224 $ hg add c
225 $ hg add d
225 $ hg add d
226 $ hg add e
226 $ hg add e
227 $ hg add f
227 $ hg add f
228 $ hg add g
228 $ hg add g
229 $ hg ci -m 'mv a foo, add many files'
229 $ hg ci -m 'mv a foo, add many files'
230 $ hg up -q ".^"
230 $ hg up -q ".^"
231 $ echo b > a
231 $ echo b > a
232 $ hg ci -m 'mod a'
232 $ hg ci -m 'mod a'
233 created new head
233 created new head
234
234
235 $ hg l
235 $ hg l
236 @ rev: 2
236 @ rev: 2
237 | desc: mod a
237 | desc: mod a
238 | o rev: 1
238 | o rev: 1
239 |/ desc: mv a foo, add many files
239 |/ desc: mv a foo, add many files
240 o rev: 0
240 o rev: 0
241 desc: initial
241 desc: initial
242
242
243 With small limit
243 With small limit
244
244
245 $ hg rebase -s 2 -d 1 --config experimental.copytrace.movecandidateslimit=0
245 $ hg rebase -s 2 -d 1 --config experimental.copytrace.movecandidateslimit=0
246 rebasing 2:ef716627c70b "mod a" (tip)
246 rebasing 2:ef716627c70b "mod a" (tip)
247 skipping copytracing for 'a', more candidates than the limit: 7
247 skipping copytracing for 'a', more candidates than the limit: 7
248 file 'a' was deleted in local [dest] but was modified in other [source].
248 file 'a' was deleted in local [dest] but was modified in other [source].
249 What do you want to do?
249 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
250 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
250 What do you want to do? u
251 unresolved conflicts (see hg resolve, then hg rebase --continue)
251 unresolved conflicts (see hg resolve, then hg rebase --continue)
252 [1]
252 [1]
253
253
254 $ hg rebase --abort
254 $ hg rebase --abort
255 rebase aborted
255 rebase aborted
256
256
257 With default limit which is 100
257 With default limit which is 100
258
258
259 $ hg rebase -s 2 -d 1
259 $ hg rebase -s 2 -d 1
260 rebasing 2:ef716627c70b "mod a" (tip)
260 rebasing 2:ef716627c70b "mod a" (tip)
261 merging foo and a to foo
261 merging foo and a to foo
262 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/ef716627c70b-24681561-rebase.hg
262 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/ef716627c70b-24681561-rebase.hg
263
263
264 $ cd ..
264 $ cd ..
265 $ rm -rf repo
265 $ rm -rf repo
266
266
267 Move file in one branch and delete it in another
267 Move file in one branch and delete it in another
268 -----------------------------------------------
268 -----------------------------------------------
269
269
270 $ hg init repo
270 $ hg init repo
271 $ initclient repo
271 $ initclient repo
272 $ cd repo
272 $ cd repo
273 $ echo a > a
273 $ echo a > a
274 $ hg add a
274 $ hg add a
275 $ hg ci -m initial
275 $ hg ci -m initial
276 $ hg mv a b
276 $ hg mv a b
277 $ hg ci -m 'mv a b'
277 $ hg ci -m 'mv a b'
278 $ hg up -q ".^"
278 $ hg up -q ".^"
279 $ hg rm a
279 $ hg rm a
280 $ hg ci -m 'del a'
280 $ hg ci -m 'del a'
281 created new head
281 created new head
282
282
283 $ hg pl
283 $ hg pl
284 @ rev: 2, phase: draft
284 @ rev: 2, phase: draft
285 | desc: del a
285 | desc: del a
286 | o rev: 1, phase: draft
286 | o rev: 1, phase: draft
287 |/ desc: mv a b
287 |/ desc: mv a b
288 o rev: 0, phase: draft
288 o rev: 0, phase: draft
289 desc: initial
289 desc: initial
290
290
291 $ hg rebase -s 1 -d 2
291 $ hg rebase -s 1 -d 2
292 rebasing 1:472e38d57782 "mv a b"
292 rebasing 1:472e38d57782 "mv a b"
293 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/472e38d57782-17d50e29-rebase.hg
293 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/472e38d57782-17d50e29-rebase.hg
294 $ hg up -q c492ed3c7e35dcd1dc938053b8adf56e2cfbd062
294 $ hg up -q c492ed3c7e35dcd1dc938053b8adf56e2cfbd062
295 $ ls
295 $ ls
296 b
296 b
297 $ cd ..
297 $ cd ..
298 $ rm -rf repo
298 $ rm -rf repo
299
299
300 Move a directory in draft branch
300 Move a directory in draft branch
301 --------------------------------
301 --------------------------------
302
302
303 $ hg init repo
303 $ hg init repo
304 $ initclient repo
304 $ initclient repo
305 $ cd repo
305 $ cd repo
306 $ mkdir dir
306 $ mkdir dir
307 $ echo a > dir/a
307 $ echo a > dir/a
308 $ hg add dir/a
308 $ hg add dir/a
309 $ hg ci -qm initial
309 $ hg ci -qm initial
310 $ echo b > dir/a
310 $ echo b > dir/a
311 $ hg ci -qm 'mod dir/a'
311 $ hg ci -qm 'mod dir/a'
312 $ hg up -q ".^"
312 $ hg up -q ".^"
313 $ hg mv -q dir/ dir2
313 $ hg mv -q dir/ dir2
314 $ hg ci -qm 'mv dir/ dir2/'
314 $ hg ci -qm 'mv dir/ dir2/'
315
315
316 $ hg l
316 $ hg l
317 @ rev: 2
317 @ rev: 2
318 | desc: mv dir/ dir2/
318 | desc: mv dir/ dir2/
319 | o rev: 1
319 | o rev: 1
320 |/ desc: mod dir/a
320 |/ desc: mod dir/a
321 o rev: 0
321 o rev: 0
322 desc: initial
322 desc: initial
323
323
324 $ hg rebase -s . -d 1
324 $ hg rebase -s . -d 1
325 rebasing 2:a33d80b6e352 "mv dir/ dir2/" (tip)
325 rebasing 2:a33d80b6e352 "mv dir/ dir2/" (tip)
326 merging dir/a and dir2/a to dir2/a
326 merging dir/a and dir2/a to dir2/a
327 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/a33d80b6e352-fecb9ada-rebase.hg
327 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/a33d80b6e352-fecb9ada-rebase.hg
328 $ cd ..
328 $ cd ..
329 $ rm -rf server
329 $ rm -rf server
330 $ rm -rf repo
330 $ rm -rf repo
331
331
332 Move file twice and rebase mod on top of moves
332 Move file twice and rebase mod on top of moves
333 ----------------------------------------------
333 ----------------------------------------------
334
334
335 $ hg init repo
335 $ hg init repo
336 $ initclient repo
336 $ initclient repo
337 $ cd repo
337 $ cd repo
338 $ echo a > a
338 $ echo a > a
339 $ hg add a
339 $ hg add a
340 $ hg ci -m initial
340 $ hg ci -m initial
341 $ hg mv a b
341 $ hg mv a b
342 $ hg ci -m 'mv a b'
342 $ hg ci -m 'mv a b'
343 $ hg mv b c
343 $ hg mv b c
344 $ hg ci -m 'mv b c'
344 $ hg ci -m 'mv b c'
345 $ hg up -q 0
345 $ hg up -q 0
346 $ echo c > a
346 $ echo c > a
347 $ hg ci -m 'mod a'
347 $ hg ci -m 'mod a'
348 created new head
348 created new head
349
349
350 $ hg l
350 $ hg l
351 @ rev: 3
351 @ rev: 3
352 | desc: mod a
352 | desc: mod a
353 | o rev: 2
353 | o rev: 2
354 | | desc: mv b c
354 | | desc: mv b c
355 | o rev: 1
355 | o rev: 1
356 |/ desc: mv a b
356 |/ desc: mv a b
357 o rev: 0
357 o rev: 0
358 desc: initial
358 desc: initial
359 $ hg rebase -s . -d 2
359 $ hg rebase -s . -d 2
360 rebasing 3:d41316942216 "mod a" (tip)
360 rebasing 3:d41316942216 "mod a" (tip)
361 merging c and a to c
361 merging c and a to c
362 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/d41316942216-2b5949bc-rebase.hg
362 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/d41316942216-2b5949bc-rebase.hg
363
363
364 $ cd ..
364 $ cd ..
365 $ rm -rf repo
365 $ rm -rf repo
366
366
367 Move file twice and rebase moves on top of mods
367 Move file twice and rebase moves on top of mods
368 -----------------------------------------------
368 -----------------------------------------------
369
369
370 $ hg init repo
370 $ hg init repo
371 $ initclient repo
371 $ initclient repo
372 $ cd repo
372 $ cd repo
373 $ echo a > a
373 $ echo a > a
374 $ hg add a
374 $ hg add a
375 $ hg ci -m initial
375 $ hg ci -m initial
376 $ hg mv a b
376 $ hg mv a b
377 $ hg ci -m 'mv a b'
377 $ hg ci -m 'mv a b'
378 $ hg mv b c
378 $ hg mv b c
379 $ hg ci -m 'mv b c'
379 $ hg ci -m 'mv b c'
380 $ hg up -q 0
380 $ hg up -q 0
381 $ echo c > a
381 $ echo c > a
382 $ hg ci -m 'mod a'
382 $ hg ci -m 'mod a'
383 created new head
383 created new head
384 $ hg l
384 $ hg l
385 @ rev: 3
385 @ rev: 3
386 | desc: mod a
386 | desc: mod a
387 | o rev: 2
387 | o rev: 2
388 | | desc: mv b c
388 | | desc: mv b c
389 | o rev: 1
389 | o rev: 1
390 |/ desc: mv a b
390 |/ desc: mv a b
391 o rev: 0
391 o rev: 0
392 desc: initial
392 desc: initial
393 $ hg rebase -s 1 -d .
393 $ hg rebase -s 1 -d .
394 rebasing 1:472e38d57782 "mv a b"
394 rebasing 1:472e38d57782 "mv a b"
395 merging a and b to b
395 merging a and b to b
396 rebasing 2:d3efd280421d "mv b c"
396 rebasing 2:d3efd280421d "mv b c"
397 merging b and c to c
397 merging b and c to c
398 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/472e38d57782-ab8d3c58-rebase.hg
398 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/472e38d57782-ab8d3c58-rebase.hg
399
399
400 $ cd ..
400 $ cd ..
401 $ rm -rf repo
401 $ rm -rf repo
402
402
403 Move one file and add another file in the same folder in one branch, modify file in another branch
403 Move one file and add another file in the same folder in one branch, modify file in another branch
404 --------------------------------------------------------------------------------------------------
404 --------------------------------------------------------------------------------------------------
405
405
406 $ hg init repo
406 $ hg init repo
407 $ initclient repo
407 $ initclient repo
408 $ cd repo
408 $ cd repo
409 $ echo a > a
409 $ echo a > a
410 $ hg add a
410 $ hg add a
411 $ hg ci -m initial
411 $ hg ci -m initial
412 $ hg mv a b
412 $ hg mv a b
413 $ hg ci -m 'mv a b'
413 $ hg ci -m 'mv a b'
414 $ echo c > c
414 $ echo c > c
415 $ hg add c
415 $ hg add c
416 $ hg ci -m 'add c'
416 $ hg ci -m 'add c'
417 $ hg up -q 0
417 $ hg up -q 0
418 $ echo b > a
418 $ echo b > a
419 $ hg ci -m 'mod a'
419 $ hg ci -m 'mod a'
420 created new head
420 created new head
421
421
422 $ hg l
422 $ hg l
423 @ rev: 3
423 @ rev: 3
424 | desc: mod a
424 | desc: mod a
425 | o rev: 2
425 | o rev: 2
426 | | desc: add c
426 | | desc: add c
427 | o rev: 1
427 | o rev: 1
428 |/ desc: mv a b
428 |/ desc: mv a b
429 o rev: 0
429 o rev: 0
430 desc: initial
430 desc: initial
431
431
432 $ hg rebase -s . -d 2
432 $ hg rebase -s . -d 2
433 rebasing 3:ef716627c70b "mod a" (tip)
433 rebasing 3:ef716627c70b "mod a" (tip)
434 merging b and a to b
434 merging b and a to b
435 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/ef716627c70b-24681561-rebase.hg
435 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/ef716627c70b-24681561-rebase.hg
436 $ ls
436 $ ls
437 b
437 b
438 c
438 c
439 $ cat b
439 $ cat b
440 b
440 b
441 $ rm -rf repo
441 $ rm -rf repo
442
442
443 Merge test
443 Merge test
444 ----------
444 ----------
445
445
446 $ hg init repo
446 $ hg init repo
447 $ initclient repo
447 $ initclient repo
448 $ cd repo
448 $ cd repo
449 $ echo a > a
449 $ echo a > a
450 $ hg add a
450 $ hg add a
451 $ hg ci -m initial
451 $ hg ci -m initial
452 $ echo b > a
452 $ echo b > a
453 $ hg ci -m 'modify a'
453 $ hg ci -m 'modify a'
454 $ hg up -q 0
454 $ hg up -q 0
455 $ hg mv a b
455 $ hg mv a b
456 $ hg ci -m 'mv a b'
456 $ hg ci -m 'mv a b'
457 created new head
457 created new head
458 $ hg up -q 2
458 $ hg up -q 2
459
459
460 $ hg l
460 $ hg l
461 @ rev: 2
461 @ rev: 2
462 | desc: mv a b
462 | desc: mv a b
463 | o rev: 1
463 | o rev: 1
464 |/ desc: modify a
464 |/ desc: modify a
465 o rev: 0
465 o rev: 0
466 desc: initial
466 desc: initial
467
467
468 $ hg merge 1
468 $ hg merge 1
469 merging b and a to b
469 merging b and a to b
470 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
470 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
471 (branch merge, don't forget to commit)
471 (branch merge, don't forget to commit)
472 $ hg ci -m merge
472 $ hg ci -m merge
473 $ ls
473 $ ls
474 b
474 b
475 $ cd ..
475 $ cd ..
476 $ rm -rf repo
476 $ rm -rf repo
477
477
478 Copy and move file
478 Copy and move file
479 ------------------
479 ------------------
480
480
481 $ hg init repo
481 $ hg init repo
482 $ initclient repo
482 $ initclient repo
483 $ cd repo
483 $ cd repo
484 $ echo a > a
484 $ echo a > a
485 $ hg add a
485 $ hg add a
486 $ hg ci -m initial
486 $ hg ci -m initial
487 $ hg cp a c
487 $ hg cp a c
488 $ hg mv a b
488 $ hg mv a b
489 $ hg ci -m 'cp a c, mv a b'
489 $ hg ci -m 'cp a c, mv a b'
490 $ hg up -q 0
490 $ hg up -q 0
491 $ echo b > a
491 $ echo b > a
492 $ hg ci -m 'mod a'
492 $ hg ci -m 'mod a'
493 created new head
493 created new head
494
494
495 $ hg l
495 $ hg l
496 @ rev: 2
496 @ rev: 2
497 | desc: mod a
497 | desc: mod a
498 | o rev: 1
498 | o rev: 1
499 |/ desc: cp a c, mv a b
499 |/ desc: cp a c, mv a b
500 o rev: 0
500 o rev: 0
501 desc: initial
501 desc: initial
502
502
503 $ hg rebase -s . -d 1
503 $ hg rebase -s . -d 1
504 rebasing 2:ef716627c70b "mod a" (tip)
504 rebasing 2:ef716627c70b "mod a" (tip)
505 merging b and a to b
505 merging b and a to b
506 merging c and a to c
506 merging c and a to c
507 saved backup bundle to $TESTTMP/repo/repo/.hg/strip-backup/ef716627c70b-24681561-rebase.hg
507 saved backup bundle to $TESTTMP/repo/repo/.hg/strip-backup/ef716627c70b-24681561-rebase.hg
508 $ ls
508 $ ls
509 b
509 b
510 c
510 c
511 $ cat b
511 $ cat b
512 b
512 b
513 $ cat c
513 $ cat c
514 b
514 b
515 $ cd ..
515 $ cd ..
516 $ rm -rf repo
516 $ rm -rf repo
517
517
518 Do a merge commit with many consequent moves in one branch
518 Do a merge commit with many consequent moves in one branch
519 ----------------------------------------------------------
519 ----------------------------------------------------------
520
520
521 $ hg init repo
521 $ hg init repo
522 $ initclient repo
522 $ initclient repo
523 $ cd repo
523 $ cd repo
524 $ echo a > a
524 $ echo a > a
525 $ hg add a
525 $ hg add a
526 $ hg ci -m initial
526 $ hg ci -m initial
527 $ echo b > a
527 $ echo b > a
528 $ hg ci -qm 'mod a'
528 $ hg ci -qm 'mod a'
529 $ hg up -q ".^"
529 $ hg up -q ".^"
530 $ hg mv a b
530 $ hg mv a b
531 $ hg ci -qm 'mv a b'
531 $ hg ci -qm 'mv a b'
532 $ hg mv b c
532 $ hg mv b c
533 $ hg ci -qm 'mv b c'
533 $ hg ci -qm 'mv b c'
534 $ hg up -q 1
534 $ hg up -q 1
535 $ hg l
535 $ hg l
536 o rev: 3
536 o rev: 3
537 | desc: mv b c
537 | desc: mv b c
538 o rev: 2
538 o rev: 2
539 | desc: mv a b
539 | desc: mv a b
540 | @ rev: 1
540 | @ rev: 1
541 |/ desc: mod a
541 |/ desc: mod a
542 o rev: 0
542 o rev: 0
543 desc: initial
543 desc: initial
544
544
545 $ hg merge 3
545 $ hg merge 3
546 merging a and c to c
546 merging a and c to c
547 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
547 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
548 (branch merge, don't forget to commit)
548 (branch merge, don't forget to commit)
549 $ hg ci -qm 'merge'
549 $ hg ci -qm 'merge'
550 $ hg pl
550 $ hg pl
551 @ rev: 4, phase: draft
551 @ rev: 4, phase: draft
552 |\ desc: merge
552 |\ desc: merge
553 | o rev: 3, phase: draft
553 | o rev: 3, phase: draft
554 | | desc: mv b c
554 | | desc: mv b c
555 | o rev: 2, phase: draft
555 | o rev: 2, phase: draft
556 | | desc: mv a b
556 | | desc: mv a b
557 o | rev: 1, phase: draft
557 o | rev: 1, phase: draft
558 |/ desc: mod a
558 |/ desc: mod a
559 o rev: 0, phase: draft
559 o rev: 0, phase: draft
560 desc: initial
560 desc: initial
561 $ ls
561 $ ls
562 c
562 c
563 $ cd ..
563 $ cd ..
564 $ rm -rf repo
564 $ rm -rf repo
565
565
566 Test shelve/unshelve
566 Test shelve/unshelve
567 -------------------
567 -------------------
568
568
569 $ hg init repo
569 $ hg init repo
570 $ initclient repo
570 $ initclient repo
571 $ cd repo
571 $ cd repo
572 $ echo a > a
572 $ echo a > a
573 $ hg add a
573 $ hg add a
574 $ hg ci -m initial
574 $ hg ci -m initial
575 $ echo b > a
575 $ echo b > a
576 $ hg shelve
576 $ hg shelve
577 shelved as default
577 shelved as default
578 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
578 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
579 $ hg mv a b
579 $ hg mv a b
580 $ hg ci -m 'mv a b'
580 $ hg ci -m 'mv a b'
581
581
582 $ hg l
582 $ hg l
583 @ rev: 1
583 @ rev: 1
584 | desc: mv a b
584 | desc: mv a b
585 o rev: 0
585 o rev: 0
586 desc: initial
586 desc: initial
587 $ hg unshelve
587 $ hg unshelve
588 unshelving change 'default'
588 unshelving change 'default'
589 rebasing shelved changes
589 rebasing shelved changes
590 merging b and a to b
590 merging b and a to b
591 $ ls
591 $ ls
592 b
592 b
593 $ cat b
593 $ cat b
594 b
594 b
595 $ cd ..
595 $ cd ..
596 $ rm -rf repo
596 $ rm -rf repo
597
597
598 Test full copytrace ability on draft branch
598 Test full copytrace ability on draft branch
599 -------------------------------------------
599 -------------------------------------------
600
600
601 File directory and base name changed in same move
601 File directory and base name changed in same move
602 $ hg init repo
602 $ hg init repo
603 $ initclient repo
603 $ initclient repo
604 $ mkdir repo/dir1
604 $ mkdir repo/dir1
605 $ cd repo/dir1
605 $ cd repo/dir1
606 $ echo a > a
606 $ echo a > a
607 $ hg add a
607 $ hg add a
608 $ hg ci -qm initial
608 $ hg ci -qm initial
609 $ cd ..
609 $ cd ..
610 $ hg mv -q dir1 dir2
610 $ hg mv -q dir1 dir2
611 $ hg mv dir2/a dir2/b
611 $ hg mv dir2/a dir2/b
612 $ hg ci -qm 'mv a b; mv dir1 dir2'
612 $ hg ci -qm 'mv a b; mv dir1 dir2'
613 $ hg up -q '.^'
613 $ hg up -q '.^'
614 $ cd dir1
614 $ cd dir1
615 $ echo b >> a
615 $ echo b >> a
616 $ cd ..
616 $ cd ..
617 $ hg ci -qm 'mod a'
617 $ hg ci -qm 'mod a'
618
618
619 $ hg pl
619 $ hg pl
620 @ rev: 2, phase: draft
620 @ rev: 2, phase: draft
621 | desc: mod a
621 | desc: mod a
622 | o rev: 1, phase: draft
622 | o rev: 1, phase: draft
623 |/ desc: mv a b; mv dir1 dir2
623 |/ desc: mv a b; mv dir1 dir2
624 o rev: 0, phase: draft
624 o rev: 0, phase: draft
625 desc: initial
625 desc: initial
626
626
627 $ hg rebase -s . -d 1 --config experimental.copytrace.sourcecommitlimit=100
627 $ hg rebase -s . -d 1 --config experimental.copytrace.sourcecommitlimit=100
628 rebasing 2:6207d2d318e7 "mod a" (tip)
628 rebasing 2:6207d2d318e7 "mod a" (tip)
629 merging dir2/b and dir1/a to dir2/b
629 merging dir2/b and dir1/a to dir2/b
630 saved backup bundle to $TESTTMP/repo/repo/.hg/strip-backup/6207d2d318e7-1c9779ad-rebase.hg
630 saved backup bundle to $TESTTMP/repo/repo/.hg/strip-backup/6207d2d318e7-1c9779ad-rebase.hg
631 $ cat dir2/b
631 $ cat dir2/b
632 a
632 a
633 b
633 b
634 $ cd ..
634 $ cd ..
635 $ rm -rf repo
635 $ rm -rf repo
636
636
637 Move directory in one merge parent, while adding file to original directory
637 Move directory in one merge parent, while adding file to original directory
638 in other merge parent. File moved on rebase.
638 in other merge parent. File moved on rebase.
639
639
640 $ hg init repo
640 $ hg init repo
641 $ initclient repo
641 $ initclient repo
642 $ mkdir repo/dir1
642 $ mkdir repo/dir1
643 $ cd repo/dir1
643 $ cd repo/dir1
644 $ echo dummy > dummy
644 $ echo dummy > dummy
645 $ hg add dummy
645 $ hg add dummy
646 $ cd ..
646 $ cd ..
647 $ hg ci -qm initial
647 $ hg ci -qm initial
648 $ cd dir1
648 $ cd dir1
649 $ echo a > a
649 $ echo a > a
650 $ hg add a
650 $ hg add a
651 $ cd ..
651 $ cd ..
652 $ hg ci -qm 'hg add dir1/a'
652 $ hg ci -qm 'hg add dir1/a'
653 $ hg up -q '.^'
653 $ hg up -q '.^'
654 $ hg mv -q dir1 dir2
654 $ hg mv -q dir1 dir2
655 $ hg ci -qm 'mv dir1 dir2'
655 $ hg ci -qm 'mv dir1 dir2'
656
656
657 $ hg pl
657 $ hg pl
658 @ rev: 2, phase: draft
658 @ rev: 2, phase: draft
659 | desc: mv dir1 dir2
659 | desc: mv dir1 dir2
660 | o rev: 1, phase: draft
660 | o rev: 1, phase: draft
661 |/ desc: hg add dir1/a
661 |/ desc: hg add dir1/a
662 o rev: 0, phase: draft
662 o rev: 0, phase: draft
663 desc: initial
663 desc: initial
664
664
665 $ hg rebase -s . -d 1 --config experimental.copytrace.sourcecommitlimit=100
665 $ hg rebase -s . -d 1 --config experimental.copytrace.sourcecommitlimit=100
666 rebasing 2:e8919e7df8d0 "mv dir1 dir2" (tip)
666 rebasing 2:e8919e7df8d0 "mv dir1 dir2" (tip)
667 saved backup bundle to $TESTTMP/repo/repo/.hg/strip-backup/e8919e7df8d0-f62fab62-rebase.hg
667 saved backup bundle to $TESTTMP/repo/repo/.hg/strip-backup/e8919e7df8d0-f62fab62-rebase.hg
668 $ ls dir2
668 $ ls dir2
669 a
669 a
670 dummy
670 dummy
671 $ rm -rf repo
671 $ rm -rf repo
672
672
673 Testing the sourcecommitlimit config
673 Testing the sourcecommitlimit config
674 -----------------------------------
674 -----------------------------------
675
675
676 $ hg init repo
676 $ hg init repo
677 $ initclient repo
677 $ initclient repo
678 $ cd repo
678 $ cd repo
679 $ echo a > a
679 $ echo a > a
680 $ hg ci -Aqm "added a"
680 $ hg ci -Aqm "added a"
681 $ echo "more things" >> a
681 $ echo "more things" >> a
682 $ hg ci -qm "added more things to a"
682 $ hg ci -qm "added more things to a"
683 $ hg up 0
683 $ hg up 0
684 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
684 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
685 $ echo b > b
685 $ echo b > b
686 $ hg ci -Aqm "added b"
686 $ hg ci -Aqm "added b"
687 $ mkdir foo
687 $ mkdir foo
688 $ hg mv a foo/bar
688 $ hg mv a foo/bar
689 $ hg ci -m "Moved a to foo/bar"
689 $ hg ci -m "Moved a to foo/bar"
690 $ hg pl
690 $ hg pl
691 @ rev: 3, phase: draft
691 @ rev: 3, phase: draft
692 | desc: Moved a to foo/bar
692 | desc: Moved a to foo/bar
693 o rev: 2, phase: draft
693 o rev: 2, phase: draft
694 | desc: added b
694 | desc: added b
695 | o rev: 1, phase: draft
695 | o rev: 1, phase: draft
696 |/ desc: added more things to a
696 |/ desc: added more things to a
697 o rev: 0, phase: draft
697 o rev: 0, phase: draft
698 desc: added a
698 desc: added a
699
699
700 When the sourcecommitlimit is small and we have more drafts, we use heuristics only
700 When the sourcecommitlimit is small and we have more drafts, we use heuristics only
701
701
702 $ hg rebase -s 1 -d .
702 $ hg rebase -s 1 -d .
703 rebasing 1:8b6e13696c38 "added more things to a"
703 rebasing 1:8b6e13696c38 "added more things to a"
704 file 'a' was deleted in local [dest] but was modified in other [source].
704 file 'a' was deleted in local [dest] but was modified in other [source].
705 What do you want to do?
705 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
706 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
706 What do you want to do? u
707 unresolved conflicts (see hg resolve, then hg rebase --continue)
707 unresolved conflicts (see hg resolve, then hg rebase --continue)
708 [1]
708 [1]
709
709
710 But when we have "sourcecommitlimit > (no. of drafts from base to c1)", we do
710 But when we have "sourcecommitlimit > (no. of drafts from base to c1)", we do
711 fullcopytracing
711 fullcopytracing
712
712
713 $ hg rebase --abort
713 $ hg rebase --abort
714 rebase aborted
714 rebase aborted
715 $ hg rebase -s 1 -d . --config experimental.copytrace.sourcecommitlimit=100
715 $ hg rebase -s 1 -d . --config experimental.copytrace.sourcecommitlimit=100
716 rebasing 1:8b6e13696c38 "added more things to a"
716 rebasing 1:8b6e13696c38 "added more things to a"
717 merging foo/bar and a to foo/bar
717 merging foo/bar and a to foo/bar
718 saved backup bundle to $TESTTMP/repo/repo/repo/.hg/strip-backup/8b6e13696c38-fc14ac83-rebase.hg
718 saved backup bundle to $TESTTMP/repo/repo/repo/.hg/strip-backup/8b6e13696c38-fc14ac83-rebase.hg
719 $ cd ..
719 $ cd ..
720 $ rm -rf repo
720 $ rm -rf repo
@@ -1,795 +1,795 b''
1 #require no-reposimplestore
1 #require no-reposimplestore
2
2
3 This file focuses mainly on updating largefiles in the working
3 This file focuses mainly on updating largefiles in the working
4 directory (and ".hg/largefiles/dirstate")
4 directory (and ".hg/largefiles/dirstate")
5
5
6 $ cat >> $HGRCPATH <<EOF
6 $ cat >> $HGRCPATH <<EOF
7 > [ui]
7 > [ui]
8 > merge = internal:merge
8 > merge = internal:merge
9 > [extensions]
9 > [extensions]
10 > largefiles =
10 > largefiles =
11 > [extdiff]
11 > [extdiff]
12 > # for portability:
12 > # for portability:
13 > pdiff = sh "$RUNTESTDIR/pdiff"
13 > pdiff = sh "$RUNTESTDIR/pdiff"
14 > EOF
14 > EOF
15
15
16 $ hg init repo
16 $ hg init repo
17 $ cd repo
17 $ cd repo
18
18
19 $ echo large1 > large1
19 $ echo large1 > large1
20 $ echo large2 > large2
20 $ echo large2 > large2
21 $ hg add --large large1 large2
21 $ hg add --large large1 large2
22 $ echo normal1 > normal1
22 $ echo normal1 > normal1
23 $ hg add normal1
23 $ hg add normal1
24 $ hg commit -m '#0'
24 $ hg commit -m '#0'
25 $ echo 'large1 in #1' > large1
25 $ echo 'large1 in #1' > large1
26 $ echo 'normal1 in #1' > normal1
26 $ echo 'normal1 in #1' > normal1
27 $ hg commit -m '#1'
27 $ hg commit -m '#1'
28 $ hg pdiff -r '.^' --config extensions.extdiff=
28 $ hg pdiff -r '.^' --config extensions.extdiff=
29 diff -Nru repo.0d9d9b8dc9a3/.hglf/large1 repo/.hglf/large1
29 diff -Nru repo.0d9d9b8dc9a3/.hglf/large1 repo/.hglf/large1
30 --- repo.0d9d9b8dc9a3/.hglf/large1 * (glob)
30 --- repo.0d9d9b8dc9a3/.hglf/large1 * (glob)
31 +++ repo/.hglf/large1 * (glob)
31 +++ repo/.hglf/large1 * (glob)
32 @@ -1* +1* @@ (glob)
32 @@ -1* +1* @@ (glob)
33 -4669e532d5b2c093a78eca010077e708a071bb64
33 -4669e532d5b2c093a78eca010077e708a071bb64
34 +58e24f733a964da346e2407a2bee99d9001184f5
34 +58e24f733a964da346e2407a2bee99d9001184f5
35 diff -Nru repo.0d9d9b8dc9a3/normal1 repo/normal1
35 diff -Nru repo.0d9d9b8dc9a3/normal1 repo/normal1
36 --- repo.0d9d9b8dc9a3/normal1 * (glob)
36 --- repo.0d9d9b8dc9a3/normal1 * (glob)
37 +++ repo/normal1 * (glob)
37 +++ repo/normal1 * (glob)
38 @@ -1* +1* @@ (glob)
38 @@ -1* +1* @@ (glob)
39 -normal1
39 -normal1
40 +normal1 in #1
40 +normal1 in #1
41 [1]
41 [1]
42 $ hg update -q -C 0
42 $ hg update -q -C 0
43 $ echo 'large2 in #2' > large2
43 $ echo 'large2 in #2' > large2
44 $ hg commit -m '#2'
44 $ hg commit -m '#2'
45 created new head
45 created new head
46
46
47 Test that update also updates the lfdirstate of 'unsure' largefiles after
47 Test that update also updates the lfdirstate of 'unsure' largefiles after
48 hashing them:
48 hashing them:
49
49
50 The previous operations will usually have left us with largefiles with a mtime
50 The previous operations will usually have left us with largefiles with a mtime
51 within the same second as the dirstate was written.
51 within the same second as the dirstate was written.
52 The lfdirstate entries will thus have been written with an invalidated/unset
52 The lfdirstate entries will thus have been written with an invalidated/unset
53 mtime to make sure further changes within the same second is detected.
53 mtime to make sure further changes within the same second is detected.
54 We will however occasionally be "lucky" and get a tick between writing
54 We will however occasionally be "lucky" and get a tick between writing
55 largefiles and writing dirstate so we get valid lfdirstate timestamps. The
55 largefiles and writing dirstate so we get valid lfdirstate timestamps. The
56 following verification is thus disabled but can be verified manually.
56 following verification is thus disabled but can be verified manually.
57
57
58 #if false
58 #if false
59 $ hg debugdirstate --large --nodate
59 $ hg debugdirstate --large --nodate
60 n 644 7 unset large1
60 n 644 7 unset large1
61 n 644 13 unset large2
61 n 644 13 unset large2
62 #endif
62 #endif
63
63
64 Wait to make sure we get a tick so the mtime of the largefiles become valid.
64 Wait to make sure we get a tick so the mtime of the largefiles become valid.
65
65
66 $ sleep 1
66 $ sleep 1
67
67
68 A linear merge will update standins before performing the actual merge. It will
68 A linear merge will update standins before performing the actual merge. It will
69 do a lfdirstate status walk and find 'unset'/'unsure' files, hash them, and
69 do a lfdirstate status walk and find 'unset'/'unsure' files, hash them, and
70 update the corresponding standins.
70 update the corresponding standins.
71 Verify that it actually marks the clean files as clean in lfdirstate so
71 Verify that it actually marks the clean files as clean in lfdirstate so
72 we don't have to hash them again next time we update.
72 we don't have to hash them again next time we update.
73
73
74 $ hg up
74 $ hg up
75 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
75 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
76 updated to "f74e50bd9e55: #2"
76 updated to "f74e50bd9e55: #2"
77 1 other heads for branch "default"
77 1 other heads for branch "default"
78 $ hg debugdirstate --large --nodate
78 $ hg debugdirstate --large --nodate
79 n 644 7 set large1
79 n 644 7 set large1
80 n 644 13 set large2
80 n 644 13 set large2
81
81
82 Test that lfdirstate keeps track of last modification of largefiles and
82 Test that lfdirstate keeps track of last modification of largefiles and
83 prevents unnecessary hashing of content - also after linear/noop update
83 prevents unnecessary hashing of content - also after linear/noop update
84
84
85 $ sleep 1
85 $ sleep 1
86 $ hg st
86 $ hg st
87 $ hg debugdirstate --large --nodate
87 $ hg debugdirstate --large --nodate
88 n 644 7 set large1
88 n 644 7 set large1
89 n 644 13 set large2
89 n 644 13 set large2
90 $ hg up
90 $ hg up
91 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
91 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
92 updated to "f74e50bd9e55: #2"
92 updated to "f74e50bd9e55: #2"
93 1 other heads for branch "default"
93 1 other heads for branch "default"
94 $ hg debugdirstate --large --nodate
94 $ hg debugdirstate --large --nodate
95 n 644 7 set large1
95 n 644 7 set large1
96 n 644 13 set large2
96 n 644 13 set large2
97
97
98 Test that "hg merge" updates largefiles from "other" correctly
98 Test that "hg merge" updates largefiles from "other" correctly
99
99
100 (getting largefiles from "other" normally)
100 (getting largefiles from "other" normally)
101
101
102 $ hg status -A large1
102 $ hg status -A large1
103 C large1
103 C large1
104 $ cat large1
104 $ cat large1
105 large1
105 large1
106 $ cat .hglf/large1
106 $ cat .hglf/large1
107 4669e532d5b2c093a78eca010077e708a071bb64
107 4669e532d5b2c093a78eca010077e708a071bb64
108 $ hg merge --config debug.dirstate.delaywrite=2
108 $ hg merge --config debug.dirstate.delaywrite=2
109 getting changed largefiles
109 getting changed largefiles
110 1 largefiles updated, 0 removed
110 1 largefiles updated, 0 removed
111 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
111 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
112 (branch merge, don't forget to commit)
112 (branch merge, don't forget to commit)
113 $ hg status -A large1
113 $ hg status -A large1
114 M large1
114 M large1
115 $ cat large1
115 $ cat large1
116 large1 in #1
116 large1 in #1
117 $ cat .hglf/large1
117 $ cat .hglf/large1
118 58e24f733a964da346e2407a2bee99d9001184f5
118 58e24f733a964da346e2407a2bee99d9001184f5
119 $ hg diff -c 1 --nodates .hglf/large1 | grep '^[+-][0-9a-z]'
119 $ hg diff -c 1 --nodates .hglf/large1 | grep '^[+-][0-9a-z]'
120 -4669e532d5b2c093a78eca010077e708a071bb64
120 -4669e532d5b2c093a78eca010077e708a071bb64
121 +58e24f733a964da346e2407a2bee99d9001184f5
121 +58e24f733a964da346e2407a2bee99d9001184f5
122
122
123 (getting largefiles from "other" via conflict prompt)
123 (getting largefiles from "other" via conflict prompt)
124
124
125 $ hg update -q -C 2
125 $ hg update -q -C 2
126 $ echo 'large1 in #3' > large1
126 $ echo 'large1 in #3' > large1
127 $ echo 'normal1 in #3' > normal1
127 $ echo 'normal1 in #3' > normal1
128 $ hg commit -m '#3'
128 $ hg commit -m '#3'
129 $ cat .hglf/large1
129 $ cat .hglf/large1
130 e5bb990443d6a92aaf7223813720f7566c9dd05b
130 e5bb990443d6a92aaf7223813720f7566c9dd05b
131 $ hg merge --config debug.dirstate.delaywrite=2 --config ui.interactive=True <<EOF
131 $ hg merge --config debug.dirstate.delaywrite=2 --config ui.interactive=True <<EOF
132 > o
132 > o
133 > EOF
133 > EOF
134 largefile large1 has a merge conflict
134 largefile large1 has a merge conflict
135 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
135 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
136 keep (l)ocal e5bb990443d6a92aaf7223813720f7566c9dd05b or
136 keep (l)ocal e5bb990443d6a92aaf7223813720f7566c9dd05b or
137 take (o)ther 58e24f733a964da346e2407a2bee99d9001184f5? o
137 take (o)ther 58e24f733a964da346e2407a2bee99d9001184f5? o
138 merging normal1
138 merging normal1
139 warning: conflicts while merging normal1! (edit, then use 'hg resolve --mark')
139 warning: conflicts while merging normal1! (edit, then use 'hg resolve --mark')
140 getting changed largefiles
140 getting changed largefiles
141 1 largefiles updated, 0 removed
141 1 largefiles updated, 0 removed
142 0 files updated, 1 files merged, 0 files removed, 1 files unresolved
142 0 files updated, 1 files merged, 0 files removed, 1 files unresolved
143 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
143 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
144 [1]
144 [1]
145 $ hg status -A large1
145 $ hg status -A large1
146 M large1
146 M large1
147 $ cat large1
147 $ cat large1
148 large1 in #1
148 large1 in #1
149 $ cat .hglf/large1
149 $ cat .hglf/large1
150 58e24f733a964da346e2407a2bee99d9001184f5
150 58e24f733a964da346e2407a2bee99d9001184f5
151 $ rm normal1.orig
151 $ rm normal1.orig
152
152
153 (merge non-existing largefiles from "other" via conflict prompt -
153 (merge non-existing largefiles from "other" via conflict prompt -
154 make sure the following commit doesn't abort in a confusing way when trying to
154 make sure the following commit doesn't abort in a confusing way when trying to
155 mark the non-existing file as normal in lfdirstate)
155 mark the non-existing file as normal in lfdirstate)
156
156
157 $ mv .hg/largefiles/58e24f733a964da346e2407a2bee99d9001184f5 .
157 $ mv .hg/largefiles/58e24f733a964da346e2407a2bee99d9001184f5 .
158 $ hg update -q -C 3
158 $ hg update -q -C 3
159 $ hg merge --config largefiles.usercache=not --config debug.dirstate.delaywrite=2 --tool :local --config ui.interactive=True <<EOF
159 $ hg merge --config largefiles.usercache=not --config debug.dirstate.delaywrite=2 --tool :local --config ui.interactive=True <<EOF
160 > o
160 > o
161 > EOF
161 > EOF
162 largefile large1 has a merge conflict
162 largefile large1 has a merge conflict
163 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
163 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
164 keep (l)ocal e5bb990443d6a92aaf7223813720f7566c9dd05b or
164 keep (l)ocal e5bb990443d6a92aaf7223813720f7566c9dd05b or
165 take (o)ther 58e24f733a964da346e2407a2bee99d9001184f5? o
165 take (o)ther 58e24f733a964da346e2407a2bee99d9001184f5? o
166 getting changed largefiles
166 getting changed largefiles
167 large1: largefile 58e24f733a964da346e2407a2bee99d9001184f5 not available from file:/*/$TESTTMP/repo (glob)
167 large1: largefile 58e24f733a964da346e2407a2bee99d9001184f5 not available from file:/*/$TESTTMP/repo (glob)
168 0 largefiles updated, 0 removed
168 0 largefiles updated, 0 removed
169 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
169 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
170 (branch merge, don't forget to commit)
170 (branch merge, don't forget to commit)
171 $ hg commit -m '1-2-3 testing' --config largefiles.usercache=not
171 $ hg commit -m '1-2-3 testing' --config largefiles.usercache=not
172 large1: largefile 58e24f733a964da346e2407a2bee99d9001184f5 not available from local store
172 large1: largefile 58e24f733a964da346e2407a2bee99d9001184f5 not available from local store
173 $ hg up -C . --config largefiles.usercache=not
173 $ hg up -C . --config largefiles.usercache=not
174 getting changed largefiles
174 getting changed largefiles
175 large1: largefile 58e24f733a964da346e2407a2bee99d9001184f5 not available from file:/*/$TESTTMP/repo (glob)
175 large1: largefile 58e24f733a964da346e2407a2bee99d9001184f5 not available from file:/*/$TESTTMP/repo (glob)
176 0 largefiles updated, 0 removed
176 0 largefiles updated, 0 removed
177 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
177 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
178 $ hg st large1
178 $ hg st large1
179 ! large1
179 ! large1
180 $ hg rollback -q
180 $ hg rollback -q
181 $ mv 58e24f733a964da346e2407a2bee99d9001184f5 .hg/largefiles/
181 $ mv 58e24f733a964da346e2407a2bee99d9001184f5 .hg/largefiles/
182
182
183 Test that "hg revert -r REV" updates largefiles from "REV" correctly
183 Test that "hg revert -r REV" updates largefiles from "REV" correctly
184
184
185 $ hg update -q -C 3
185 $ hg update -q -C 3
186 $ hg status -A large1
186 $ hg status -A large1
187 C large1
187 C large1
188 $ cat large1
188 $ cat large1
189 large1 in #3
189 large1 in #3
190 $ cat .hglf/large1
190 $ cat .hglf/large1
191 e5bb990443d6a92aaf7223813720f7566c9dd05b
191 e5bb990443d6a92aaf7223813720f7566c9dd05b
192 $ hg diff -c 1 --nodates .hglf/large1 | grep '^[+-][0-9a-z]'
192 $ hg diff -c 1 --nodates .hglf/large1 | grep '^[+-][0-9a-z]'
193 -4669e532d5b2c093a78eca010077e708a071bb64
193 -4669e532d5b2c093a78eca010077e708a071bb64
194 +58e24f733a964da346e2407a2bee99d9001184f5
194 +58e24f733a964da346e2407a2bee99d9001184f5
195 $ hg revert --no-backup -r 1 --config debug.dirstate.delaywrite=2 large1
195 $ hg revert --no-backup -r 1 --config debug.dirstate.delaywrite=2 large1
196 $ hg status -A large1
196 $ hg status -A large1
197 M large1
197 M large1
198 $ cat large1
198 $ cat large1
199 large1 in #1
199 large1 in #1
200 $ cat .hglf/large1
200 $ cat .hglf/large1
201 58e24f733a964da346e2407a2bee99d9001184f5
201 58e24f733a964da346e2407a2bee99d9001184f5
202
202
203 Test that "hg rollback" restores status of largefiles correctly
203 Test that "hg rollback" restores status of largefiles correctly
204
204
205 $ hg update -C -q
205 $ hg update -C -q
206 $ hg remove large1
206 $ hg remove large1
207 $ test -f .hglf/large1
207 $ test -f .hglf/large1
208 [1]
208 [1]
209 $ hg forget large2
209 $ hg forget large2
210 $ test -f .hglf/large2
210 $ test -f .hglf/large2
211 [1]
211 [1]
212 $ echo largeX > largeX
212 $ echo largeX > largeX
213 $ hg add --large largeX
213 $ hg add --large largeX
214 $ cat .hglf/largeX
214 $ cat .hglf/largeX
215
215
216 $ hg commit -m 'will be rollback-ed soon'
216 $ hg commit -m 'will be rollback-ed soon'
217 $ echo largeY > largeY
217 $ echo largeY > largeY
218 $ hg add --large largeY
218 $ hg add --large largeY
219
219
220 $ hg status -A large1
220 $ hg status -A large1
221 large1: $ENOENT$
221 large1: $ENOENT$
222
222
223 $ hg status -A large2
223 $ hg status -A large2
224 ? large2
224 ? large2
225 $ hg status -A largeX
225 $ hg status -A largeX
226 C largeX
226 C largeX
227 $ hg status -A largeY
227 $ hg status -A largeY
228 A largeY
228 A largeY
229 $ hg rollback
229 $ hg rollback
230 repository tip rolled back to revision 3 (undo commit)
230 repository tip rolled back to revision 3 (undo commit)
231 working directory now based on revision 3
231 working directory now based on revision 3
232 $ hg status -A large1
232 $ hg status -A large1
233 R large1
233 R large1
234 $ test -f .hglf/large1
234 $ test -f .hglf/large1
235 [1]
235 [1]
236 $ hg status -A large2
236 $ hg status -A large2
237 R large2
237 R large2
238 $ test -f .hglf/large2
238 $ test -f .hglf/large2
239 [1]
239 [1]
240 $ hg status -A largeX
240 $ hg status -A largeX
241 A largeX
241 A largeX
242 $ cat .hglf/largeX
242 $ cat .hglf/largeX
243
243
244 $ hg status -A largeY
244 $ hg status -A largeY
245 ? largeY
245 ? largeY
246 $ test -f .hglf/largeY
246 $ test -f .hglf/largeY
247 [1]
247 [1]
248 $ rm largeY
248 $ rm largeY
249
249
250 Test that "hg rollback" restores standins correctly
250 Test that "hg rollback" restores standins correctly
251
251
252 $ hg commit -m 'will be rollback-ed soon'
252 $ hg commit -m 'will be rollback-ed soon'
253 $ hg update -q -C 2
253 $ hg update -q -C 2
254 $ cat large1
254 $ cat large1
255 large1
255 large1
256 $ cat .hglf/large1
256 $ cat .hglf/large1
257 4669e532d5b2c093a78eca010077e708a071bb64
257 4669e532d5b2c093a78eca010077e708a071bb64
258 $ cat large2
258 $ cat large2
259 large2 in #2
259 large2 in #2
260 $ cat .hglf/large2
260 $ cat .hglf/large2
261 3cfce6277e7668985707b6887ce56f9f62f6ccd9
261 3cfce6277e7668985707b6887ce56f9f62f6ccd9
262
262
263 $ hg rollback -q -f
263 $ hg rollback -q -f
264 $ cat large1
264 $ cat large1
265 large1
265 large1
266 $ cat .hglf/large1
266 $ cat .hglf/large1
267 4669e532d5b2c093a78eca010077e708a071bb64
267 4669e532d5b2c093a78eca010077e708a071bb64
268 $ cat large2
268 $ cat large2
269 large2 in #2
269 large2 in #2
270 $ cat .hglf/large2
270 $ cat .hglf/large2
271 3cfce6277e7668985707b6887ce56f9f62f6ccd9
271 3cfce6277e7668985707b6887ce56f9f62f6ccd9
272
272
273 (rollback the parent of the working directory, when the parent of it
273 (rollback the parent of the working directory, when the parent of it
274 is not branch-tip)
274 is not branch-tip)
275
275
276 $ hg update -q -C 1
276 $ hg update -q -C 1
277 $ cat .hglf/large1
277 $ cat .hglf/large1
278 58e24f733a964da346e2407a2bee99d9001184f5
278 58e24f733a964da346e2407a2bee99d9001184f5
279 $ cat .hglf/large2
279 $ cat .hglf/large2
280 1deebade43c8c498a3c8daddac0244dc55d1331d
280 1deebade43c8c498a3c8daddac0244dc55d1331d
281
281
282 $ echo normalX > normalX
282 $ echo normalX > normalX
283 $ hg add normalX
283 $ hg add normalX
284 $ hg commit -m 'will be rollback-ed soon'
284 $ hg commit -m 'will be rollback-ed soon'
285 $ hg rollback -q
285 $ hg rollback -q
286
286
287 $ cat .hglf/large1
287 $ cat .hglf/large1
288 58e24f733a964da346e2407a2bee99d9001184f5
288 58e24f733a964da346e2407a2bee99d9001184f5
289 $ cat .hglf/large2
289 $ cat .hglf/large2
290 1deebade43c8c498a3c8daddac0244dc55d1331d
290 1deebade43c8c498a3c8daddac0244dc55d1331d
291 $ rm normalX
291 $ rm normalX
292
292
293 Test that "hg status" shows status of largefiles correctly just after
293 Test that "hg status" shows status of largefiles correctly just after
294 automated commit like rebase/transplant
294 automated commit like rebase/transplant
295
295
296 $ cat >> .hg/hgrc <<EOF
296 $ cat >> .hg/hgrc <<EOF
297 > [extensions]
297 > [extensions]
298 > rebase =
298 > rebase =
299 > strip =
299 > strip =
300 > transplant =
300 > transplant =
301 > EOF
301 > EOF
302 $ hg update -q -C 1
302 $ hg update -q -C 1
303 $ hg remove large1
303 $ hg remove large1
304 $ echo largeX > largeX
304 $ echo largeX > largeX
305 $ hg add --large largeX
305 $ hg add --large largeX
306 $ hg commit -m '#4'
306 $ hg commit -m '#4'
307
307
308 $ hg rebase -s 1 -d 2 --keep
308 $ hg rebase -s 1 -d 2 --keep
309 rebasing 1:72518492caa6 "#1"
309 rebasing 1:72518492caa6 "#1"
310 rebasing 4:07d6153b5c04 "#4" (tip)
310 rebasing 4:07d6153b5c04 "#4" (tip)
311
311
312 $ hg status -A large1
312 $ hg status -A large1
313 large1: $ENOENT$
313 large1: $ENOENT$
314
314
315 $ hg status -A largeX
315 $ hg status -A largeX
316 C largeX
316 C largeX
317 $ hg strip -q 5
317 $ hg strip -q 5
318
318
319 $ hg update -q -C 2
319 $ hg update -q -C 2
320 $ hg transplant -q 1 4
320 $ hg transplant -q 1 4
321
321
322 $ hg status -A large1
322 $ hg status -A large1
323 large1: $ENOENT$
323 large1: $ENOENT$
324
324
325 $ hg status -A largeX
325 $ hg status -A largeX
326 C largeX
326 C largeX
327 $ hg strip -q 5
327 $ hg strip -q 5
328
328
329 $ hg update -q -C 2
329 $ hg update -q -C 2
330 $ hg transplant -q --merge 1 --merge 4
330 $ hg transplant -q --merge 1 --merge 4
331
331
332 $ hg status -A large1
332 $ hg status -A large1
333 large1: $ENOENT$
333 large1: $ENOENT$
334
334
335 $ hg status -A largeX
335 $ hg status -A largeX
336 C largeX
336 C largeX
337 $ hg strip -q 5
337 $ hg strip -q 5
338
338
339 Test that linear merge can detect modification (and conflict) correctly
339 Test that linear merge can detect modification (and conflict) correctly
340
340
341 (linear merge without conflict)
341 (linear merge without conflict)
342
342
343 $ echo 'large2 for linear merge (no conflict)' > large2
343 $ echo 'large2 for linear merge (no conflict)' > large2
344 $ hg update 3 --config debug.dirstate.delaywrite=2
344 $ hg update 3 --config debug.dirstate.delaywrite=2
345 getting changed largefiles
345 getting changed largefiles
346 1 largefiles updated, 0 removed
346 1 largefiles updated, 0 removed
347 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
347 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
348 $ hg status -A large2
348 $ hg status -A large2
349 M large2
349 M large2
350 $ cat large2
350 $ cat large2
351 large2 for linear merge (no conflict)
351 large2 for linear merge (no conflict)
352 $ cat .hglf/large2
352 $ cat .hglf/large2
353 9c4bf8f1b33536d6e5f89447e10620cfe52ea710
353 9c4bf8f1b33536d6e5f89447e10620cfe52ea710
354
354
355 (linear merge with conflict, choosing "other")
355 (linear merge with conflict, choosing "other")
356
356
357 $ hg update -q -C 2
357 $ hg update -q -C 2
358 $ echo 'large1 for linear merge (conflict)' > large1
358 $ echo 'large1 for linear merge (conflict)' > large1
359 $ hg update 3 --config ui.interactive=True <<EOF
359 $ hg update 3 --config ui.interactive=True <<EOF
360 > o
360 > o
361 > EOF
361 > EOF
362 largefile large1 has a merge conflict
362 largefile large1 has a merge conflict
363 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
363 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
364 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
364 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
365 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? o
365 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? o
366 getting changed largefiles
366 getting changed largefiles
367 1 largefiles updated, 0 removed
367 1 largefiles updated, 0 removed
368 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
368 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
369 $ hg status -A large1
369 $ hg status -A large1
370 C large1
370 C large1
371 $ cat large1
371 $ cat large1
372 large1 in #3
372 large1 in #3
373 $ cat .hglf/large1
373 $ cat .hglf/large1
374 e5bb990443d6a92aaf7223813720f7566c9dd05b
374 e5bb990443d6a92aaf7223813720f7566c9dd05b
375
375
376 (linear merge with conflict, choosing "local")
376 (linear merge with conflict, choosing "local")
377
377
378 $ hg update -q -C 2
378 $ hg update -q -C 2
379 $ echo 'large1 for linear merge (conflict)' > large1
379 $ echo 'large1 for linear merge (conflict)' > large1
380 $ hg update 3 --config debug.dirstate.delaywrite=2
380 $ hg update 3 --config debug.dirstate.delaywrite=2
381 largefile large1 has a merge conflict
381 largefile large1 has a merge conflict
382 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
382 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
383 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
383 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
384 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? l
384 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? l
385 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
385 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
386 $ hg status -A large1
386 $ hg status -A large1
387 M large1
387 M large1
388 $ cat large1
388 $ cat large1
389 large1 for linear merge (conflict)
389 large1 for linear merge (conflict)
390 $ cat .hglf/large1
390 $ cat .hglf/large1
391 ba94c2efe5b7c5e0af8d189295ce00553b0612b7
391 ba94c2efe5b7c5e0af8d189295ce00553b0612b7
392
392
393 Test a linear merge to a revision containing same-name normal file
393 Test a linear merge to a revision containing same-name normal file
394
394
395 $ hg update -q -C 3
395 $ hg update -q -C 3
396 $ hg remove large2
396 $ hg remove large2
397 $ echo 'large2 as normal file' > large2
397 $ echo 'large2 as normal file' > large2
398 $ hg add large2
398 $ hg add large2
399 $ echo 'large3 as normal file' > large3
399 $ echo 'large3 as normal file' > large3
400 $ hg add large3
400 $ hg add large3
401 $ hg commit -m '#5'
401 $ hg commit -m '#5'
402 $ hg manifest
402 $ hg manifest
403 .hglf/large1
403 .hglf/large1
404 large2
404 large2
405 large3
405 large3
406 normal1
406 normal1
407
407
408 (modified largefile is already switched to normal)
408 (modified largefile is already switched to normal)
409
409
410 $ hg update -q -C 2
410 $ hg update -q -C 2
411 $ echo 'modified large2 for linear merge' > large2
411 $ echo 'modified large2 for linear merge' > large2
412 $ hg update -q 5
412 $ hg update -q 5
413 remote turned local largefile large2 into a normal file
413 remote turned local largefile large2 into a normal file
414 keep (l)argefile or use (n)ormal file? l
414 keep (l)argefile or use (n)ormal file? l
415 $ hg debugdirstate --no-dates | grep large2
415 $ hg debugdirstate --no-dates | grep large2
416 a 0 -1 unset .hglf/large2
416 a 0 -1 unset .hglf/large2
417 r 0 0 set large2
417 r 0 0 set large2
418 $ hg status -A large2
418 $ hg status -A large2
419 A large2
419 A large2
420 $ cat large2
420 $ cat large2
421 modified large2 for linear merge
421 modified large2 for linear merge
422
422
423 (added largefile is already committed as normal)
423 (added largefile is already committed as normal)
424
424
425 $ hg update -q -C 2
425 $ hg update -q -C 2
426 $ echo 'large3 as large file for linear merge' > large3
426 $ echo 'large3 as large file for linear merge' > large3
427 $ hg add --large large3
427 $ hg add --large large3
428 $ hg update -q 5
428 $ hg update -q 5
429 remote turned local largefile large3 into a normal file
429 remote turned local largefile large3 into a normal file
430 keep (l)argefile or use (n)ormal file? l
430 keep (l)argefile or use (n)ormal file? l
431 $ hg debugdirstate --no-dates | grep large3
431 $ hg debugdirstate --no-dates | grep large3
432 a 0 -1 unset .hglf/large3
432 a 0 -1 unset .hglf/large3
433 r 0 0 set large3
433 r 0 0 set large3
434 $ hg status -A large3
434 $ hg status -A large3
435 A large3
435 A large3
436 $ cat large3
436 $ cat large3
437 large3 as large file for linear merge
437 large3 as large file for linear merge
438 $ rm -f large3 .hglf/large3
438 $ rm -f large3 .hglf/large3
439
439
440 Test that the internal linear merging works correctly
440 Test that the internal linear merging works correctly
441 (both heads are stripped to keep pairing of revision number and commit log)
441 (both heads are stripped to keep pairing of revision number and commit log)
442
442
443 $ hg update -q -C 2
443 $ hg update -q -C 2
444 $ hg strip 3 4
444 $ hg strip 3 4
445 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/9530e27857f7-2e7b195d-backup.hg
445 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/9530e27857f7-2e7b195d-backup.hg
446 $ mv .hg/strip-backup/9530e27857f7-2e7b195d-backup.hg $TESTTMP
446 $ mv .hg/strip-backup/9530e27857f7-2e7b195d-backup.hg $TESTTMP
447
447
448 (internal linear merging at "hg pull --update")
448 (internal linear merging at "hg pull --update")
449
449
450 $ echo 'large1 for linear merge (conflict)' > large1
450 $ echo 'large1 for linear merge (conflict)' > large1
451 $ echo 'large2 for linear merge (conflict with normal file)' > large2
451 $ echo 'large2 for linear merge (conflict with normal file)' > large2
452 $ hg pull --update --config debug.dirstate.delaywrite=2 $TESTTMP/9530e27857f7-2e7b195d-backup.hg
452 $ hg pull --update --config debug.dirstate.delaywrite=2 $TESTTMP/9530e27857f7-2e7b195d-backup.hg
453 pulling from $TESTTMP/9530e27857f7-2e7b195d-backup.hg
453 pulling from $TESTTMP/9530e27857f7-2e7b195d-backup.hg
454 searching for changes
454 searching for changes
455 adding changesets
455 adding changesets
456 adding manifests
456 adding manifests
457 adding file changes
457 adding file changes
458 added 3 changesets with 5 changes to 5 files
458 added 3 changesets with 5 changes to 5 files
459 new changesets 9530e27857f7:d65e59e952a9 (3 drafts)
459 new changesets 9530e27857f7:d65e59e952a9 (3 drafts)
460 remote turned local largefile large2 into a normal file
460 remote turned local largefile large2 into a normal file
461 keep (l)argefile or use (n)ormal file? l
461 keep (l)argefile or use (n)ormal file? l
462 largefile large1 has a merge conflict
462 largefile large1 has a merge conflict
463 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
463 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
464 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
464 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
465 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? l
465 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? l
466 2 files updated, 1 files merged, 0 files removed, 0 files unresolved
466 2 files updated, 1 files merged, 0 files removed, 0 files unresolved
467 updated to "d65e59e952a9: #5"
467 updated to "d65e59e952a9: #5"
468 1 other heads for branch "default"
468 1 other heads for branch "default"
469
469
470 $ hg status -A large1
470 $ hg status -A large1
471 M large1
471 M large1
472 $ cat large1
472 $ cat large1
473 large1 for linear merge (conflict)
473 large1 for linear merge (conflict)
474 $ cat .hglf/large1
474 $ cat .hglf/large1
475 ba94c2efe5b7c5e0af8d189295ce00553b0612b7
475 ba94c2efe5b7c5e0af8d189295ce00553b0612b7
476 $ hg status -A large2
476 $ hg status -A large2
477 A large2
477 A large2
478 $ cat large2
478 $ cat large2
479 large2 for linear merge (conflict with normal file)
479 large2 for linear merge (conflict with normal file)
480 $ cat .hglf/large2
480 $ cat .hglf/large2
481 d7591fe9be0f6227d90bddf3e4f52ff41fc1f544
481 d7591fe9be0f6227d90bddf3e4f52ff41fc1f544
482
482
483 (internal linear merging at "hg unbundle --update")
483 (internal linear merging at "hg unbundle --update")
484
484
485 $ hg update -q -C 2
485 $ hg update -q -C 2
486 $ hg rollback -q
486 $ hg rollback -q
487
487
488 $ echo 'large1 for linear merge (conflict)' > large1
488 $ echo 'large1 for linear merge (conflict)' > large1
489 $ echo 'large2 for linear merge (conflict with normal file)' > large2
489 $ echo 'large2 for linear merge (conflict with normal file)' > large2
490 $ hg unbundle --update --config debug.dirstate.delaywrite=2 $TESTTMP/9530e27857f7-2e7b195d-backup.hg
490 $ hg unbundle --update --config debug.dirstate.delaywrite=2 $TESTTMP/9530e27857f7-2e7b195d-backup.hg
491 adding changesets
491 adding changesets
492 adding manifests
492 adding manifests
493 adding file changes
493 adding file changes
494 added 3 changesets with 5 changes to 5 files
494 added 3 changesets with 5 changes to 5 files
495 new changesets 9530e27857f7:d65e59e952a9 (3 drafts)
495 new changesets 9530e27857f7:d65e59e952a9 (3 drafts)
496 remote turned local largefile large2 into a normal file
496 remote turned local largefile large2 into a normal file
497 keep (l)argefile or use (n)ormal file? l
497 keep (l)argefile or use (n)ormal file? l
498 largefile large1 has a merge conflict
498 largefile large1 has a merge conflict
499 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
499 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
500 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
500 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
501 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? l
501 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? l
502 2 files updated, 1 files merged, 0 files removed, 0 files unresolved
502 2 files updated, 1 files merged, 0 files removed, 0 files unresolved
503 updated to "d65e59e952a9: #5"
503 updated to "d65e59e952a9: #5"
504 1 other heads for branch "default"
504 1 other heads for branch "default"
505
505
506 $ hg status -A large1
506 $ hg status -A large1
507 M large1
507 M large1
508 $ cat large1
508 $ cat large1
509 large1 for linear merge (conflict)
509 large1 for linear merge (conflict)
510 $ cat .hglf/large1
510 $ cat .hglf/large1
511 ba94c2efe5b7c5e0af8d189295ce00553b0612b7
511 ba94c2efe5b7c5e0af8d189295ce00553b0612b7
512 $ hg status -A large2
512 $ hg status -A large2
513 A large2
513 A large2
514 $ cat large2
514 $ cat large2
515 large2 for linear merge (conflict with normal file)
515 large2 for linear merge (conflict with normal file)
516 $ cat .hglf/large2
516 $ cat .hglf/large2
517 d7591fe9be0f6227d90bddf3e4f52ff41fc1f544
517 d7591fe9be0f6227d90bddf3e4f52ff41fc1f544
518
518
519 (internal linear merging in subrepo at "hg update")
519 (internal linear merging in subrepo at "hg update")
520
520
521 $ cd ..
521 $ cd ..
522 $ hg init subparent
522 $ hg init subparent
523 $ cd subparent
523 $ cd subparent
524
524
525 $ hg clone -q -u 2 ../repo sub
525 $ hg clone -q -u 2 ../repo sub
526 $ cat > .hgsub <<EOF
526 $ cat > .hgsub <<EOF
527 > sub = sub
527 > sub = sub
528 > EOF
528 > EOF
529 $ hg add .hgsub
529 $ hg add .hgsub
530 $ hg commit -m '#0@parent'
530 $ hg commit -m '#0@parent'
531 $ cat .hgsubstate
531 $ cat .hgsubstate
532 f74e50bd9e5594b7cf1e6c5cbab86ddd25f3ca2f sub
532 f74e50bd9e5594b7cf1e6c5cbab86ddd25f3ca2f sub
533 $ hg -R sub update -q
533 $ hg -R sub update -q
534 $ hg commit -m '#1@parent'
534 $ hg commit -m '#1@parent'
535 $ cat .hgsubstate
535 $ cat .hgsubstate
536 d65e59e952a9638e2ce863b41a420ca723dd3e8d sub
536 d65e59e952a9638e2ce863b41a420ca723dd3e8d sub
537 $ hg update -q 0
537 $ hg update -q 0
538
538
539 $ echo 'large1 for linear merge (conflict)' > sub/large1
539 $ echo 'large1 for linear merge (conflict)' > sub/large1
540 $ echo 'large2 for linear merge (conflict with normal file)' > sub/large2
540 $ echo 'large2 for linear merge (conflict with normal file)' > sub/large2
541 $ hg update --config ui.interactive=True --config debug.dirstate.delaywrite=2 <<EOF
541 $ hg update --config ui.interactive=True --config debug.dirstate.delaywrite=2 <<EOF
542 > m
542 > m
543 > r
543 > r
544 > l
544 > l
545 > l
545 > l
546 > EOF
546 > EOF
547 subrepository sub diverged (local revision: f74e50bd9e55, remote revision: d65e59e952a9)
547 subrepository sub diverged (local revision: f74e50bd9e55, remote revision: d65e59e952a9)
548 (M)erge, keep (l)ocal [working copy] or keep (r)emote [destination]? m
548 (M)erge, keep (l)ocal [working copy] or keep (r)emote [destination]? m
549 subrepository sources for sub differ (in checked out version)
549 subrepository sources for sub differ (in checked out version)
550 use (l)ocal source (f74e50bd9e55) or (r)emote source (d65e59e952a9)? r
550 use (l)ocal source (f74e50bd9e55) or (r)emote source (d65e59e952a9)? r
551 remote turned local largefile large2 into a normal file
551 remote turned local largefile large2 into a normal file
552 keep (l)argefile or use (n)ormal file? l
552 keep (l)argefile or use (n)ormal file? l
553 largefile large1 has a merge conflict
553 largefile large1 has a merge conflict
554 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
554 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
555 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
555 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
556 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? l
556 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? l
557 2 files updated, 1 files merged, 0 files removed, 0 files unresolved
557 2 files updated, 1 files merged, 0 files removed, 0 files unresolved
558 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
558 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
559
559
560 $ hg -R sub status -A sub/large1
560 $ hg -R sub status -A sub/large1
561 M sub/large1
561 M sub/large1
562 $ cat sub/large1
562 $ cat sub/large1
563 large1 for linear merge (conflict)
563 large1 for linear merge (conflict)
564 $ cat sub/.hglf/large1
564 $ cat sub/.hglf/large1
565 ba94c2efe5b7c5e0af8d189295ce00553b0612b7
565 ba94c2efe5b7c5e0af8d189295ce00553b0612b7
566 $ hg -R sub status -A sub/large2
566 $ hg -R sub status -A sub/large2
567 A sub/large2
567 A sub/large2
568 $ cat sub/large2
568 $ cat sub/large2
569 large2 for linear merge (conflict with normal file)
569 large2 for linear merge (conflict with normal file)
570 $ cat sub/.hglf/large2
570 $ cat sub/.hglf/large2
571 d7591fe9be0f6227d90bddf3e4f52ff41fc1f544
571 d7591fe9be0f6227d90bddf3e4f52ff41fc1f544
572
572
573 $ cd ..
573 $ cd ..
574 $ cd repo
574 $ cd repo
575
575
576 Test that rebase updates largefiles in the working directory even if
576 Test that rebase updates largefiles in the working directory even if
577 it is aborted by conflict.
577 it is aborted by conflict.
578
578
579 $ hg update -q -C 3
579 $ hg update -q -C 3
580 $ cat .hglf/large1
580 $ cat .hglf/large1
581 e5bb990443d6a92aaf7223813720f7566c9dd05b
581 e5bb990443d6a92aaf7223813720f7566c9dd05b
582 $ cat large1
582 $ cat large1
583 large1 in #3
583 large1 in #3
584 $ hg rebase -s 1 -d 3 --keep --config ui.interactive=True <<EOF
584 $ hg rebase -s 1 -d 3 --keep --config ui.interactive=True <<EOF
585 > o
585 > o
586 > EOF
586 > EOF
587 rebasing 1:72518492caa6 "#1"
587 rebasing 1:72518492caa6 "#1"
588 largefile large1 has a merge conflict
588 largefile large1 has a merge conflict
589 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
589 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
590 keep (l)ocal e5bb990443d6a92aaf7223813720f7566c9dd05b or
590 keep (l)ocal e5bb990443d6a92aaf7223813720f7566c9dd05b or
591 take (o)ther 58e24f733a964da346e2407a2bee99d9001184f5? o
591 take (o)ther 58e24f733a964da346e2407a2bee99d9001184f5? o
592 merging normal1
592 merging normal1
593 warning: conflicts while merging normal1! (edit, then use 'hg resolve --mark')
593 warning: conflicts while merging normal1! (edit, then use 'hg resolve --mark')
594 unresolved conflicts (see hg resolve, then hg rebase --continue)
594 unresolved conflicts (see hg resolve, then hg rebase --continue)
595 [1]
595 [1]
596 $ cat .hglf/large1
596 $ cat .hglf/large1
597 58e24f733a964da346e2407a2bee99d9001184f5
597 58e24f733a964da346e2407a2bee99d9001184f5
598 $ cat large1
598 $ cat large1
599 large1 in #1
599 large1 in #1
600 $ rm normal1.orig
600 $ rm normal1.orig
601
601
602 Test that rebase updates standins for manually modified largefiles at
602 Test that rebase updates standins for manually modified largefiles at
603 the 1st commit of resuming.
603 the 1st commit of resuming.
604
604
605 $ echo "manually modified before 'hg rebase --continue'" > large1
605 $ echo "manually modified before 'hg rebase --continue'" > large1
606 $ hg resolve -m normal1
606 $ hg resolve -m normal1
607 (no more unresolved files)
607 (no more unresolved files)
608 continue: hg rebase --continue
608 continue: hg rebase --continue
609 $ hg rebase --continue --config ui.interactive=True <<EOF
609 $ hg rebase --continue --config ui.interactive=True <<EOF
610 > c
610 > c
611 > EOF
611 > EOF
612 rebasing 1:72518492caa6 "#1"
612 rebasing 1:72518492caa6 "#1"
613 rebasing 4:07d6153b5c04 "#4"
613 rebasing 4:07d6153b5c04 "#4"
614 file '.hglf/large1' was deleted in other [source] but was modified in local [dest].
614 file '.hglf/large1' was deleted in other [source] but was modified in local [dest].
615 What do you want to do?
615 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
616 use (c)hanged version, (d)elete, or leave (u)nresolved? c
616 What do you want to do? c
617
617
618 $ hg diff -c "tip~1" --nodates .hglf/large1 | grep '^[+-][0-9a-z]'
618 $ hg diff -c "tip~1" --nodates .hglf/large1 | grep '^[+-][0-9a-z]'
619 -e5bb990443d6a92aaf7223813720f7566c9dd05b
619 -e5bb990443d6a92aaf7223813720f7566c9dd05b
620 +8a4f783556e7dea21139ca0466eafce954c75c13
620 +8a4f783556e7dea21139ca0466eafce954c75c13
621 $ rm -f large1
621 $ rm -f large1
622 $ hg update -q -C tip
622 $ hg update -q -C tip
623 $ cat large1
623 $ cat large1
624 manually modified before 'hg rebase --continue'
624 manually modified before 'hg rebase --continue'
625
625
626 Test that transplant updates largefiles, of which standins are safely
626 Test that transplant updates largefiles, of which standins are safely
627 changed, even if it is aborted by conflict of other.
627 changed, even if it is aborted by conflict of other.
628
628
629 $ hg update -q -C 5
629 $ hg update -q -C 5
630 $ cat .hglf/large1
630 $ cat .hglf/large1
631 e5bb990443d6a92aaf7223813720f7566c9dd05b
631 e5bb990443d6a92aaf7223813720f7566c9dd05b
632 $ cat large1
632 $ cat large1
633 large1 in #3
633 large1 in #3
634 $ hg diff -c 4 .hglf/largeX | grep '^[+-][0-9a-z]'
634 $ hg diff -c 4 .hglf/largeX | grep '^[+-][0-9a-z]'
635 +fa44618ea25181aff4f48b70428294790cec9f61
635 +fa44618ea25181aff4f48b70428294790cec9f61
636 $ hg transplant 4
636 $ hg transplant 4
637 applying 07d6153b5c04
637 applying 07d6153b5c04
638 patching file .hglf/large1
638 patching file .hglf/large1
639 Hunk #1 FAILED at 0
639 Hunk #1 FAILED at 0
640 1 out of 1 hunks FAILED -- saving rejects to file .hglf/large1.rej
640 1 out of 1 hunks FAILED -- saving rejects to file .hglf/large1.rej
641 patch failed to apply
641 patch failed to apply
642 abort: fix up the working directory and run hg transplant --continue
642 abort: fix up the working directory and run hg transplant --continue
643 [255]
643 [255]
644 $ hg status -A large1
644 $ hg status -A large1
645 C large1
645 C large1
646 $ cat .hglf/large1
646 $ cat .hglf/large1
647 e5bb990443d6a92aaf7223813720f7566c9dd05b
647 e5bb990443d6a92aaf7223813720f7566c9dd05b
648 $ cat large1
648 $ cat large1
649 large1 in #3
649 large1 in #3
650 $ hg status -A largeX
650 $ hg status -A largeX
651 A largeX
651 A largeX
652 $ cat .hglf/largeX
652 $ cat .hglf/largeX
653 fa44618ea25181aff4f48b70428294790cec9f61
653 fa44618ea25181aff4f48b70428294790cec9f61
654 $ cat largeX
654 $ cat largeX
655 largeX
655 largeX
656
656
657 Test that transplant updates standins for manually modified largefiles
657 Test that transplant updates standins for manually modified largefiles
658 at the 1st commit of resuming.
658 at the 1st commit of resuming.
659
659
660 $ echo "manually modified before 'hg transplant --continue'" > large1
660 $ echo "manually modified before 'hg transplant --continue'" > large1
661 $ hg transplant --continue
661 $ hg transplant --continue
662 07d6153b5c04 transplanted as f1bf30eb88cc
662 07d6153b5c04 transplanted as f1bf30eb88cc
663 $ hg diff -c tip .hglf/large1 | grep '^[+-][0-9a-z]'
663 $ hg diff -c tip .hglf/large1 | grep '^[+-][0-9a-z]'
664 -e5bb990443d6a92aaf7223813720f7566c9dd05b
664 -e5bb990443d6a92aaf7223813720f7566c9dd05b
665 +6a4f36d4075fbe0f30ec1d26ca44e63c05903671
665 +6a4f36d4075fbe0f30ec1d26ca44e63c05903671
666 $ rm -f large1
666 $ rm -f large1
667 $ hg update -q -C tip
667 $ hg update -q -C tip
668 $ cat large1
668 $ cat large1
669 manually modified before 'hg transplant --continue'
669 manually modified before 'hg transplant --continue'
670
670
671 Test that "hg status" doesn't show removal of largefiles not managed
671 Test that "hg status" doesn't show removal of largefiles not managed
672 in the target context.
672 in the target context.
673
673
674 $ hg update -q -C 4
674 $ hg update -q -C 4
675 $ hg remove largeX
675 $ hg remove largeX
676 $ hg status -A largeX
676 $ hg status -A largeX
677 R largeX
677 R largeX
678 $ hg status -A --rev '.^1' largeX
678 $ hg status -A --rev '.^1' largeX
679
679
680 #if execbit
680 #if execbit
681
681
682 Test that "hg status" against revisions other than parent notices exec
682 Test that "hg status" against revisions other than parent notices exec
683 bit changes of largefiles.
683 bit changes of largefiles.
684
684
685 $ hg update -q -C 4
685 $ hg update -q -C 4
686
686
687 (the case that large2 doesn't have exec bit in the target context but
687 (the case that large2 doesn't have exec bit in the target context but
688 in the working context)
688 in the working context)
689
689
690 $ chmod +x large2
690 $ chmod +x large2
691 $ hg status -A --rev 0 large2
691 $ hg status -A --rev 0 large2
692 M large2
692 M large2
693 $ hg commit -m 'chmod +x large2'
693 $ hg commit -m 'chmod +x large2'
694
694
695 (the case that large2 has exec bit in the target context but not in
695 (the case that large2 has exec bit in the target context but not in
696 the working context)
696 the working context)
697
697
698 $ echo dummy > dummy
698 $ echo dummy > dummy
699 $ hg add dummy
699 $ hg add dummy
700 $ hg commit -m 'revision for separation'
700 $ hg commit -m 'revision for separation'
701 $ chmod -x large2
701 $ chmod -x large2
702 $ hg status -A --rev '.^1' large2
702 $ hg status -A --rev '.^1' large2
703 M large2
703 M large2
704
704
705 #else
705 #else
706
706
707 Test that "hg status" against revisions other than parent ignores exec
707 Test that "hg status" against revisions other than parent ignores exec
708 bit correctly on the platform being unaware of it.
708 bit correctly on the platform being unaware of it.
709
709
710 $ hg update -q -C 4
710 $ hg update -q -C 4
711
711
712 $ cat > ../exec-bit.patch <<EOF
712 $ cat > ../exec-bit.patch <<EOF
713 > # HG changeset patch
713 > # HG changeset patch
714 > # User test
714 > # User test
715 > # Date 0 0
715 > # Date 0 0
716 > # Thu Jan 01 00:00:00 1970 +0000
716 > # Thu Jan 01 00:00:00 1970 +0000
717 > # Node ID be1b433a65b12b27b5519d92213e14f7e1769b90
717 > # Node ID be1b433a65b12b27b5519d92213e14f7e1769b90
718 > # Parent 07d6153b5c04313efb75deec9ba577de7faeb727
718 > # Parent 07d6153b5c04313efb75deec9ba577de7faeb727
719 > chmod +x large2
719 > chmod +x large2
720 >
720 >
721 > diff --git a/.hglf/large2 b/.hglf/large2
721 > diff --git a/.hglf/large2 b/.hglf/large2
722 > old mode 100644
722 > old mode 100644
723 > new mode 100755
723 > new mode 100755
724 > EOF
724 > EOF
725 $ hg import --exact --bypass ../exec-bit.patch
725 $ hg import --exact --bypass ../exec-bit.patch
726 applying ../exec-bit.patch
726 applying ../exec-bit.patch
727 $ hg status -A --rev tip large2
727 $ hg status -A --rev tip large2
728 C large2
728 C large2
729
729
730 #endif
730 #endif
731
731
732 The fileset revset is evaluated for each revision, instead of once on wdir(),
732 The fileset revset is evaluated for each revision, instead of once on wdir(),
733 and then patterns matched on each revision. Here, no exec bits are set in
733 and then patterns matched on each revision. Here, no exec bits are set in
734 wdir(), but a matching revision is detected.
734 wdir(), but a matching revision is detected.
735
735
736 (Teach large2 is not an executable. Maybe this is a bug of largefiles.)
736 (Teach large2 is not an executable. Maybe this is a bug of largefiles.)
737 #if execbit
737 #if execbit
738 $ chmod -x .hglf/large2
738 $ chmod -x .hglf/large2
739 #endif
739 #endif
740
740
741 $ hg files 'set:exec()'
741 $ hg files 'set:exec()'
742 [1]
742 [1]
743 $ hg log -qr 'file("set:exec()")'
743 $ hg log -qr 'file("set:exec()")'
744 9:be1b433a65b1
744 9:be1b433a65b1
745
745
746 Test a fatal error interrupting an update. Verify that status report dirty
746 Test a fatal error interrupting an update. Verify that status report dirty
747 files correctly after an interrupted update. Also verify that checking all
747 files correctly after an interrupted update. Also verify that checking all
748 hashes reveals it isn't clean.
748 hashes reveals it isn't clean.
749
749
750 Start with clean dirstates:
750 Start with clean dirstates:
751 $ hg up --quiet --clean --rev "8^"
751 $ hg up --quiet --clean --rev "8^"
752 $ sleep 1
752 $ sleep 1
753 $ hg st
753 $ hg st
754 Update standins without updating largefiles - large1 is modified and largeX is
754 Update standins without updating largefiles - large1 is modified and largeX is
755 added:
755 added:
756 $ cat << EOF > ../crashupdatelfiles.py
756 $ cat << EOF > ../crashupdatelfiles.py
757 > import hgext.largefiles.lfutil
757 > import hgext.largefiles.lfutil
758 > def getlfilestoupdate(oldstandins, newstandins):
758 > def getlfilestoupdate(oldstandins, newstandins):
759 > raise SystemExit(7)
759 > raise SystemExit(7)
760 > hgext.largefiles.lfutil.getlfilestoupdate = getlfilestoupdate
760 > hgext.largefiles.lfutil.getlfilestoupdate = getlfilestoupdate
761 > EOF
761 > EOF
762 $ hg up -Cr "8" --config extensions.crashupdatelfiles=../crashupdatelfiles.py
762 $ hg up -Cr "8" --config extensions.crashupdatelfiles=../crashupdatelfiles.py
763 [7]
763 [7]
764 Check large1 content and status ... and that update will undo modifications:
764 Check large1 content and status ... and that update will undo modifications:
765 $ cat large1
765 $ cat large1
766 large1 in #3
766 large1 in #3
767 $ hg st
767 $ hg st
768 M large1
768 M large1
769 ! largeX
769 ! largeX
770 $ hg up -Cr .
770 $ hg up -Cr .
771 getting changed largefiles
771 getting changed largefiles
772 2 largefiles updated, 0 removed
772 2 largefiles updated, 0 removed
773 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
773 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
774 $ cat large1
774 $ cat large1
775 manually modified before 'hg transplant --continue'
775 manually modified before 'hg transplant --continue'
776 $ hg st
776 $ hg st
777 Force largefiles rehashing and check that all changes have been caught by
777 Force largefiles rehashing and check that all changes have been caught by
778 status and update:
778 status and update:
779 $ rm .hg/largefiles/dirstate
779 $ rm .hg/largefiles/dirstate
780 $ hg st
780 $ hg st
781
781
782 $ cd ..
782 $ cd ..
783
783
784 Test that "hg convert" avoids copying largefiles from the working
784 Test that "hg convert" avoids copying largefiles from the working
785 directory into store, because "hg convert" doesn't update largefiles
785 directory into store, because "hg convert" doesn't update largefiles
786 in the working directory (removing files under ".cache/largefiles"
786 in the working directory (removing files under ".cache/largefiles"
787 forces "hg convert" to copy corresponding largefiles)
787 forces "hg convert" to copy corresponding largefiles)
788
788
789 $ cat >> $HGRCPATH <<EOF
789 $ cat >> $HGRCPATH <<EOF
790 > [extensions]
790 > [extensions]
791 > convert =
791 > convert =
792 > EOF
792 > EOF
793
793
794 $ rm $TESTTMP/.cache/largefiles/6a4f36d4075fbe0f30ec1d26ca44e63c05903671
794 $ rm $TESTTMP/.cache/largefiles/6a4f36d4075fbe0f30ec1d26ca44e63c05903671
795 $ hg convert -q repo repo.converted
795 $ hg convert -q repo repo.converted
@@ -1,405 +1,407 b''
1 $ USERCACHE="$TESTTMP/cache"; export USERCACHE
1 $ USERCACHE="$TESTTMP/cache"; export USERCACHE
2 $ mkdir "${USERCACHE}"
2 $ mkdir "${USERCACHE}"
3 $ cat >> $HGRCPATH <<EOF
3 $ cat >> $HGRCPATH <<EOF
4 > [extensions]
4 > [extensions]
5 > largefiles =
5 > largefiles =
6 > share =
6 > share =
7 > strip =
7 > strip =
8 > convert =
8 > convert =
9 > [largefiles]
9 > [largefiles]
10 > minsize = 0.5
10 > minsize = 0.5
11 > patterns = **.other
11 > patterns = **.other
12 > **.dat
12 > **.dat
13 > usercache=${USERCACHE}
13 > usercache=${USERCACHE}
14 > EOF
14 > EOF
15
15
16 "lfconvert" works
16 "lfconvert" works
17 $ hg init bigfile-repo
17 $ hg init bigfile-repo
18 $ cd bigfile-repo
18 $ cd bigfile-repo
19 $ cat >> .hg/hgrc <<EOF
19 $ cat >> .hg/hgrc <<EOF
20 > [extensions]
20 > [extensions]
21 > largefiles = !
21 > largefiles = !
22 > EOF
22 > EOF
23 $ mkdir sub
23 $ mkdir sub
24 $ dd if=/dev/zero bs=1k count=256 > large 2> /dev/null
24 $ dd if=/dev/zero bs=1k count=256 > large 2> /dev/null
25 $ dd if=/dev/zero bs=1k count=256 > large2 2> /dev/null
25 $ dd if=/dev/zero bs=1k count=256 > large2 2> /dev/null
26 $ echo normal > normal1
26 $ echo normal > normal1
27 $ echo alsonormal > sub/normal2
27 $ echo alsonormal > sub/normal2
28 $ dd if=/dev/zero bs=1k count=10 > sub/maybelarge.dat 2> /dev/null
28 $ dd if=/dev/zero bs=1k count=10 > sub/maybelarge.dat 2> /dev/null
29 $ hg addremove
29 $ hg addremove
30 adding large
30 adding large
31 adding large2
31 adding large2
32 adding normal1
32 adding normal1
33 adding sub/maybelarge.dat
33 adding sub/maybelarge.dat
34 adding sub/normal2
34 adding sub/normal2
35 $ hg commit -m"add large, normal1" large normal1
35 $ hg commit -m"add large, normal1" large normal1
36 $ hg commit -m"add sub/*" sub
36 $ hg commit -m"add sub/*" sub
37
37
38 Test tag parsing
38 Test tag parsing
39 $ cat >> .hgtags <<EOF
39 $ cat >> .hgtags <<EOF
40 > IncorrectlyFormattedTag!
40 > IncorrectlyFormattedTag!
41 > invalidhash sometag
41 > invalidhash sometag
42 > 0123456789abcdef anothertag
42 > 0123456789abcdef anothertag
43 > EOF
43 > EOF
44 $ hg add .hgtags
44 $ hg add .hgtags
45 $ hg commit -m"add large2" large2 .hgtags
45 $ hg commit -m"add large2" large2 .hgtags
46
46
47 Test link+rename largefile codepath
47 Test link+rename largefile codepath
48 $ [ -d .hg/largefiles ] && echo fail || echo pass
48 $ [ -d .hg/largefiles ] && echo fail || echo pass
49 pass
49 pass
50 $ cd ..
50 $ cd ..
51 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
51 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
52 initializing destination largefiles-repo
52 initializing destination largefiles-repo
53 skipping incorrectly formatted tag IncorrectlyFormattedTag!
53 skipping incorrectly formatted tag IncorrectlyFormattedTag!
54 skipping incorrectly formatted id invalidhash
54 skipping incorrectly formatted id invalidhash
55 no mapping for id 0123456789abcdef
55 no mapping for id 0123456789abcdef
56 #if symlink
56 #if symlink
57 $ hg --cwd bigfile-repo rename large2 large3
57 $ hg --cwd bigfile-repo rename large2 large3
58 $ ln -sf large bigfile-repo/large3
58 $ ln -sf large bigfile-repo/large3
59 $ hg --cwd bigfile-repo commit -m"make large2 a symlink" large2 large3
59 $ hg --cwd bigfile-repo commit -m"make large2 a symlink" large2 large3
60 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo-symlink
60 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo-symlink
61 initializing destination largefiles-repo-symlink
61 initializing destination largefiles-repo-symlink
62 skipping incorrectly formatted tag IncorrectlyFormattedTag!
62 skipping incorrectly formatted tag IncorrectlyFormattedTag!
63 skipping incorrectly formatted id invalidhash
63 skipping incorrectly formatted id invalidhash
64 no mapping for id 0123456789abcdef
64 no mapping for id 0123456789abcdef
65 abort: renamed/copied largefile large3 becomes symlink
65 abort: renamed/copied largefile large3 becomes symlink
66 [255]
66 [255]
67 #endif
67 #endif
68 $ cd bigfile-repo
68 $ cd bigfile-repo
69 $ hg strip --no-backup 2
69 $ hg strip --no-backup 2
70 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
70 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
71 $ cd ..
71 $ cd ..
72 $ rm -rf largefiles-repo largefiles-repo-symlink
72 $ rm -rf largefiles-repo largefiles-repo-symlink
73
73
74 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
74 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
75 initializing destination largefiles-repo
75 initializing destination largefiles-repo
76
76
77 "lfconvert" converts content correctly
77 "lfconvert" converts content correctly
78 $ cd largefiles-repo
78 $ cd largefiles-repo
79 $ hg up
79 $ hg up
80 getting changed largefiles
80 getting changed largefiles
81 2 largefiles updated, 0 removed
81 2 largefiles updated, 0 removed
82 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
82 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
83 $ hg locate
83 $ hg locate
84 .hglf/large
84 .hglf/large
85 .hglf/sub/maybelarge.dat
85 .hglf/sub/maybelarge.dat
86 normal1
86 normal1
87 sub/normal2
87 sub/normal2
88 $ cat normal1
88 $ cat normal1
89 normal
89 normal
90 $ cat sub/normal2
90 $ cat sub/normal2
91 alsonormal
91 alsonormal
92 $ md5sum.py large sub/maybelarge.dat
92 $ md5sum.py large sub/maybelarge.dat
93 ec87a838931d4d5d2e94a04644788a55 large
93 ec87a838931d4d5d2e94a04644788a55 large
94 1276481102f218c981e0324180bafd9f sub/maybelarge.dat
94 1276481102f218c981e0324180bafd9f sub/maybelarge.dat
95
95
96 "lfconvert" adds 'largefiles' to .hg/requires.
96 "lfconvert" adds 'largefiles' to .hg/requires.
97 $ cat .hg/requires
97 $ cat .hg/requires
98 dotencode
98 dotencode
99 fncache
99 fncache
100 generaldelta
100 generaldelta
101 largefiles
101 largefiles
102 revlogv1
102 revlogv1
103 sparserevlog
103 sparserevlog
104 store
104 store
105 testonly-simplestore (reposimplestore !)
105 testonly-simplestore (reposimplestore !)
106
106
107 "lfconvert" includes a newline at the end of the standin files.
107 "lfconvert" includes a newline at the end of the standin files.
108 $ cat .hglf/large .hglf/sub/maybelarge.dat
108 $ cat .hglf/large .hglf/sub/maybelarge.dat
109 2e000fa7e85759c7f4c254d4d9c33ef481e459a7
109 2e000fa7e85759c7f4c254d4d9c33ef481e459a7
110 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
110 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
111 $ cd ..
111 $ cd ..
112
112
113 add some changesets to rename/remove/merge
113 add some changesets to rename/remove/merge
114 $ cd bigfile-repo
114 $ cd bigfile-repo
115 $ hg mv -q sub stuff
115 $ hg mv -q sub stuff
116 $ hg commit -m"rename sub/ to stuff/"
116 $ hg commit -m"rename sub/ to stuff/"
117 $ hg update -q 1
117 $ hg update -q 1
118 $ echo blah >> normal3
118 $ echo blah >> normal3
119 $ echo blah >> sub/normal2
119 $ echo blah >> sub/normal2
120 $ echo blah >> sub/maybelarge.dat
120 $ echo blah >> sub/maybelarge.dat
121 $ md5sum.py sub/maybelarge.dat
121 $ md5sum.py sub/maybelarge.dat
122 1dd0b99ff80e19cff409702a1d3f5e15 sub/maybelarge.dat
122 1dd0b99ff80e19cff409702a1d3f5e15 sub/maybelarge.dat
123 $ hg commit -A -m"add normal3, modify sub/*"
123 $ hg commit -A -m"add normal3, modify sub/*"
124 adding normal3
124 adding normal3
125 created new head
125 created new head
126 $ hg rm large normal3
126 $ hg rm large normal3
127 $ hg commit -q -m"remove large, normal3"
127 $ hg commit -q -m"remove large, normal3"
128 $ hg merge
128 $ hg merge
129 tool internal:merge (for pattern stuff/maybelarge.dat) can't handle binary
129 tool internal:merge (for pattern stuff/maybelarge.dat) can't handle binary
130 no tool found to merge stuff/maybelarge.dat
130 no tool found to merge stuff/maybelarge.dat
131 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for stuff/maybelarge.dat? u
131 file 'stuff/maybelarge.dat' needs to be resolved.
132 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
133 What do you want to do? u
132 merging sub/normal2 and stuff/normal2 to stuff/normal2
134 merging sub/normal2 and stuff/normal2 to stuff/normal2
133 0 files updated, 1 files merged, 0 files removed, 1 files unresolved
135 0 files updated, 1 files merged, 0 files removed, 1 files unresolved
134 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
136 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
135 [1]
137 [1]
136 $ hg cat -r . sub/maybelarge.dat > stuff/maybelarge.dat
138 $ hg cat -r . sub/maybelarge.dat > stuff/maybelarge.dat
137 $ hg resolve -m stuff/maybelarge.dat
139 $ hg resolve -m stuff/maybelarge.dat
138 (no more unresolved files)
140 (no more unresolved files)
139 $ hg commit -m"merge"
141 $ hg commit -m"merge"
140 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
142 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
141 @ 5:4884f215abda merge
143 @ 5:4884f215abda merge
142 |\
144 |\
143 | o 4:7285f817b77e remove large, normal3
145 | o 4:7285f817b77e remove large, normal3
144 | |
146 | |
145 | o 3:67e3892e3534 add normal3, modify sub/*
147 | o 3:67e3892e3534 add normal3, modify sub/*
146 | |
148 | |
147 o | 2:c96c8beb5d56 rename sub/ to stuff/
149 o | 2:c96c8beb5d56 rename sub/ to stuff/
148 |/
150 |/
149 o 1:020c65d24e11 add sub/*
151 o 1:020c65d24e11 add sub/*
150 |
152 |
151 o 0:117b8328f97a add large, normal1
153 o 0:117b8328f97a add large, normal1
152
154
153 $ cd ..
155 $ cd ..
154
156
155 lfconvert with rename, merge, and remove
157 lfconvert with rename, merge, and remove
156 $ rm -rf largefiles-repo
158 $ rm -rf largefiles-repo
157 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
159 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
158 initializing destination largefiles-repo
160 initializing destination largefiles-repo
159 $ cd largefiles-repo
161 $ cd largefiles-repo
160 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
162 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
161 o 5:8e05f5f2b77e merge
163 o 5:8e05f5f2b77e merge
162 |\
164 |\
163 | o 4:a5a02de7a8e4 remove large, normal3
165 | o 4:a5a02de7a8e4 remove large, normal3
164 | |
166 | |
165 | o 3:55759520c76f add normal3, modify sub/*
167 | o 3:55759520c76f add normal3, modify sub/*
166 | |
168 | |
167 o | 2:261ad3f3f037 rename sub/ to stuff/
169 o | 2:261ad3f3f037 rename sub/ to stuff/
168 |/
170 |/
169 o 1:334e5237836d add sub/*
171 o 1:334e5237836d add sub/*
170 |
172 |
171 o 0:d4892ec57ce2 add large, normal1
173 o 0:d4892ec57ce2 add large, normal1
172
174
173 $ hg locate -r 2
175 $ hg locate -r 2
174 .hglf/large
176 .hglf/large
175 .hglf/stuff/maybelarge.dat
177 .hglf/stuff/maybelarge.dat
176 normal1
178 normal1
177 stuff/normal2
179 stuff/normal2
178 $ hg locate -r 3
180 $ hg locate -r 3
179 .hglf/large
181 .hglf/large
180 .hglf/sub/maybelarge.dat
182 .hglf/sub/maybelarge.dat
181 normal1
183 normal1
182 normal3
184 normal3
183 sub/normal2
185 sub/normal2
184 $ hg locate -r 4
186 $ hg locate -r 4
185 .hglf/sub/maybelarge.dat
187 .hglf/sub/maybelarge.dat
186 normal1
188 normal1
187 sub/normal2
189 sub/normal2
188 $ hg locate -r 5
190 $ hg locate -r 5
189 .hglf/stuff/maybelarge.dat
191 .hglf/stuff/maybelarge.dat
190 normal1
192 normal1
191 stuff/normal2
193 stuff/normal2
192 $ hg update
194 $ hg update
193 getting changed largefiles
195 getting changed largefiles
194 1 largefiles updated, 0 removed
196 1 largefiles updated, 0 removed
195 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
197 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
196 $ cat stuff/normal2
198 $ cat stuff/normal2
197 alsonormal
199 alsonormal
198 blah
200 blah
199 $ md5sum.py stuff/maybelarge.dat
201 $ md5sum.py stuff/maybelarge.dat
200 1dd0b99ff80e19cff409702a1d3f5e15 stuff/maybelarge.dat
202 1dd0b99ff80e19cff409702a1d3f5e15 stuff/maybelarge.dat
201 $ cat .hglf/stuff/maybelarge.dat
203 $ cat .hglf/stuff/maybelarge.dat
202 76236b6a2c6102826c61af4297dd738fb3b1de38
204 76236b6a2c6102826c61af4297dd738fb3b1de38
203 $ cd ..
205 $ cd ..
204
206
205 "lfconvert" error cases
207 "lfconvert" error cases
206 $ hg lfconvert http://localhost/foo foo
208 $ hg lfconvert http://localhost/foo foo
207 abort: http://localhost/foo is not a local Mercurial repo
209 abort: http://localhost/foo is not a local Mercurial repo
208 [255]
210 [255]
209 $ hg lfconvert foo ssh://localhost/foo
211 $ hg lfconvert foo ssh://localhost/foo
210 abort: ssh://localhost/foo is not a local Mercurial repo
212 abort: ssh://localhost/foo is not a local Mercurial repo
211 [255]
213 [255]
212 $ hg lfconvert nosuchrepo foo
214 $ hg lfconvert nosuchrepo foo
213 abort: repository nosuchrepo not found!
215 abort: repository nosuchrepo not found!
214 [255]
216 [255]
215 $ hg share -q -U bigfile-repo shared
217 $ hg share -q -U bigfile-repo shared
216 $ printf 'bogus' > shared/.hg/sharedpath
218 $ printf 'bogus' > shared/.hg/sharedpath
217 $ hg lfconvert shared foo
219 $ hg lfconvert shared foo
218 abort: .hg/sharedpath points to nonexistent directory $TESTTMP/bogus!
220 abort: .hg/sharedpath points to nonexistent directory $TESTTMP/bogus!
219 [255]
221 [255]
220 $ hg lfconvert bigfile-repo largefiles-repo
222 $ hg lfconvert bigfile-repo largefiles-repo
221 initializing destination largefiles-repo
223 initializing destination largefiles-repo
222 abort: repository largefiles-repo already exists!
224 abort: repository largefiles-repo already exists!
223 [255]
225 [255]
224
226
225 add another largefile to the new largefiles repo
227 add another largefile to the new largefiles repo
226 $ cd largefiles-repo
228 $ cd largefiles-repo
227 $ dd if=/dev/zero bs=1k count=1k > anotherlarge 2> /dev/null
229 $ dd if=/dev/zero bs=1k count=1k > anotherlarge 2> /dev/null
228 $ hg add --lfsize=1 anotherlarge
230 $ hg add --lfsize=1 anotherlarge
229 $ hg commit -m "add anotherlarge (should be a largefile)"
231 $ hg commit -m "add anotherlarge (should be a largefile)"
230 $ cat .hglf/anotherlarge
232 $ cat .hglf/anotherlarge
231 3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3
233 3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3
232 $ hg tag mytag
234 $ hg tag mytag
233 $ cd ..
235 $ cd ..
234
236
235 round-trip: converting back to a normal (non-largefiles) repo with
237 round-trip: converting back to a normal (non-largefiles) repo with
236 "lfconvert --to-normal" should give the same as ../bigfile-repo. The
238 "lfconvert --to-normal" should give the same as ../bigfile-repo. The
237 convert extension is disabled to show config items can be loaded without it.
239 convert extension is disabled to show config items can be loaded without it.
238 $ cd largefiles-repo
240 $ cd largefiles-repo
239 $ hg --config extensions.convert=! lfconvert --to-normal . ../normal-repo
241 $ hg --config extensions.convert=! lfconvert --to-normal . ../normal-repo
240 initializing destination ../normal-repo
242 initializing destination ../normal-repo
241 0 additional largefiles cached
243 0 additional largefiles cached
242 scanning source...
244 scanning source...
243 sorting...
245 sorting...
244 converting...
246 converting...
245 7 add large, normal1
247 7 add large, normal1
246 6 add sub/*
248 6 add sub/*
247 5 rename sub/ to stuff/
249 5 rename sub/ to stuff/
248 4 add normal3, modify sub/*
250 4 add normal3, modify sub/*
249 3 remove large, normal3
251 3 remove large, normal3
250 2 merge
252 2 merge
251 1 add anotherlarge (should be a largefile)
253 1 add anotherlarge (should be a largefile)
252 0 Added tag mytag for changeset abacddda7028
254 0 Added tag mytag for changeset abacddda7028
253 $ cd ../normal-repo
255 $ cd ../normal-repo
254 $ cat >> .hg/hgrc <<EOF
256 $ cat >> .hg/hgrc <<EOF
255 > [extensions]
257 > [extensions]
256 > largefiles = !
258 > largefiles = !
257 > EOF
259 > EOF
258
260
259 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
261 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
260 o 7:b5fedc110b9d Added tag mytag for changeset 867ab992ecf4
262 o 7:b5fedc110b9d Added tag mytag for changeset 867ab992ecf4
261 |
263 |
262 o 6:867ab992ecf4 add anotherlarge (should be a largefile)
264 o 6:867ab992ecf4 add anotherlarge (should be a largefile)
263 |
265 |
264 o 5:4884f215abda merge
266 o 5:4884f215abda merge
265 |\
267 |\
266 | o 4:7285f817b77e remove large, normal3
268 | o 4:7285f817b77e remove large, normal3
267 | |
269 | |
268 | o 3:67e3892e3534 add normal3, modify sub/*
270 | o 3:67e3892e3534 add normal3, modify sub/*
269 | |
271 | |
270 o | 2:c96c8beb5d56 rename sub/ to stuff/
272 o | 2:c96c8beb5d56 rename sub/ to stuff/
271 |/
273 |/
272 o 1:020c65d24e11 add sub/*
274 o 1:020c65d24e11 add sub/*
273 |
275 |
274 o 0:117b8328f97a add large, normal1
276 o 0:117b8328f97a add large, normal1
275
277
276 $ hg update
278 $ hg update
277 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
279 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
278 $ hg locate
280 $ hg locate
279 .hgtags
281 .hgtags
280 anotherlarge
282 anotherlarge
281 normal1
283 normal1
282 stuff/maybelarge.dat
284 stuff/maybelarge.dat
283 stuff/normal2
285 stuff/normal2
284 $ [ -d .hg/largefiles ] && echo fail || echo pass
286 $ [ -d .hg/largefiles ] && echo fail || echo pass
285 pass
287 pass
286
288
287 $ cd ..
289 $ cd ..
288
290
289 Clearing the usercache ensures that commitctx doesn't try to cache largefiles
291 Clearing the usercache ensures that commitctx doesn't try to cache largefiles
290 from the working dir on a convert.
292 from the working dir on a convert.
291 $ rm "${USERCACHE}"/*
293 $ rm "${USERCACHE}"/*
292 $ hg convert largefiles-repo
294 $ hg convert largefiles-repo
293 assuming destination largefiles-repo-hg
295 assuming destination largefiles-repo-hg
294 initializing destination largefiles-repo-hg repository
296 initializing destination largefiles-repo-hg repository
295 scanning source...
297 scanning source...
296 sorting...
298 sorting...
297 converting...
299 converting...
298 7 add large, normal1
300 7 add large, normal1
299 6 add sub/*
301 6 add sub/*
300 5 rename sub/ to stuff/
302 5 rename sub/ to stuff/
301 4 add normal3, modify sub/*
303 4 add normal3, modify sub/*
302 3 remove large, normal3
304 3 remove large, normal3
303 2 merge
305 2 merge
304 1 add anotherlarge (should be a largefile)
306 1 add anotherlarge (should be a largefile)
305 0 Added tag mytag for changeset abacddda7028
307 0 Added tag mytag for changeset abacddda7028
306
308
307 $ hg -R largefiles-repo-hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
309 $ hg -R largefiles-repo-hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
308 o 7:2f08f66459b7 Added tag mytag for changeset 17126745edfd
310 o 7:2f08f66459b7 Added tag mytag for changeset 17126745edfd
309 |
311 |
310 o 6:17126745edfd add anotherlarge (should be a largefile)
312 o 6:17126745edfd add anotherlarge (should be a largefile)
311 |
313 |
312 o 5:9cc5aa7204f0 merge
314 o 5:9cc5aa7204f0 merge
313 |\
315 |\
314 | o 4:a5a02de7a8e4 remove large, normal3
316 | o 4:a5a02de7a8e4 remove large, normal3
315 | |
317 | |
316 | o 3:55759520c76f add normal3, modify sub/*
318 | o 3:55759520c76f add normal3, modify sub/*
317 | |
319 | |
318 o | 2:261ad3f3f037 rename sub/ to stuff/
320 o | 2:261ad3f3f037 rename sub/ to stuff/
319 |/
321 |/
320 o 1:334e5237836d add sub/*
322 o 1:334e5237836d add sub/*
321 |
323 |
322 o 0:d4892ec57ce2 add large, normal1
324 o 0:d4892ec57ce2 add large, normal1
323
325
324 Verify will fail (for now) if the usercache is purged before converting, since
326 Verify will fail (for now) if the usercache is purged before converting, since
325 largefiles are not cached in the converted repo's local store by the conversion
327 largefiles are not cached in the converted repo's local store by the conversion
326 process.
328 process.
327 $ cd largefiles-repo-hg
329 $ cd largefiles-repo-hg
328 $ cat >> .hg/hgrc <<EOF
330 $ cat >> .hg/hgrc <<EOF
329 > [experimental]
331 > [experimental]
330 > evolution.createmarkers=True
332 > evolution.createmarkers=True
331 > EOF
333 > EOF
332 $ hg debugobsolete `hg log -r tip -T "{node}"`
334 $ hg debugobsolete `hg log -r tip -T "{node}"`
333 obsoleted 1 changesets
335 obsoleted 1 changesets
334 $ cd ..
336 $ cd ..
335
337
336 $ hg -R largefiles-repo-hg verify --large --lfa
338 $ hg -R largefiles-repo-hg verify --large --lfa
337 checking changesets
339 checking changesets
338 checking manifests
340 checking manifests
339 crosschecking files in changesets and manifests
341 crosschecking files in changesets and manifests
340 checking files
342 checking files
341 checked 8 changesets with 13 changes to 9 files
343 checked 8 changesets with 13 changes to 9 files
342 searching 7 changesets for largefiles
344 searching 7 changesets for largefiles
343 changeset 0:d4892ec57ce2: large references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/2e000fa7e85759c7f4c254d4d9c33ef481e459a7
345 changeset 0:d4892ec57ce2: large references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/2e000fa7e85759c7f4c254d4d9c33ef481e459a7
344 changeset 1:334e5237836d: sub/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
346 changeset 1:334e5237836d: sub/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
345 changeset 2:261ad3f3f037: stuff/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
347 changeset 2:261ad3f3f037: stuff/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
346 changeset 3:55759520c76f: sub/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/76236b6a2c6102826c61af4297dd738fb3b1de38
348 changeset 3:55759520c76f: sub/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/76236b6a2c6102826c61af4297dd738fb3b1de38
347 changeset 5:9cc5aa7204f0: stuff/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/76236b6a2c6102826c61af4297dd738fb3b1de38
349 changeset 5:9cc5aa7204f0: stuff/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/76236b6a2c6102826c61af4297dd738fb3b1de38
348 changeset 6:17126745edfd: anotherlarge references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3
350 changeset 6:17126745edfd: anotherlarge references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3
349 verified existence of 6 revisions of 4 largefiles
351 verified existence of 6 revisions of 4 largefiles
350 [1]
352 [1]
351 $ hg -R largefiles-repo-hg showconfig paths
353 $ hg -R largefiles-repo-hg showconfig paths
352 [1]
354 [1]
353
355
354
356
355 Avoid a traceback if a largefile isn't available (issue3519)
357 Avoid a traceback if a largefile isn't available (issue3519)
356
358
357 Ensure the largefile can be cached in the source if necessary
359 Ensure the largefile can be cached in the source if necessary
358 $ hg clone -U largefiles-repo issue3519
360 $ hg clone -U largefiles-repo issue3519
359 $ rm -f "${USERCACHE}"/*
361 $ rm -f "${USERCACHE}"/*
360 $ hg -R issue3519 branch -q mybranch
362 $ hg -R issue3519 branch -q mybranch
361 $ hg -R issue3519 ci -m 'change branch name only'
363 $ hg -R issue3519 ci -m 'change branch name only'
362 $ hg lfconvert --to-normal issue3519 normalized3519
364 $ hg lfconvert --to-normal issue3519 normalized3519
363 initializing destination normalized3519
365 initializing destination normalized3519
364 4 additional largefiles cached
366 4 additional largefiles cached
365 scanning source...
367 scanning source...
366 sorting...
368 sorting...
367 converting...
369 converting...
368 8 add large, normal1
370 8 add large, normal1
369 7 add sub/*
371 7 add sub/*
370 6 rename sub/ to stuff/
372 6 rename sub/ to stuff/
371 5 add normal3, modify sub/*
373 5 add normal3, modify sub/*
372 4 remove large, normal3
374 4 remove large, normal3
373 3 merge
375 3 merge
374 2 add anotherlarge (should be a largefile)
376 2 add anotherlarge (should be a largefile)
375 1 Added tag mytag for changeset abacddda7028
377 1 Added tag mytag for changeset abacddda7028
376 0 change branch name only
378 0 change branch name only
377
379
378 Ensure empty commits aren't lost in the conversion
380 Ensure empty commits aren't lost in the conversion
379 $ hg -R normalized3519 log -r tip -T '{desc}\n'
381 $ hg -R normalized3519 log -r tip -T '{desc}\n'
380 change branch name only
382 change branch name only
381
383
382 Ensure the abort message is useful if a largefile is entirely unavailable
384 Ensure the abort message is useful if a largefile is entirely unavailable
383 $ rm -rf normalized3519
385 $ rm -rf normalized3519
384 $ rm "${USERCACHE}"/*
386 $ rm "${USERCACHE}"/*
385 $ rm issue3519/.hg/largefiles/*
387 $ rm issue3519/.hg/largefiles/*
386 $ rm largefiles-repo/.hg/largefiles/*
388 $ rm largefiles-repo/.hg/largefiles/*
387 $ hg lfconvert --to-normal issue3519 normalized3519
389 $ hg lfconvert --to-normal issue3519 normalized3519
388 initializing destination normalized3519
390 initializing destination normalized3519
389 anotherlarge: largefile 3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3 not available from file:/*/$TESTTMP/largefiles-repo (glob)
391 anotherlarge: largefile 3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3 not available from file:/*/$TESTTMP/largefiles-repo (glob)
390 stuff/maybelarge.dat: largefile 76236b6a2c6102826c61af4297dd738fb3b1de38 not available from file:/*/$TESTTMP/largefiles-repo (glob)
392 stuff/maybelarge.dat: largefile 76236b6a2c6102826c61af4297dd738fb3b1de38 not available from file:/*/$TESTTMP/largefiles-repo (glob)
391 stuff/maybelarge.dat: largefile 76236b6a2c6102826c61af4297dd738fb3b1de38 not available from file:/*/$TESTTMP/largefiles-repo (glob)
393 stuff/maybelarge.dat: largefile 76236b6a2c6102826c61af4297dd738fb3b1de38 not available from file:/*/$TESTTMP/largefiles-repo (glob)
392 sub/maybelarge.dat: largefile 76236b6a2c6102826c61af4297dd738fb3b1de38 not available from file:/*/$TESTTMP/largefiles-repo (glob)
394 sub/maybelarge.dat: largefile 76236b6a2c6102826c61af4297dd738fb3b1de38 not available from file:/*/$TESTTMP/largefiles-repo (glob)
393 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
395 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
394 sub/maybelarge.dat: largefile 76236b6a2c6102826c61af4297dd738fb3b1de38 not available from file:/*/$TESTTMP/largefiles-repo (glob)
396 sub/maybelarge.dat: largefile 76236b6a2c6102826c61af4297dd738fb3b1de38 not available from file:/*/$TESTTMP/largefiles-repo (glob)
395 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
397 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
396 stuff/maybelarge.dat: largefile 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c not available from file:/*/$TESTTMP/largefiles-repo (glob)
398 stuff/maybelarge.dat: largefile 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c not available from file:/*/$TESTTMP/largefiles-repo (glob)
397 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
399 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
398 sub/maybelarge.dat: largefile 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c not available from file:/*/$TESTTMP/largefiles-repo (glob)
400 sub/maybelarge.dat: largefile 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c not available from file:/*/$TESTTMP/largefiles-repo (glob)
399 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
401 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
400 0 additional largefiles cached
402 0 additional largefiles cached
401 11 largefiles failed to download
403 11 largefiles failed to download
402 abort: all largefiles must be present locally
404 abort: all largefiles must be present locally
403 [255]
405 [255]
404
406
405
407
@@ -1,1130 +1,1140 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 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
57 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
58 What do you want to do?
58 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
59 use (c)hanged version, (d)elete, or leave (u)nresolved? u
59 What do you want to do? u
60 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
60 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
61 What do you want to do?
61 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
62 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
62 What do you want to do? u
63 merging file3
63 merging file3
64 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
64 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
65 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
65 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
66 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
66 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
67 [1]
67 [1]
68
68
69 $ status
69 $ status
70 --- status ---
70 --- status ---
71 M file2
71 M file2
72 M file3
72 M file3
73 C file1
73 C file1
74 --- resolve --list ---
74 --- resolve --list ---
75 U file1
75 U file1
76 U file2
76 U file2
77 U file3
77 U file3
78 --- debugmergestate ---
78 --- debugmergestate ---
79 * version 2 records
79 * version 2 records
80 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
80 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
81 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
81 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
82 labels:
82 labels:
83 local: working copy
83 local: working copy
84 other: merge rev
84 other: merge rev
85 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
85 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
86 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
86 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
87 local path: file1 (flags "")
87 local path: file1 (flags "")
88 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
88 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
89 other path: file1 (node null)
89 other path: file1 (node null)
90 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
90 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
91 file: file2 (record type "C", state "u", hash null)
91 file: file2 (record type "C", state "u", hash null)
92 local path: file2 (flags "")
92 local path: file2 (flags "")
93 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
93 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
94 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
94 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
95 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
95 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
96 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
96 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
97 local path: file3 (flags "")
97 local path: file3 (flags "")
98 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
98 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
99 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
99 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
100 --- file1 ---
100 --- file1 ---
101 1
101 1
102 changed
102 changed
103 --- file2 ---
103 --- file2 ---
104 2
104 2
105 changed
105 changed
106 --- file3 ---
106 --- file3 ---
107 3
107 3
108 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
108 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
109 changed2
109 changed2
110 =======
110 =======
111 changed1
111 changed1
112 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
112 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
113
113
114
114
115 Interactive merge:
115 Interactive merge:
116
116
117 $ hg co -C
117 $ hg co -C
118 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
118 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
119 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
119 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
120 1 other heads for branch "default"
120 1 other heads for branch "default"
121
121
122 $ hg merge --config ui.interactive=true <<EOF
122 $ hg merge --config ui.interactive=true <<EOF
123 > c
123 > c
124 > d
124 > d
125 > EOF
125 > EOF
126 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
126 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
127 What do you want to do?
127 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
128 use (c)hanged version, (d)elete, or leave (u)nresolved? c
128 What do you want to do? c
129 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
129 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
130 What do you want to do?
130 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
131 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? d
131 What do you want to do? d
132 merging file3
132 merging file3
133 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
133 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
134 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
134 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
135 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
135 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
136 [1]
136 [1]
137
137
138 $ status
138 $ status
139 --- status ---
139 --- status ---
140 file2: * (glob)
140 file2: * (glob)
141 M file3
141 M file3
142 C file1
142 C file1
143 --- resolve --list ---
143 --- resolve --list ---
144 R file1
144 R file1
145 R file2
145 R file2
146 U file3
146 U file3
147 --- debugmergestate ---
147 --- debugmergestate ---
148 * version 2 records
148 * version 2 records
149 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
149 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
150 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
150 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
151 labels:
151 labels:
152 local: working copy
152 local: working copy
153 other: merge rev
153 other: merge rev
154 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
154 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
155 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
155 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
156 local path: file1 (flags "")
156 local path: file1 (flags "")
157 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
157 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
158 other path: file1 (node null)
158 other path: file1 (node null)
159 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
159 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
160 file: file2 (record type "C", state "r", hash null)
160 file: file2 (record type "C", state "r", hash null)
161 local path: file2 (flags "")
161 local path: file2 (flags "")
162 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
162 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
163 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
163 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
164 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
164 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
165 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
165 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
166 local path: file3 (flags "")
166 local path: file3 (flags "")
167 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
167 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
168 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
168 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
169 --- file1 ---
169 --- file1 ---
170 1
170 1
171 changed
171 changed
172 *** file2 does not exist
172 *** file2 does not exist
173 --- file3 ---
173 --- file3 ---
174 3
174 3
175 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
175 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
176 changed2
176 changed2
177 =======
177 =======
178 changed1
178 changed1
179 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
179 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
180
180
181
181
182 Interactive merge with bad input:
182 Interactive merge with bad input:
183
183
184 $ hg co -C
184 $ hg co -C
185 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
185 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
186 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
186 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
187 1 other heads for branch "default"
187 1 other heads for branch "default"
188
188
189 $ hg merge --config ui.interactive=true <<EOF
189 $ hg merge --config ui.interactive=true <<EOF
190 > foo
190 > foo
191 > bar
191 > bar
192 > d
192 > d
193 > baz
193 > baz
194 > c
194 > c
195 > EOF
195 > EOF
196 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
196 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
197 What do you want to do?
197 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
198 use (c)hanged version, (d)elete, or leave (u)nresolved? foo
198 What do you want to do? foo
199 unrecognized response
199 unrecognized response
200 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
200 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
201 What do you want to do?
201 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
202 use (c)hanged version, (d)elete, or leave (u)nresolved? bar
202 What do you want to do? bar
203 unrecognized response
203 unrecognized response
204 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
204 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
205 What do you want to do?
205 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
206 use (c)hanged version, (d)elete, or leave (u)nresolved? d
206 What do you want to do? d
207 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
207 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
208 What do you want to do?
208 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
209 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? baz
209 What do you want to do? baz
210 unrecognized response
210 unrecognized response
211 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
211 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
212 What do you want to do?
212 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
213 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
213 What do you want to do? c
214 merging file3
214 merging file3
215 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
215 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
216 0 files updated, 1 files merged, 1 files removed, 1 files unresolved
216 0 files updated, 1 files merged, 1 files removed, 1 files unresolved
217 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
217 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
218 [1]
218 [1]
219
219
220 $ status
220 $ status
221 --- status ---
221 --- status ---
222 M file2
222 M file2
223 M file3
223 M file3
224 R file1
224 R file1
225 --- resolve --list ---
225 --- resolve --list ---
226 R file1
226 R file1
227 R file2
227 R file2
228 U file3
228 U file3
229 --- debugmergestate ---
229 --- debugmergestate ---
230 * version 2 records
230 * version 2 records
231 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
231 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
232 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
232 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
233 labels:
233 labels:
234 local: working copy
234 local: working copy
235 other: merge rev
235 other: merge rev
236 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
236 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
237 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
237 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
238 local path: file1 (flags "")
238 local path: file1 (flags "")
239 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
239 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
240 other path: file1 (node null)
240 other path: file1 (node null)
241 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
241 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
242 file: file2 (record type "C", state "r", hash null)
242 file: file2 (record type "C", state "r", hash null)
243 local path: file2 (flags "")
243 local path: file2 (flags "")
244 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
244 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
245 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
245 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
246 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
246 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
247 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
247 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
248 local path: file3 (flags "")
248 local path: file3 (flags "")
249 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
249 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
250 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
250 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
251 *** file1 does not exist
251 *** file1 does not exist
252 --- file2 ---
252 --- file2 ---
253 2
253 2
254 changed
254 changed
255 --- file3 ---
255 --- file3 ---
256 3
256 3
257 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
257 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
258 changed2
258 changed2
259 =======
259 =======
260 changed1
260 changed1
261 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
261 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
262
262
263
263
264 Interactive merge with not enough input:
264 Interactive merge with not enough input:
265
265
266 $ hg co -C
266 $ hg co -C
267 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
267 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
268 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
268 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
269 1 other heads for branch "default"
269 1 other heads for branch "default"
270
270
271 $ hg merge --config ui.interactive=true <<EOF
271 $ hg merge --config ui.interactive=true <<EOF
272 > d
272 > d
273 > EOF
273 > EOF
274 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
274 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
275 What do you want to do?
275 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
276 use (c)hanged version, (d)elete, or leave (u)nresolved? d
276 What do you want to do? d
277 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
277 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
278 What do you want to do?
278 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
279 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
279 What do you want to do?
280 merging file3
280 merging file3
281 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
281 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
282 0 files updated, 0 files merged, 1 files removed, 2 files unresolved
282 0 files updated, 0 files merged, 1 files removed, 2 files unresolved
283 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
283 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
284 [1]
284 [1]
285
285
286 $ status
286 $ status
287 --- status ---
287 --- status ---
288 M file2
288 M file2
289 M file3
289 M file3
290 R file1
290 R file1
291 --- resolve --list ---
291 --- resolve --list ---
292 R file1
292 R file1
293 U file2
293 U file2
294 U file3
294 U file3
295 --- debugmergestate ---
295 --- debugmergestate ---
296 * version 2 records
296 * version 2 records
297 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
297 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
298 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
298 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
299 labels:
299 labels:
300 local: working copy
300 local: working copy
301 other: merge rev
301 other: merge rev
302 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
302 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
303 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
303 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
304 local path: file1 (flags "")
304 local path: file1 (flags "")
305 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
305 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
306 other path: file1 (node null)
306 other path: file1 (node null)
307 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
307 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
308 file: file2 (record type "C", state "u", hash null)
308 file: file2 (record type "C", state "u", hash null)
309 local path: file2 (flags "")
309 local path: file2 (flags "")
310 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
310 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
311 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
311 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
312 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
312 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
313 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
313 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
314 local path: file3 (flags "")
314 local path: file3 (flags "")
315 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
315 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
316 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
316 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
317 *** file1 does not exist
317 *** file1 does not exist
318 --- file2 ---
318 --- file2 ---
319 2
319 2
320 changed
320 changed
321 --- file3 ---
321 --- file3 ---
322 3
322 3
323 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
323 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
324 changed2
324 changed2
325 =======
325 =======
326 changed1
326 changed1
327 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
327 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
328
328
329 Choose local versions of files
329 Choose local versions of files
330
330
331 $ hg co -C
331 $ hg co -C
332 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
332 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
333 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
333 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
334 1 other heads for branch "default"
334 1 other heads for branch "default"
335
335
336 $ hg merge --tool :local
336 $ hg merge --tool :local
337 0 files updated, 3 files merged, 0 files removed, 0 files unresolved
337 0 files updated, 3 files merged, 0 files removed, 0 files unresolved
338 (branch merge, don't forget to commit)
338 (branch merge, don't forget to commit)
339 $ status 2>&1 | tee $TESTTMP/local.status
339 $ status 2>&1 | tee $TESTTMP/local.status
340 --- status ---
340 --- status ---
341 file2: * (glob)
341 file2: * (glob)
342 M file3
342 M file3
343 C file1
343 C file1
344 --- resolve --list ---
344 --- resolve --list ---
345 R file1
345 R file1
346 R file2
346 R file2
347 R file3
347 R file3
348 --- debugmergestate ---
348 --- debugmergestate ---
349 * version 2 records
349 * version 2 records
350 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
350 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
351 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
351 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
352 labels:
352 labels:
353 local: working copy
353 local: working copy
354 other: merge rev
354 other: merge rev
355 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
355 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
356 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
356 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
357 local path: file1 (flags "")
357 local path: file1 (flags "")
358 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
358 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
359 other path: file1 (node null)
359 other path: file1 (node null)
360 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
360 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
361 file: file2 (record type "C", state "r", hash null)
361 file: file2 (record type "C", state "r", hash null)
362 local path: file2 (flags "")
362 local path: file2 (flags "")
363 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
363 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
364 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
364 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
365 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
365 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
366 file: file3 (record type "F", state "r", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
366 file: file3 (record type "F", state "r", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
367 local path: file3 (flags "")
367 local path: file3 (flags "")
368 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
368 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
369 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
369 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
370 --- file1 ---
370 --- file1 ---
371 1
371 1
372 changed
372 changed
373 *** file2 does not exist
373 *** file2 does not exist
374 --- file3 ---
374 --- file3 ---
375 3
375 3
376 changed2
376 changed2
377
377
378 Choose other versions of files
378 Choose other versions of files
379
379
380 $ hg co -C
380 $ hg co -C
381 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
381 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
382 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
382 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
383 1 other heads for branch "default"
383 1 other heads for branch "default"
384
384
385 $ hg merge --tool :other
385 $ hg merge --tool :other
386 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
386 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
387 (branch merge, don't forget to commit)
387 (branch merge, don't forget to commit)
388 $ status 2>&1 | tee $TESTTMP/other.status
388 $ status 2>&1 | tee $TESTTMP/other.status
389 --- status ---
389 --- status ---
390 M file2
390 M file2
391 M file3
391 M file3
392 R file1
392 R file1
393 --- resolve --list ---
393 --- resolve --list ---
394 R file1
394 R file1
395 R file2
395 R file2
396 R file3
396 R file3
397 --- debugmergestate ---
397 --- debugmergestate ---
398 * version 2 records
398 * version 2 records
399 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
399 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
400 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
400 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
401 labels:
401 labels:
402 local: working copy
402 local: working copy
403 other: merge rev
403 other: merge rev
404 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
404 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
405 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
405 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
406 local path: file1 (flags "")
406 local path: file1 (flags "")
407 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
407 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
408 other path: file1 (node null)
408 other path: file1 (node null)
409 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
409 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
410 file: file2 (record type "C", state "r", hash null)
410 file: file2 (record type "C", state "r", hash null)
411 local path: file2 (flags "")
411 local path: file2 (flags "")
412 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
412 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
413 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
413 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
414 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
414 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
415 file: file3 (record type "F", state "r", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
415 file: file3 (record type "F", state "r", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
416 local path: file3 (flags "")
416 local path: file3 (flags "")
417 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
417 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
418 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
418 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
419 *** file1 does not exist
419 *** file1 does not exist
420 --- file2 ---
420 --- file2 ---
421 2
421 2
422 changed
422 changed
423 --- file3 ---
423 --- file3 ---
424 3
424 3
425 changed1
425 changed1
426
426
427 Fail
427 Fail
428
428
429 $ hg co -C
429 $ hg co -C
430 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
430 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
431 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
431 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
432 1 other heads for branch "default"
432 1 other heads for branch "default"
433
433
434 $ hg merge --tool :fail
434 $ hg merge --tool :fail
435 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
435 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
436 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
436 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
437 [1]
437 [1]
438 $ status 2>&1 | tee $TESTTMP/fail.status
438 $ status 2>&1 | tee $TESTTMP/fail.status
439 --- status ---
439 --- status ---
440 M file2
440 M file2
441 M file3
441 M file3
442 C file1
442 C file1
443 --- resolve --list ---
443 --- resolve --list ---
444 U file1
444 U file1
445 U file2
445 U file2
446 U file3
446 U file3
447 --- debugmergestate ---
447 --- debugmergestate ---
448 * version 2 records
448 * version 2 records
449 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
449 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
450 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
450 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
451 labels:
451 labels:
452 local: working copy
452 local: working copy
453 other: merge rev
453 other: merge rev
454 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
454 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
455 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
455 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
456 local path: file1 (flags "")
456 local path: file1 (flags "")
457 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
457 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
458 other path: file1 (node null)
458 other path: file1 (node null)
459 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
459 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
460 file: file2 (record type "C", state "u", hash null)
460 file: file2 (record type "C", state "u", hash null)
461 local path: file2 (flags "")
461 local path: file2 (flags "")
462 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
462 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
463 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
463 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
464 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
464 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
465 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
465 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
466 local path: file3 (flags "")
466 local path: file3 (flags "")
467 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
467 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
468 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
468 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
469 --- file1 ---
469 --- file1 ---
470 1
470 1
471 changed
471 changed
472 --- file2 ---
472 --- file2 ---
473 2
473 2
474 changed
474 changed
475 --- file3 ---
475 --- file3 ---
476 3
476 3
477 changed2
477 changed2
478
478
479 Force prompts with no input (should be similar to :fail)
479 Force prompts with no input (should be similar to :fail)
480
480
481 $ hg co -C
481 $ hg co -C
482 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
482 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
483 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
483 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
484 1 other heads for branch "default"
484 1 other heads for branch "default"
485
485
486 $ hg merge --config ui.interactive=True --tool :prompt
486 $ hg merge --config ui.interactive=True --tool :prompt
487 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
487 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
488 What do you want to do?
488 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
489 use (c)hanged version, (d)elete, or leave (u)nresolved?
489 What do you want to do?
490 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
490 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
491 What do you want to do?
491 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
492 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
492 What do you want to do?
493 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for file3?
493 file 'file3' needs to be resolved.
494 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
495 What do you want to do?
494 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
496 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
495 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
497 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
496 [1]
498 [1]
497 $ status 2>&1 | tee $TESTTMP/prompt.status
499 $ status 2>&1 | tee $TESTTMP/prompt.status
498 --- status ---
500 --- status ---
499 M file2
501 M file2
500 M file3
502 M file3
501 C file1
503 C file1
502 --- resolve --list ---
504 --- resolve --list ---
503 U file1
505 U file1
504 U file2
506 U file2
505 U file3
507 U file3
506 --- debugmergestate ---
508 --- debugmergestate ---
507 * version 2 records
509 * version 2 records
508 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
510 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
509 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
511 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
510 labels:
512 labels:
511 local: working copy
513 local: working copy
512 other: merge rev
514 other: merge rev
513 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
515 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
514 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
516 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
515 local path: file1 (flags "")
517 local path: file1 (flags "")
516 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
518 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
517 other path: file1 (node null)
519 other path: file1 (node null)
518 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
520 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
519 file: file2 (record type "C", state "u", hash null)
521 file: file2 (record type "C", state "u", hash null)
520 local path: file2 (flags "")
522 local path: file2 (flags "")
521 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
523 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
522 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
524 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
523 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
525 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
524 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
526 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
525 local path: file3 (flags "")
527 local path: file3 (flags "")
526 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
528 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
527 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
529 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
528 --- file1 ---
530 --- file1 ---
529 1
531 1
530 changed
532 changed
531 --- file2 ---
533 --- file2 ---
532 2
534 2
533 changed
535 changed
534 --- file3 ---
536 --- file3 ---
535 3
537 3
536 changed2
538 changed2
537 $ cmp $TESTTMP/fail.status $TESTTMP/prompt.status || diff -U8 $TESTTMP/fail.status $TESTTMP/prompt.status
539 $ cmp $TESTTMP/fail.status $TESTTMP/prompt.status || diff -U8 $TESTTMP/fail.status $TESTTMP/prompt.status
538
540
539
541
540 Force prompts
542 Force prompts
541
543
542 $ hg co -C
544 $ hg co -C
543 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
545 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
544 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
546 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
545 1 other heads for branch "default"
547 1 other heads for branch "default"
546
548
547 $ hg merge --tool :prompt
549 $ hg merge --tool :prompt
548 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
550 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
549 What do you want to do?
551 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
550 use (c)hanged version, (d)elete, or leave (u)nresolved? u
552 What do you want to do? u
551 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
553 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
552 What do you want to do?
554 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
553 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
555 What do you want to do? u
554 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for file3? u
556 file 'file3' needs to be resolved.
557 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
558 What do you want to do? u
555 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
559 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
556 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
560 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
557 [1]
561 [1]
558 $ status
562 $ status
559 --- status ---
563 --- status ---
560 M file2
564 M file2
561 M file3
565 M file3
562 C file1
566 C file1
563 --- resolve --list ---
567 --- resolve --list ---
564 U file1
568 U file1
565 U file2
569 U file2
566 U file3
570 U file3
567 --- debugmergestate ---
571 --- debugmergestate ---
568 * version 2 records
572 * version 2 records
569 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
573 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
570 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
574 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
571 labels:
575 labels:
572 local: working copy
576 local: working copy
573 other: merge rev
577 other: merge rev
574 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
578 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
575 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
579 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
576 local path: file1 (flags "")
580 local path: file1 (flags "")
577 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
581 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
578 other path: file1 (node null)
582 other path: file1 (node null)
579 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
583 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
580 file: file2 (record type "C", state "u", hash null)
584 file: file2 (record type "C", state "u", hash null)
581 local path: file2 (flags "")
585 local path: file2 (flags "")
582 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
586 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
583 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
587 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
584 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
588 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
585 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
589 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
586 local path: file3 (flags "")
590 local path: file3 (flags "")
587 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
591 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
588 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
592 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
589 --- file1 ---
593 --- file1 ---
590 1
594 1
591 changed
595 changed
592 --- file2 ---
596 --- file2 ---
593 2
597 2
594 changed
598 changed
595 --- file3 ---
599 --- file3 ---
596 3
600 3
597 changed2
601 changed2
598
602
599 Choose to merge all files
603 Choose to merge all files
600
604
601 $ hg co -C
605 $ hg co -C
602 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
606 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
603 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
607 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
604 1 other heads for branch "default"
608 1 other heads for branch "default"
605
609
606 $ hg merge --tool :merge3
610 $ hg merge --tool :merge3
607 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
611 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
608 What do you want to do?
612 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
609 use (c)hanged version, (d)elete, or leave (u)nresolved? u
613 What do you want to do? u
610 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
614 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
611 What do you want to do?
615 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
612 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
616 What do you want to do? u
613 merging file3
617 merging file3
614 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
618 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
615 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
619 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
616 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
620 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
617 [1]
621 [1]
618 $ status
622 $ status
619 --- status ---
623 --- status ---
620 M file2
624 M file2
621 M file3
625 M file3
622 C file1
626 C file1
623 --- resolve --list ---
627 --- resolve --list ---
624 U file1
628 U file1
625 U file2
629 U file2
626 U file3
630 U file3
627 --- debugmergestate ---
631 --- debugmergestate ---
628 * version 2 records
632 * version 2 records
629 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
633 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
630 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
634 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
631 labels:
635 labels:
632 local: working copy
636 local: working copy
633 other: merge rev
637 other: merge rev
634 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
638 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
635 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
639 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
636 local path: file1 (flags "")
640 local path: file1 (flags "")
637 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
641 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
638 other path: file1 (node null)
642 other path: file1 (node null)
639 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
643 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
640 file: file2 (record type "C", state "u", hash null)
644 file: file2 (record type "C", state "u", hash null)
641 local path: file2 (flags "")
645 local path: file2 (flags "")
642 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
646 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
643 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
647 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
644 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
648 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
645 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
649 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
646 local path: file3 (flags "")
650 local path: file3 (flags "")
647 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
651 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
648 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
652 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
649 --- file1 ---
653 --- file1 ---
650 1
654 1
651 changed
655 changed
652 --- file2 ---
656 --- file2 ---
653 2
657 2
654 changed
658 changed
655 --- file3 ---
659 --- file3 ---
656 3
660 3
657 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
661 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
658 changed2
662 changed2
659 ||||||| base
663 ||||||| base
660 =======
664 =======
661 changed1
665 changed1
662 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
666 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
663
667
664 Exercise transitions between local, other, fail and prompt, and make sure the
668 Exercise transitions between local, other, fail and prompt, and make sure the
665 dirstate stays consistent. (Compare with each other and to the above
669 dirstate stays consistent. (Compare with each other and to the above
666 invocations.)
670 invocations.)
667
671
668 $ testtransitions() {
672 $ testtransitions() {
669 > # this traversal order covers every transition
673 > # this traversal order covers every transition
670 > tools="local other prompt local fail other local prompt other fail prompt fail local"
674 > tools="local other prompt local fail other local prompt other fail prompt fail local"
671 > lasttool="merge3"
675 > lasttool="merge3"
672 > for tool in $tools; do
676 > for tool in $tools; do
673 > echo "=== :$lasttool -> :$tool ==="
677 > echo "=== :$lasttool -> :$tool ==="
674 > ref="$TESTTMP/$tool.status"
678 > ref="$TESTTMP/$tool.status"
675 > hg resolve --unmark --all
679 > hg resolve --unmark --all
676 > hg resolve --tool ":$tool" --all --config ui.interactive=True
680 > hg resolve --tool ":$tool" --all --config ui.interactive=True
677 > status > "$TESTTMP/compare.status" 2>&1
681 > status > "$TESTTMP/compare.status" 2>&1
678 > echo '--- diff of status ---'
682 > echo '--- diff of status ---'
679 > if cmp "$TESTTMP/$tool.status" "$TESTTMP/compare.status" || diff -U8 "$TESTTMP/$tool.status" "$TESTTMP/compare.status"; then
683 > if cmp "$TESTTMP/$tool.status" "$TESTTMP/compare.status" || diff -U8 "$TESTTMP/$tool.status" "$TESTTMP/compare.status"; then
680 > echo '(status identical)'
684 > echo '(status identical)'
681 > fi
685 > fi
682 > lasttool="$tool"
686 > lasttool="$tool"
683 > echo
687 > echo
684 > done
688 > done
685 > }
689 > }
686
690
687 $ testtransitions
691 $ testtransitions
688 === :merge3 -> :local ===
692 === :merge3 -> :local ===
689 (no more unresolved files)
693 (no more unresolved files)
690 --- diff of status ---
694 --- diff of status ---
691 (status identical)
695 (status identical)
692
696
693 === :local -> :other ===
697 === :local -> :other ===
694 (no more unresolved files)
698 (no more unresolved files)
695 --- diff of status ---
699 --- diff of status ---
696 (status identical)
700 (status identical)
697
701
698 === :other -> :prompt ===
702 === :other -> :prompt ===
699 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
703 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
700 What do you want to do?
704 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
701 use (c)hanged version, (d)elete, or leave (u)nresolved?
705 What do you want to do?
702 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
706 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
703 What do you want to do?
707 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
704 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
708 What do you want to do?
705 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for file3?
709 file 'file3' needs to be resolved.
710 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
711 What do you want to do?
706 --- diff of status ---
712 --- diff of status ---
707 (status identical)
713 (status identical)
708
714
709 === :prompt -> :local ===
715 === :prompt -> :local ===
710 (no more unresolved files)
716 (no more unresolved files)
711 --- diff of status ---
717 --- diff of status ---
712 (status identical)
718 (status identical)
713
719
714 === :local -> :fail ===
720 === :local -> :fail ===
715 --- diff of status ---
721 --- diff of status ---
716 (status identical)
722 (status identical)
717
723
718 === :fail -> :other ===
724 === :fail -> :other ===
719 (no more unresolved files)
725 (no more unresolved files)
720 --- diff of status ---
726 --- diff of status ---
721 (status identical)
727 (status identical)
722
728
723 === :other -> :local ===
729 === :other -> :local ===
724 (no more unresolved files)
730 (no more unresolved files)
725 --- diff of status ---
731 --- diff of status ---
726 (status identical)
732 (status identical)
727
733
728 === :local -> :prompt ===
734 === :local -> :prompt ===
729 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
735 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
730 What do you want to do?
736 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
731 use (c)hanged version, (d)elete, or leave (u)nresolved?
737 What do you want to do?
732 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
738 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
733 What do you want to do?
739 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
734 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
740 What do you want to do?
735 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for file3?
741 file 'file3' needs to be resolved.
742 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
743 What do you want to do?
736 --- diff of status ---
744 --- diff of status ---
737 (status identical)
745 (status identical)
738
746
739 === :prompt -> :other ===
747 === :prompt -> :other ===
740 (no more unresolved files)
748 (no more unresolved files)
741 --- diff of status ---
749 --- diff of status ---
742 (status identical)
750 (status identical)
743
751
744 === :other -> :fail ===
752 === :other -> :fail ===
745 --- diff of status ---
753 --- diff of status ---
746 (status identical)
754 (status identical)
747
755
748 === :fail -> :prompt ===
756 === :fail -> :prompt ===
749 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
757 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
750 What do you want to do?
758 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
751 use (c)hanged version, (d)elete, or leave (u)nresolved?
759 What do you want to do?
752 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
760 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
753 What do you want to do?
761 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
754 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
762 What do you want to do?
755 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for file3?
763 file 'file3' needs to be resolved.
764 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
765 What do you want to do?
756 --- diff of status ---
766 --- diff of status ---
757 (status identical)
767 (status identical)
758
768
759 === :prompt -> :fail ===
769 === :prompt -> :fail ===
760 --- diff of status ---
770 --- diff of status ---
761 (status identical)
771 (status identical)
762
772
763 === :fail -> :local ===
773 === :fail -> :local ===
764 (no more unresolved files)
774 (no more unresolved files)
765 --- diff of status ---
775 --- diff of status ---
766 (status identical)
776 (status identical)
767
777
768
778
769
779
770 Non-interactive linear update
780 Non-interactive linear update
771
781
772 $ hg co -C 0
782 $ hg co -C 0
773 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
783 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
774 $ echo changed >> file1
784 $ echo changed >> file1
775 $ hg rm file2
785 $ hg rm file2
776 $ hg update 1 -y
786 $ hg update 1 -y
777 file 'file1' was deleted in other [destination] but was modified in local [working copy].
787 file 'file1' was deleted in other [destination] but was modified in local [working copy].
778 What do you want to do?
788 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
779 use (c)hanged version, (d)elete, or leave (u)nresolved? u
789 What do you want to do? u
780 file 'file2' was deleted in local [working copy] but was modified in other [destination].
790 file 'file2' was deleted in local [working copy] but was modified in other [destination].
781 What do you want to do?
791 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
782 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
792 What do you want to do? u
783 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
793 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
784 use 'hg resolve' to retry unresolved file merges
794 use 'hg resolve' to retry unresolved file merges
785 [1]
795 [1]
786 $ status
796 $ status
787 --- status ---
797 --- status ---
788 A file1
798 A file1
789 C file2
799 C file2
790 C file3
800 C file3
791 --- resolve --list ---
801 --- resolve --list ---
792 U file1
802 U file1
793 U file2
803 U file2
794 --- debugmergestate ---
804 --- debugmergestate ---
795 * version 2 records
805 * version 2 records
796 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
806 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
797 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
807 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
798 labels:
808 labels:
799 local: working copy
809 local: working copy
800 other: destination
810 other: destination
801 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
811 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
802 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
812 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
803 local path: file1 (flags "")
813 local path: file1 (flags "")
804 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
814 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
805 other path: file1 (node null)
815 other path: file1 (node null)
806 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
816 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
807 file: file2 (record type "C", state "u", hash null)
817 file: file2 (record type "C", state "u", hash null)
808 local path: file2 (flags "")
818 local path: file2 (flags "")
809 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
819 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
810 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
820 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
811 --- file1 ---
821 --- file1 ---
812 1
822 1
813 changed
823 changed
814 --- file2 ---
824 --- file2 ---
815 2
825 2
816 changed
826 changed
817 --- file3 ---
827 --- file3 ---
818 3
828 3
819 changed1
829 changed1
820
830
821 Choose local versions of files
831 Choose local versions of files
822
832
823 $ hg co -C 0
833 $ hg co -C 0
824 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
834 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
825 $ echo changed >> file1
835 $ echo changed >> file1
826 $ hg rm file2
836 $ hg rm file2
827 $ hg update 1 --tool :local
837 $ hg update 1 --tool :local
828 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
838 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
829 $ status 2>&1 | tee $TESTTMP/local.status
839 $ status 2>&1 | tee $TESTTMP/local.status
830 --- status ---
840 --- status ---
831 file2: * (glob)
841 file2: * (glob)
832 A file1
842 A file1
833 C file3
843 C file3
834 --- resolve --list ---
844 --- resolve --list ---
835 R file1
845 R file1
836 R file2
846 R file2
837 --- debugmergestate ---
847 --- debugmergestate ---
838 * version 2 records
848 * version 2 records
839 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
849 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
840 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
850 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
841 labels:
851 labels:
842 local: working copy
852 local: working copy
843 other: destination
853 other: destination
844 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
854 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
845 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
855 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
846 local path: file1 (flags "")
856 local path: file1 (flags "")
847 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
857 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
848 other path: file1 (node null)
858 other path: file1 (node null)
849 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
859 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
850 file: file2 (record type "C", state "r", hash null)
860 file: file2 (record type "C", state "r", hash null)
851 local path: file2 (flags "")
861 local path: file2 (flags "")
852 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
862 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
853 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
863 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
854 --- file1 ---
864 --- file1 ---
855 1
865 1
856 changed
866 changed
857 *** file2 does not exist
867 *** file2 does not exist
858 --- file3 ---
868 --- file3 ---
859 3
869 3
860 changed1
870 changed1
861
871
862 Choose other versions of files
872 Choose other versions of files
863
873
864 $ hg co -C 0
874 $ hg co -C 0
865 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
875 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
866 $ echo changed >> file1
876 $ echo changed >> file1
867 $ hg rm file2
877 $ hg rm file2
868 $ hg update 1 --tool :other
878 $ hg update 1 --tool :other
869 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
879 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
870 $ status 2>&1 | tee $TESTTMP/other.status
880 $ status 2>&1 | tee $TESTTMP/other.status
871 --- status ---
881 --- status ---
872 file1: * (glob)
882 file1: * (glob)
873 C file2
883 C file2
874 C file3
884 C file3
875 --- resolve --list ---
885 --- resolve --list ---
876 R file1
886 R file1
877 R file2
887 R file2
878 --- debugmergestate ---
888 --- debugmergestate ---
879 * version 2 records
889 * version 2 records
880 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
890 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
881 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
891 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
882 labels:
892 labels:
883 local: working copy
893 local: working copy
884 other: destination
894 other: destination
885 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
895 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
886 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
896 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
887 local path: file1 (flags "")
897 local path: file1 (flags "")
888 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
898 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
889 other path: file1 (node null)
899 other path: file1 (node null)
890 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
900 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
891 file: file2 (record type "C", state "r", hash null)
901 file: file2 (record type "C", state "r", hash null)
892 local path: file2 (flags "")
902 local path: file2 (flags "")
893 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
903 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
894 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
904 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
895 *** file1 does not exist
905 *** file1 does not exist
896 --- file2 ---
906 --- file2 ---
897 2
907 2
898 changed
908 changed
899 --- file3 ---
909 --- file3 ---
900 3
910 3
901 changed1
911 changed1
902
912
903 Fail
913 Fail
904
914
905 $ hg co -C 0
915 $ hg co -C 0
906 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
916 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
907 $ echo changed >> file1
917 $ echo changed >> file1
908 $ hg rm file2
918 $ hg rm file2
909 $ hg update 1 --tool :fail
919 $ hg update 1 --tool :fail
910 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
920 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
911 use 'hg resolve' to retry unresolved file merges
921 use 'hg resolve' to retry unresolved file merges
912 [1]
922 [1]
913 $ status 2>&1 | tee $TESTTMP/fail.status
923 $ status 2>&1 | tee $TESTTMP/fail.status
914 --- status ---
924 --- status ---
915 A file1
925 A file1
916 C file2
926 C file2
917 C file3
927 C file3
918 --- resolve --list ---
928 --- resolve --list ---
919 U file1
929 U file1
920 U file2
930 U file2
921 --- debugmergestate ---
931 --- debugmergestate ---
922 * version 2 records
932 * version 2 records
923 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
933 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
924 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
934 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
925 labels:
935 labels:
926 local: working copy
936 local: working copy
927 other: destination
937 other: destination
928 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
938 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
929 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
939 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
930 local path: file1 (flags "")
940 local path: file1 (flags "")
931 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
941 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
932 other path: file1 (node null)
942 other path: file1 (node null)
933 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
943 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
934 file: file2 (record type "C", state "u", hash null)
944 file: file2 (record type "C", state "u", hash null)
935 local path: file2 (flags "")
945 local path: file2 (flags "")
936 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
946 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
937 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
947 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
938 --- file1 ---
948 --- file1 ---
939 1
949 1
940 changed
950 changed
941 --- file2 ---
951 --- file2 ---
942 2
952 2
943 changed
953 changed
944 --- file3 ---
954 --- file3 ---
945 3
955 3
946 changed1
956 changed1
947
957
948 Force prompts with no input
958 Force prompts with no input
949
959
950 $ hg co -C 0
960 $ hg co -C 0
951 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
961 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
952 $ echo changed >> file1
962 $ echo changed >> file1
953 $ hg rm file2
963 $ hg rm file2
954 $ hg update 1 --config ui.interactive=True --tool :prompt
964 $ hg update 1 --config ui.interactive=True --tool :prompt
955 file 'file1' was deleted in other [destination] but was modified in local [working copy].
965 file 'file1' was deleted in other [destination] but was modified in local [working copy].
956 What do you want to do?
966 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
957 use (c)hanged version, (d)elete, or leave (u)nresolved?
967 What do you want to do?
958 file 'file2' was deleted in local [working copy] but was modified in other [destination].
968 file 'file2' was deleted in local [working copy] but was modified in other [destination].
959 What do you want to do?
969 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
960 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
970 What do you want to do?
961 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
971 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
962 use 'hg resolve' to retry unresolved file merges
972 use 'hg resolve' to retry unresolved file merges
963 [1]
973 [1]
964 $ status 2>&1 | tee $TESTTMP/prompt.status
974 $ status 2>&1 | tee $TESTTMP/prompt.status
965 --- status ---
975 --- status ---
966 A file1
976 A file1
967 C file2
977 C file2
968 C file3
978 C file3
969 --- resolve --list ---
979 --- resolve --list ---
970 U file1
980 U file1
971 U file2
981 U file2
972 --- debugmergestate ---
982 --- debugmergestate ---
973 * version 2 records
983 * version 2 records
974 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
984 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
975 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
985 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
976 labels:
986 labels:
977 local: working copy
987 local: working copy
978 other: destination
988 other: destination
979 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
989 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
980 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
990 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
981 local path: file1 (flags "")
991 local path: file1 (flags "")
982 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
992 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
983 other path: file1 (node null)
993 other path: file1 (node null)
984 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
994 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
985 file: file2 (record type "C", state "u", hash null)
995 file: file2 (record type "C", state "u", hash null)
986 local path: file2 (flags "")
996 local path: file2 (flags "")
987 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
997 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
988 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
998 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
989 --- file1 ---
999 --- file1 ---
990 1
1000 1
991 changed
1001 changed
992 --- file2 ---
1002 --- file2 ---
993 2
1003 2
994 changed
1004 changed
995 --- file3 ---
1005 --- file3 ---
996 3
1006 3
997 changed1
1007 changed1
998 $ cmp $TESTTMP/fail.status $TESTTMP/prompt.status || diff -U8 $TESTTMP/fail.status $TESTTMP/prompt.status
1008 $ cmp $TESTTMP/fail.status $TESTTMP/prompt.status || diff -U8 $TESTTMP/fail.status $TESTTMP/prompt.status
999
1009
1000 Choose to merge all files
1010 Choose to merge all files
1001
1011
1002 $ hg co -C 0
1012 $ hg co -C 0
1003 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
1013 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
1004 $ echo changed >> file1
1014 $ echo changed >> file1
1005 $ hg rm file2
1015 $ hg rm file2
1006 $ hg update 1 --tool :merge3
1016 $ hg update 1 --tool :merge3
1007 file 'file1' was deleted in other [destination] but was modified in local [working copy].
1017 file 'file1' was deleted in other [destination] but was modified in local [working copy].
1008 What do you want to do?
1018 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
1009 use (c)hanged version, (d)elete, or leave (u)nresolved? u
1019 What do you want to do? u
1010 file 'file2' was deleted in local [working copy] but was modified in other [destination].
1020 file 'file2' was deleted in local [working copy] but was modified in other [destination].
1011 What do you want to do?
1021 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
1012 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
1022 What do you want to do? u
1013 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
1023 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
1014 use 'hg resolve' to retry unresolved file merges
1024 use 'hg resolve' to retry unresolved file merges
1015 [1]
1025 [1]
1016 $ status
1026 $ status
1017 --- status ---
1027 --- status ---
1018 A file1
1028 A file1
1019 C file2
1029 C file2
1020 C file3
1030 C file3
1021 --- resolve --list ---
1031 --- resolve --list ---
1022 U file1
1032 U file1
1023 U file2
1033 U file2
1024 --- debugmergestate ---
1034 --- debugmergestate ---
1025 * version 2 records
1035 * version 2 records
1026 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
1036 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
1027 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
1037 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
1028 labels:
1038 labels:
1029 local: working copy
1039 local: working copy
1030 other: destination
1040 other: destination
1031 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
1041 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
1032 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
1042 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
1033 local path: file1 (flags "")
1043 local path: file1 (flags "")
1034 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
1044 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
1035 other path: file1 (node null)
1045 other path: file1 (node null)
1036 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
1046 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
1037 file: file2 (record type "C", state "u", hash null)
1047 file: file2 (record type "C", state "u", hash null)
1038 local path: file2 (flags "")
1048 local path: file2 (flags "")
1039 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
1049 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
1040 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
1050 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
1041 --- file1 ---
1051 --- file1 ---
1042 1
1052 1
1043 changed
1053 changed
1044 --- file2 ---
1054 --- file2 ---
1045 2
1055 2
1046 changed
1056 changed
1047 --- file3 ---
1057 --- file3 ---
1048 3
1058 3
1049 changed1
1059 changed1
1050
1060
1051 Test transitions between different merge tools
1061 Test transitions between different merge tools
1052
1062
1053 $ testtransitions
1063 $ testtransitions
1054 === :merge3 -> :local ===
1064 === :merge3 -> :local ===
1055 (no more unresolved files)
1065 (no more unresolved files)
1056 --- diff of status ---
1066 --- diff of status ---
1057 (status identical)
1067 (status identical)
1058
1068
1059 === :local -> :other ===
1069 === :local -> :other ===
1060 (no more unresolved files)
1070 (no more unresolved files)
1061 --- diff of status ---
1071 --- diff of status ---
1062 (status identical)
1072 (status identical)
1063
1073
1064 === :other -> :prompt ===
1074 === :other -> :prompt ===
1065 file 'file1' was deleted in other [destination] but was modified in local [working copy].
1075 file 'file1' was deleted in other [destination] but was modified in local [working copy].
1066 What do you want to do?
1076 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
1067 use (c)hanged version, (d)elete, or leave (u)nresolved?
1077 What do you want to do?
1068 file 'file2' was deleted in local [working copy] but was modified in other [destination].
1078 file 'file2' was deleted in local [working copy] but was modified in other [destination].
1069 What do you want to do?
1079 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
1070 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
1080 What do you want to do?
1071 --- diff of status ---
1081 --- diff of status ---
1072 (status identical)
1082 (status identical)
1073
1083
1074 === :prompt -> :local ===
1084 === :prompt -> :local ===
1075 (no more unresolved files)
1085 (no more unresolved files)
1076 --- diff of status ---
1086 --- diff of status ---
1077 (status identical)
1087 (status identical)
1078
1088
1079 === :local -> :fail ===
1089 === :local -> :fail ===
1080 --- diff of status ---
1090 --- diff of status ---
1081 (status identical)
1091 (status identical)
1082
1092
1083 === :fail -> :other ===
1093 === :fail -> :other ===
1084 (no more unresolved files)
1094 (no more unresolved files)
1085 --- diff of status ---
1095 --- diff of status ---
1086 (status identical)
1096 (status identical)
1087
1097
1088 === :other -> :local ===
1098 === :other -> :local ===
1089 (no more unresolved files)
1099 (no more unresolved files)
1090 --- diff of status ---
1100 --- diff of status ---
1091 (status identical)
1101 (status identical)
1092
1102
1093 === :local -> :prompt ===
1103 === :local -> :prompt ===
1094 file 'file1' was deleted in other [destination] but was modified in local [working copy].
1104 file 'file1' was deleted in other [destination] but was modified in local [working copy].
1095 What do you want to do?
1105 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
1096 use (c)hanged version, (d)elete, or leave (u)nresolved?
1106 What do you want to do?
1097 file 'file2' was deleted in local [working copy] but was modified in other [destination].
1107 file 'file2' was deleted in local [working copy] but was modified in other [destination].
1098 What do you want to do?
1108 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
1099 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
1109 What do you want to do?
1100 --- diff of status ---
1110 --- diff of status ---
1101 (status identical)
1111 (status identical)
1102
1112
1103 === :prompt -> :other ===
1113 === :prompt -> :other ===
1104 (no more unresolved files)
1114 (no more unresolved files)
1105 --- diff of status ---
1115 --- diff of status ---
1106 (status identical)
1116 (status identical)
1107
1117
1108 === :other -> :fail ===
1118 === :other -> :fail ===
1109 --- diff of status ---
1119 --- diff of status ---
1110 (status identical)
1120 (status identical)
1111
1121
1112 === :fail -> :prompt ===
1122 === :fail -> :prompt ===
1113 file 'file1' was deleted in other [destination] but was modified in local [working copy].
1123 file 'file1' was deleted in other [destination] but was modified in local [working copy].
1114 What do you want to do?
1124 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
1115 use (c)hanged version, (d)elete, or leave (u)nresolved?
1125 What do you want to do?
1116 file 'file2' was deleted in local [working copy] but was modified in other [destination].
1126 file 'file2' was deleted in local [working copy] but was modified in other [destination].
1117 What do you want to do?
1127 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
1118 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
1128 What do you want to do?
1119 --- diff of status ---
1129 --- diff of status ---
1120 (status identical)
1130 (status identical)
1121
1131
1122 === :prompt -> :fail ===
1132 === :prompt -> :fail ===
1123 --- diff of status ---
1133 --- diff of status ---
1124 (status identical)
1134 (status identical)
1125
1135
1126 === :fail -> :local ===
1136 === :fail -> :local ===
1127 (no more unresolved files)
1137 (no more unresolved files)
1128 --- diff of status ---
1138 --- diff of status ---
1129 (status identical)
1139 (status identical)
1130
1140
@@ -1,845 +1,845 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")' 2>&1 | tee $TESTTMP/merge-output-1
144 $ hg merge -f --tool internal:merge3 'desc("remote")' 2>&1 | tee $TESTTMP/merge-output-1
145 file 'content1_missing_content1_content4-tracked' was deleted in other [merge rev] but was modified in local [working copy].
145 file 'content1_missing_content1_content4-tracked' was deleted in other [merge rev] but was modified in local [working copy].
146 What do you want to do?
146 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
147 use (c)hanged version, (d)elete, or leave (u)nresolved? u
147 What do you want to do? u
148 file 'content1_missing_content3_content3-tracked' was deleted in other [merge rev] but was modified in local [working copy].
148 file 'content1_missing_content3_content3-tracked' was deleted in other [merge rev] but was modified in local [working copy].
149 What do you want to do?
149 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
150 use (c)hanged version, (d)elete, or leave (u)nresolved? u
150 What do you want to do? u
151 file 'content1_missing_content3_content4-tracked' was deleted in other [merge rev] but was modified in local [working copy].
151 file 'content1_missing_content3_content4-tracked' was deleted in other [merge rev] but was modified in local [working copy].
152 What do you want to do?
152 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
153 use (c)hanged version, (d)elete, or leave (u)nresolved? u
153 What do you want to do? u
154 file 'content1_missing_missing_content4-tracked' was deleted in other [merge rev] but was modified in local [working copy].
154 file 'content1_missing_missing_content4-tracked' was deleted in other [merge rev] but was modified in local [working copy].
155 What do you want to do?
155 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
156 use (c)hanged version, (d)elete, or leave (u)nresolved? u
156 What do you want to do? u
157 file 'content1_content2_content1_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
157 file 'content1_content2_content1_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
158 What do you want to do?
158 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
159 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
159 What do you want to do? u
160 file 'content1_content2_content1_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
160 file 'content1_content2_content1_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
161 What do you want to do?
161 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
162 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
162 What do you want to do? u
163 file 'content1_content2_content1_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
163 file 'content1_content2_content1_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
164 What do you want to do?
164 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
165 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
165 What do you want to do? u
166 file 'content1_content2_content1_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
166 file 'content1_content2_content1_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
167 What do you want to do?
167 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
168 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
168 What do you want to do? u
169 file 'content1_content2_content1_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
169 file 'content1_content2_content1_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
170 What do you want to do?
170 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
171 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
171 What do you want to do? u
172 file 'content1_content2_content2_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
172 file 'content1_content2_content2_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
173 What do you want to do?
173 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
174 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
174 What do you want to do? u
175 file 'content1_content2_content2_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
175 file 'content1_content2_content2_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
176 What do you want to do?
176 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
177 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
177 What do you want to do? u
178 file 'content1_content2_content2_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
178 file 'content1_content2_content2_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
179 What do you want to do?
179 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
180 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
180 What do you want to do? u
181 file 'content1_content2_content2_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
181 file 'content1_content2_content2_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
182 What do you want to do?
182 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
183 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
183 What do you want to do? u
184 file 'content1_content2_content2_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
184 file 'content1_content2_content2_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
185 What do you want to do?
185 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
186 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
186 What do you want to do? u
187 file 'content1_content2_content3_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
187 file 'content1_content2_content3_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
188 What do you want to do?
188 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
189 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
189 What do you want to do? u
190 file 'content1_content2_content3_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
190 file 'content1_content2_content3_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
191 What do you want to do?
191 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
192 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
192 What do you want to do? u
193 file 'content1_content2_content3_content3-untracked' was deleted in local [working copy] but was modified in other [merge rev].
193 file 'content1_content2_content3_content3-untracked' was deleted in local [working copy] but was modified in other [merge rev].
194 What do you want to do?
194 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
195 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
195 What do you want to do? u
196 file 'content1_content2_content3_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
196 file 'content1_content2_content3_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
197 What do you want to do?
197 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
198 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
198 What do you want to do? u
199 file 'content1_content2_content3_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
199 file 'content1_content2_content3_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
200 What do you want to do?
200 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
201 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
201 What do you want to do? u
202 file 'content1_content2_content3_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
202 file 'content1_content2_content3_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
203 What do you want to do?
203 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
204 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
204 What do you want to do? u
205 file 'content1_content2_missing_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
205 file 'content1_content2_missing_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
206 What do you want to do?
206 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
207 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
207 What do you want to do? u
208 file 'content1_content2_missing_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
208 file 'content1_content2_missing_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
209 What do you want to do?
209 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
210 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
210 What do you want to do? u
211 file 'content1_content2_missing_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
211 file 'content1_content2_missing_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
212 What do you want to do?
212 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
213 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
213 What do you want to do? u
214 file 'content1_content2_missing_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
214 file 'content1_content2_missing_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
215 What do you want to do?
215 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
216 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
216 What do you want to do? u
217 file 'content1_content2_missing_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
217 file 'content1_content2_missing_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
218 What do you want to do?
218 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
219 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
219 What do you want to do? u
220 merging content1_content2_content1_content4-tracked
220 merging content1_content2_content1_content4-tracked
221 merging content1_content2_content2_content1-tracked
221 merging content1_content2_content2_content1-tracked
222 merging content1_content2_content2_content4-tracked
222 merging content1_content2_content2_content4-tracked
223 merging content1_content2_content3_content1-tracked
223 merging content1_content2_content3_content1-tracked
224 merging content1_content2_content3_content3-tracked
224 merging content1_content2_content3_content3-tracked
225 merging content1_content2_content3_content4-tracked
225 merging content1_content2_content3_content4-tracked
226 merging content1_content2_missing_content1-tracked
226 merging content1_content2_missing_content1-tracked
227 merging content1_content2_missing_content4-tracked
227 merging content1_content2_missing_content4-tracked
228 merging missing_content2_content2_content4-tracked
228 merging missing_content2_content2_content4-tracked
229 merging missing_content2_content3_content3-tracked
229 merging missing_content2_content3_content3-tracked
230 merging missing_content2_content3_content4-tracked
230 merging missing_content2_content3_content4-tracked
231 merging missing_content2_missing_content4-tracked
231 merging missing_content2_missing_content4-tracked
232 merging missing_content2_missing_content4-untracked
232 merging missing_content2_missing_content4-untracked
233 warning: conflicts while merging content1_content2_content1_content4-tracked! (edit, then use 'hg resolve --mark')
233 warning: conflicts while merging content1_content2_content1_content4-tracked! (edit, then use 'hg resolve --mark')
234 warning: conflicts while merging content1_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
234 warning: conflicts while merging content1_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
235 warning: conflicts while merging content1_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
235 warning: conflicts while merging content1_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
236 warning: conflicts while merging content1_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
236 warning: conflicts while merging content1_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
237 warning: conflicts while merging content1_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
237 warning: conflicts while merging content1_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
238 warning: conflicts while merging missing_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
238 warning: conflicts while merging missing_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
239 warning: conflicts while merging missing_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
239 warning: conflicts while merging missing_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
240 warning: conflicts while merging missing_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
240 warning: conflicts while merging missing_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
241 warning: conflicts while merging missing_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
241 warning: conflicts while merging missing_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
242 warning: conflicts while merging missing_content2_missing_content4-untracked! (edit, then use 'hg resolve --mark')
242 warning: conflicts while merging missing_content2_missing_content4-untracked! (edit, then use 'hg resolve --mark')
243 18 files updated, 3 files merged, 8 files removed, 35 files unresolved
243 18 files updated, 3 files merged, 8 files removed, 35 files unresolved
244 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
244 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
245
245
246 Check which files need to be resolved (should correspond to the output above).
246 Check which files need to be resolved (should correspond to the output above).
247 This should be the files for which the base (1st filename segment), the remote
247 This should be the files for which the base (1st filename segment), the remote
248 (2nd segment) and the working copy (4th segment) are all different.
248 (2nd segment) and the working copy (4th segment) are all different.
249
249
250 Interestingly, one untracked file got merged and added, which corresponds to the
250 Interestingly, one untracked file got merged and added, which corresponds to the
251 odd 'if force and branchmerge and different' case in manifestmerge().
251 odd 'if force and branchmerge and different' case in manifestmerge().
252
252
253 $ hg resolve -l
253 $ hg resolve -l
254 U content1_content2_content1_content1-untracked
254 U content1_content2_content1_content1-untracked
255 U content1_content2_content1_content2-untracked
255 U content1_content2_content1_content2-untracked
256 U content1_content2_content1_content4-tracked
256 U content1_content2_content1_content4-tracked
257 U content1_content2_content1_content4-untracked
257 U content1_content2_content1_content4-untracked
258 U content1_content2_content1_missing-tracked
258 U content1_content2_content1_missing-tracked
259 U content1_content2_content1_missing-untracked
259 U content1_content2_content1_missing-untracked
260 R content1_content2_content2_content1-tracked
260 R content1_content2_content2_content1-tracked
261 U content1_content2_content2_content1-untracked
261 U content1_content2_content2_content1-untracked
262 U content1_content2_content2_content2-untracked
262 U content1_content2_content2_content2-untracked
263 U content1_content2_content2_content4-tracked
263 U content1_content2_content2_content4-tracked
264 U content1_content2_content2_content4-untracked
264 U content1_content2_content2_content4-untracked
265 U content1_content2_content2_missing-tracked
265 U content1_content2_content2_missing-tracked
266 U content1_content2_content2_missing-untracked
266 U content1_content2_content2_missing-untracked
267 R content1_content2_content3_content1-tracked
267 R content1_content2_content3_content1-tracked
268 U content1_content2_content3_content1-untracked
268 U content1_content2_content3_content1-untracked
269 U content1_content2_content3_content2-untracked
269 U content1_content2_content3_content2-untracked
270 U content1_content2_content3_content3-tracked
270 U content1_content2_content3_content3-tracked
271 U content1_content2_content3_content3-untracked
271 U content1_content2_content3_content3-untracked
272 U content1_content2_content3_content4-tracked
272 U content1_content2_content3_content4-tracked
273 U content1_content2_content3_content4-untracked
273 U content1_content2_content3_content4-untracked
274 U content1_content2_content3_missing-tracked
274 U content1_content2_content3_missing-tracked
275 U content1_content2_content3_missing-untracked
275 U content1_content2_content3_missing-untracked
276 R content1_content2_missing_content1-tracked
276 R content1_content2_missing_content1-tracked
277 U content1_content2_missing_content1-untracked
277 U content1_content2_missing_content1-untracked
278 U content1_content2_missing_content2-untracked
278 U content1_content2_missing_content2-untracked
279 U content1_content2_missing_content4-tracked
279 U content1_content2_missing_content4-tracked
280 U content1_content2_missing_content4-untracked
280 U content1_content2_missing_content4-untracked
281 U content1_content2_missing_missing-tracked
281 U content1_content2_missing_missing-tracked
282 U content1_content2_missing_missing-untracked
282 U content1_content2_missing_missing-untracked
283 U content1_missing_content1_content4-tracked
283 U content1_missing_content1_content4-tracked
284 U content1_missing_content3_content3-tracked
284 U content1_missing_content3_content3-tracked
285 U content1_missing_content3_content4-tracked
285 U content1_missing_content3_content4-tracked
286 U content1_missing_missing_content4-tracked
286 U content1_missing_missing_content4-tracked
287 U missing_content2_content2_content4-tracked
287 U missing_content2_content2_content4-tracked
288 U missing_content2_content3_content3-tracked
288 U missing_content2_content3_content3-tracked
289 U missing_content2_content3_content4-tracked
289 U missing_content2_content3_content4-tracked
290 U missing_content2_missing_content4-tracked
290 U missing_content2_missing_content4-tracked
291 U missing_content2_missing_content4-untracked
291 U missing_content2_missing_content4-untracked
292
292
293 Check status and file content
293 Check status and file content
294
294
295 Some files get added (e.g. content1_content2_content1_content1-untracked)
295 Some files get added (e.g. content1_content2_content1_content1-untracked)
296
296
297 It is not intuitive that content1_content2_content1_content4-tracked gets
297 It is not intuitive that content1_content2_content1_content4-tracked gets
298 merged while content1_content2_content1_content4-untracked gets overwritten.
298 merged while content1_content2_content1_content4-untracked gets overwritten.
299 Any *_content2_*-untracked triggers the modified/deleted prompt and then gets
299 Any *_content2_*-untracked triggers the modified/deleted prompt and then gets
300 overwritten.
300 overwritten.
301
301
302 A lot of untracked files become tracked, for example
302 A lot of untracked files become tracked, for example
303 content1_content2_content2_content2-untracked.
303 content1_content2_content2_content2-untracked.
304
304
305 *_missing_missing_missing-tracked is reported as removed ('R'), which
305 *_missing_missing_missing-tracked is reported as removed ('R'), which
306 doesn't make sense since the file did not exist in the parent, but on the
306 doesn't make sense since the file did not exist in the parent, but on the
307 other hand, merged-in additions are reported as modifications, which is
307 other hand, merged-in additions are reported as modifications, which is
308 almost as strange.
308 almost as strange.
309
309
310 missing_missing_content3_missing-tracked becomes removed ('R'), even though
310 missing_missing_content3_missing-tracked becomes removed ('R'), even though
311 the remote side did not touch the file
311 the remote side did not touch the file
312
312
313 $ checkstatus() {
313 $ checkstatus() {
314 > for f in `"$PYTHON" $TESTDIR/generate-working-copy-states.py filelist 3`
314 > for f in `"$PYTHON" $TESTDIR/generate-working-copy-states.py filelist 3`
315 > do
315 > do
316 > echo
316 > echo
317 > hg status -A $f
317 > hg status -A $f
318 > if test -f $f
318 > if test -f $f
319 > then
319 > then
320 > cat $f
320 > cat $f
321 > else
321 > else
322 > echo '<missing>'
322 > echo '<missing>'
323 > fi
323 > fi
324 > done
324 > done
325 > }
325 > }
326 $ checkstatus 2>&1 | tee $TESTTMP/status1
326 $ checkstatus 2>&1 | tee $TESTTMP/status1
327
327
328 C content1_content1_content1_content1-tracked
328 C content1_content1_content1_content1-tracked
329 content1
329 content1
330
330
331 R content1_content1_content1_content1-untracked
331 R content1_content1_content1_content1-untracked
332 content1
332 content1
333
333
334 M content1_content1_content1_content4-tracked
334 M content1_content1_content1_content4-tracked
335 content4
335 content4
336
336
337 R content1_content1_content1_content4-untracked
337 R content1_content1_content1_content4-untracked
338 content4
338 content4
339
339
340 ! content1_content1_content1_missing-tracked
340 ! content1_content1_content1_missing-tracked
341 <missing>
341 <missing>
342
342
343 R content1_content1_content1_missing-untracked
343 R content1_content1_content1_missing-untracked
344 <missing>
344 <missing>
345
345
346 M content1_content1_content3_content1-tracked
346 M content1_content1_content3_content1-tracked
347 content1
347 content1
348
348
349 R content1_content1_content3_content1-untracked
349 R content1_content1_content3_content1-untracked
350 content1
350 content1
351
351
352 C content1_content1_content3_content3-tracked
352 C content1_content1_content3_content3-tracked
353 content3
353 content3
354
354
355 R content1_content1_content3_content3-untracked
355 R content1_content1_content3_content3-untracked
356 content3
356 content3
357
357
358 M content1_content1_content3_content4-tracked
358 M content1_content1_content3_content4-tracked
359 content4
359 content4
360
360
361 R content1_content1_content3_content4-untracked
361 R content1_content1_content3_content4-untracked
362 content4
362 content4
363
363
364 ! content1_content1_content3_missing-tracked
364 ! content1_content1_content3_missing-tracked
365 <missing>
365 <missing>
366
366
367 R content1_content1_content3_missing-untracked
367 R content1_content1_content3_missing-untracked
368 <missing>
368 <missing>
369
369
370 A content1_content1_missing_content1-tracked
370 A content1_content1_missing_content1-tracked
371 content1
371 content1
372
372
373 ? content1_content1_missing_content1-untracked
373 ? content1_content1_missing_content1-untracked
374 content1
374 content1
375
375
376 A content1_content1_missing_content4-tracked
376 A content1_content1_missing_content4-tracked
377 content4
377 content4
378
378
379 ? content1_content1_missing_content4-untracked
379 ? content1_content1_missing_content4-untracked
380 content4
380 content4
381
381
382 ! content1_content1_missing_missing-tracked
382 ! content1_content1_missing_missing-tracked
383 <missing>
383 <missing>
384
384
385 content1_content1_missing_missing-untracked: * (glob)
385 content1_content1_missing_missing-untracked: * (glob)
386 <missing>
386 <missing>
387
387
388 M content1_content2_content1_content1-tracked
388 M content1_content2_content1_content1-tracked
389 content2
389 content2
390
390
391 M content1_content2_content1_content1-untracked
391 M content1_content2_content1_content1-untracked
392 content2
392 content2
393
393
394 M content1_content2_content1_content2-tracked
394 M content1_content2_content1_content2-tracked
395 content2
395 content2
396
396
397 M content1_content2_content1_content2-untracked
397 M content1_content2_content1_content2-untracked
398 content2
398 content2
399
399
400 M content1_content2_content1_content4-tracked
400 M content1_content2_content1_content4-tracked
401 <<<<<<< working copy: 0447570f1af6 - test: local
401 <<<<<<< working copy: 0447570f1af6 - test: local
402 content4
402 content4
403 ||||||| base
403 ||||||| base
404 content1
404 content1
405 =======
405 =======
406 content2
406 content2
407 >>>>>>> merge rev: 85100b8c675b - test: remote
407 >>>>>>> merge rev: 85100b8c675b - test: remote
408
408
409 M content1_content2_content1_content4-untracked
409 M content1_content2_content1_content4-untracked
410 content2
410 content2
411
411
412 M content1_content2_content1_missing-tracked
412 M content1_content2_content1_missing-tracked
413 content2
413 content2
414
414
415 M content1_content2_content1_missing-untracked
415 M content1_content2_content1_missing-untracked
416 content2
416 content2
417
417
418 M content1_content2_content2_content1-tracked
418 M content1_content2_content2_content1-tracked
419 content2
419 content2
420
420
421 M content1_content2_content2_content1-untracked
421 M content1_content2_content2_content1-untracked
422 content2
422 content2
423
423
424 C content1_content2_content2_content2-tracked
424 C content1_content2_content2_content2-tracked
425 content2
425 content2
426
426
427 M content1_content2_content2_content2-untracked
427 M content1_content2_content2_content2-untracked
428 content2
428 content2
429
429
430 M content1_content2_content2_content4-tracked
430 M content1_content2_content2_content4-tracked
431 <<<<<<< working copy: 0447570f1af6 - test: local
431 <<<<<<< working copy: 0447570f1af6 - test: local
432 content4
432 content4
433 ||||||| base
433 ||||||| base
434 content1
434 content1
435 =======
435 =======
436 content2
436 content2
437 >>>>>>> merge rev: 85100b8c675b - test: remote
437 >>>>>>> merge rev: 85100b8c675b - test: remote
438
438
439 M content1_content2_content2_content4-untracked
439 M content1_content2_content2_content4-untracked
440 content2
440 content2
441
441
442 M content1_content2_content2_missing-tracked
442 M content1_content2_content2_missing-tracked
443 content2
443 content2
444
444
445 M content1_content2_content2_missing-untracked
445 M content1_content2_content2_missing-untracked
446 content2
446 content2
447
447
448 M content1_content2_content3_content1-tracked
448 M content1_content2_content3_content1-tracked
449 content2
449 content2
450
450
451 M content1_content2_content3_content1-untracked
451 M content1_content2_content3_content1-untracked
452 content2
452 content2
453
453
454 M content1_content2_content3_content2-tracked
454 M content1_content2_content3_content2-tracked
455 content2
455 content2
456
456
457 M content1_content2_content3_content2-untracked
457 M content1_content2_content3_content2-untracked
458 content2
458 content2
459
459
460 M content1_content2_content3_content3-tracked
460 M content1_content2_content3_content3-tracked
461 <<<<<<< working copy: 0447570f1af6 - test: local
461 <<<<<<< working copy: 0447570f1af6 - test: local
462 content3
462 content3
463 ||||||| base
463 ||||||| base
464 content1
464 content1
465 =======
465 =======
466 content2
466 content2
467 >>>>>>> merge rev: 85100b8c675b - test: remote
467 >>>>>>> merge rev: 85100b8c675b - test: remote
468
468
469 M content1_content2_content3_content3-untracked
469 M content1_content2_content3_content3-untracked
470 content2
470 content2
471
471
472 M content1_content2_content3_content4-tracked
472 M content1_content2_content3_content4-tracked
473 <<<<<<< working copy: 0447570f1af6 - test: local
473 <<<<<<< working copy: 0447570f1af6 - test: local
474 content4
474 content4
475 ||||||| base
475 ||||||| base
476 content1
476 content1
477 =======
477 =======
478 content2
478 content2
479 >>>>>>> merge rev: 85100b8c675b - test: remote
479 >>>>>>> merge rev: 85100b8c675b - test: remote
480
480
481 M content1_content2_content3_content4-untracked
481 M content1_content2_content3_content4-untracked
482 content2
482 content2
483
483
484 M content1_content2_content3_missing-tracked
484 M content1_content2_content3_missing-tracked
485 content2
485 content2
486
486
487 M content1_content2_content3_missing-untracked
487 M content1_content2_content3_missing-untracked
488 content2
488 content2
489
489
490 M content1_content2_missing_content1-tracked
490 M content1_content2_missing_content1-tracked
491 content2
491 content2
492
492
493 M content1_content2_missing_content1-untracked
493 M content1_content2_missing_content1-untracked
494 content2
494 content2
495
495
496 M content1_content2_missing_content2-tracked
496 M content1_content2_missing_content2-tracked
497 content2
497 content2
498
498
499 M content1_content2_missing_content2-untracked
499 M content1_content2_missing_content2-untracked
500 content2
500 content2
501
501
502 M content1_content2_missing_content4-tracked
502 M content1_content2_missing_content4-tracked
503 <<<<<<< working copy: 0447570f1af6 - test: local
503 <<<<<<< working copy: 0447570f1af6 - test: local
504 content4
504 content4
505 ||||||| base
505 ||||||| base
506 content1
506 content1
507 =======
507 =======
508 content2
508 content2
509 >>>>>>> merge rev: 85100b8c675b - test: remote
509 >>>>>>> merge rev: 85100b8c675b - test: remote
510
510
511 M content1_content2_missing_content4-untracked
511 M content1_content2_missing_content4-untracked
512 content2
512 content2
513
513
514 M content1_content2_missing_missing-tracked
514 M content1_content2_missing_missing-tracked
515 content2
515 content2
516
516
517 M content1_content2_missing_missing-untracked
517 M content1_content2_missing_missing-untracked
518 content2
518 content2
519
519
520 R content1_missing_content1_content1-tracked
520 R content1_missing_content1_content1-tracked
521 <missing>
521 <missing>
522
522
523 R content1_missing_content1_content1-untracked
523 R content1_missing_content1_content1-untracked
524 content1
524 content1
525
525
526 M content1_missing_content1_content4-tracked
526 M content1_missing_content1_content4-tracked
527 content4
527 content4
528
528
529 R content1_missing_content1_content4-untracked
529 R content1_missing_content1_content4-untracked
530 content4
530 content4
531
531
532 R content1_missing_content1_missing-tracked
532 R content1_missing_content1_missing-tracked
533 <missing>
533 <missing>
534
534
535 R content1_missing_content1_missing-untracked
535 R content1_missing_content1_missing-untracked
536 <missing>
536 <missing>
537
537
538 R content1_missing_content3_content1-tracked
538 R content1_missing_content3_content1-tracked
539 <missing>
539 <missing>
540
540
541 R content1_missing_content3_content1-untracked
541 R content1_missing_content3_content1-untracked
542 content1
542 content1
543
543
544 C content1_missing_content3_content3-tracked
544 C content1_missing_content3_content3-tracked
545 content3
545 content3
546
546
547 R content1_missing_content3_content3-untracked
547 R content1_missing_content3_content3-untracked
548 content3
548 content3
549
549
550 M content1_missing_content3_content4-tracked
550 M content1_missing_content3_content4-tracked
551 content4
551 content4
552
552
553 R content1_missing_content3_content4-untracked
553 R content1_missing_content3_content4-untracked
554 content4
554 content4
555
555
556 R content1_missing_content3_missing-tracked
556 R content1_missing_content3_missing-tracked
557 <missing>
557 <missing>
558
558
559 R content1_missing_content3_missing-untracked
559 R content1_missing_content3_missing-untracked
560 <missing>
560 <missing>
561
561
562 R content1_missing_missing_content1-tracked
562 R content1_missing_missing_content1-tracked
563 <missing>
563 <missing>
564
564
565 ? content1_missing_missing_content1-untracked
565 ? content1_missing_missing_content1-untracked
566 content1
566 content1
567
567
568 A content1_missing_missing_content4-tracked
568 A content1_missing_missing_content4-tracked
569 content4
569 content4
570
570
571 ? content1_missing_missing_content4-untracked
571 ? content1_missing_missing_content4-untracked
572 content4
572 content4
573
573
574 R content1_missing_missing_missing-tracked
574 R content1_missing_missing_missing-tracked
575 <missing>
575 <missing>
576
576
577 content1_missing_missing_missing-untracked: * (glob)
577 content1_missing_missing_missing-untracked: * (glob)
578 <missing>
578 <missing>
579
579
580 C missing_content2_content2_content2-tracked
580 C missing_content2_content2_content2-tracked
581 content2
581 content2
582
582
583 M missing_content2_content2_content2-untracked
583 M missing_content2_content2_content2-untracked
584 content2
584 content2
585
585
586 M missing_content2_content2_content4-tracked
586 M missing_content2_content2_content4-tracked
587 <<<<<<< working copy: 0447570f1af6 - test: local
587 <<<<<<< working copy: 0447570f1af6 - test: local
588 content4
588 content4
589 ||||||| base
589 ||||||| base
590 =======
590 =======
591 content2
591 content2
592 >>>>>>> merge rev: 85100b8c675b - test: remote
592 >>>>>>> merge rev: 85100b8c675b - test: remote
593
593
594 M missing_content2_content2_content4-untracked
594 M missing_content2_content2_content4-untracked
595 content2
595 content2
596
596
597 M missing_content2_content2_missing-tracked
597 M missing_content2_content2_missing-tracked
598 content2
598 content2
599
599
600 M missing_content2_content2_missing-untracked
600 M missing_content2_content2_missing-untracked
601 content2
601 content2
602
602
603 M missing_content2_content3_content2-tracked
603 M missing_content2_content3_content2-tracked
604 content2
604 content2
605
605
606 M missing_content2_content3_content2-untracked
606 M missing_content2_content3_content2-untracked
607 content2
607 content2
608
608
609 M missing_content2_content3_content3-tracked
609 M missing_content2_content3_content3-tracked
610 <<<<<<< working copy: 0447570f1af6 - test: local
610 <<<<<<< working copy: 0447570f1af6 - test: local
611 content3
611 content3
612 ||||||| base
612 ||||||| base
613 =======
613 =======
614 content2
614 content2
615 >>>>>>> merge rev: 85100b8c675b - test: remote
615 >>>>>>> merge rev: 85100b8c675b - test: remote
616
616
617 M missing_content2_content3_content3-untracked
617 M missing_content2_content3_content3-untracked
618 content2
618 content2
619
619
620 M missing_content2_content3_content4-tracked
620 M missing_content2_content3_content4-tracked
621 <<<<<<< working copy: 0447570f1af6 - test: local
621 <<<<<<< working copy: 0447570f1af6 - test: local
622 content4
622 content4
623 ||||||| base
623 ||||||| base
624 =======
624 =======
625 content2
625 content2
626 >>>>>>> merge rev: 85100b8c675b - test: remote
626 >>>>>>> merge rev: 85100b8c675b - test: remote
627
627
628 M missing_content2_content3_content4-untracked
628 M missing_content2_content3_content4-untracked
629 content2
629 content2
630
630
631 M missing_content2_content3_missing-tracked
631 M missing_content2_content3_missing-tracked
632 content2
632 content2
633
633
634 M missing_content2_content3_missing-untracked
634 M missing_content2_content3_missing-untracked
635 content2
635 content2
636
636
637 M missing_content2_missing_content2-tracked
637 M missing_content2_missing_content2-tracked
638 content2
638 content2
639
639
640 M missing_content2_missing_content2-untracked
640 M missing_content2_missing_content2-untracked
641 content2
641 content2
642
642
643 M missing_content2_missing_content4-tracked
643 M missing_content2_missing_content4-tracked
644 <<<<<<< working copy: 0447570f1af6 - test: local
644 <<<<<<< working copy: 0447570f1af6 - test: local
645 content4
645 content4
646 ||||||| base
646 ||||||| base
647 =======
647 =======
648 content2
648 content2
649 >>>>>>> merge rev: 85100b8c675b - test: remote
649 >>>>>>> merge rev: 85100b8c675b - test: remote
650
650
651 M missing_content2_missing_content4-untracked
651 M missing_content2_missing_content4-untracked
652 <<<<<<< working copy: 0447570f1af6 - test: local
652 <<<<<<< working copy: 0447570f1af6 - test: local
653 content4
653 content4
654 ||||||| base
654 ||||||| base
655 =======
655 =======
656 content2
656 content2
657 >>>>>>> merge rev: 85100b8c675b - test: remote
657 >>>>>>> merge rev: 85100b8c675b - test: remote
658
658
659 M missing_content2_missing_missing-tracked
659 M missing_content2_missing_missing-tracked
660 content2
660 content2
661
661
662 M missing_content2_missing_missing-untracked
662 M missing_content2_missing_missing-untracked
663 content2
663 content2
664
664
665 C missing_missing_content3_content3-tracked
665 C missing_missing_content3_content3-tracked
666 content3
666 content3
667
667
668 R missing_missing_content3_content3-untracked
668 R missing_missing_content3_content3-untracked
669 content3
669 content3
670
670
671 M missing_missing_content3_content4-tracked
671 M missing_missing_content3_content4-tracked
672 content4
672 content4
673
673
674 R missing_missing_content3_content4-untracked
674 R missing_missing_content3_content4-untracked
675 content4
675 content4
676
676
677 R missing_missing_content3_missing-tracked
677 R missing_missing_content3_missing-tracked
678 <missing>
678 <missing>
679
679
680 R missing_missing_content3_missing-untracked
680 R missing_missing_content3_missing-untracked
681 <missing>
681 <missing>
682
682
683 A missing_missing_missing_content4-tracked
683 A missing_missing_missing_content4-tracked
684 content4
684 content4
685
685
686 ? missing_missing_missing_content4-untracked
686 ? missing_missing_missing_content4-untracked
687 content4
687 content4
688
688
689 R missing_missing_missing_missing-tracked
689 R missing_missing_missing_missing-tracked
690 <missing>
690 <missing>
691
691
692 missing_missing_missing_missing-untracked: * (glob)
692 missing_missing_missing_missing-untracked: * (glob)
693 <missing>
693 <missing>
694
694
695 $ for f in `"$PYTHON" $TESTDIR/generate-working-copy-states.py filelist 3`
695 $ for f in `"$PYTHON" $TESTDIR/generate-working-copy-states.py filelist 3`
696 > do
696 > do
697 > if test -f ${f}.orig
697 > if test -f ${f}.orig
698 > then
698 > then
699 > echo ${f}.orig:
699 > echo ${f}.orig:
700 > cat ${f}.orig
700 > cat ${f}.orig
701 > fi
701 > fi
702 > done
702 > done
703 content1_content2_content1_content4-tracked.orig:
703 content1_content2_content1_content4-tracked.orig:
704 content4
704 content4
705 content1_content2_content2_content4-tracked.orig:
705 content1_content2_content2_content4-tracked.orig:
706 content4
706 content4
707 content1_content2_content3_content3-tracked.orig:
707 content1_content2_content3_content3-tracked.orig:
708 content3
708 content3
709 content1_content2_content3_content4-tracked.orig:
709 content1_content2_content3_content4-tracked.orig:
710 content4
710 content4
711 content1_content2_missing_content4-tracked.orig:
711 content1_content2_missing_content4-tracked.orig:
712 content4
712 content4
713 missing_content2_content2_content4-tracked.orig:
713 missing_content2_content2_content4-tracked.orig:
714 content4
714 content4
715 missing_content2_content3_content3-tracked.orig:
715 missing_content2_content3_content3-tracked.orig:
716 content3
716 content3
717 missing_content2_content3_content4-tracked.orig:
717 missing_content2_content3_content4-tracked.orig:
718 content4
718 content4
719 missing_content2_missing_content4-tracked.orig:
719 missing_content2_missing_content4-tracked.orig:
720 content4
720 content4
721 missing_content2_missing_content4-untracked.orig:
721 missing_content2_missing_content4-untracked.orig:
722 content4
722 content4
723
723
724 Re-resolve and check status
724 Re-resolve and check status
725
725
726 $ hg resolve --unmark --all
726 $ hg resolve --unmark --all
727 $ hg resolve --all --tool :local
727 $ hg resolve --all --tool :local
728 (no more unresolved files)
728 (no more unresolved files)
729 $ hg resolve --unmark --all
729 $ hg resolve --unmark --all
730 $ hg resolve --all --tool internal:merge3
730 $ hg resolve --all --tool internal:merge3
731 file 'content1_content2_content1_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
731 file 'content1_content2_content1_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
732 What do you want to do?
732 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
733 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
733 What do you want to do? u
734 file 'content1_content2_content1_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
734 file 'content1_content2_content1_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
735 What do you want to do?
735 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
736 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
736 What do you want to do? u
737 merging content1_content2_content1_content4-tracked
737 merging content1_content2_content1_content4-tracked
738 file 'content1_content2_content1_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
738 file 'content1_content2_content1_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
739 What do you want to do?
739 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
740 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
740 What do you want to do? u
741 file 'content1_content2_content1_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
741 file 'content1_content2_content1_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
742 What do you want to do?
742 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
743 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
743 What do you want to do? u
744 file 'content1_content2_content1_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
744 file 'content1_content2_content1_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
745 What do you want to do?
745 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
746 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
746 What do you want to do? u
747 merging content1_content2_content2_content1-tracked
747 merging content1_content2_content2_content1-tracked
748 file 'content1_content2_content2_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
748 file 'content1_content2_content2_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
749 What do you want to do?
749 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
750 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
750 What do you want to do? u
751 file 'content1_content2_content2_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
751 file 'content1_content2_content2_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
752 What do you want to do?
752 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
753 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
753 What do you want to do? u
754 merging content1_content2_content2_content4-tracked
754 merging content1_content2_content2_content4-tracked
755 file 'content1_content2_content2_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
755 file 'content1_content2_content2_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
756 What do you want to do?
756 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
757 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
757 What do you want to do? u
758 file 'content1_content2_content2_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
758 file 'content1_content2_content2_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
759 What do you want to do?
759 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
760 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
760 What do you want to do? u
761 file 'content1_content2_content2_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
761 file 'content1_content2_content2_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
762 What do you want to do?
762 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
763 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
763 What do you want to do? u
764 merging content1_content2_content3_content1-tracked
764 merging content1_content2_content3_content1-tracked
765 file 'content1_content2_content3_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
765 file 'content1_content2_content3_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
766 What do you want to do?
766 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
767 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
767 What do you want to do? u
768 file 'content1_content2_content3_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
768 file 'content1_content2_content3_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
769 What do you want to do?
769 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
770 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
770 What do you want to do? u
771 merging content1_content2_content3_content3-tracked
771 merging content1_content2_content3_content3-tracked
772 file 'content1_content2_content3_content3-untracked' was deleted in local [working copy] but was modified in other [merge rev].
772 file 'content1_content2_content3_content3-untracked' was deleted in local [working copy] but was modified in other [merge rev].
773 What do you want to do?
773 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
774 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
774 What do you want to do? u
775 merging content1_content2_content3_content4-tracked
775 merging content1_content2_content3_content4-tracked
776 file 'content1_content2_content3_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
776 file 'content1_content2_content3_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
777 What do you want to do?
777 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
778 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
778 What do you want to do? u
779 file 'content1_content2_content3_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
779 file 'content1_content2_content3_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
780 What do you want to do?
780 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
781 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
781 What do you want to do? u
782 file 'content1_content2_content3_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
782 file 'content1_content2_content3_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
783 What do you want to do?
783 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
784 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
784 What do you want to do? u
785 merging content1_content2_missing_content1-tracked
785 merging content1_content2_missing_content1-tracked
786 file 'content1_content2_missing_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
786 file 'content1_content2_missing_content1-untracked' was deleted in local [working copy] but was modified in other [merge rev].
787 What do you want to do?
787 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
788 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
788 What do you want to do? u
789 file 'content1_content2_missing_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
789 file 'content1_content2_missing_content2-untracked' was deleted in local [working copy] but was modified in other [merge rev].
790 What do you want to do?
790 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
791 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
791 What do you want to do? u
792 merging content1_content2_missing_content4-tracked
792 merging content1_content2_missing_content4-tracked
793 file 'content1_content2_missing_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
793 file 'content1_content2_missing_content4-untracked' was deleted in local [working copy] but was modified in other [merge rev].
794 What do you want to do?
794 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
795 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
795 What do you want to do? u
796 file 'content1_content2_missing_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
796 file 'content1_content2_missing_missing-tracked' was deleted in local [working copy] but was modified in other [merge rev].
797 What do you want to do?
797 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
798 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
798 What do you want to do? u
799 file 'content1_content2_missing_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
799 file 'content1_content2_missing_missing-untracked' was deleted in local [working copy] but was modified in other [merge rev].
800 What do you want to do?
800 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
801 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
801 What do you want to do? u
802 file 'content1_missing_content1_content4-tracked' was deleted in other [merge rev] but was modified in local [working copy].
802 file 'content1_missing_content1_content4-tracked' was deleted in other [merge rev] but was modified in local [working copy].
803 What do you want to do?
803 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
804 use (c)hanged version, (d)elete, or leave (u)nresolved? u
804 What do you want to do? u
805 file 'content1_missing_content3_content3-tracked' was deleted in other [merge rev] but was modified in local [working copy].
805 file 'content1_missing_content3_content3-tracked' was deleted in other [merge rev] but was modified in local [working copy].
806 What do you want to do?
806 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
807 use (c)hanged version, (d)elete, or leave (u)nresolved? u
807 What do you want to do? u
808 file 'content1_missing_content3_content4-tracked' was deleted in other [merge rev] but was modified in local [working copy].
808 file 'content1_missing_content3_content4-tracked' was deleted in other [merge rev] but was modified in local [working copy].
809 What do you want to do?
809 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
810 use (c)hanged version, (d)elete, or leave (u)nresolved? u
810 What do you want to do? u
811 file 'content1_missing_missing_content4-tracked' was deleted in other [merge rev] but was modified in local [working copy].
811 file 'content1_missing_missing_content4-tracked' was deleted in other [merge rev] but was modified in local [working copy].
812 What do you want to do?
812 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
813 use (c)hanged version, (d)elete, or leave (u)nresolved? u
813 What do you want to do? u
814 merging missing_content2_content2_content4-tracked
814 merging missing_content2_content2_content4-tracked
815 merging missing_content2_content3_content3-tracked
815 merging missing_content2_content3_content3-tracked
816 merging missing_content2_content3_content4-tracked
816 merging missing_content2_content3_content4-tracked
817 merging missing_content2_missing_content4-tracked
817 merging missing_content2_missing_content4-tracked
818 merging missing_content2_missing_content4-untracked
818 merging missing_content2_missing_content4-untracked
819 warning: conflicts while merging content1_content2_content1_content4-tracked! (edit, then use 'hg resolve --mark')
819 warning: conflicts while merging content1_content2_content1_content4-tracked! (edit, then use 'hg resolve --mark')
820 warning: conflicts while merging content1_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
820 warning: conflicts while merging content1_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
821 warning: conflicts while merging content1_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
821 warning: conflicts while merging content1_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
822 warning: conflicts while merging content1_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
822 warning: conflicts while merging content1_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
823 warning: conflicts while merging content1_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
823 warning: conflicts while merging content1_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
824 warning: conflicts while merging missing_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
824 warning: conflicts while merging missing_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
825 warning: conflicts while merging missing_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
825 warning: conflicts while merging missing_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
826 warning: conflicts while merging missing_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
826 warning: conflicts while merging missing_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
827 warning: conflicts while merging missing_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
827 warning: conflicts while merging missing_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
828 warning: conflicts while merging missing_content2_missing_content4-untracked! (edit, then use 'hg resolve --mark')
828 warning: conflicts while merging missing_content2_missing_content4-untracked! (edit, then use 'hg resolve --mark')
829 [1]
829 [1]
830 $ checkstatus > $TESTTMP/status2 2>&1
830 $ checkstatus > $TESTTMP/status2 2>&1
831 $ cmp $TESTTMP/status1 $TESTTMP/status2 || diff -U8 $TESTTMP/status1 $TESTTMP/status2
831 $ cmp $TESTTMP/status1 $TESTTMP/status2 || diff -U8 $TESTTMP/status1 $TESTTMP/status2
832
832
833 Set up working directory again
833 Set up working directory again
834
834
835 $ hg -q update --clean 2
835 $ hg -q update --clean 2
836 $ hg --config extensions.purge= purge
836 $ hg --config extensions.purge= purge
837 $ "$PYTHON" $TESTDIR/generate-working-copy-states.py state 3 wc
837 $ "$PYTHON" $TESTDIR/generate-working-copy-states.py state 3 wc
838 $ hg addremove -q --similarity 0
838 $ hg addremove -q --similarity 0
839 $ hg forget *_*_*_*-untracked
839 $ hg forget *_*_*_*-untracked
840 $ rm *_*_*_missing-*
840 $ rm *_*_*_missing-*
841
841
842 Merge with checkunknown = warn, see that behavior is the same as before
842 Merge with checkunknown = warn, see that behavior is the same as before
843 $ hg merge -f --tool internal:merge3 'desc("remote")' --config merge.checkunknown=warn > $TESTTMP/merge-output-2 2>&1
843 $ hg merge -f --tool internal:merge3 'desc("remote")' --config merge.checkunknown=warn > $TESTTMP/merge-output-2 2>&1
844 [1]
844 [1]
845 $ cmp $TESTTMP/merge-output-1 $TESTTMP/merge-output-2 || diff -U8 $TESTTMP/merge-output-1 $TESTTMP/merge-output-2
845 $ cmp $TESTTMP/merge-output-1 $TESTTMP/merge-output-2 || diff -U8 $TESTTMP/merge-output-1 $TESTTMP/merge-output-2
@@ -1,116 +1,116 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 --no-dates
23 $ hg debugstate --no-dates
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 --no-dates
39 $ hg debugstate --no-dates
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 --no-dates
57 $ hg debugstate --no-dates
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 saving current version of foo1 as foo1.orig
72 saving current version of foo1 as foo1.orig
73 reverting bar
73 reverting bar
74 reverting foo1
74 reverting foo1
75
75
76 $ hg debugstate --no-dates
76 $ hg debugstate --no-dates
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 file 'bar' was deleted in local [working copy] but was modified in other [merge rev].
105 file 'bar' was deleted in local [working copy] but was modified in other [merge rev].
106 What do you want to do?
106 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
107 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
107 What do you want to do? u
108 merging foo1 and foo to foo1
108 merging foo1 and foo to foo1
109 0 files updated, 1 files merged, 0 files removed, 1 files unresolved
109 0 files updated, 1 files merged, 0 files removed, 1 files unresolved
110 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
110 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
111 [1]
111 [1]
112 $ cat bar
112 $ cat bar
113 bleh
113 bleh
114 $ hg st
114 $ hg st
115 M bar
115 M bar
116 M foo1
116 M foo1
@@ -1,141 +1,141 b''
1 $ hg init
1 $ hg init
2
2
3 $ echo a > a
3 $ echo a > a
4 $ hg ci -qAm 'add a'
4 $ hg ci -qAm 'add a'
5
5
6 $ hg init subrepo
6 $ hg init subrepo
7 $ echo 'subrepo = http://example.net/libfoo' > .hgsub
7 $ echo 'subrepo = http://example.net/libfoo' > .hgsub
8 $ hg ci -qAm 'added subrepo'
8 $ hg ci -qAm 'added subrepo'
9
9
10 $ hg up -qC 0
10 $ hg up -qC 0
11 $ echo ax > a
11 $ echo ax > a
12 $ hg ci -m 'changed a'
12 $ hg ci -m 'changed a'
13 created new head
13 created new head
14
14
15 $ hg up -qC 1
15 $ hg up -qC 1
16 $ cd subrepo
16 $ cd subrepo
17 $ echo b > b
17 $ echo b > b
18 $ hg add b
18 $ hg add b
19 $ cd ..
19 $ cd ..
20
20
21 Should fail, since there are added files to subrepo:
21 Should fail, since there are added files to subrepo:
22
22
23 $ hg merge
23 $ hg merge
24 abort: uncommitted changes in subrepository "subrepo"
24 abort: uncommitted changes in subrepository "subrepo"
25 [255]
25 [255]
26
26
27 Deleted files trigger a '+' marker in top level repos. Deleted files are also
27 Deleted files trigger a '+' marker in top level repos. Deleted files are also
28 noticed by `update --check` in the top level repo.
28 noticed by `update --check` in the top level repo.
29
29
30 $ hg ci -Sqm 'add b'
30 $ hg ci -Sqm 'add b'
31 $ echo change > subrepo/b
31 $ echo change > subrepo/b
32
32
33 $ hg ci -Sm 'change b'
33 $ hg ci -Sm 'change b'
34 committing subrepository subrepo
34 committing subrepository subrepo
35
35
36 $ rm a
36 $ rm a
37 $ hg id
37 $ hg id
38 9bfe45a197d7+ tip
38 9bfe45a197d7+ tip
39 $ hg sum
39 $ hg sum
40 parent: 4:9bfe45a197d7 tip
40 parent: 4:9bfe45a197d7 tip
41 change b
41 change b
42 branch: default
42 branch: default
43 commit: 1 deleted (clean)
43 commit: 1 deleted (clean)
44 update: 1 new changesets, 2 branch heads (merge)
44 update: 1 new changesets, 2 branch heads (merge)
45 phases: 5 draft
45 phases: 5 draft
46
46
47 $ hg up --check -r '.^'
47 $ hg up --check -r '.^'
48 abort: uncommitted changes
48 abort: uncommitted changes
49 [255]
49 [255]
50 $ hg st -S
50 $ hg st -S
51 ! a
51 ! a
52 $ hg up -Cq .
52 $ hg up -Cq .
53
53
54 Test that dirty is consistent through subrepos
54 Test that dirty is consistent through subrepos
55
55
56 $ rm subrepo/b
56 $ rm subrepo/b
57
57
58 A deleted subrepo file is flagged as dirty, like the top level repo
58 A deleted subrepo file is flagged as dirty, like the top level repo
59
59
60 $ hg id --config extensions.blackbox= --config blackbox.dirty=True \
60 $ hg id --config extensions.blackbox= --config blackbox.dirty=True \
61 > --config blackbox.track='command commandfinish'
61 > --config blackbox.track='command commandfinish'
62 9bfe45a197d7+ tip
62 9bfe45a197d7+ tip
63 $ cat .hg/blackbox.log
63 $ cat .hg/blackbox.log
64 * @9bfe45a197d7b0ab09bf287729dd57e9619c9da5+ (*)> serve --cmdserver chgunix * (glob) (chg !)
64 * @9bfe45a197d7b0ab09bf287729dd57e9619c9da5+ (*)> serve --cmdserver chgunix * (glob) (chg !)
65 * @9bfe45a197d7b0ab09bf287729dd57e9619c9da5+ (*)> id --config *extensions.blackbox=* --config *blackbox.dirty=True* (glob)
65 * @9bfe45a197d7b0ab09bf287729dd57e9619c9da5+ (*)> id --config *extensions.blackbox=* --config *blackbox.dirty=True* (glob)
66 * @9bfe45a197d7b0ab09bf287729dd57e9619c9da5+ (*)> id --config *extensions.blackbox=* --config *blackbox.dirty=True* exited 0 * (glob)
66 * @9bfe45a197d7b0ab09bf287729dd57e9619c9da5+ (*)> id --config *extensions.blackbox=* --config *blackbox.dirty=True* exited 0 * (glob)
67
67
68 TODO: a deleted file should be listed as such, like the top level repo
68 TODO: a deleted file should be listed as such, like the top level repo
69
69
70 $ hg sum
70 $ hg sum
71 parent: 4:9bfe45a197d7 tip
71 parent: 4:9bfe45a197d7 tip
72 change b
72 change b
73 branch: default
73 branch: default
74 commit: (clean)
74 commit: (clean)
75 update: 1 new changesets, 2 branch heads (merge)
75 update: 1 new changesets, 2 branch heads (merge)
76 phases: 5 draft
76 phases: 5 draft
77
77
78 Modified subrepo files are noticed by `update --check` and `summary`
78 Modified subrepo files are noticed by `update --check` and `summary`
79
79
80 $ echo mod > subrepo/b
80 $ echo mod > subrepo/b
81 $ hg st -S
81 $ hg st -S
82 M subrepo/b
82 M subrepo/b
83
83
84 $ hg up -r '.^' --check
84 $ hg up -r '.^' --check
85 abort: uncommitted changes in subrepository "subrepo"
85 abort: uncommitted changes in subrepository "subrepo"
86 [255]
86 [255]
87
87
88 $ hg sum
88 $ hg sum
89 parent: 4:9bfe45a197d7 tip
89 parent: 4:9bfe45a197d7 tip
90 change b
90 change b
91 branch: default
91 branch: default
92 commit: 1 subrepos
92 commit: 1 subrepos
93 update: 1 new changesets, 2 branch heads (merge)
93 update: 1 new changesets, 2 branch heads (merge)
94 phases: 5 draft
94 phases: 5 draft
95
95
96 TODO: why is -R needed here? If it's because the subrepo is treated as a
96 TODO: why is -R needed here? If it's because the subrepo is treated as a
97 discrete unit, then this should probably warn or something.
97 discrete unit, then this should probably warn or something.
98 $ hg revert -R subrepo --no-backup subrepo/b -r .
98 $ hg revert -R subrepo --no-backup subrepo/b -r .
99
99
100 $ rm subrepo/b
100 $ rm subrepo/b
101 $ hg st -S
101 $ hg st -S
102 ! subrepo/b
102 ! subrepo/b
103
103
104 `hg update --check` notices a subrepo with a missing file, like it notices a
104 `hg update --check` notices a subrepo with a missing file, like it notices a
105 missing file in the top level repo.
105 missing file in the top level repo.
106
106
107 $ hg up -r '.^' --check
107 $ hg up -r '.^' --check
108 abort: uncommitted changes in subrepository "subrepo"
108 abort: uncommitted changes in subrepository "subrepo"
109 [255]
109 [255]
110
110
111 $ hg up -r '.^' --config ui.interactive=True << EOF
111 $ hg up -r '.^' --config ui.interactive=True << EOF
112 > d
112 > d
113 > EOF
113 > EOF
114 file 'b' was deleted in local [working copy] but was modified in other [destination].
114 file 'b' was deleted in local [working copy] but was modified in other [destination].
115 What do you want to do?
115 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
116 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? d
116 What do you want to do? d
117 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
117 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
118
118
119 XXX: There's a difference between wdir() and '.', so there should be a status.
119 XXX: There's a difference between wdir() and '.', so there should be a status.
120 `hg files -S` from the top is also missing 'subrepo/b'.
120 `hg files -S` from the top is also missing 'subrepo/b'.
121
121
122 $ hg st -S
122 $ hg st -S
123 $ hg st -R subrepo
123 $ hg st -R subrepo
124 $ hg files -R subrepo
124 $ hg files -R subrepo
125 [1]
125 [1]
126 $ hg files -R subrepo -r '.'
126 $ hg files -R subrepo -r '.'
127 subrepo/b
127 subrepo/b
128
128
129 $ hg bookmark -r tip @other
129 $ hg bookmark -r tip @other
130 $ echo xyz > subrepo/c
130 $ echo xyz > subrepo/c
131 $ hg ci -SAm 'add c'
131 $ hg ci -SAm 'add c'
132 adding subrepo/c
132 adding subrepo/c
133 committing subrepository subrepo
133 committing subrepository subrepo
134 created new head
134 created new head
135 $ rm subrepo/c
135 $ rm subrepo/c
136
136
137 Merge sees deleted subrepo files as an uncommitted change
137 Merge sees deleted subrepo files as an uncommitted change
138
138
139 $ hg merge @other
139 $ hg merge @other
140 abort: uncommitted changes in subrepository "subrepo"
140 abort: uncommitted changes in subrepository "subrepo"
141 [255]
141 [255]
@@ -1,2074 +1,2088 b''
1 test merge-tools configuration - mostly exercising filemerge.py
1 test merge-tools configuration - mostly exercising filemerge.py
2
2
3 $ unset HGMERGE # make sure HGMERGE doesn't interfere with the test
3 $ unset HGMERGE # make sure HGMERGE doesn't interfere with the test
4 $ cat >> $HGRCPATH << EOF
4 $ cat >> $HGRCPATH << EOF
5 > [ui]
5 > [ui]
6 > merge=
6 > merge=
7 > EOF
7 > EOF
8 $ hg init repo
8 $ hg init repo
9 $ cd repo
9 $ cd repo
10
10
11 revision 0
11 revision 0
12
12
13 $ echo "revision 0" > f
13 $ echo "revision 0" > f
14 $ echo "space" >> f
14 $ echo "space" >> f
15 $ hg commit -Am "revision 0"
15 $ hg commit -Am "revision 0"
16 adding f
16 adding f
17
17
18 revision 1
18 revision 1
19
19
20 $ echo "revision 1" > f
20 $ echo "revision 1" > f
21 $ echo "space" >> f
21 $ echo "space" >> f
22 $ hg commit -Am "revision 1"
22 $ hg commit -Am "revision 1"
23 $ hg update 0 > /dev/null
23 $ hg update 0 > /dev/null
24
24
25 revision 2
25 revision 2
26
26
27 $ echo "revision 2" > f
27 $ echo "revision 2" > f
28 $ echo "space" >> f
28 $ echo "space" >> f
29 $ hg commit -Am "revision 2"
29 $ hg commit -Am "revision 2"
30 created new head
30 created new head
31 $ hg update 0 > /dev/null
31 $ hg update 0 > /dev/null
32
32
33 revision 3 - simple to merge
33 revision 3 - simple to merge
34
34
35 $ echo "revision 3" >> f
35 $ echo "revision 3" >> f
36 $ hg commit -Am "revision 3"
36 $ hg commit -Am "revision 3"
37 created new head
37 created new head
38
38
39 revision 4 - hard to merge
39 revision 4 - hard to merge
40
40
41 $ hg update 0 > /dev/null
41 $ hg update 0 > /dev/null
42 $ echo "revision 4" > f
42 $ echo "revision 4" > f
43 $ hg commit -Am "revision 4"
43 $ hg commit -Am "revision 4"
44 created new head
44 created new head
45
45
46 $ echo "[merge-tools]" > .hg/hgrc
46 $ echo "[merge-tools]" > .hg/hgrc
47
47
48 $ beforemerge() {
48 $ beforemerge() {
49 > cat .hg/hgrc
49 > cat .hg/hgrc
50 > echo "# hg update -C 1"
50 > echo "# hg update -C 1"
51 > hg update -C 1 > /dev/null
51 > hg update -C 1 > /dev/null
52 > }
52 > }
53 $ aftermerge() {
53 $ aftermerge() {
54 > echo "# cat f"
54 > echo "# cat f"
55 > cat f
55 > cat f
56 > echo "# hg stat"
56 > echo "# hg stat"
57 > hg stat
57 > hg stat
58 > echo "# hg resolve --list"
58 > echo "# hg resolve --list"
59 > hg resolve --list
59 > hg resolve --list
60 > rm -f f.orig
60 > rm -f f.orig
61 > }
61 > }
62
62
63 Tool selection
63 Tool selection
64
64
65 default is internal merge:
65 default is internal merge:
66
66
67 $ beforemerge
67 $ beforemerge
68 [merge-tools]
68 [merge-tools]
69 # hg update -C 1
69 # hg update -C 1
70
70
71 hg merge -r 2
71 hg merge -r 2
72 override $PATH to ensure hgmerge not visible; use $PYTHON in case we're
72 override $PATH to ensure hgmerge not visible; use $PYTHON in case we're
73 running from a devel copy, not a temp installation
73 running from a devel copy, not a temp installation
74
74
75 $ PATH="$BINDIR:/usr/sbin" "$PYTHON" "$BINDIR"/hg merge -r 2
75 $ PATH="$BINDIR:/usr/sbin" "$PYTHON" "$BINDIR"/hg merge -r 2
76 merging f
76 merging f
77 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
77 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
78 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
78 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
79 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
79 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
80 [1]
80 [1]
81 $ aftermerge
81 $ aftermerge
82 # cat f
82 # cat f
83 <<<<<<< working copy: ef83787e2614 - test: revision 1
83 <<<<<<< working copy: ef83787e2614 - test: revision 1
84 revision 1
84 revision 1
85 =======
85 =======
86 revision 2
86 revision 2
87 >>>>>>> merge rev: 0185f4e0cf02 - test: revision 2
87 >>>>>>> merge rev: 0185f4e0cf02 - test: revision 2
88 space
88 space
89 # hg stat
89 # hg stat
90 M f
90 M f
91 ? f.orig
91 ? f.orig
92 # hg resolve --list
92 # hg resolve --list
93 U f
93 U f
94
94
95 simplest hgrc using false for merge:
95 simplest hgrc using false for merge:
96
96
97 $ echo "false.whatever=" >> .hg/hgrc
97 $ echo "false.whatever=" >> .hg/hgrc
98 $ beforemerge
98 $ beforemerge
99 [merge-tools]
99 [merge-tools]
100 false.whatever=
100 false.whatever=
101 # hg update -C 1
101 # hg update -C 1
102 $ hg merge -r 2
102 $ hg merge -r 2
103 merging f
103 merging f
104 merging f failed!
104 merging f failed!
105 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
105 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
106 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
106 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
107 [1]
107 [1]
108 $ aftermerge
108 $ aftermerge
109 # cat f
109 # cat f
110 revision 1
110 revision 1
111 space
111 space
112 # hg stat
112 # hg stat
113 M f
113 M f
114 ? f.orig
114 ? f.orig
115 # hg resolve --list
115 # hg resolve --list
116 U f
116 U f
117
117
118 #if unix-permissions
118 #if unix-permissions
119
119
120 unexecutable file in $PATH shouldn't be found:
120 unexecutable file in $PATH shouldn't be found:
121
121
122 $ echo "echo fail" > false
122 $ echo "echo fail" > false
123 $ hg up -qC 1
123 $ hg up -qC 1
124 $ PATH="`pwd`:$BINDIR:/usr/sbin" "$PYTHON" "$BINDIR"/hg merge -r 2
124 $ PATH="`pwd`:$BINDIR:/usr/sbin" "$PYTHON" "$BINDIR"/hg merge -r 2
125 merging f
125 merging f
126 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
126 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
127 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
127 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
128 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
128 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
129 [1]
129 [1]
130 $ rm false
130 $ rm false
131
131
132 #endif
132 #endif
133
133
134 executable directory in $PATH shouldn't be found:
134 executable directory in $PATH shouldn't be found:
135
135
136 $ mkdir false
136 $ mkdir false
137 $ hg up -qC 1
137 $ hg up -qC 1
138 $ PATH="`pwd`:$BINDIR:/usr/sbin" "$PYTHON" "$BINDIR"/hg merge -r 2
138 $ PATH="`pwd`:$BINDIR:/usr/sbin" "$PYTHON" "$BINDIR"/hg merge -r 2
139 merging f
139 merging f
140 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
140 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
141 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
141 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
142 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
142 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
143 [1]
143 [1]
144 $ rmdir false
144 $ rmdir false
145
145
146 true with higher .priority gets precedence:
146 true with higher .priority gets precedence:
147
147
148 $ echo "true.priority=1" >> .hg/hgrc
148 $ echo "true.priority=1" >> .hg/hgrc
149 $ beforemerge
149 $ beforemerge
150 [merge-tools]
150 [merge-tools]
151 false.whatever=
151 false.whatever=
152 true.priority=1
152 true.priority=1
153 # hg update -C 1
153 # hg update -C 1
154 $ hg merge -r 2
154 $ hg merge -r 2
155 merging f
155 merging f
156 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
156 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
157 (branch merge, don't forget to commit)
157 (branch merge, don't forget to commit)
158 $ aftermerge
158 $ aftermerge
159 # cat f
159 # cat f
160 revision 1
160 revision 1
161 space
161 space
162 # hg stat
162 # hg stat
163 M f
163 M f
164 # hg resolve --list
164 # hg resolve --list
165 R f
165 R f
166
166
167 unless lowered on command line:
167 unless lowered on command line:
168
168
169 $ beforemerge
169 $ beforemerge
170 [merge-tools]
170 [merge-tools]
171 false.whatever=
171 false.whatever=
172 true.priority=1
172 true.priority=1
173 # hg update -C 1
173 # hg update -C 1
174 $ hg merge -r 2 --config merge-tools.true.priority=-7
174 $ hg merge -r 2 --config merge-tools.true.priority=-7
175 merging f
175 merging f
176 merging f failed!
176 merging f failed!
177 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
177 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
178 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
178 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
179 [1]
179 [1]
180 $ aftermerge
180 $ aftermerge
181 # cat f
181 # cat f
182 revision 1
182 revision 1
183 space
183 space
184 # hg stat
184 # hg stat
185 M f
185 M f
186 ? f.orig
186 ? f.orig
187 # hg resolve --list
187 # hg resolve --list
188 U f
188 U f
189
189
190 or false set higher on command line:
190 or false set higher on command line:
191
191
192 $ beforemerge
192 $ beforemerge
193 [merge-tools]
193 [merge-tools]
194 false.whatever=
194 false.whatever=
195 true.priority=1
195 true.priority=1
196 # hg update -C 1
196 # hg update -C 1
197 $ hg merge -r 2 --config merge-tools.false.priority=117
197 $ hg merge -r 2 --config merge-tools.false.priority=117
198 merging f
198 merging f
199 merging f failed!
199 merging f failed!
200 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
200 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
201 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
201 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
202 [1]
202 [1]
203 $ aftermerge
203 $ aftermerge
204 # cat f
204 # cat f
205 revision 1
205 revision 1
206 space
206 space
207 # hg stat
207 # hg stat
208 M f
208 M f
209 ? f.orig
209 ? f.orig
210 # hg resolve --list
210 # hg resolve --list
211 U f
211 U f
212
212
213 or true set to disabled:
213 or true set to disabled:
214 $ beforemerge
214 $ beforemerge
215 [merge-tools]
215 [merge-tools]
216 false.whatever=
216 false.whatever=
217 true.priority=1
217 true.priority=1
218 # hg update -C 1
218 # hg update -C 1
219 $ hg merge -r 2 --config merge-tools.true.disabled=yes
219 $ hg merge -r 2 --config merge-tools.true.disabled=yes
220 merging f
220 merging f
221 merging f failed!
221 merging f failed!
222 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
222 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
223 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
223 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
224 [1]
224 [1]
225 $ aftermerge
225 $ aftermerge
226 # cat f
226 # cat f
227 revision 1
227 revision 1
228 space
228 space
229 # hg stat
229 # hg stat
230 M f
230 M f
231 ? f.orig
231 ? f.orig
232 # hg resolve --list
232 # hg resolve --list
233 U f
233 U f
234
234
235 or true.executable not found in PATH:
235 or true.executable not found in PATH:
236
236
237 $ beforemerge
237 $ beforemerge
238 [merge-tools]
238 [merge-tools]
239 false.whatever=
239 false.whatever=
240 true.priority=1
240 true.priority=1
241 # hg update -C 1
241 # hg update -C 1
242 $ hg merge -r 2 --config merge-tools.true.executable=nonexistentmergetool
242 $ hg merge -r 2 --config merge-tools.true.executable=nonexistentmergetool
243 merging f
243 merging f
244 merging f failed!
244 merging f failed!
245 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
245 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
246 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
246 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
247 [1]
247 [1]
248 $ aftermerge
248 $ aftermerge
249 # cat f
249 # cat f
250 revision 1
250 revision 1
251 space
251 space
252 # hg stat
252 # hg stat
253 M f
253 M f
254 ? f.orig
254 ? f.orig
255 # hg resolve --list
255 # hg resolve --list
256 U f
256 U f
257
257
258 or true.executable with bogus path:
258 or true.executable with bogus path:
259
259
260 $ beforemerge
260 $ beforemerge
261 [merge-tools]
261 [merge-tools]
262 false.whatever=
262 false.whatever=
263 true.priority=1
263 true.priority=1
264 # hg update -C 1
264 # hg update -C 1
265 $ hg merge -r 2 --config merge-tools.true.executable=/nonexistent/mergetool
265 $ hg merge -r 2 --config merge-tools.true.executable=/nonexistent/mergetool
266 merging f
266 merging f
267 merging f failed!
267 merging f failed!
268 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
268 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
269 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
269 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
270 [1]
270 [1]
271 $ aftermerge
271 $ aftermerge
272 # cat f
272 # cat f
273 revision 1
273 revision 1
274 space
274 space
275 # hg stat
275 # hg stat
276 M f
276 M f
277 ? f.orig
277 ? f.orig
278 # hg resolve --list
278 # hg resolve --list
279 U f
279 U f
280
280
281 but true.executable set to cat found in PATH works:
281 but true.executable set to cat found in PATH works:
282
282
283 $ echo "true.executable=cat" >> .hg/hgrc
283 $ echo "true.executable=cat" >> .hg/hgrc
284 $ beforemerge
284 $ beforemerge
285 [merge-tools]
285 [merge-tools]
286 false.whatever=
286 false.whatever=
287 true.priority=1
287 true.priority=1
288 true.executable=cat
288 true.executable=cat
289 # hg update -C 1
289 # hg update -C 1
290 $ hg merge -r 2
290 $ hg merge -r 2
291 merging f
291 merging f
292 revision 1
292 revision 1
293 space
293 space
294 revision 0
294 revision 0
295 space
295 space
296 revision 2
296 revision 2
297 space
297 space
298 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
298 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
299 (branch merge, don't forget to commit)
299 (branch merge, don't forget to commit)
300 $ aftermerge
300 $ aftermerge
301 # cat f
301 # cat f
302 revision 1
302 revision 1
303 space
303 space
304 # hg stat
304 # hg stat
305 M f
305 M f
306 # hg resolve --list
306 # hg resolve --list
307 R f
307 R f
308
308
309 and true.executable set to cat with path works:
309 and true.executable set to cat with path works:
310
310
311 $ beforemerge
311 $ beforemerge
312 [merge-tools]
312 [merge-tools]
313 false.whatever=
313 false.whatever=
314 true.priority=1
314 true.priority=1
315 true.executable=cat
315 true.executable=cat
316 # hg update -C 1
316 # hg update -C 1
317 $ hg merge -r 2 --config merge-tools.true.executable=cat
317 $ hg merge -r 2 --config merge-tools.true.executable=cat
318 merging f
318 merging f
319 revision 1
319 revision 1
320 space
320 space
321 revision 0
321 revision 0
322 space
322 space
323 revision 2
323 revision 2
324 space
324 space
325 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
325 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
326 (branch merge, don't forget to commit)
326 (branch merge, don't forget to commit)
327 $ aftermerge
327 $ aftermerge
328 # cat f
328 # cat f
329 revision 1
329 revision 1
330 space
330 space
331 # hg stat
331 # hg stat
332 M f
332 M f
333 # hg resolve --list
333 # hg resolve --list
334 R f
334 R f
335
335
336 executable set to python script that succeeds:
336 executable set to python script that succeeds:
337
337
338 $ cat > "$TESTTMP/myworkingmerge.py" <<EOF
338 $ cat > "$TESTTMP/myworkingmerge.py" <<EOF
339 > def myworkingmergefn(ui, repo, args, **kwargs):
339 > def myworkingmergefn(ui, repo, args, **kwargs):
340 > return False
340 > return False
341 > EOF
341 > EOF
342 $ beforemerge
342 $ beforemerge
343 [merge-tools]
343 [merge-tools]
344 false.whatever=
344 false.whatever=
345 true.priority=1
345 true.priority=1
346 true.executable=cat
346 true.executable=cat
347 # hg update -C 1
347 # hg update -C 1
348 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py:myworkingmergefn"
348 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py:myworkingmergefn"
349 merging f
349 merging f
350 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
350 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
351 (branch merge, don't forget to commit)
351 (branch merge, don't forget to commit)
352 $ aftermerge
352 $ aftermerge
353 # cat f
353 # cat f
354 revision 1
354 revision 1
355 space
355 space
356 # hg stat
356 # hg stat
357 M f
357 M f
358 # hg resolve --list
358 # hg resolve --list
359 R f
359 R f
360
360
361 executable set to python script that fails:
361 executable set to python script that fails:
362
362
363 $ cat > "$TESTTMP/mybrokenmerge.py" <<EOF
363 $ cat > "$TESTTMP/mybrokenmerge.py" <<EOF
364 > def mybrokenmergefn(ui, repo, args, **kwargs):
364 > def mybrokenmergefn(ui, repo, args, **kwargs):
365 > ui.write(b"some fail message\n")
365 > ui.write(b"some fail message\n")
366 > return True
366 > return True
367 > EOF
367 > EOF
368 $ beforemerge
368 $ beforemerge
369 [merge-tools]
369 [merge-tools]
370 false.whatever=
370 false.whatever=
371 true.priority=1
371 true.priority=1
372 true.executable=cat
372 true.executable=cat
373 # hg update -C 1
373 # hg update -C 1
374 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/mybrokenmerge.py:mybrokenmergefn"
374 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/mybrokenmerge.py:mybrokenmergefn"
375 merging f
375 merging f
376 some fail message
376 some fail message
377 abort: $TESTTMP/mybrokenmerge.py hook failed
377 abort: $TESTTMP/mybrokenmerge.py hook failed
378 [255]
378 [255]
379 $ aftermerge
379 $ aftermerge
380 # cat f
380 # cat f
381 revision 1
381 revision 1
382 space
382 space
383 # hg stat
383 # hg stat
384 ? f.orig
384 ? f.orig
385 # hg resolve --list
385 # hg resolve --list
386 U f
386 U f
387
387
388 executable set to python script that is missing function:
388 executable set to python script that is missing function:
389
389
390 $ beforemerge
390 $ beforemerge
391 [merge-tools]
391 [merge-tools]
392 false.whatever=
392 false.whatever=
393 true.priority=1
393 true.priority=1
394 true.executable=cat
394 true.executable=cat
395 # hg update -C 1
395 # hg update -C 1
396 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py:missingFunction"
396 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py:missingFunction"
397 merging f
397 merging f
398 abort: $TESTTMP/myworkingmerge.py does not have function: missingFunction
398 abort: $TESTTMP/myworkingmerge.py does not have function: missingFunction
399 [255]
399 [255]
400 $ aftermerge
400 $ aftermerge
401 # cat f
401 # cat f
402 revision 1
402 revision 1
403 space
403 space
404 # hg stat
404 # hg stat
405 ? f.orig
405 ? f.orig
406 # hg resolve --list
406 # hg resolve --list
407 U f
407 U f
408
408
409 executable set to missing python script:
409 executable set to missing python script:
410
410
411 $ beforemerge
411 $ beforemerge
412 [merge-tools]
412 [merge-tools]
413 false.whatever=
413 false.whatever=
414 true.priority=1
414 true.priority=1
415 true.executable=cat
415 true.executable=cat
416 # hg update -C 1
416 # hg update -C 1
417 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/missingpythonscript.py:mergefn"
417 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/missingpythonscript.py:mergefn"
418 merging f
418 merging f
419 abort: loading python merge script failed: $TESTTMP/missingpythonscript.py
419 abort: loading python merge script failed: $TESTTMP/missingpythonscript.py
420 [255]
420 [255]
421 $ aftermerge
421 $ aftermerge
422 # cat f
422 # cat f
423 revision 1
423 revision 1
424 space
424 space
425 # hg stat
425 # hg stat
426 ? f.orig
426 ? f.orig
427 # hg resolve --list
427 # hg resolve --list
428 U f
428 U f
429
429
430 executable set to python script but callable function is missing:
430 executable set to python script but callable function is missing:
431
431
432 $ beforemerge
432 $ beforemerge
433 [merge-tools]
433 [merge-tools]
434 false.whatever=
434 false.whatever=
435 true.priority=1
435 true.priority=1
436 true.executable=cat
436 true.executable=cat
437 # hg update -C 1
437 # hg update -C 1
438 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py"
438 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py"
439 abort: invalid 'python:' syntax: python:$TESTTMP/myworkingmerge.py
439 abort: invalid 'python:' syntax: python:$TESTTMP/myworkingmerge.py
440 [255]
440 [255]
441 $ aftermerge
441 $ aftermerge
442 # cat f
442 # cat f
443 revision 1
443 revision 1
444 space
444 space
445 # hg stat
445 # hg stat
446 # hg resolve --list
446 # hg resolve --list
447 U f
447 U f
448
448
449 executable set to python script but callable function is empty string:
449 executable set to python script but callable function is empty string:
450
450
451 $ beforemerge
451 $ beforemerge
452 [merge-tools]
452 [merge-tools]
453 false.whatever=
453 false.whatever=
454 true.priority=1
454 true.priority=1
455 true.executable=cat
455 true.executable=cat
456 # hg update -C 1
456 # hg update -C 1
457 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py:"
457 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py:"
458 abort: invalid 'python:' syntax: python:$TESTTMP/myworkingmerge.py:
458 abort: invalid 'python:' syntax: python:$TESTTMP/myworkingmerge.py:
459 [255]
459 [255]
460 $ aftermerge
460 $ aftermerge
461 # cat f
461 # cat f
462 revision 1
462 revision 1
463 space
463 space
464 # hg stat
464 # hg stat
465 # hg resolve --list
465 # hg resolve --list
466 U f
466 U f
467
467
468 executable set to python script but callable function is missing and path contains colon:
468 executable set to python script but callable function is missing and path contains colon:
469
469
470 $ beforemerge
470 $ beforemerge
471 [merge-tools]
471 [merge-tools]
472 false.whatever=
472 false.whatever=
473 true.priority=1
473 true.priority=1
474 true.executable=cat
474 true.executable=cat
475 # hg update -C 1
475 # hg update -C 1
476 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/some:dir/myworkingmerge.py"
476 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/some:dir/myworkingmerge.py"
477 abort: invalid 'python:' syntax: python:$TESTTMP/some:dir/myworkingmerge.py
477 abort: invalid 'python:' syntax: python:$TESTTMP/some:dir/myworkingmerge.py
478 [255]
478 [255]
479 $ aftermerge
479 $ aftermerge
480 # cat f
480 # cat f
481 revision 1
481 revision 1
482 space
482 space
483 # hg stat
483 # hg stat
484 # hg resolve --list
484 # hg resolve --list
485 U f
485 U f
486
486
487 executable set to python script filename that contains spaces:
487 executable set to python script filename that contains spaces:
488
488
489 $ mkdir -p "$TESTTMP/my path"
489 $ mkdir -p "$TESTTMP/my path"
490 $ cat > "$TESTTMP/my path/my working merge with spaces in filename.py" <<EOF
490 $ cat > "$TESTTMP/my path/my working merge with spaces in filename.py" <<EOF
491 > def myworkingmergefn(ui, repo, args, **kwargs):
491 > def myworkingmergefn(ui, repo, args, **kwargs):
492 > return False
492 > return False
493 > EOF
493 > EOF
494 $ beforemerge
494 $ beforemerge
495 [merge-tools]
495 [merge-tools]
496 false.whatever=
496 false.whatever=
497 true.priority=1
497 true.priority=1
498 true.executable=cat
498 true.executable=cat
499 # hg update -C 1
499 # hg update -C 1
500 $ hg merge -r 2 --config "merge-tools.true.executable=python:$TESTTMP/my path/my working merge with spaces in filename.py:myworkingmergefn"
500 $ hg merge -r 2 --config "merge-tools.true.executable=python:$TESTTMP/my path/my working merge with spaces in filename.py:myworkingmergefn"
501 merging f
501 merging f
502 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
502 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
503 (branch merge, don't forget to commit)
503 (branch merge, don't forget to commit)
504 $ aftermerge
504 $ aftermerge
505 # cat f
505 # cat f
506 revision 1
506 revision 1
507 space
507 space
508 # hg stat
508 # hg stat
509 M f
509 M f
510 # hg resolve --list
510 # hg resolve --list
511 R f
511 R f
512
512
513 #if unix-permissions
513 #if unix-permissions
514
514
515 environment variables in true.executable are handled:
515 environment variables in true.executable are handled:
516
516
517 $ echo 'echo "custom merge tool"' > .hg/merge.sh
517 $ echo 'echo "custom merge tool"' > .hg/merge.sh
518 $ beforemerge
518 $ beforemerge
519 [merge-tools]
519 [merge-tools]
520 false.whatever=
520 false.whatever=
521 true.priority=1
521 true.priority=1
522 true.executable=cat
522 true.executable=cat
523 # hg update -C 1
523 # hg update -C 1
524 $ hg --config merge-tools.true.executable='sh' \
524 $ hg --config merge-tools.true.executable='sh' \
525 > --config merge-tools.true.args=.hg/merge.sh \
525 > --config merge-tools.true.args=.hg/merge.sh \
526 > merge -r 2
526 > merge -r 2
527 merging f
527 merging f
528 custom merge tool
528 custom merge tool
529 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
529 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
530 (branch merge, don't forget to commit)
530 (branch merge, don't forget to commit)
531 $ aftermerge
531 $ aftermerge
532 # cat f
532 # cat f
533 revision 1
533 revision 1
534 space
534 space
535 # hg stat
535 # hg stat
536 M f
536 M f
537 # hg resolve --list
537 # hg resolve --list
538 R f
538 R f
539
539
540 #endif
540 #endif
541
541
542 Tool selection and merge-patterns
542 Tool selection and merge-patterns
543
543
544 merge-patterns specifies new tool false:
544 merge-patterns specifies new tool false:
545
545
546 $ beforemerge
546 $ beforemerge
547 [merge-tools]
547 [merge-tools]
548 false.whatever=
548 false.whatever=
549 true.priority=1
549 true.priority=1
550 true.executable=cat
550 true.executable=cat
551 # hg update -C 1
551 # hg update -C 1
552 $ hg merge -r 2 --config merge-patterns.f=false
552 $ hg merge -r 2 --config merge-patterns.f=false
553 merging f
553 merging f
554 merging f failed!
554 merging f failed!
555 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
555 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
556 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
556 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
557 [1]
557 [1]
558 $ aftermerge
558 $ aftermerge
559 # cat f
559 # cat f
560 revision 1
560 revision 1
561 space
561 space
562 # hg stat
562 # hg stat
563 M f
563 M f
564 ? f.orig
564 ? f.orig
565 # hg resolve --list
565 # hg resolve --list
566 U f
566 U f
567
567
568 merge-patterns specifies executable not found in PATH and gets warning:
568 merge-patterns specifies executable not found in PATH and gets warning:
569
569
570 $ beforemerge
570 $ beforemerge
571 [merge-tools]
571 [merge-tools]
572 false.whatever=
572 false.whatever=
573 true.priority=1
573 true.priority=1
574 true.executable=cat
574 true.executable=cat
575 # hg update -C 1
575 # hg update -C 1
576 $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistentmergetool
576 $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistentmergetool
577 couldn't find merge tool true (for pattern f)
577 couldn't find merge tool true (for pattern f)
578 merging f
578 merging f
579 couldn't find merge tool true (for pattern f)
579 couldn't find merge tool true (for pattern f)
580 merging f failed!
580 merging f failed!
581 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
581 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
582 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
582 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
583 [1]
583 [1]
584 $ aftermerge
584 $ aftermerge
585 # cat f
585 # cat f
586 revision 1
586 revision 1
587 space
587 space
588 # hg stat
588 # hg stat
589 M f
589 M f
590 ? f.orig
590 ? f.orig
591 # hg resolve --list
591 # hg resolve --list
592 U f
592 U f
593
593
594 merge-patterns specifies executable with bogus path and gets warning:
594 merge-patterns specifies executable with bogus path and gets warning:
595
595
596 $ beforemerge
596 $ beforemerge
597 [merge-tools]
597 [merge-tools]
598 false.whatever=
598 false.whatever=
599 true.priority=1
599 true.priority=1
600 true.executable=cat
600 true.executable=cat
601 # hg update -C 1
601 # hg update -C 1
602 $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/nonexistent/mergetool
602 $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/nonexistent/mergetool
603 couldn't find merge tool true (for pattern f)
603 couldn't find merge tool true (for pattern f)
604 merging f
604 merging f
605 couldn't find merge tool true (for pattern f)
605 couldn't find merge tool true (for pattern f)
606 merging f failed!
606 merging f failed!
607 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
607 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
608 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
608 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
609 [1]
609 [1]
610 $ aftermerge
610 $ aftermerge
611 # cat f
611 # cat f
612 revision 1
612 revision 1
613 space
613 space
614 # hg stat
614 # hg stat
615 M f
615 M f
616 ? f.orig
616 ? f.orig
617 # hg resolve --list
617 # hg resolve --list
618 U f
618 U f
619
619
620 ui.merge overrules priority
620 ui.merge overrules priority
621
621
622 ui.merge specifies false:
622 ui.merge specifies false:
623
623
624 $ beforemerge
624 $ beforemerge
625 [merge-tools]
625 [merge-tools]
626 false.whatever=
626 false.whatever=
627 true.priority=1
627 true.priority=1
628 true.executable=cat
628 true.executable=cat
629 # hg update -C 1
629 # hg update -C 1
630 $ hg merge -r 2 --config ui.merge=false
630 $ hg merge -r 2 --config ui.merge=false
631 merging f
631 merging f
632 merging f failed!
632 merging f failed!
633 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
633 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
634 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
634 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
635 [1]
635 [1]
636 $ aftermerge
636 $ aftermerge
637 # cat f
637 # cat f
638 revision 1
638 revision 1
639 space
639 space
640 # hg stat
640 # hg stat
641 M f
641 M f
642 ? f.orig
642 ? f.orig
643 # hg resolve --list
643 # hg resolve --list
644 U f
644 U f
645
645
646 ui.merge specifies internal:fail:
646 ui.merge specifies internal:fail:
647
647
648 $ beforemerge
648 $ beforemerge
649 [merge-tools]
649 [merge-tools]
650 false.whatever=
650 false.whatever=
651 true.priority=1
651 true.priority=1
652 true.executable=cat
652 true.executable=cat
653 # hg update -C 1
653 # hg update -C 1
654 $ hg merge -r 2 --config ui.merge=internal:fail
654 $ hg merge -r 2 --config ui.merge=internal:fail
655 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
655 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
656 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
656 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
657 [1]
657 [1]
658 $ aftermerge
658 $ aftermerge
659 # cat f
659 # cat f
660 revision 1
660 revision 1
661 space
661 space
662 # hg stat
662 # hg stat
663 M f
663 M f
664 # hg resolve --list
664 # hg resolve --list
665 U f
665 U f
666
666
667 ui.merge specifies :local (without internal prefix):
667 ui.merge specifies :local (without internal prefix):
668
668
669 $ beforemerge
669 $ beforemerge
670 [merge-tools]
670 [merge-tools]
671 false.whatever=
671 false.whatever=
672 true.priority=1
672 true.priority=1
673 true.executable=cat
673 true.executable=cat
674 # hg update -C 1
674 # hg update -C 1
675 $ hg merge -r 2 --config ui.merge=:local
675 $ hg merge -r 2 --config ui.merge=:local
676 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
676 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
677 (branch merge, don't forget to commit)
677 (branch merge, don't forget to commit)
678 $ aftermerge
678 $ aftermerge
679 # cat f
679 # cat f
680 revision 1
680 revision 1
681 space
681 space
682 # hg stat
682 # hg stat
683 M f
683 M f
684 # hg resolve --list
684 # hg resolve --list
685 R f
685 R f
686
686
687 ui.merge specifies internal:other:
687 ui.merge specifies internal:other:
688
688
689 $ beforemerge
689 $ beforemerge
690 [merge-tools]
690 [merge-tools]
691 false.whatever=
691 false.whatever=
692 true.priority=1
692 true.priority=1
693 true.executable=cat
693 true.executable=cat
694 # hg update -C 1
694 # hg update -C 1
695 $ hg merge -r 2 --config ui.merge=internal:other
695 $ hg merge -r 2 --config ui.merge=internal:other
696 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
696 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
697 (branch merge, don't forget to commit)
697 (branch merge, don't forget to commit)
698 $ aftermerge
698 $ aftermerge
699 # cat f
699 # cat f
700 revision 2
700 revision 2
701 space
701 space
702 # hg stat
702 # hg stat
703 M f
703 M f
704 # hg resolve --list
704 # hg resolve --list
705 R f
705 R f
706
706
707 ui.merge specifies internal:prompt:
707 ui.merge specifies internal:prompt:
708
708
709 $ beforemerge
709 $ beforemerge
710 [merge-tools]
710 [merge-tools]
711 false.whatever=
711 false.whatever=
712 true.priority=1
712 true.priority=1
713 true.executable=cat
713 true.executable=cat
714 # hg update -C 1
714 # hg update -C 1
715 $ hg merge -r 2 --config ui.merge=internal:prompt
715 $ hg merge -r 2 --config ui.merge=internal:prompt
716 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
716 file 'f' needs to be resolved.
717 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
718 What do you want to do? u
717 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
719 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
718 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
720 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
719 [1]
721 [1]
720 $ aftermerge
722 $ aftermerge
721 # cat f
723 # cat f
722 revision 1
724 revision 1
723 space
725 space
724 # hg stat
726 # hg stat
725 M f
727 M f
726 # hg resolve --list
728 # hg resolve --list
727 U f
729 U f
728
730
729 ui.merge specifies :prompt, with 'leave unresolved' chosen
731 ui.merge specifies :prompt, with 'leave unresolved' chosen
730
732
731 $ beforemerge
733 $ beforemerge
732 [merge-tools]
734 [merge-tools]
733 false.whatever=
735 false.whatever=
734 true.priority=1
736 true.priority=1
735 true.executable=cat
737 true.executable=cat
736 # hg update -C 1
738 # hg update -C 1
737 $ hg merge -r 2 --config ui.merge=:prompt --config ui.interactive=True << EOF
739 $ hg merge -r 2 --config ui.merge=:prompt --config ui.interactive=True << EOF
738 > u
740 > u
739 > EOF
741 > EOF
740 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
742 file 'f' needs to be resolved.
743 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
744 What do you want to do? u
741 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
745 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
742 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
746 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
743 [1]
747 [1]
744 $ aftermerge
748 $ aftermerge
745 # cat f
749 # cat f
746 revision 1
750 revision 1
747 space
751 space
748 # hg stat
752 # hg stat
749 M f
753 M f
750 # hg resolve --list
754 # hg resolve --list
751 U f
755 U f
752
756
753 prompt with EOF
757 prompt with EOF
754
758
755 $ beforemerge
759 $ beforemerge
756 [merge-tools]
760 [merge-tools]
757 false.whatever=
761 false.whatever=
758 true.priority=1
762 true.priority=1
759 true.executable=cat
763 true.executable=cat
760 # hg update -C 1
764 # hg update -C 1
761 $ hg merge -r 2 --config ui.merge=internal:prompt --config ui.interactive=true
765 $ hg merge -r 2 --config ui.merge=internal:prompt --config ui.interactive=true
762 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f?
766 file 'f' needs to be resolved.
767 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
768 What do you want to do?
763 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
769 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
764 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
770 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
765 [1]
771 [1]
766 $ aftermerge
772 $ aftermerge
767 # cat f
773 # cat f
768 revision 1
774 revision 1
769 space
775 space
770 # hg stat
776 # hg stat
771 M f
777 M f
772 # hg resolve --list
778 # hg resolve --list
773 U f
779 U f
774 $ hg resolve --all --config ui.merge=internal:prompt --config ui.interactive=true
780 $ hg resolve --all --config ui.merge=internal:prompt --config ui.interactive=true
775 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f?
781 file 'f' needs to be resolved.
782 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
783 What do you want to do?
776 [1]
784 [1]
777 $ aftermerge
785 $ aftermerge
778 # cat f
786 # cat f
779 revision 1
787 revision 1
780 space
788 space
781 # hg stat
789 # hg stat
782 M f
790 M f
783 ? f.orig
791 ? f.orig
784 # hg resolve --list
792 # hg resolve --list
785 U f
793 U f
786 $ rm f
794 $ rm f
787 $ hg resolve --all --config ui.merge=internal:prompt --config ui.interactive=true
795 $ hg resolve --all --config ui.merge=internal:prompt --config ui.interactive=true
788 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f?
796 file 'f' needs to be resolved.
797 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
798 What do you want to do?
789 [1]
799 [1]
790 $ aftermerge
800 $ aftermerge
791 # cat f
801 # cat f
792 revision 1
802 revision 1
793 space
803 space
794 # hg stat
804 # hg stat
795 M f
805 M f
796 # hg resolve --list
806 # hg resolve --list
797 U f
807 U f
798 $ hg resolve --all --config ui.merge=internal:prompt
808 $ hg resolve --all --config ui.merge=internal:prompt
799 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
809 file 'f' needs to be resolved.
810 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
811 What do you want to do? u
800 [1]
812 [1]
801 $ aftermerge
813 $ aftermerge
802 # cat f
814 # cat f
803 revision 1
815 revision 1
804 space
816 space
805 # hg stat
817 # hg stat
806 M f
818 M f
807 ? f.orig
819 ? f.orig
808 # hg resolve --list
820 # hg resolve --list
809 U f
821 U f
810
822
811 ui.merge specifies internal:dump:
823 ui.merge specifies internal:dump:
812
824
813 $ beforemerge
825 $ beforemerge
814 [merge-tools]
826 [merge-tools]
815 false.whatever=
827 false.whatever=
816 true.priority=1
828 true.priority=1
817 true.executable=cat
829 true.executable=cat
818 # hg update -C 1
830 # hg update -C 1
819 $ hg merge -r 2 --config ui.merge=internal:dump
831 $ hg merge -r 2 --config ui.merge=internal:dump
820 merging f
832 merging f
821 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
833 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
822 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
834 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
823 [1]
835 [1]
824 $ aftermerge
836 $ aftermerge
825 # cat f
837 # cat f
826 revision 1
838 revision 1
827 space
839 space
828 # hg stat
840 # hg stat
829 M f
841 M f
830 ? f.base
842 ? f.base
831 ? f.local
843 ? f.local
832 ? f.orig
844 ? f.orig
833 ? f.other
845 ? f.other
834 # hg resolve --list
846 # hg resolve --list
835 U f
847 U f
836
848
837 f.base:
849 f.base:
838
850
839 $ cat f.base
851 $ cat f.base
840 revision 0
852 revision 0
841 space
853 space
842
854
843 f.local:
855 f.local:
844
856
845 $ cat f.local
857 $ cat f.local
846 revision 1
858 revision 1
847 space
859 space
848
860
849 f.other:
861 f.other:
850
862
851 $ cat f.other
863 $ cat f.other
852 revision 2
864 revision 2
853 space
865 space
854 $ rm f.base f.local f.other
866 $ rm f.base f.local f.other
855
867
856 check that internal:dump doesn't dump files if premerge runs
868 check that internal:dump doesn't dump files if premerge runs
857 successfully
869 successfully
858
870
859 $ beforemerge
871 $ beforemerge
860 [merge-tools]
872 [merge-tools]
861 false.whatever=
873 false.whatever=
862 true.priority=1
874 true.priority=1
863 true.executable=cat
875 true.executable=cat
864 # hg update -C 1
876 # hg update -C 1
865 $ hg merge -r 3 --config ui.merge=internal:dump
877 $ hg merge -r 3 --config ui.merge=internal:dump
866 merging f
878 merging f
867 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
879 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
868 (branch merge, don't forget to commit)
880 (branch merge, don't forget to commit)
869
881
870 $ aftermerge
882 $ aftermerge
871 # cat f
883 # cat f
872 revision 1
884 revision 1
873 space
885 space
874 revision 3
886 revision 3
875 # hg stat
887 # hg stat
876 M f
888 M f
877 # hg resolve --list
889 # hg resolve --list
878 R f
890 R f
879
891
880 check that internal:forcedump dumps files, even if local and other can
892 check that internal:forcedump dumps files, even if local and other can
881 be merged easily
893 be merged easily
882
894
883 $ beforemerge
895 $ beforemerge
884 [merge-tools]
896 [merge-tools]
885 false.whatever=
897 false.whatever=
886 true.priority=1
898 true.priority=1
887 true.executable=cat
899 true.executable=cat
888 # hg update -C 1
900 # hg update -C 1
889 $ hg merge -r 3 --config ui.merge=internal:forcedump
901 $ hg merge -r 3 --config ui.merge=internal:forcedump
890 merging f
902 merging f
891 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
903 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
892 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
904 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
893 [1]
905 [1]
894 $ aftermerge
906 $ aftermerge
895 # cat f
907 # cat f
896 revision 1
908 revision 1
897 space
909 space
898 # hg stat
910 # hg stat
899 M f
911 M f
900 ? f.base
912 ? f.base
901 ? f.local
913 ? f.local
902 ? f.orig
914 ? f.orig
903 ? f.other
915 ? f.other
904 # hg resolve --list
916 # hg resolve --list
905 U f
917 U f
906
918
907 $ cat f.base
919 $ cat f.base
908 revision 0
920 revision 0
909 space
921 space
910
922
911 $ cat f.local
923 $ cat f.local
912 revision 1
924 revision 1
913 space
925 space
914
926
915 $ cat f.other
927 $ cat f.other
916 revision 0
928 revision 0
917 space
929 space
918 revision 3
930 revision 3
919
931
920 $ rm -f f.base f.local f.other
932 $ rm -f f.base f.local f.other
921
933
922 ui.merge specifies internal:other but is overruled by pattern for false:
934 ui.merge specifies internal:other but is overruled by pattern for false:
923
935
924 $ beforemerge
936 $ beforemerge
925 [merge-tools]
937 [merge-tools]
926 false.whatever=
938 false.whatever=
927 true.priority=1
939 true.priority=1
928 true.executable=cat
940 true.executable=cat
929 # hg update -C 1
941 # hg update -C 1
930 $ hg merge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false
942 $ hg merge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false
931 merging f
943 merging f
932 merging f failed!
944 merging f failed!
933 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
945 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
934 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
946 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
935 [1]
947 [1]
936 $ aftermerge
948 $ aftermerge
937 # cat f
949 # cat f
938 revision 1
950 revision 1
939 space
951 space
940 # hg stat
952 # hg stat
941 M f
953 M f
942 ? f.orig
954 ? f.orig
943 # hg resolve --list
955 # hg resolve --list
944 U f
956 U f
945
957
946 Premerge
958 Premerge
947
959
948 ui.merge specifies internal:other but is overruled by --tool=false
960 ui.merge specifies internal:other but is overruled by --tool=false
949
961
950 $ beforemerge
962 $ beforemerge
951 [merge-tools]
963 [merge-tools]
952 false.whatever=
964 false.whatever=
953 true.priority=1
965 true.priority=1
954 true.executable=cat
966 true.executable=cat
955 # hg update -C 1
967 # hg update -C 1
956 $ hg merge -r 2 --config ui.merge=internal:other --tool=false
968 $ hg merge -r 2 --config ui.merge=internal:other --tool=false
957 merging f
969 merging f
958 merging f failed!
970 merging f failed!
959 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
971 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
960 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
972 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
961 [1]
973 [1]
962 $ aftermerge
974 $ aftermerge
963 # cat f
975 # cat f
964 revision 1
976 revision 1
965 space
977 space
966 # hg stat
978 # hg stat
967 M f
979 M f
968 ? f.orig
980 ? f.orig
969 # hg resolve --list
981 # hg resolve --list
970 U f
982 U f
971
983
972 HGMERGE specifies internal:other but is overruled by --tool=false
984 HGMERGE specifies internal:other but is overruled by --tool=false
973
985
974 $ HGMERGE=internal:other ; export HGMERGE
986 $ HGMERGE=internal:other ; export HGMERGE
975 $ beforemerge
987 $ beforemerge
976 [merge-tools]
988 [merge-tools]
977 false.whatever=
989 false.whatever=
978 true.priority=1
990 true.priority=1
979 true.executable=cat
991 true.executable=cat
980 # hg update -C 1
992 # hg update -C 1
981 $ hg merge -r 2 --tool=false
993 $ hg merge -r 2 --tool=false
982 merging f
994 merging f
983 merging f failed!
995 merging f failed!
984 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
996 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
985 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
997 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
986 [1]
998 [1]
987 $ aftermerge
999 $ aftermerge
988 # cat f
1000 # cat f
989 revision 1
1001 revision 1
990 space
1002 space
991 # hg stat
1003 # hg stat
992 M f
1004 M f
993 ? f.orig
1005 ? f.orig
994 # hg resolve --list
1006 # hg resolve --list
995 U f
1007 U f
996
1008
997 $ unset HGMERGE # make sure HGMERGE doesn't interfere with remaining tests
1009 $ unset HGMERGE # make sure HGMERGE doesn't interfere with remaining tests
998
1010
999 update is a merge ...
1011 update is a merge ...
1000
1012
1001 (this also tests that files reverted with '--rev REV' are treated as
1013 (this also tests that files reverted with '--rev REV' are treated as
1002 "modified", even if none of mode, size and timestamp of them isn't
1014 "modified", even if none of mode, size and timestamp of them isn't
1003 changed on the filesystem (see also issue4583))
1015 changed on the filesystem (see also issue4583))
1004
1016
1005 $ cat >> $HGRCPATH <<EOF
1017 $ cat >> $HGRCPATH <<EOF
1006 > [fakedirstatewritetime]
1018 > [fakedirstatewritetime]
1007 > # emulate invoking dirstate.write() via repo.status()
1019 > # emulate invoking dirstate.write() via repo.status()
1008 > # at 2000-01-01 00:00
1020 > # at 2000-01-01 00:00
1009 > fakenow = 200001010000
1021 > fakenow = 200001010000
1010 > EOF
1022 > EOF
1011
1023
1012 $ beforemerge
1024 $ beforemerge
1013 [merge-tools]
1025 [merge-tools]
1014 false.whatever=
1026 false.whatever=
1015 true.priority=1
1027 true.priority=1
1016 true.executable=cat
1028 true.executable=cat
1017 # hg update -C 1
1029 # hg update -C 1
1018 $ hg update -q 0
1030 $ hg update -q 0
1019 $ f -s f
1031 $ f -s f
1020 f: size=17
1032 f: size=17
1021 $ touch -t 200001010000 f
1033 $ touch -t 200001010000 f
1022 $ hg debugrebuildstate
1034 $ hg debugrebuildstate
1023 $ cat >> $HGRCPATH <<EOF
1035 $ cat >> $HGRCPATH <<EOF
1024 > [extensions]
1036 > [extensions]
1025 > fakedirstatewritetime = $TESTDIR/fakedirstatewritetime.py
1037 > fakedirstatewritetime = $TESTDIR/fakedirstatewritetime.py
1026 > EOF
1038 > EOF
1027 $ hg revert -q -r 1 .
1039 $ hg revert -q -r 1 .
1028 $ cat >> $HGRCPATH <<EOF
1040 $ cat >> $HGRCPATH <<EOF
1029 > [extensions]
1041 > [extensions]
1030 > fakedirstatewritetime = !
1042 > fakedirstatewritetime = !
1031 > EOF
1043 > EOF
1032 $ f -s f
1044 $ f -s f
1033 f: size=17
1045 f: size=17
1034 $ touch -t 200001010000 f
1046 $ touch -t 200001010000 f
1035 $ hg status f
1047 $ hg status f
1036 M f
1048 M f
1037 $ hg update -r 2
1049 $ hg update -r 2
1038 merging f
1050 merging f
1039 revision 1
1051 revision 1
1040 space
1052 space
1041 revision 0
1053 revision 0
1042 space
1054 space
1043 revision 2
1055 revision 2
1044 space
1056 space
1045 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1057 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1046 $ aftermerge
1058 $ aftermerge
1047 # cat f
1059 # cat f
1048 revision 1
1060 revision 1
1049 space
1061 space
1050 # hg stat
1062 # hg stat
1051 M f
1063 M f
1052 # hg resolve --list
1064 # hg resolve --list
1053 R f
1065 R f
1054
1066
1055 update should also have --tool
1067 update should also have --tool
1056
1068
1057 $ beforemerge
1069 $ beforemerge
1058 [merge-tools]
1070 [merge-tools]
1059 false.whatever=
1071 false.whatever=
1060 true.priority=1
1072 true.priority=1
1061 true.executable=cat
1073 true.executable=cat
1062 # hg update -C 1
1074 # hg update -C 1
1063 $ hg update -q 0
1075 $ hg update -q 0
1064 $ f -s f
1076 $ f -s f
1065 f: size=17
1077 f: size=17
1066 $ touch -t 200001010000 f
1078 $ touch -t 200001010000 f
1067 $ hg debugrebuildstate
1079 $ hg debugrebuildstate
1068 $ cat >> $HGRCPATH <<EOF
1080 $ cat >> $HGRCPATH <<EOF
1069 > [extensions]
1081 > [extensions]
1070 > fakedirstatewritetime = $TESTDIR/fakedirstatewritetime.py
1082 > fakedirstatewritetime = $TESTDIR/fakedirstatewritetime.py
1071 > EOF
1083 > EOF
1072 $ hg revert -q -r 1 .
1084 $ hg revert -q -r 1 .
1073 $ cat >> $HGRCPATH <<EOF
1085 $ cat >> $HGRCPATH <<EOF
1074 > [extensions]
1086 > [extensions]
1075 > fakedirstatewritetime = !
1087 > fakedirstatewritetime = !
1076 > EOF
1088 > EOF
1077 $ f -s f
1089 $ f -s f
1078 f: size=17
1090 f: size=17
1079 $ touch -t 200001010000 f
1091 $ touch -t 200001010000 f
1080 $ hg status f
1092 $ hg status f
1081 M f
1093 M f
1082 $ hg update -r 2 --tool false
1094 $ hg update -r 2 --tool false
1083 merging f
1095 merging f
1084 merging f failed!
1096 merging f failed!
1085 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1097 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1086 use 'hg resolve' to retry unresolved file merges
1098 use 'hg resolve' to retry unresolved file merges
1087 [1]
1099 [1]
1088 $ aftermerge
1100 $ aftermerge
1089 # cat f
1101 # cat f
1090 revision 1
1102 revision 1
1091 space
1103 space
1092 # hg stat
1104 # hg stat
1093 M f
1105 M f
1094 ? f.orig
1106 ? f.orig
1095 # hg resolve --list
1107 # hg resolve --list
1096 U f
1108 U f
1097
1109
1098 Default is silent simplemerge:
1110 Default is silent simplemerge:
1099
1111
1100 $ beforemerge
1112 $ beforemerge
1101 [merge-tools]
1113 [merge-tools]
1102 false.whatever=
1114 false.whatever=
1103 true.priority=1
1115 true.priority=1
1104 true.executable=cat
1116 true.executable=cat
1105 # hg update -C 1
1117 # hg update -C 1
1106 $ hg merge -r 3
1118 $ hg merge -r 3
1107 merging f
1119 merging f
1108 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1120 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1109 (branch merge, don't forget to commit)
1121 (branch merge, don't forget to commit)
1110 $ aftermerge
1122 $ aftermerge
1111 # cat f
1123 # cat f
1112 revision 1
1124 revision 1
1113 space
1125 space
1114 revision 3
1126 revision 3
1115 # hg stat
1127 # hg stat
1116 M f
1128 M f
1117 # hg resolve --list
1129 # hg resolve --list
1118 R f
1130 R f
1119
1131
1120 .premerge=True is same:
1132 .premerge=True is same:
1121
1133
1122 $ beforemerge
1134 $ beforemerge
1123 [merge-tools]
1135 [merge-tools]
1124 false.whatever=
1136 false.whatever=
1125 true.priority=1
1137 true.priority=1
1126 true.executable=cat
1138 true.executable=cat
1127 # hg update -C 1
1139 # hg update -C 1
1128 $ hg merge -r 3 --config merge-tools.true.premerge=True
1140 $ hg merge -r 3 --config merge-tools.true.premerge=True
1129 merging f
1141 merging f
1130 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1142 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1131 (branch merge, don't forget to commit)
1143 (branch merge, don't forget to commit)
1132 $ aftermerge
1144 $ aftermerge
1133 # cat f
1145 # cat f
1134 revision 1
1146 revision 1
1135 space
1147 space
1136 revision 3
1148 revision 3
1137 # hg stat
1149 # hg stat
1138 M f
1150 M f
1139 # hg resolve --list
1151 # hg resolve --list
1140 R f
1152 R f
1141
1153
1142 .premerge=False executes merge-tool:
1154 .premerge=False executes merge-tool:
1143
1155
1144 $ beforemerge
1156 $ beforemerge
1145 [merge-tools]
1157 [merge-tools]
1146 false.whatever=
1158 false.whatever=
1147 true.priority=1
1159 true.priority=1
1148 true.executable=cat
1160 true.executable=cat
1149 # hg update -C 1
1161 # hg update -C 1
1150 $ hg merge -r 3 --config merge-tools.true.premerge=False
1162 $ hg merge -r 3 --config merge-tools.true.premerge=False
1151 merging f
1163 merging f
1152 revision 1
1164 revision 1
1153 space
1165 space
1154 revision 0
1166 revision 0
1155 space
1167 space
1156 revision 0
1168 revision 0
1157 space
1169 space
1158 revision 3
1170 revision 3
1159 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1171 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1160 (branch merge, don't forget to commit)
1172 (branch merge, don't forget to commit)
1161 $ aftermerge
1173 $ aftermerge
1162 # cat f
1174 # cat f
1163 revision 1
1175 revision 1
1164 space
1176 space
1165 # hg stat
1177 # hg stat
1166 M f
1178 M f
1167 # hg resolve --list
1179 # hg resolve --list
1168 R f
1180 R f
1169
1181
1170 premerge=keep keeps conflict markers in:
1182 premerge=keep keeps conflict markers in:
1171
1183
1172 $ beforemerge
1184 $ beforemerge
1173 [merge-tools]
1185 [merge-tools]
1174 false.whatever=
1186 false.whatever=
1175 true.priority=1
1187 true.priority=1
1176 true.executable=cat
1188 true.executable=cat
1177 # hg update -C 1
1189 # hg update -C 1
1178 $ hg merge -r 4 --config merge-tools.true.premerge=keep
1190 $ hg merge -r 4 --config merge-tools.true.premerge=keep
1179 merging f
1191 merging f
1180 <<<<<<< working copy: ef83787e2614 - test: revision 1
1192 <<<<<<< working copy: ef83787e2614 - test: revision 1
1181 revision 1
1193 revision 1
1182 space
1194 space
1183 =======
1195 =======
1184 revision 4
1196 revision 4
1185 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1197 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1186 revision 0
1198 revision 0
1187 space
1199 space
1188 revision 4
1200 revision 4
1189 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1201 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1190 (branch merge, don't forget to commit)
1202 (branch merge, don't forget to commit)
1191 $ aftermerge
1203 $ aftermerge
1192 # cat f
1204 # cat f
1193 <<<<<<< working copy: ef83787e2614 - test: revision 1
1205 <<<<<<< working copy: ef83787e2614 - test: revision 1
1194 revision 1
1206 revision 1
1195 space
1207 space
1196 =======
1208 =======
1197 revision 4
1209 revision 4
1198 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1210 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1199 # hg stat
1211 # hg stat
1200 M f
1212 M f
1201 # hg resolve --list
1213 # hg resolve --list
1202 R f
1214 R f
1203
1215
1204 premerge=keep-merge3 keeps conflict markers with base content:
1216 premerge=keep-merge3 keeps conflict markers with base content:
1205
1217
1206 $ beforemerge
1218 $ beforemerge
1207 [merge-tools]
1219 [merge-tools]
1208 false.whatever=
1220 false.whatever=
1209 true.priority=1
1221 true.priority=1
1210 true.executable=cat
1222 true.executable=cat
1211 # hg update -C 1
1223 # hg update -C 1
1212 $ hg merge -r 4 --config merge-tools.true.premerge=keep-merge3
1224 $ hg merge -r 4 --config merge-tools.true.premerge=keep-merge3
1213 merging f
1225 merging f
1214 <<<<<<< working copy: ef83787e2614 - test: revision 1
1226 <<<<<<< working copy: ef83787e2614 - test: revision 1
1215 revision 1
1227 revision 1
1216 space
1228 space
1217 ||||||| base
1229 ||||||| base
1218 revision 0
1230 revision 0
1219 space
1231 space
1220 =======
1232 =======
1221 revision 4
1233 revision 4
1222 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1234 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1223 revision 0
1235 revision 0
1224 space
1236 space
1225 revision 4
1237 revision 4
1226 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1238 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1227 (branch merge, don't forget to commit)
1239 (branch merge, don't forget to commit)
1228 $ aftermerge
1240 $ aftermerge
1229 # cat f
1241 # cat f
1230 <<<<<<< working copy: ef83787e2614 - test: revision 1
1242 <<<<<<< working copy: ef83787e2614 - test: revision 1
1231 revision 1
1243 revision 1
1232 space
1244 space
1233 ||||||| base
1245 ||||||| base
1234 revision 0
1246 revision 0
1235 space
1247 space
1236 =======
1248 =======
1237 revision 4
1249 revision 4
1238 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1250 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1239 # hg stat
1251 # hg stat
1240 M f
1252 M f
1241 # hg resolve --list
1253 # hg resolve --list
1242 R f
1254 R f
1243
1255
1244 premerge=keep respects ui.mergemarkers=basic:
1256 premerge=keep respects ui.mergemarkers=basic:
1245
1257
1246 $ beforemerge
1258 $ beforemerge
1247 [merge-tools]
1259 [merge-tools]
1248 false.whatever=
1260 false.whatever=
1249 true.priority=1
1261 true.priority=1
1250 true.executable=cat
1262 true.executable=cat
1251 # hg update -C 1
1263 # hg update -C 1
1252 $ hg merge -r 4 --config merge-tools.true.premerge=keep --config ui.mergemarkers=basic
1264 $ hg merge -r 4 --config merge-tools.true.premerge=keep --config ui.mergemarkers=basic
1253 merging f
1265 merging f
1254 <<<<<<< working copy
1266 <<<<<<< working copy
1255 revision 1
1267 revision 1
1256 space
1268 space
1257 =======
1269 =======
1258 revision 4
1270 revision 4
1259 >>>>>>> merge rev
1271 >>>>>>> merge rev
1260 revision 0
1272 revision 0
1261 space
1273 space
1262 revision 4
1274 revision 4
1263 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1275 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1264 (branch merge, don't forget to commit)
1276 (branch merge, don't forget to commit)
1265 $ aftermerge
1277 $ aftermerge
1266 # cat f
1278 # cat f
1267 <<<<<<< working copy
1279 <<<<<<< working copy
1268 revision 1
1280 revision 1
1269 space
1281 space
1270 =======
1282 =======
1271 revision 4
1283 revision 4
1272 >>>>>>> merge rev
1284 >>>>>>> merge rev
1273 # hg stat
1285 # hg stat
1274 M f
1286 M f
1275 # hg resolve --list
1287 # hg resolve --list
1276 R f
1288 R f
1277
1289
1278 premerge=keep ignores ui.mergemarkers=basic if true.mergemarkers=detailed:
1290 premerge=keep ignores ui.mergemarkers=basic if true.mergemarkers=detailed:
1279
1291
1280 $ beforemerge
1292 $ beforemerge
1281 [merge-tools]
1293 [merge-tools]
1282 false.whatever=
1294 false.whatever=
1283 true.priority=1
1295 true.priority=1
1284 true.executable=cat
1296 true.executable=cat
1285 # hg update -C 1
1297 # hg update -C 1
1286 $ hg merge -r 4 --config merge-tools.true.premerge=keep \
1298 $ hg merge -r 4 --config merge-tools.true.premerge=keep \
1287 > --config ui.mergemarkers=basic \
1299 > --config ui.mergemarkers=basic \
1288 > --config merge-tools.true.mergemarkers=detailed
1300 > --config merge-tools.true.mergemarkers=detailed
1289 merging f
1301 merging f
1290 <<<<<<< working copy: ef83787e2614 - test: revision 1
1302 <<<<<<< working copy: ef83787e2614 - test: revision 1
1291 revision 1
1303 revision 1
1292 space
1304 space
1293 =======
1305 =======
1294 revision 4
1306 revision 4
1295 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1307 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1296 revision 0
1308 revision 0
1297 space
1309 space
1298 revision 4
1310 revision 4
1299 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1311 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1300 (branch merge, don't forget to commit)
1312 (branch merge, don't forget to commit)
1301 $ aftermerge
1313 $ aftermerge
1302 # cat f
1314 # cat f
1303 <<<<<<< working copy: ef83787e2614 - test: revision 1
1315 <<<<<<< working copy: ef83787e2614 - test: revision 1
1304 revision 1
1316 revision 1
1305 space
1317 space
1306 =======
1318 =======
1307 revision 4
1319 revision 4
1308 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1320 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1309 # hg stat
1321 # hg stat
1310 M f
1322 M f
1311 # hg resolve --list
1323 # hg resolve --list
1312 R f
1324 R f
1313
1325
1314 premerge=keep respects ui.mergemarkertemplate instead of
1326 premerge=keep respects ui.mergemarkertemplate instead of
1315 true.mergemarkertemplate if true.mergemarkers=basic:
1327 true.mergemarkertemplate if true.mergemarkers=basic:
1316
1328
1317 $ beforemerge
1329 $ beforemerge
1318 [merge-tools]
1330 [merge-tools]
1319 false.whatever=
1331 false.whatever=
1320 true.priority=1
1332 true.priority=1
1321 true.executable=cat
1333 true.executable=cat
1322 # hg update -C 1
1334 # hg update -C 1
1323 $ hg merge -r 4 --config merge-tools.true.premerge=keep \
1335 $ hg merge -r 4 --config merge-tools.true.premerge=keep \
1324 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1336 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1325 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}'
1337 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}'
1326 merging f
1338 merging f
1327 <<<<<<< working copy: uitmpl 1
1339 <<<<<<< working copy: uitmpl 1
1328 revision 1
1340 revision 1
1329 space
1341 space
1330 =======
1342 =======
1331 revision 4
1343 revision 4
1332 >>>>>>> merge rev: uitmpl 4
1344 >>>>>>> merge rev: uitmpl 4
1333 revision 0
1345 revision 0
1334 space
1346 space
1335 revision 4
1347 revision 4
1336 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1348 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1337 (branch merge, don't forget to commit)
1349 (branch merge, don't forget to commit)
1338 $ aftermerge
1350 $ aftermerge
1339 # cat f
1351 # cat f
1340 <<<<<<< working copy: uitmpl 1
1352 <<<<<<< working copy: uitmpl 1
1341 revision 1
1353 revision 1
1342 space
1354 space
1343 =======
1355 =======
1344 revision 4
1356 revision 4
1345 >>>>>>> merge rev: uitmpl 4
1357 >>>>>>> merge rev: uitmpl 4
1346 # hg stat
1358 # hg stat
1347 M f
1359 M f
1348 # hg resolve --list
1360 # hg resolve --list
1349 R f
1361 R f
1350
1362
1351 premerge=keep respects true.mergemarkertemplate instead of
1363 premerge=keep respects true.mergemarkertemplate instead of
1352 true.mergemarkertemplate if true.mergemarkers=detailed:
1364 true.mergemarkertemplate if true.mergemarkers=detailed:
1353
1365
1354 $ beforemerge
1366 $ beforemerge
1355 [merge-tools]
1367 [merge-tools]
1356 false.whatever=
1368 false.whatever=
1357 true.priority=1
1369 true.priority=1
1358 true.executable=cat
1370 true.executable=cat
1359 # hg update -C 1
1371 # hg update -C 1
1360 $ hg merge -r 4 --config merge-tools.true.premerge=keep \
1372 $ hg merge -r 4 --config merge-tools.true.premerge=keep \
1361 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1373 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1362 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1374 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1363 > --config merge-tools.true.mergemarkers=detailed
1375 > --config merge-tools.true.mergemarkers=detailed
1364 merging f
1376 merging f
1365 <<<<<<< working copy: tooltmpl ef83787e2614
1377 <<<<<<< working copy: tooltmpl ef83787e2614
1366 revision 1
1378 revision 1
1367 space
1379 space
1368 =======
1380 =======
1369 revision 4
1381 revision 4
1370 >>>>>>> merge rev: tooltmpl 81448d39c9a0
1382 >>>>>>> merge rev: tooltmpl 81448d39c9a0
1371 revision 0
1383 revision 0
1372 space
1384 space
1373 revision 4
1385 revision 4
1374 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1386 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1375 (branch merge, don't forget to commit)
1387 (branch merge, don't forget to commit)
1376 $ aftermerge
1388 $ aftermerge
1377 # cat f
1389 # cat f
1378 <<<<<<< working copy: tooltmpl ef83787e2614
1390 <<<<<<< working copy: tooltmpl ef83787e2614
1379 revision 1
1391 revision 1
1380 space
1392 space
1381 =======
1393 =======
1382 revision 4
1394 revision 4
1383 >>>>>>> merge rev: tooltmpl 81448d39c9a0
1395 >>>>>>> merge rev: tooltmpl 81448d39c9a0
1384 # hg stat
1396 # hg stat
1385 M f
1397 M f
1386 # hg resolve --list
1398 # hg resolve --list
1387 R f
1399 R f
1388
1400
1389 Tool execution
1401 Tool execution
1390
1402
1391 set tools.args explicit to include $base $local $other $output:
1403 set tools.args explicit to include $base $local $other $output:
1392
1404
1393 $ beforemerge
1405 $ beforemerge
1394 [merge-tools]
1406 [merge-tools]
1395 false.whatever=
1407 false.whatever=
1396 true.priority=1
1408 true.priority=1
1397 true.executable=cat
1409 true.executable=cat
1398 # hg update -C 1
1410 # hg update -C 1
1399 $ hg merge -r 2 --config merge-tools.true.executable=head --config merge-tools.true.args='$base $local $other $output' \
1411 $ hg merge -r 2 --config merge-tools.true.executable=head --config merge-tools.true.args='$base $local $other $output' \
1400 > | sed 's,==> .* <==,==> ... <==,g'
1412 > | sed 's,==> .* <==,==> ... <==,g'
1401 merging f
1413 merging f
1402 ==> ... <==
1414 ==> ... <==
1403 revision 0
1415 revision 0
1404 space
1416 space
1405
1417
1406 ==> ... <==
1418 ==> ... <==
1407 revision 1
1419 revision 1
1408 space
1420 space
1409
1421
1410 ==> ... <==
1422 ==> ... <==
1411 revision 2
1423 revision 2
1412 space
1424 space
1413
1425
1414 ==> ... <==
1426 ==> ... <==
1415 revision 1
1427 revision 1
1416 space
1428 space
1417 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1429 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1418 (branch merge, don't forget to commit)
1430 (branch merge, don't forget to commit)
1419 $ aftermerge
1431 $ aftermerge
1420 # cat f
1432 # cat f
1421 revision 1
1433 revision 1
1422 space
1434 space
1423 # hg stat
1435 # hg stat
1424 M f
1436 M f
1425 # hg resolve --list
1437 # hg resolve --list
1426 R f
1438 R f
1427
1439
1428 Merge with "echo mergeresult > $local":
1440 Merge with "echo mergeresult > $local":
1429
1441
1430 $ beforemerge
1442 $ beforemerge
1431 [merge-tools]
1443 [merge-tools]
1432 false.whatever=
1444 false.whatever=
1433 true.priority=1
1445 true.priority=1
1434 true.executable=cat
1446 true.executable=cat
1435 # hg update -C 1
1447 # hg update -C 1
1436 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $local'
1448 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $local'
1437 merging f
1449 merging f
1438 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1450 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1439 (branch merge, don't forget to commit)
1451 (branch merge, don't forget to commit)
1440 $ aftermerge
1452 $ aftermerge
1441 # cat f
1453 # cat f
1442 mergeresult
1454 mergeresult
1443 # hg stat
1455 # hg stat
1444 M f
1456 M f
1445 # hg resolve --list
1457 # hg resolve --list
1446 R f
1458 R f
1447
1459
1448 - and $local is the file f:
1460 - and $local is the file f:
1449
1461
1450 $ beforemerge
1462 $ beforemerge
1451 [merge-tools]
1463 [merge-tools]
1452 false.whatever=
1464 false.whatever=
1453 true.priority=1
1465 true.priority=1
1454 true.executable=cat
1466 true.executable=cat
1455 # hg update -C 1
1467 # hg update -C 1
1456 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > f'
1468 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > f'
1457 merging f
1469 merging f
1458 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1470 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1459 (branch merge, don't forget to commit)
1471 (branch merge, don't forget to commit)
1460 $ aftermerge
1472 $ aftermerge
1461 # cat f
1473 # cat f
1462 mergeresult
1474 mergeresult
1463 # hg stat
1475 # hg stat
1464 M f
1476 M f
1465 # hg resolve --list
1477 # hg resolve --list
1466 R f
1478 R f
1467
1479
1468 Merge with "echo mergeresult > $output" - the variable is a bit magic:
1480 Merge with "echo mergeresult > $output" - the variable is a bit magic:
1469
1481
1470 $ beforemerge
1482 $ beforemerge
1471 [merge-tools]
1483 [merge-tools]
1472 false.whatever=
1484 false.whatever=
1473 true.priority=1
1485 true.priority=1
1474 true.executable=cat
1486 true.executable=cat
1475 # hg update -C 1
1487 # hg update -C 1
1476 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $output'
1488 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $output'
1477 merging f
1489 merging f
1478 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1490 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1479 (branch merge, don't forget to commit)
1491 (branch merge, don't forget to commit)
1480 $ aftermerge
1492 $ aftermerge
1481 # cat f
1493 # cat f
1482 mergeresult
1494 mergeresult
1483 # hg stat
1495 # hg stat
1484 M f
1496 M f
1485 # hg resolve --list
1497 # hg resolve --list
1486 R f
1498 R f
1487
1499
1488 Merge using tool with a path that must be quoted:
1500 Merge using tool with a path that must be quoted:
1489
1501
1490 $ beforemerge
1502 $ beforemerge
1491 [merge-tools]
1503 [merge-tools]
1492 false.whatever=
1504 false.whatever=
1493 true.priority=1
1505 true.priority=1
1494 true.executable=cat
1506 true.executable=cat
1495 # hg update -C 1
1507 # hg update -C 1
1496 $ cat <<EOF > 'my merge tool'
1508 $ cat <<EOF > 'my merge tool'
1497 > cat "\$1" "\$2" "\$3" > "\$4"
1509 > cat "\$1" "\$2" "\$3" > "\$4"
1498 > EOF
1510 > EOF
1499 $ hg --config merge-tools.true.executable='sh' \
1511 $ hg --config merge-tools.true.executable='sh' \
1500 > --config merge-tools.true.args='"./my merge tool" $base $local $other $output' \
1512 > --config merge-tools.true.args='"./my merge tool" $base $local $other $output' \
1501 > merge -r 2
1513 > merge -r 2
1502 merging f
1514 merging f
1503 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1515 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1504 (branch merge, don't forget to commit)
1516 (branch merge, don't forget to commit)
1505 $ rm -f 'my merge tool'
1517 $ rm -f 'my merge tool'
1506 $ aftermerge
1518 $ aftermerge
1507 # cat f
1519 # cat f
1508 revision 0
1520 revision 0
1509 space
1521 space
1510 revision 1
1522 revision 1
1511 space
1523 space
1512 revision 2
1524 revision 2
1513 space
1525 space
1514 # hg stat
1526 # hg stat
1515 M f
1527 M f
1516 # hg resolve --list
1528 # hg resolve --list
1517 R f
1529 R f
1518
1530
1519 Merge using a tool that supports labellocal, labelother, and labelbase, checking
1531 Merge using a tool that supports labellocal, labelother, and labelbase, checking
1520 that they're quoted properly as well. This is using the default 'basic'
1532 that they're quoted properly as well. This is using the default 'basic'
1521 mergemarkers even though ui.mergemarkers is 'detailed', so it's ignoring both
1533 mergemarkers even though ui.mergemarkers is 'detailed', so it's ignoring both
1522 mergemarkertemplate settings:
1534 mergemarkertemplate settings:
1523
1535
1524 $ beforemerge
1536 $ beforemerge
1525 [merge-tools]
1537 [merge-tools]
1526 false.whatever=
1538 false.whatever=
1527 true.priority=1
1539 true.priority=1
1528 true.executable=cat
1540 true.executable=cat
1529 # hg update -C 1
1541 # hg update -C 1
1530 $ cat <<EOF > printargs_merge_tool
1542 $ cat <<EOF > printargs_merge_tool
1531 > while test \$# -gt 0; do echo arg: \"\$1\"; shift; done
1543 > while test \$# -gt 0; do echo arg: \"\$1\"; shift; done
1532 > EOF
1544 > EOF
1533 $ hg --config merge-tools.true.executable='sh' \
1545 $ hg --config merge-tools.true.executable='sh' \
1534 > --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \
1546 > --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \
1535 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1547 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1536 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1548 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1537 > --config ui.mergemarkers=detailed \
1549 > --config ui.mergemarkers=detailed \
1538 > merge -r 2
1550 > merge -r 2
1539 merging f
1551 merging f
1540 arg: "ll:working copy"
1552 arg: "ll:working copy"
1541 arg: "lo:"
1553 arg: "lo:"
1542 arg: "merge rev"
1554 arg: "merge rev"
1543 arg: "lb:base: */f~base.*" (glob)
1555 arg: "lb:base: */f~base.*" (glob)
1544 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1556 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1545 (branch merge, don't forget to commit)
1557 (branch merge, don't forget to commit)
1546 $ rm -f 'printargs_merge_tool'
1558 $ rm -f 'printargs_merge_tool'
1547
1559
1548 Same test with experimental.mergetempdirprefix set:
1560 Same test with experimental.mergetempdirprefix set:
1549
1561
1550 $ beforemerge
1562 $ beforemerge
1551 [merge-tools]
1563 [merge-tools]
1552 false.whatever=
1564 false.whatever=
1553 true.priority=1
1565 true.priority=1
1554 true.executable=cat
1566 true.executable=cat
1555 # hg update -C 1
1567 # hg update -C 1
1556 $ cat <<EOF > printargs_merge_tool
1568 $ cat <<EOF > printargs_merge_tool
1557 > while test \$# -gt 0; do echo arg: \"\$1\"; shift; done
1569 > while test \$# -gt 0; do echo arg: \"\$1\"; shift; done
1558 > EOF
1570 > EOF
1559 $ hg --config experimental.mergetempdirprefix=$TESTTMP/hgmerge. \
1571 $ hg --config experimental.mergetempdirprefix=$TESTTMP/hgmerge. \
1560 > --config merge-tools.true.executable='sh' \
1572 > --config merge-tools.true.executable='sh' \
1561 > --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \
1573 > --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \
1562 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1574 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1563 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1575 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1564 > --config ui.mergemarkers=detailed \
1576 > --config ui.mergemarkers=detailed \
1565 > merge -r 2
1577 > merge -r 2
1566 merging f
1578 merging f
1567 arg: "ll:working copy"
1579 arg: "ll:working copy"
1568 arg: "lo:"
1580 arg: "lo:"
1569 arg: "merge rev"
1581 arg: "merge rev"
1570 arg: "lb:base: */hgmerge.*/f~base" (glob)
1582 arg: "lb:base: */hgmerge.*/f~base" (glob)
1571 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1583 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1572 (branch merge, don't forget to commit)
1584 (branch merge, don't forget to commit)
1573 $ rm -f 'printargs_merge_tool'
1585 $ rm -f 'printargs_merge_tool'
1574
1586
1575 Merge using a tool that supports labellocal, labelother, and labelbase, checking
1587 Merge using a tool that supports labellocal, labelother, and labelbase, checking
1576 that they're quoted properly as well. This is using 'detailed' mergemarkers,
1588 that they're quoted properly as well. This is using 'detailed' mergemarkers,
1577 even though ui.mergemarkers is 'basic', and using the tool's
1589 even though ui.mergemarkers is 'basic', and using the tool's
1578 mergemarkertemplate:
1590 mergemarkertemplate:
1579
1591
1580 $ beforemerge
1592 $ beforemerge
1581 [merge-tools]
1593 [merge-tools]
1582 false.whatever=
1594 false.whatever=
1583 true.priority=1
1595 true.priority=1
1584 true.executable=cat
1596 true.executable=cat
1585 # hg update -C 1
1597 # hg update -C 1
1586 $ cat <<EOF > printargs_merge_tool
1598 $ cat <<EOF > printargs_merge_tool
1587 > while test \$# -gt 0; do echo arg: \"\$1\"; shift; done
1599 > while test \$# -gt 0; do echo arg: \"\$1\"; shift; done
1588 > EOF
1600 > EOF
1589 $ hg --config merge-tools.true.executable='sh' \
1601 $ hg --config merge-tools.true.executable='sh' \
1590 > --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \
1602 > --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \
1591 > --config merge-tools.true.mergemarkers=detailed \
1603 > --config merge-tools.true.mergemarkers=detailed \
1592 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1604 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1593 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1605 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1594 > --config ui.mergemarkers=basic \
1606 > --config ui.mergemarkers=basic \
1595 > merge -r 2
1607 > merge -r 2
1596 merging f
1608 merging f
1597 arg: "ll:working copy: tooltmpl ef83787e2614"
1609 arg: "ll:working copy: tooltmpl ef83787e2614"
1598 arg: "lo:"
1610 arg: "lo:"
1599 arg: "merge rev: tooltmpl 0185f4e0cf02"
1611 arg: "merge rev: tooltmpl 0185f4e0cf02"
1600 arg: "lb:base: */f~base.*" (glob)
1612 arg: "lb:base: */f~base.*" (glob)
1601 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1613 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1602 (branch merge, don't forget to commit)
1614 (branch merge, don't forget to commit)
1603 $ rm -f 'printargs_merge_tool'
1615 $ rm -f 'printargs_merge_tool'
1604
1616
1605 The merge tool still gets labellocal and labelother as 'basic' even when
1617 The merge tool still gets labellocal and labelother as 'basic' even when
1606 premerge=keep is used and has 'detailed' markers:
1618 premerge=keep is used and has 'detailed' markers:
1607
1619
1608 $ beforemerge
1620 $ beforemerge
1609 [merge-tools]
1621 [merge-tools]
1610 false.whatever=
1622 false.whatever=
1611 true.priority=1
1623 true.priority=1
1612 true.executable=cat
1624 true.executable=cat
1613 # hg update -C 1
1625 # hg update -C 1
1614 $ cat <<EOF > mytool
1626 $ cat <<EOF > mytool
1615 > echo labellocal: \"\$1\"
1627 > echo labellocal: \"\$1\"
1616 > echo labelother: \"\$2\"
1628 > echo labelother: \"\$2\"
1617 > echo "output (arg)": \"\$3\"
1629 > echo "output (arg)": \"\$3\"
1618 > echo "output (contents)":
1630 > echo "output (contents)":
1619 > cat "\$3"
1631 > cat "\$3"
1620 > EOF
1632 > EOF
1621 $ hg --config merge-tools.true.executable='sh' \
1633 $ hg --config merge-tools.true.executable='sh' \
1622 > --config merge-tools.true.args='mytool $labellocal $labelother $output' \
1634 > --config merge-tools.true.args='mytool $labellocal $labelother $output' \
1623 > --config merge-tools.true.premerge=keep \
1635 > --config merge-tools.true.premerge=keep \
1624 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1636 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1625 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1637 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1626 > --config ui.mergemarkers=detailed \
1638 > --config ui.mergemarkers=detailed \
1627 > merge -r 2
1639 > merge -r 2
1628 merging f
1640 merging f
1629 labellocal: "working copy"
1641 labellocal: "working copy"
1630 labelother: "merge rev"
1642 labelother: "merge rev"
1631 output (arg): "$TESTTMP/repo/f"
1643 output (arg): "$TESTTMP/repo/f"
1632 output (contents):
1644 output (contents):
1633 <<<<<<< working copy: uitmpl 1
1645 <<<<<<< working copy: uitmpl 1
1634 revision 1
1646 revision 1
1635 =======
1647 =======
1636 revision 2
1648 revision 2
1637 >>>>>>> merge rev: uitmpl 2
1649 >>>>>>> merge rev: uitmpl 2
1638 space
1650 space
1639 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1651 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1640 (branch merge, don't forget to commit)
1652 (branch merge, don't forget to commit)
1641 $ rm -f 'mytool'
1653 $ rm -f 'mytool'
1642
1654
1643 premerge=keep uses the *tool's* mergemarkertemplate if tool's
1655 premerge=keep uses the *tool's* mergemarkertemplate if tool's
1644 mergemarkers=detailed; labellocal and labelother also use the tool's template
1656 mergemarkers=detailed; labellocal and labelother also use the tool's template
1645
1657
1646 $ beforemerge
1658 $ beforemerge
1647 [merge-tools]
1659 [merge-tools]
1648 false.whatever=
1660 false.whatever=
1649 true.priority=1
1661 true.priority=1
1650 true.executable=cat
1662 true.executable=cat
1651 # hg update -C 1
1663 # hg update -C 1
1652 $ cat <<EOF > mytool
1664 $ cat <<EOF > mytool
1653 > echo labellocal: \"\$1\"
1665 > echo labellocal: \"\$1\"
1654 > echo labelother: \"\$2\"
1666 > echo labelother: \"\$2\"
1655 > echo "output (arg)": \"\$3\"
1667 > echo "output (arg)": \"\$3\"
1656 > echo "output (contents)":
1668 > echo "output (contents)":
1657 > cat "\$3"
1669 > cat "\$3"
1658 > EOF
1670 > EOF
1659 $ hg --config merge-tools.true.executable='sh' \
1671 $ hg --config merge-tools.true.executable='sh' \
1660 > --config merge-tools.true.args='mytool $labellocal $labelother $output' \
1672 > --config merge-tools.true.args='mytool $labellocal $labelother $output' \
1661 > --config merge-tools.true.premerge=keep \
1673 > --config merge-tools.true.premerge=keep \
1662 > --config merge-tools.true.mergemarkers=detailed \
1674 > --config merge-tools.true.mergemarkers=detailed \
1663 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1675 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1664 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1676 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1665 > --config ui.mergemarkers=detailed \
1677 > --config ui.mergemarkers=detailed \
1666 > merge -r 2
1678 > merge -r 2
1667 merging f
1679 merging f
1668 labellocal: "working copy: tooltmpl ef83787e2614"
1680 labellocal: "working copy: tooltmpl ef83787e2614"
1669 labelother: "merge rev: tooltmpl 0185f4e0cf02"
1681 labelother: "merge rev: tooltmpl 0185f4e0cf02"
1670 output (arg): "$TESTTMP/repo/f"
1682 output (arg): "$TESTTMP/repo/f"
1671 output (contents):
1683 output (contents):
1672 <<<<<<< working copy: tooltmpl ef83787e2614
1684 <<<<<<< working copy: tooltmpl ef83787e2614
1673 revision 1
1685 revision 1
1674 =======
1686 =======
1675 revision 2
1687 revision 2
1676 >>>>>>> merge rev: tooltmpl 0185f4e0cf02
1688 >>>>>>> merge rev: tooltmpl 0185f4e0cf02
1677 space
1689 space
1678 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1690 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1679 (branch merge, don't forget to commit)
1691 (branch merge, don't forget to commit)
1680 $ rm -f 'mytool'
1692 $ rm -f 'mytool'
1681
1693
1682 Issue3581: Merging a filename that needs to be quoted
1694 Issue3581: Merging a filename that needs to be quoted
1683 (This test doesn't work on Windows filesystems even on Linux, so check
1695 (This test doesn't work on Windows filesystems even on Linux, so check
1684 for Unix-like permission)
1696 for Unix-like permission)
1685
1697
1686 #if unix-permissions
1698 #if unix-permissions
1687 $ beforemerge
1699 $ beforemerge
1688 [merge-tools]
1700 [merge-tools]
1689 false.whatever=
1701 false.whatever=
1690 true.priority=1
1702 true.priority=1
1691 true.executable=cat
1703 true.executable=cat
1692 # hg update -C 1
1704 # hg update -C 1
1693 $ echo "revision 5" > '"; exit 1; echo "'
1705 $ echo "revision 5" > '"; exit 1; echo "'
1694 $ hg commit -Am "revision 5"
1706 $ hg commit -Am "revision 5"
1695 adding "; exit 1; echo "
1707 adding "; exit 1; echo "
1696 warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "'
1708 warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "'
1697 $ hg update -C 1 > /dev/null
1709 $ hg update -C 1 > /dev/null
1698 $ echo "revision 6" > '"; exit 1; echo "'
1710 $ echo "revision 6" > '"; exit 1; echo "'
1699 $ hg commit -Am "revision 6"
1711 $ hg commit -Am "revision 6"
1700 adding "; exit 1; echo "
1712 adding "; exit 1; echo "
1701 warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "'
1713 warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "'
1702 created new head
1714 created new head
1703 $ hg merge --config merge-tools.true.executable="true" -r 5
1715 $ hg merge --config merge-tools.true.executable="true" -r 5
1704 merging "; exit 1; echo "
1716 merging "; exit 1; echo "
1705 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1717 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1706 (branch merge, don't forget to commit)
1718 (branch merge, don't forget to commit)
1707 $ hg update -C 1 > /dev/null
1719 $ hg update -C 1 > /dev/null
1708
1720
1709 #else
1721 #else
1710
1722
1711 Match the non-portable filename commits above for test stability
1723 Match the non-portable filename commits above for test stability
1712
1724
1713 $ hg import --bypass -q - << EOF
1725 $ hg import --bypass -q - << EOF
1714 > # HG changeset patch
1726 > # HG changeset patch
1715 > revision 5
1727 > revision 5
1716 >
1728 >
1717 > diff --git a/"; exit 1; echo " b/"; exit 1; echo "
1729 > diff --git a/"; exit 1; echo " b/"; exit 1; echo "
1718 > new file mode 100644
1730 > new file mode 100644
1719 > --- /dev/null
1731 > --- /dev/null
1720 > +++ b/"; exit 1; echo "
1732 > +++ b/"; exit 1; echo "
1721 > @@ -0,0 +1,1 @@
1733 > @@ -0,0 +1,1 @@
1722 > +revision 5
1734 > +revision 5
1723 > EOF
1735 > EOF
1724
1736
1725 $ hg import --bypass -q - << EOF
1737 $ hg import --bypass -q - << EOF
1726 > # HG changeset patch
1738 > # HG changeset patch
1727 > revision 6
1739 > revision 6
1728 >
1740 >
1729 > diff --git a/"; exit 1; echo " b/"; exit 1; echo "
1741 > diff --git a/"; exit 1; echo " b/"; exit 1; echo "
1730 > new file mode 100644
1742 > new file mode 100644
1731 > --- /dev/null
1743 > --- /dev/null
1732 > +++ b/"; exit 1; echo "
1744 > +++ b/"; exit 1; echo "
1733 > @@ -0,0 +1,1 @@
1745 > @@ -0,0 +1,1 @@
1734 > +revision 6
1746 > +revision 6
1735 > EOF
1747 > EOF
1736
1748
1737 #endif
1749 #endif
1738
1750
1739 Merge post-processing
1751 Merge post-processing
1740
1752
1741 cat is a bad merge-tool and doesn't change:
1753 cat is a bad merge-tool and doesn't change:
1742
1754
1743 $ beforemerge
1755 $ beforemerge
1744 [merge-tools]
1756 [merge-tools]
1745 false.whatever=
1757 false.whatever=
1746 true.priority=1
1758 true.priority=1
1747 true.executable=cat
1759 true.executable=cat
1748 # hg update -C 1
1760 # hg update -C 1
1749 $ hg merge -y -r 2 --config merge-tools.true.checkchanged=1
1761 $ hg merge -y -r 2 --config merge-tools.true.checkchanged=1
1750 merging f
1762 merging f
1751 revision 1
1763 revision 1
1752 space
1764 space
1753 revision 0
1765 revision 0
1754 space
1766 space
1755 revision 2
1767 revision 2
1756 space
1768 space
1757 output file f appears unchanged
1769 output file f appears unchanged
1758 was merge successful (yn)? n
1770 was merge successful (yn)? n
1759 merging f failed!
1771 merging f failed!
1760 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1772 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1761 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1773 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1762 [1]
1774 [1]
1763 $ aftermerge
1775 $ aftermerge
1764 # cat f
1776 # cat f
1765 revision 1
1777 revision 1
1766 space
1778 space
1767 # hg stat
1779 # hg stat
1768 M f
1780 M f
1769 ? f.orig
1781 ? f.orig
1770 # hg resolve --list
1782 # hg resolve --list
1771 U f
1783 U f
1772
1784
1773 missingbinary is a merge-tool that doesn't exist:
1785 missingbinary is a merge-tool that doesn't exist:
1774
1786
1775 $ echo "missingbinary.executable=doesnotexist" >> .hg/hgrc
1787 $ echo "missingbinary.executable=doesnotexist" >> .hg/hgrc
1776 $ beforemerge
1788 $ beforemerge
1777 [merge-tools]
1789 [merge-tools]
1778 false.whatever=
1790 false.whatever=
1779 true.priority=1
1791 true.priority=1
1780 true.executable=cat
1792 true.executable=cat
1781 missingbinary.executable=doesnotexist
1793 missingbinary.executable=doesnotexist
1782 # hg update -C 1
1794 # hg update -C 1
1783 $ hg merge -y -r 2 --config ui.merge=missingbinary
1795 $ hg merge -y -r 2 --config ui.merge=missingbinary
1784 couldn't find merge tool missingbinary (for pattern f)
1796 couldn't find merge tool missingbinary (for pattern f)
1785 merging f
1797 merging f
1786 couldn't find merge tool missingbinary (for pattern f)
1798 couldn't find merge tool missingbinary (for pattern f)
1787 revision 1
1799 revision 1
1788 space
1800 space
1789 revision 0
1801 revision 0
1790 space
1802 space
1791 revision 2
1803 revision 2
1792 space
1804 space
1793 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1805 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1794 (branch merge, don't forget to commit)
1806 (branch merge, don't forget to commit)
1795
1807
1796 $ hg update -q -C 1
1808 $ hg update -q -C 1
1797 $ rm f
1809 $ rm f
1798
1810
1799 internal merge cannot handle symlinks and shouldn't try:
1811 internal merge cannot handle symlinks and shouldn't try:
1800
1812
1801 #if symlink
1813 #if symlink
1802
1814
1803 $ ln -s symlink f
1815 $ ln -s symlink f
1804 $ hg commit -qm 'f is symlink'
1816 $ hg commit -qm 'f is symlink'
1805
1817
1806 #else
1818 #else
1807
1819
1808 $ hg import --bypass -q - << EOF
1820 $ hg import --bypass -q - << EOF
1809 > # HG changeset patch
1821 > # HG changeset patch
1810 > f is symlink
1822 > f is symlink
1811 >
1823 >
1812 > diff --git a/f b/f
1824 > diff --git a/f b/f
1813 > old mode 100644
1825 > old mode 100644
1814 > new mode 120000
1826 > new mode 120000
1815 > --- a/f
1827 > --- a/f
1816 > +++ b/f
1828 > +++ b/f
1817 > @@ -1,2 +1,1 @@
1829 > @@ -1,2 +1,1 @@
1818 > -revision 1
1830 > -revision 1
1819 > -space
1831 > -space
1820 > +symlink
1832 > +symlink
1821 > \ No newline at end of file
1833 > \ No newline at end of file
1822 > EOF
1834 > EOF
1823
1835
1824 Resolve 'other [destination] changed f which local [working copy] deleted' prompt
1836 Resolve 'other [destination] changed f which local [working copy] deleted' prompt
1825 $ hg up -q -C --config ui.interactive=True << EOF
1837 $ hg up -q -C --config ui.interactive=True << EOF
1826 > c
1838 > c
1827 > EOF
1839 > EOF
1828
1840
1829 #endif
1841 #endif
1830
1842
1831 $ hg merge -r 2 --tool internal:merge
1843 $ hg merge -r 2 --tool internal:merge
1832 merging f
1844 merging f
1833 warning: internal :merge cannot merge symlinks for f
1845 warning: internal :merge cannot merge symlinks for f
1834 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
1846 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
1835 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1847 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1836 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1848 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1837 [1]
1849 [1]
1838
1850
1839 Verify naming of temporary files and that extension is preserved:
1851 Verify naming of temporary files and that extension is preserved:
1840
1852
1841 $ hg update -q -C 1
1853 $ hg update -q -C 1
1842 $ hg mv f f.txt
1854 $ hg mv f f.txt
1843 $ hg ci -qm "f.txt"
1855 $ hg ci -qm "f.txt"
1844 $ hg update -q -C 2
1856 $ hg update -q -C 2
1845 $ hg merge -y -r tip --tool echo --config merge-tools.echo.args='$base $local $other $output'
1857 $ hg merge -y -r tip --tool echo --config merge-tools.echo.args='$base $local $other $output'
1846 merging f and f.txt to f.txt
1858 merging f and f.txt to f.txt
1847 */f~base.* */f~local.*.txt */f~other.*.txt $TESTTMP/repo/f.txt (glob)
1859 */f~base.* */f~local.*.txt */f~other.*.txt $TESTTMP/repo/f.txt (glob)
1848 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1860 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1849 (branch merge, don't forget to commit)
1861 (branch merge, don't forget to commit)
1850
1862
1851 Verify naming of temporary files and that extension is preserved
1863 Verify naming of temporary files and that extension is preserved
1852 (experimental.mergetempdirprefix version):
1864 (experimental.mergetempdirprefix version):
1853
1865
1854 $ hg update -q -C 1
1866 $ hg update -q -C 1
1855 $ hg mv f f.txt
1867 $ hg mv f f.txt
1856 $ hg ci -qm "f.txt"
1868 $ hg ci -qm "f.txt"
1857 $ hg update -q -C 2
1869 $ hg update -q -C 2
1858 $ hg merge -y -r tip --tool echo \
1870 $ hg merge -y -r tip --tool echo \
1859 > --config merge-tools.echo.args='$base $local $other $output' \
1871 > --config merge-tools.echo.args='$base $local $other $output' \
1860 > --config experimental.mergetempdirprefix=$TESTTMP/hgmerge.
1872 > --config experimental.mergetempdirprefix=$TESTTMP/hgmerge.
1861 merging f and f.txt to f.txt
1873 merging f and f.txt to f.txt
1862 $TESTTMP/hgmerge.*/f~base $TESTTMP/hgmerge.*/f~local.txt $TESTTMP/hgmerge.*/f~other.txt $TESTTMP/repo/f.txt (glob)
1874 $TESTTMP/hgmerge.*/f~base $TESTTMP/hgmerge.*/f~local.txt $TESTTMP/hgmerge.*/f~other.txt $TESTTMP/repo/f.txt (glob)
1863 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1875 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1864 (branch merge, don't forget to commit)
1876 (branch merge, don't forget to commit)
1865
1877
1866 Binary files capability checking
1878 Binary files capability checking
1867
1879
1868 $ hg update -q -C 0
1880 $ hg update -q -C 0
1869 $ python <<EOF
1881 $ python <<EOF
1870 > with open('b', 'wb') as fp:
1882 > with open('b', 'wb') as fp:
1871 > fp.write(b'\x00\x01\x02\x03')
1883 > fp.write(b'\x00\x01\x02\x03')
1872 > EOF
1884 > EOF
1873 $ hg add b
1885 $ hg add b
1874 $ hg commit -qm "add binary file (#1)"
1886 $ hg commit -qm "add binary file (#1)"
1875
1887
1876 $ hg update -q -C 0
1888 $ hg update -q -C 0
1877 $ python <<EOF
1889 $ python <<EOF
1878 > with open('b', 'wb') as fp:
1890 > with open('b', 'wb') as fp:
1879 > fp.write(b'\x03\x02\x01\x00')
1891 > fp.write(b'\x03\x02\x01\x00')
1880 > EOF
1892 > EOF
1881 $ hg add b
1893 $ hg add b
1882 $ hg commit -qm "add binary file (#2)"
1894 $ hg commit -qm "add binary file (#2)"
1883
1895
1884 By default, binary files capability of internal merge tools is not
1896 By default, binary files capability of internal merge tools is not
1885 checked strictly.
1897 checked strictly.
1886
1898
1887 (for merge-patterns, chosen unintentionally)
1899 (for merge-patterns, chosen unintentionally)
1888
1900
1889 $ hg merge 9 \
1901 $ hg merge 9 \
1890 > --config merge-patterns.b=:merge-other \
1902 > --config merge-patterns.b=:merge-other \
1891 > --config merge-patterns.re:[a-z]=:other
1903 > --config merge-patterns.re:[a-z]=:other
1892 warning: check merge-patterns configurations, if ':merge-other' for binary file 'b' is unintentional
1904 warning: check merge-patterns configurations, if ':merge-other' for binary file 'b' is unintentional
1893 (see 'hg help merge-tools' for binary files capability)
1905 (see 'hg help merge-tools' for binary files capability)
1894 merging b
1906 merging b
1895 warning: b looks like a binary file.
1907 warning: b looks like a binary file.
1896 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1908 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1897 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1909 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1898 [1]
1910 [1]
1899 $ hg merge --abort -q
1911 $ hg merge --abort -q
1900
1912
1901 (for ui.merge, ignored unintentionally)
1913 (for ui.merge, ignored unintentionally)
1902
1914
1903 $ hg merge 9 \
1915 $ hg merge 9 \
1904 > --config merge-tools.:other.binary=true \
1916 > --config merge-tools.:other.binary=true \
1905 > --config ui.merge=:other
1917 > --config ui.merge=:other
1906 tool :other (for pattern b) can't handle binary
1918 tool :other (for pattern b) can't handle binary
1907 tool true can't handle binary
1919 tool true can't handle binary
1908 tool :other can't handle binary
1920 tool :other can't handle binary
1909 tool false can't handle binary
1921 tool false can't handle binary
1910 no tool found to merge b
1922 no tool found to merge b
1911 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for b? u
1923 file 'b' needs to be resolved.
1924 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
1925 What do you want to do? u
1912 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1926 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1913 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1927 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1914 [1]
1928 [1]
1915 $ hg merge --abort -q
1929 $ hg merge --abort -q
1916
1930
1917 With merge.strict-capability-check=true, binary files capability of
1931 With merge.strict-capability-check=true, binary files capability of
1918 internal merge tools is checked strictly.
1932 internal merge tools is checked strictly.
1919
1933
1920 $ f --hexdump b
1934 $ f --hexdump b
1921 b:
1935 b:
1922 0000: 03 02 01 00 |....|
1936 0000: 03 02 01 00 |....|
1923
1937
1924 (for merge-patterns)
1938 (for merge-patterns)
1925
1939
1926 $ hg merge 9 --config merge.strict-capability-check=true \
1940 $ hg merge 9 --config merge.strict-capability-check=true \
1927 > --config merge-tools.:merge-other.binary=true \
1941 > --config merge-tools.:merge-other.binary=true \
1928 > --config merge-patterns.b=:merge-other \
1942 > --config merge-patterns.b=:merge-other \
1929 > --config merge-patterns.re:[a-z]=:other
1943 > --config merge-patterns.re:[a-z]=:other
1930 tool :merge-other (for pattern b) can't handle binary
1944 tool :merge-other (for pattern b) can't handle binary
1931 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1945 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1932 (branch merge, don't forget to commit)
1946 (branch merge, don't forget to commit)
1933 $ f --hexdump b
1947 $ f --hexdump b
1934 b:
1948 b:
1935 0000: 00 01 02 03 |....|
1949 0000: 00 01 02 03 |....|
1936 $ hg merge --abort -q
1950 $ hg merge --abort -q
1937
1951
1938 (for ui.merge)
1952 (for ui.merge)
1939
1953
1940 $ hg merge 9 --config merge.strict-capability-check=true \
1954 $ hg merge 9 --config merge.strict-capability-check=true \
1941 > --config ui.merge=:other
1955 > --config ui.merge=:other
1942 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1956 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1943 (branch merge, don't forget to commit)
1957 (branch merge, don't forget to commit)
1944 $ f --hexdump b
1958 $ f --hexdump b
1945 b:
1959 b:
1946 0000: 00 01 02 03 |....|
1960 0000: 00 01 02 03 |....|
1947 $ hg merge --abort -q
1961 $ hg merge --abort -q
1948
1962
1949 Check that the extra information is printed correctly
1963 Check that the extra information is printed correctly
1950
1964
1951 $ hg merge 9 \
1965 $ hg merge 9 \
1952 > --config merge-tools.testecho.executable='echo' \
1966 > --config merge-tools.testecho.executable='echo' \
1953 > --config merge-tools.testecho.args='merge runs here ...' \
1967 > --config merge-tools.testecho.args='merge runs here ...' \
1954 > --config merge-tools.testecho.binary=True \
1968 > --config merge-tools.testecho.binary=True \
1955 > --config ui.merge=testecho \
1969 > --config ui.merge=testecho \
1956 > --config ui.pre-merge-tool-output-template='\n{label("extmerge.running_merge_tool", "Running merge tool for {path} ({toolpath}):")}\n{separate("\n", extmerge_section(local), extmerge_section(base), extmerge_section(other))}\n' \
1970 > --config ui.pre-merge-tool-output-template='\n{label("extmerge.running_merge_tool", "Running merge tool for {path} ({toolpath}):")}\n{separate("\n", extmerge_section(local), extmerge_section(base), extmerge_section(other))}\n' \
1957 > --config 'templatealias.extmerge_section(sect)="- {pad("{sect.name} ({sect.label})", 20, left=True)}: {revset(sect.node)%"{rev}:{shortest(node,8)} {desc|firstline} {separate(" ", tags, bookmarks, branch)}"}"'
1971 > --config 'templatealias.extmerge_section(sect)="- {pad("{sect.name} ({sect.label})", 20, left=True)}: {revset(sect.node)%"{rev}:{shortest(node,8)} {desc|firstline} {separate(" ", tags, bookmarks, branch)}"}"'
1958 merging b
1972 merging b
1959
1973
1960 Running merge tool for b ("*/bin/echo.exe"): (glob) (windows !)
1974 Running merge tool for b ("*/bin/echo.exe"): (glob) (windows !)
1961 Running merge tool for b (*/bin/echo): (glob) (no-windows !)
1975 Running merge tool for b (*/bin/echo): (glob) (no-windows !)
1962 - local (working copy): 10:2d1f533d add binary file (#2) tip default
1976 - local (working copy): 10:2d1f533d add binary file (#2) tip default
1963 - base (base): -1:00000000 default
1977 - base (base): -1:00000000 default
1964 - other (merge rev): 9:1e7ad7d7 add binary file (#1) default
1978 - other (merge rev): 9:1e7ad7d7 add binary file (#1) default
1965 merge runs here ...
1979 merge runs here ...
1966 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1980 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1967 (branch merge, don't forget to commit)
1981 (branch merge, don't forget to commit)
1968
1982
1969 Check that debugpicktool examines which merge tool is chosen for
1983 Check that debugpicktool examines which merge tool is chosen for
1970 specified file as expected
1984 specified file as expected
1971
1985
1972 $ beforemerge
1986 $ beforemerge
1973 [merge-tools]
1987 [merge-tools]
1974 false.whatever=
1988 false.whatever=
1975 true.priority=1
1989 true.priority=1
1976 true.executable=cat
1990 true.executable=cat
1977 missingbinary.executable=doesnotexist
1991 missingbinary.executable=doesnotexist
1978 # hg update -C 1
1992 # hg update -C 1
1979
1993
1980 (default behavior: checking files in the working parent context)
1994 (default behavior: checking files in the working parent context)
1981
1995
1982 $ hg manifest
1996 $ hg manifest
1983 f
1997 f
1984 $ hg debugpickmergetool
1998 $ hg debugpickmergetool
1985 f = true
1999 f = true
1986
2000
1987 (-X/-I and file patterns limmit examination targets)
2001 (-X/-I and file patterns limmit examination targets)
1988
2002
1989 $ hg debugpickmergetool -X f
2003 $ hg debugpickmergetool -X f
1990 $ hg debugpickmergetool unknown
2004 $ hg debugpickmergetool unknown
1991 unknown: no such file in rev ef83787e2614
2005 unknown: no such file in rev ef83787e2614
1992
2006
1993 (--changedelete emulates merging change and delete)
2007 (--changedelete emulates merging change and delete)
1994
2008
1995 $ hg debugpickmergetool --changedelete
2009 $ hg debugpickmergetool --changedelete
1996 f = :prompt
2010 f = :prompt
1997
2011
1998 (-r REV causes checking files in specified revision)
2012 (-r REV causes checking files in specified revision)
1999
2013
2000 $ hg manifest -r 8
2014 $ hg manifest -r 8
2001 f.txt
2015 f.txt
2002 $ hg debugpickmergetool -r 8
2016 $ hg debugpickmergetool -r 8
2003 f.txt = true
2017 f.txt = true
2004
2018
2005 #if symlink
2019 #if symlink
2006
2020
2007 (symlink causes chosing :prompt)
2021 (symlink causes chosing :prompt)
2008
2022
2009 $ hg debugpickmergetool -r 6d00b3726f6e
2023 $ hg debugpickmergetool -r 6d00b3726f6e
2010 f = :prompt
2024 f = :prompt
2011
2025
2012 (by default, it is assumed that no internal merge tools has symlinks
2026 (by default, it is assumed that no internal merge tools has symlinks
2013 capability)
2027 capability)
2014
2028
2015 $ hg debugpickmergetool \
2029 $ hg debugpickmergetool \
2016 > -r 6d00b3726f6e \
2030 > -r 6d00b3726f6e \
2017 > --config merge-tools.:merge-other.symlink=true \
2031 > --config merge-tools.:merge-other.symlink=true \
2018 > --config merge-patterns.f=:merge-other \
2032 > --config merge-patterns.f=:merge-other \
2019 > --config merge-patterns.re:[f]=:merge-local \
2033 > --config merge-patterns.re:[f]=:merge-local \
2020 > --config merge-patterns.re:[a-z]=:other
2034 > --config merge-patterns.re:[a-z]=:other
2021 f = :prompt
2035 f = :prompt
2022
2036
2023 $ hg debugpickmergetool \
2037 $ hg debugpickmergetool \
2024 > -r 6d00b3726f6e \
2038 > -r 6d00b3726f6e \
2025 > --config merge-tools.:other.symlink=true \
2039 > --config merge-tools.:other.symlink=true \
2026 > --config ui.merge=:other
2040 > --config ui.merge=:other
2027 f = :prompt
2041 f = :prompt
2028
2042
2029 (with strict-capability-check=true, actual symlink capabilities are
2043 (with strict-capability-check=true, actual symlink capabilities are
2030 checked striclty)
2044 checked striclty)
2031
2045
2032 $ hg debugpickmergetool --config merge.strict-capability-check=true \
2046 $ hg debugpickmergetool --config merge.strict-capability-check=true \
2033 > -r 6d00b3726f6e \
2047 > -r 6d00b3726f6e \
2034 > --config merge-tools.:merge-other.symlink=true \
2048 > --config merge-tools.:merge-other.symlink=true \
2035 > --config merge-patterns.f=:merge-other \
2049 > --config merge-patterns.f=:merge-other \
2036 > --config merge-patterns.re:[f]=:merge-local \
2050 > --config merge-patterns.re:[f]=:merge-local \
2037 > --config merge-patterns.re:[a-z]=:other
2051 > --config merge-patterns.re:[a-z]=:other
2038 f = :other
2052 f = :other
2039
2053
2040 $ hg debugpickmergetool --config merge.strict-capability-check=true \
2054 $ hg debugpickmergetool --config merge.strict-capability-check=true \
2041 > -r 6d00b3726f6e \
2055 > -r 6d00b3726f6e \
2042 > --config ui.merge=:other
2056 > --config ui.merge=:other
2043 f = :other
2057 f = :other
2044
2058
2045 $ hg debugpickmergetool --config merge.strict-capability-check=true \
2059 $ hg debugpickmergetool --config merge.strict-capability-check=true \
2046 > -r 6d00b3726f6e \
2060 > -r 6d00b3726f6e \
2047 > --config merge-tools.:merge-other.symlink=true \
2061 > --config merge-tools.:merge-other.symlink=true \
2048 > --config ui.merge=:merge-other
2062 > --config ui.merge=:merge-other
2049 f = :prompt
2063 f = :prompt
2050
2064
2051 #endif
2065 #endif
2052
2066
2053 (--verbose shows some configurations)
2067 (--verbose shows some configurations)
2054
2068
2055 $ hg debugpickmergetool --tool foobar -v
2069 $ hg debugpickmergetool --tool foobar -v
2056 with --tool 'foobar'
2070 with --tool 'foobar'
2057 f = foobar
2071 f = foobar
2058
2072
2059 $ HGMERGE=false hg debugpickmergetool -v
2073 $ HGMERGE=false hg debugpickmergetool -v
2060 with HGMERGE='false'
2074 with HGMERGE='false'
2061 f = false
2075 f = false
2062
2076
2063 $ hg debugpickmergetool --config ui.merge=false -v
2077 $ hg debugpickmergetool --config ui.merge=false -v
2064 with ui.merge='false'
2078 with ui.merge='false'
2065 f = false
2079 f = false
2066
2080
2067 (--debug shows errors detected intermediately)
2081 (--debug shows errors detected intermediately)
2068
2082
2069 $ hg debugpickmergetool --config merge-patterns.f=true --config merge-tools.true.executable=nonexistentmergetool --debug f
2083 $ hg debugpickmergetool --config merge-patterns.f=true --config merge-tools.true.executable=nonexistentmergetool --debug f
2070 couldn't find merge tool true (for pattern f)
2084 couldn't find merge tool true (for pattern f)
2071 couldn't find merge tool true
2085 couldn't find merge tool true
2072 f = false
2086 f = false
2073
2087
2074 $ cd ..
2088 $ cd ..
@@ -1,448 +1,472 b''
1 #require symlink execbit
1 #require symlink execbit
2
2
3 $ tellmeabout() {
3 $ tellmeabout() {
4 > if [ -h $1 ]; then
4 > if [ -h $1 ]; then
5 > echo $1 is a symlink:
5 > echo $1 is a symlink:
6 > $TESTDIR/readlink.py $1
6 > $TESTDIR/readlink.py $1
7 > elif [ -x $1 ]; then
7 > elif [ -x $1 ]; then
8 > echo $1 is an executable file with content:
8 > echo $1 is an executable file with content:
9 > cat $1
9 > cat $1
10 > else
10 > else
11 > echo $1 is a plain file with content:
11 > echo $1 is a plain file with content:
12 > cat $1
12 > cat $1
13 > fi
13 > fi
14 > }
14 > }
15
15
16 $ hg init test1
16 $ hg init test1
17 $ cd test1
17 $ cd test1
18
18
19 $ echo a > a
19 $ echo a > a
20 $ hg ci -Aqmadd
20 $ hg ci -Aqmadd
21 $ chmod +x a
21 $ chmod +x a
22 $ hg ci -mexecutable
22 $ hg ci -mexecutable
23
23
24 $ hg up -q 0
24 $ hg up -q 0
25 $ rm a
25 $ rm a
26 $ ln -s symlink a
26 $ ln -s symlink a
27 $ hg ci -msymlink
27 $ hg ci -msymlink
28 created new head
28 created new head
29
29
30 Symlink is local parent, executable is other:
30 Symlink is local parent, executable is other:
31
31
32 $ hg merge --debug
32 $ hg merge --debug
33 resolving manifests
33 resolving manifests
34 branchmerge: True, force: False, partial: False
34 branchmerge: True, force: False, partial: False
35 ancestor: c334dc3be0da, local: 521a1e40188f+, remote: 3574f3e69b1c
35 ancestor: c334dc3be0da, local: 521a1e40188f+, remote: 3574f3e69b1c
36 preserving a for resolve of a
36 preserving a for resolve of a
37 a: versions differ -> m (premerge)
37 a: versions differ -> m (premerge)
38 tool internal:merge (for pattern a) can't handle symlinks
38 tool internal:merge (for pattern a) can't handle symlinks
39 couldn't find merge tool hgmerge
39 couldn't find merge tool hgmerge
40 no tool found to merge a
40 no tool found to merge a
41 picked tool ':prompt' for a (binary False symlink True changedelete False)
41 picked tool ':prompt' for a (binary False symlink True changedelete False)
42 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for a? u
42 file 'a' needs to be resolved.
43 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
44 What do you want to do? u
43 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
45 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
44 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
46 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
45 [1]
47 [1]
46
48
47 $ tellmeabout a
49 $ tellmeabout a
48 a is a symlink:
50 a is a symlink:
49 a -> symlink
51 a -> symlink
50 $ hg resolve a --tool internal:other
52 $ hg resolve a --tool internal:other
51 (no more unresolved files)
53 (no more unresolved files)
52 $ tellmeabout a
54 $ tellmeabout a
53 a is an executable file with content:
55 a is an executable file with content:
54 a
56 a
55 $ hg st
57 $ hg st
56 M a
58 M a
57 ? a.orig
59 ? a.orig
58
60
59 Symlink is other parent, executable is local:
61 Symlink is other parent, executable is local:
60
62
61 $ hg update -C 1
63 $ hg update -C 1
62 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
64 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
63
65
64 $ hg merge --debug --tool :union
66 $ hg merge --debug --tool :union
65 resolving manifests
67 resolving manifests
66 branchmerge: True, force: False, partial: False
68 branchmerge: True, force: False, partial: False
67 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
69 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
68 preserving a for resolve of a
70 preserving a for resolve of a
69 a: versions differ -> m (premerge)
71 a: versions differ -> m (premerge)
70 picked tool ':union' for a (binary False symlink True changedelete False)
72 picked tool ':union' for a (binary False symlink True changedelete False)
71 merging a
73 merging a
72 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
74 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
73 warning: internal :union cannot merge symlinks for a
75 warning: internal :union cannot merge symlinks for a
74 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
76 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
75 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
77 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
76 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
78 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
77 [1]
79 [1]
78
80
79 $ tellmeabout a
81 $ tellmeabout a
80 a is an executable file with content:
82 a is an executable file with content:
81 a
83 a
82
84
83 $ hg update -C 1
85 $ hg update -C 1
84 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
86 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
85
87
86 $ hg merge --debug --tool :merge3
88 $ hg merge --debug --tool :merge3
87 resolving manifests
89 resolving manifests
88 branchmerge: True, force: False, partial: False
90 branchmerge: True, force: False, partial: False
89 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
91 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
90 preserving a for resolve of a
92 preserving a for resolve of a
91 a: versions differ -> m (premerge)
93 a: versions differ -> m (premerge)
92 picked tool ':merge3' for a (binary False symlink True changedelete False)
94 picked tool ':merge3' for a (binary False symlink True changedelete False)
93 merging a
95 merging a
94 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
96 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
95 warning: internal :merge3 cannot merge symlinks for a
97 warning: internal :merge3 cannot merge symlinks for a
96 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
98 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
97 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
99 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
98 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
100 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
99 [1]
101 [1]
100
102
101 $ tellmeabout a
103 $ tellmeabout a
102 a is an executable file with content:
104 a is an executable file with content:
103 a
105 a
104
106
105 $ hg update -C 1
107 $ hg update -C 1
106 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
108 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
107
109
108 $ hg merge --debug --tool :merge-local
110 $ hg merge --debug --tool :merge-local
109 resolving manifests
111 resolving manifests
110 branchmerge: True, force: False, partial: False
112 branchmerge: True, force: False, partial: False
111 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
113 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
112 preserving a for resolve of a
114 preserving a for resolve of a
113 a: versions differ -> m (premerge)
115 a: versions differ -> m (premerge)
114 picked tool ':merge-local' for a (binary False symlink True changedelete False)
116 picked tool ':merge-local' for a (binary False symlink True changedelete False)
115 merging a
117 merging a
116 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
118 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
117 warning: internal :merge-local cannot merge symlinks for a
119 warning: internal :merge-local cannot merge symlinks for a
118 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
120 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
119 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
121 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
120 [1]
122 [1]
121
123
122 $ tellmeabout a
124 $ tellmeabout a
123 a is an executable file with content:
125 a is an executable file with content:
124 a
126 a
125
127
126 $ hg update -C 1
128 $ hg update -C 1
127 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
129 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
128
130
129 $ hg merge --debug --tool :merge-other
131 $ hg merge --debug --tool :merge-other
130 resolving manifests
132 resolving manifests
131 branchmerge: True, force: False, partial: False
133 branchmerge: True, force: False, partial: False
132 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
134 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
133 preserving a for resolve of a
135 preserving a for resolve of a
134 a: versions differ -> m (premerge)
136 a: versions differ -> m (premerge)
135 picked tool ':merge-other' for a (binary False symlink True changedelete False)
137 picked tool ':merge-other' for a (binary False symlink True changedelete False)
136 merging a
138 merging a
137 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
139 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
138 warning: internal :merge-other cannot merge symlinks for a
140 warning: internal :merge-other cannot merge symlinks for a
139 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
141 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
140 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
142 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
141 [1]
143 [1]
142
144
143 $ tellmeabout a
145 $ tellmeabout a
144 a is an executable file with content:
146 a is an executable file with content:
145 a
147 a
146
148
147 Update to link without local change should get us a symlink (issue3316):
149 Update to link without local change should get us a symlink (issue3316):
148
150
149 $ hg up -C 0
151 $ hg up -C 0
150 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
152 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
151 $ hg up
153 $ hg up
152 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
154 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
153 updated to "521a1e40188f: symlink"
155 updated to "521a1e40188f: symlink"
154 1 other heads for branch "default"
156 1 other heads for branch "default"
155 $ hg st
157 $ hg st
156 ? a.orig
158 ? a.orig
157
159
158 Update to link with local change should cause a merge prompt (issue3200):
160 Update to link with local change should cause a merge prompt (issue3200):
159
161
160 $ hg up -Cq 0
162 $ hg up -Cq 0
161 $ echo data > a
163 $ echo data > a
162 $ HGMERGE= hg up -y --debug --config ui.merge=
164 $ HGMERGE= hg up -y --debug --config ui.merge=
163 resolving manifests
165 resolving manifests
164 branchmerge: False, force: False, partial: False
166 branchmerge: False, force: False, partial: False
165 ancestor: c334dc3be0da, local: c334dc3be0da+, remote: 521a1e40188f
167 ancestor: c334dc3be0da, local: c334dc3be0da+, remote: 521a1e40188f
166 preserving a for resolve of a
168 preserving a for resolve of a
167 a: versions differ -> m (premerge)
169 a: versions differ -> m (premerge)
168 (couldn't find merge tool hgmerge|tool hgmerge can't handle symlinks) (re)
170 (couldn't find merge tool hgmerge|tool hgmerge can't handle symlinks) (re)
169 no tool found to merge a
171 no tool found to merge a
170 picked tool ':prompt' for a (binary False symlink True changedelete False)
172 picked tool ':prompt' for a (binary False symlink True changedelete False)
171 keep (l)ocal [working copy], take (o)ther [destination], or leave (u)nresolved for a? u
173 file 'a' needs to be resolved.
174 You can keep (l)ocal [working copy], take (o)ther [destination], or leave (u)nresolved.
175 What do you want to do? u
172 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
176 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
173 use 'hg resolve' to retry unresolved file merges
177 use 'hg resolve' to retry unresolved file merges
174 updated to "521a1e40188f: symlink"
178 updated to "521a1e40188f: symlink"
175 1 other heads for branch "default"
179 1 other heads for branch "default"
176 [1]
180 [1]
177 $ hg diff --git
181 $ hg diff --git
178 diff --git a/a b/a
182 diff --git a/a b/a
179 old mode 120000
183 old mode 120000
180 new mode 100644
184 new mode 100644
181 --- a/a
185 --- a/a
182 +++ b/a
186 +++ b/a
183 @@ -1,1 +1,1 @@
187 @@ -1,1 +1,1 @@
184 -symlink
188 -symlink
185 \ No newline at end of file
189 \ No newline at end of file
186 +data
190 +data
187
191
188
192
189 Test only 'l' change - happens rarely, except when recovering from situations
193 Test only 'l' change - happens rarely, except when recovering from situations
190 where that was what happened.
194 where that was what happened.
191
195
192 $ hg init test2
196 $ hg init test2
193 $ cd test2
197 $ cd test2
194 $ printf base > f
198 $ printf base > f
195 $ hg ci -Aqm0
199 $ hg ci -Aqm0
196 $ echo file > f
200 $ echo file > f
197 $ echo content >> f
201 $ echo content >> f
198 $ hg ci -qm1
202 $ hg ci -qm1
199 $ hg up -qr0
203 $ hg up -qr0
200 $ rm f
204 $ rm f
201 $ ln -s base f
205 $ ln -s base f
202 $ hg ci -qm2
206 $ hg ci -qm2
203 $ hg merge
207 $ hg merge
204 tool internal:merge (for pattern f) can't handle symlinks
208 tool internal:merge (for pattern f) can't handle symlinks
205 no tool found to merge f
209 no tool found to merge f
206 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
210 file 'f' needs to be resolved.
211 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
212 What do you want to do? u
207 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
213 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
208 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
214 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
209 [1]
215 [1]
210 $ tellmeabout f
216 $ tellmeabout f
211 f is a symlink:
217 f is a symlink:
212 f -> base
218 f -> base
213
219
214 $ hg up -Cqr1
220 $ hg up -Cqr1
215 $ hg merge
221 $ hg merge
216 tool internal:merge (for pattern f) can't handle symlinks
222 tool internal:merge (for pattern f) can't handle symlinks
217 no tool found to merge f
223 no tool found to merge f
218 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
224 file 'f' needs to be resolved.
225 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
226 What do you want to do? u
219 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
227 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
220 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
228 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
221 [1]
229 [1]
222 $ tellmeabout f
230 $ tellmeabout f
223 f is a plain file with content:
231 f is a plain file with content:
224 file
232 file
225 content
233 content
226
234
227 $ cd ..
235 $ cd ..
228
236
229 Test removed 'x' flag merged with change to symlink
237 Test removed 'x' flag merged with change to symlink
230
238
231 $ hg init test3
239 $ hg init test3
232 $ cd test3
240 $ cd test3
233 $ echo f > f
241 $ echo f > f
234 $ chmod +x f
242 $ chmod +x f
235 $ hg ci -Aqm0
243 $ hg ci -Aqm0
236 $ chmod -x f
244 $ chmod -x f
237 $ hg ci -qm1
245 $ hg ci -qm1
238 $ hg up -qr0
246 $ hg up -qr0
239 $ rm f
247 $ rm f
240 $ ln -s dangling f
248 $ ln -s dangling f
241 $ hg ci -qm2
249 $ hg ci -qm2
242 $ hg merge
250 $ hg merge
243 tool internal:merge (for pattern f) can't handle symlinks
251 tool internal:merge (for pattern f) can't handle symlinks
244 no tool found to merge f
252 no tool found to merge f
245 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
253 file 'f' needs to be resolved.
254 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
255 What do you want to do? u
246 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
256 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
247 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
257 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
248 [1]
258 [1]
249 $ tellmeabout f
259 $ tellmeabout f
250 f is a symlink:
260 f is a symlink:
251 f -> dangling
261 f -> dangling
252
262
253 $ hg up -Cqr1
263 $ hg up -Cqr1
254 $ hg merge
264 $ hg merge
255 tool internal:merge (for pattern f) can't handle symlinks
265 tool internal:merge (for pattern f) can't handle symlinks
256 no tool found to merge f
266 no tool found to merge f
257 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
267 file 'f' needs to be resolved.
268 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
269 What do you want to do? u
258 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
270 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
259 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
271 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
260 [1]
272 [1]
261 $ tellmeabout f
273 $ tellmeabout f
262 f is a plain file with content:
274 f is a plain file with content:
263 f
275 f
264
276
265 Test removed 'x' flag merged with content change - both ways
277 Test removed 'x' flag merged with content change - both ways
266
278
267 $ hg up -Cqr0
279 $ hg up -Cqr0
268 $ echo change > f
280 $ echo change > f
269 $ hg ci -qm3
281 $ hg ci -qm3
270 $ hg merge -r1
282 $ hg merge -r1
271 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
283 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
272 (branch merge, don't forget to commit)
284 (branch merge, don't forget to commit)
273 $ tellmeabout f
285 $ tellmeabout f
274 f is a plain file with content:
286 f is a plain file with content:
275 change
287 change
276
288
277 $ hg up -qCr1
289 $ hg up -qCr1
278 $ hg merge -r3
290 $ hg merge -r3
279 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
291 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
280 (branch merge, don't forget to commit)
292 (branch merge, don't forget to commit)
281 $ tellmeabout f
293 $ tellmeabout f
282 f is a plain file with content:
294 f is a plain file with content:
283 change
295 change
284
296
285 $ cd ..
297 $ cd ..
286
298
287 Test merge with no common ancestor:
299 Test merge with no common ancestor:
288 a: just different
300 a: just different
289 b: x vs -, different (cannot calculate x, cannot ask merge tool)
301 b: x vs -, different (cannot calculate x, cannot ask merge tool)
290 c: x vs -, same (cannot calculate x, merge tool is no good)
302 c: x vs -, same (cannot calculate x, merge tool is no good)
291 d: x vs l, different
303 d: x vs l, different
292 e: x vs l, same
304 e: x vs l, same
293 f: - vs l, different
305 f: - vs l, different
294 g: - vs l, same
306 g: - vs l, same
295 h: l vs l, different
307 h: l vs l, different
296 (where same means the filelog entry is shared and there thus is an ancestor!)
308 (where same means the filelog entry is shared and there thus is an ancestor!)
297
309
298 $ hg init test4
310 $ hg init test4
299 $ cd test4
311 $ cd test4
300 $ echo 0 > 0
312 $ echo 0 > 0
301 $ hg ci -Aqm0
313 $ hg ci -Aqm0
302
314
303 $ echo 1 > a
315 $ echo 1 > a
304 $ echo 1 > b
316 $ echo 1 > b
305 $ chmod +x b
317 $ chmod +x b
306 $ echo 1 > bx
318 $ echo 1 > bx
307 $ chmod +x bx
319 $ chmod +x bx
308 $ echo x > c
320 $ echo x > c
309 $ chmod +x c
321 $ chmod +x c
310 $ echo 1 > d
322 $ echo 1 > d
311 $ chmod +x d
323 $ chmod +x d
312 $ printf x > e
324 $ printf x > e
313 $ chmod +x e
325 $ chmod +x e
314 $ echo 1 > f
326 $ echo 1 > f
315 $ printf x > g
327 $ printf x > g
316 $ ln -s 1 h
328 $ ln -s 1 h
317 $ hg ci -qAm1
329 $ hg ci -qAm1
318
330
319 $ hg up -qr0
331 $ hg up -qr0
320 $ echo 2 > a
332 $ echo 2 > a
321 $ echo 2 > b
333 $ echo 2 > b
322 $ echo 2 > bx
334 $ echo 2 > bx
323 $ chmod +x bx
335 $ chmod +x bx
324 $ echo x > c
336 $ echo x > c
325 $ ln -s 2 d
337 $ ln -s 2 d
326 $ ln -s x e
338 $ ln -s x e
327 $ ln -s 2 f
339 $ ln -s 2 f
328 $ ln -s x g
340 $ ln -s x g
329 $ ln -s 2 h
341 $ ln -s 2 h
330 $ hg ci -Aqm2
342 $ hg ci -Aqm2
331
343
332 $ hg merge
344 $ hg merge
333 merging a
345 merging a
334 warning: cannot merge flags for b without common ancestor - keeping local flags
346 warning: cannot merge flags for b without common ancestor - keeping local flags
335 merging b
347 merging b
336 merging bx
348 merging bx
337 warning: cannot merge flags for c without common ancestor - keeping local flags
349 warning: cannot merge flags for c without common ancestor - keeping local flags
338 tool internal:merge (for pattern d) can't handle symlinks
350 tool internal:merge (for pattern d) can't handle symlinks
339 no tool found to merge d
351 no tool found to merge d
340 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for d? u
352 file 'd' needs to be resolved.
353 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
354 What do you want to do? u
341 tool internal:merge (for pattern f) can't handle symlinks
355 tool internal:merge (for pattern f) can't handle symlinks
342 no tool found to merge f
356 no tool found to merge f
343 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
357 file 'f' needs to be resolved.
358 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
359 What do you want to do? u
344 tool internal:merge (for pattern h) can't handle symlinks
360 tool internal:merge (for pattern h) can't handle symlinks
345 no tool found to merge h
361 no tool found to merge h
346 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for h? u
362 file 'h' needs to be resolved.
363 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
364 What do you want to do? u
347 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
365 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
348 warning: conflicts while merging b! (edit, then use 'hg resolve --mark')
366 warning: conflicts while merging b! (edit, then use 'hg resolve --mark')
349 warning: conflicts while merging bx! (edit, then use 'hg resolve --mark')
367 warning: conflicts while merging bx! (edit, then use 'hg resolve --mark')
350 3 files updated, 0 files merged, 0 files removed, 6 files unresolved
368 3 files updated, 0 files merged, 0 files removed, 6 files unresolved
351 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
369 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
352 [1]
370 [1]
353 $ hg resolve -l
371 $ hg resolve -l
354 U a
372 U a
355 U b
373 U b
356 U bx
374 U bx
357 U d
375 U d
358 U f
376 U f
359 U h
377 U h
360 $ tellmeabout a
378 $ tellmeabout a
361 a is a plain file with content:
379 a is a plain file with content:
362 <<<<<<< working copy: 0c617753b41b - test: 2
380 <<<<<<< working copy: 0c617753b41b - test: 2
363 2
381 2
364 =======
382 =======
365 1
383 1
366 >>>>>>> merge rev: 2e60aa20b912 - test: 1
384 >>>>>>> merge rev: 2e60aa20b912 - test: 1
367 $ tellmeabout b
385 $ tellmeabout b
368 b is a plain file with content:
386 b is a plain file with content:
369 <<<<<<< working copy: 0c617753b41b - test: 2
387 <<<<<<< working copy: 0c617753b41b - test: 2
370 2
388 2
371 =======
389 =======
372 1
390 1
373 >>>>>>> merge rev: 2e60aa20b912 - test: 1
391 >>>>>>> merge rev: 2e60aa20b912 - test: 1
374 $ tellmeabout c
392 $ tellmeabout c
375 c is a plain file with content:
393 c is a plain file with content:
376 x
394 x
377 $ tellmeabout d
395 $ tellmeabout d
378 d is a symlink:
396 d is a symlink:
379 d -> 2
397 d -> 2
380 $ tellmeabout e
398 $ tellmeabout e
381 e is a symlink:
399 e is a symlink:
382 e -> x
400 e -> x
383 $ tellmeabout f
401 $ tellmeabout f
384 f is a symlink:
402 f is a symlink:
385 f -> 2
403 f -> 2
386 $ tellmeabout g
404 $ tellmeabout g
387 g is a symlink:
405 g is a symlink:
388 g -> x
406 g -> x
389 $ tellmeabout h
407 $ tellmeabout h
390 h is a symlink:
408 h is a symlink:
391 h -> 2
409 h -> 2
392
410
393 $ hg up -Cqr1
411 $ hg up -Cqr1
394 $ hg merge
412 $ hg merge
395 merging a
413 merging a
396 warning: cannot merge flags for b without common ancestor - keeping local flags
414 warning: cannot merge flags for b without common ancestor - keeping local flags
397 merging b
415 merging b
398 merging bx
416 merging bx
399 warning: cannot merge flags for c without common ancestor - keeping local flags
417 warning: cannot merge flags for c without common ancestor - keeping local flags
400 tool internal:merge (for pattern d) can't handle symlinks
418 tool internal:merge (for pattern d) can't handle symlinks
401 no tool found to merge d
419 no tool found to merge d
402 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for d? u
420 file 'd' needs to be resolved.
421 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
422 What do you want to do? u
403 tool internal:merge (for pattern f) can't handle symlinks
423 tool internal:merge (for pattern f) can't handle symlinks
404 no tool found to merge f
424 no tool found to merge f
405 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for f? u
425 file 'f' needs to be resolved.
426 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
427 What do you want to do? u
406 tool internal:merge (for pattern h) can't handle symlinks
428 tool internal:merge (for pattern h) can't handle symlinks
407 no tool found to merge h
429 no tool found to merge h
408 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for h? u
430 file 'h' needs to be resolved.
431 You can keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved.
432 What do you want to do? u
409 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
433 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
410 warning: conflicts while merging b! (edit, then use 'hg resolve --mark')
434 warning: conflicts while merging b! (edit, then use 'hg resolve --mark')
411 warning: conflicts while merging bx! (edit, then use 'hg resolve --mark')
435 warning: conflicts while merging bx! (edit, then use 'hg resolve --mark')
412 3 files updated, 0 files merged, 0 files removed, 6 files unresolved
436 3 files updated, 0 files merged, 0 files removed, 6 files unresolved
413 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
437 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
414 [1]
438 [1]
415 $ tellmeabout a
439 $ tellmeabout a
416 a is a plain file with content:
440 a is a plain file with content:
417 <<<<<<< working copy: 2e60aa20b912 - test: 1
441 <<<<<<< working copy: 2e60aa20b912 - test: 1
418 1
442 1
419 =======
443 =======
420 2
444 2
421 >>>>>>> merge rev: 0c617753b41b - test: 2
445 >>>>>>> merge rev: 0c617753b41b - test: 2
422 $ tellmeabout b
446 $ tellmeabout b
423 b is an executable file with content:
447 b is an executable file with content:
424 <<<<<<< working copy: 2e60aa20b912 - test: 1
448 <<<<<<< working copy: 2e60aa20b912 - test: 1
425 1
449 1
426 =======
450 =======
427 2
451 2
428 >>>>>>> merge rev: 0c617753b41b - test: 2
452 >>>>>>> merge rev: 0c617753b41b - test: 2
429 $ tellmeabout c
453 $ tellmeabout c
430 c is an executable file with content:
454 c is an executable file with content:
431 x
455 x
432 $ tellmeabout d
456 $ tellmeabout d
433 d is an executable file with content:
457 d is an executable file with content:
434 1
458 1
435 $ tellmeabout e
459 $ tellmeabout e
436 e is an executable file with content:
460 e is an executable file with content:
437 x (no-eol)
461 x (no-eol)
438 $ tellmeabout f
462 $ tellmeabout f
439 f is a plain file with content:
463 f is a plain file with content:
440 1
464 1
441 $ tellmeabout g
465 $ tellmeabout g
442 g is a plain file with content:
466 g is a plain file with content:
443 x (no-eol)
467 x (no-eol)
444 $ tellmeabout h
468 $ tellmeabout h
445 h is a symlink:
469 h is a symlink:
446 h -> 1
470 h -> 1
447
471
448 $ cd ..
472 $ cd ..
@@ -1,426 +1,426 b''
1 $ cat >> $HGRCPATH <<EOF
1 $ cat >> $HGRCPATH <<EOF
2 > [extensions]
2 > [extensions]
3 > rebase=
3 > rebase=
4 > drawdag=$TESTDIR/drawdag.py
4 > drawdag=$TESTDIR/drawdag.py
5 > [alias]
5 > [alias]
6 > tglog = log -G --template "{rev}: {node|short} '{desc}' {branches}\n"
6 > tglog = log -G --template "{rev}: {node|short} '{desc}' {branches}\n"
7 > EOF
7 > EOF
8
8
9 $ hg init repo
9 $ hg init repo
10 $ cd repo
10 $ cd repo
11
11
12 $ echo A > a
12 $ echo A > a
13 $ echo >> a
13 $ echo >> a
14 $ hg ci -Am A
14 $ hg ci -Am A
15 adding a
15 adding a
16
16
17 $ echo B > a
17 $ echo B > a
18 $ echo >> a
18 $ echo >> a
19 $ hg ci -m B
19 $ hg ci -m B
20
20
21 $ echo C > a
21 $ echo C > a
22 $ echo >> a
22 $ echo >> a
23 $ hg ci -m C
23 $ hg ci -m C
24
24
25 $ hg up -q -C 0
25 $ hg up -q -C 0
26
26
27 $ echo D >> a
27 $ echo D >> a
28 $ hg ci -Am AD
28 $ hg ci -Am AD
29 created new head
29 created new head
30
30
31 $ hg tglog
31 $ hg tglog
32 @ 3: 3878212183bd 'AD'
32 @ 3: 3878212183bd 'AD'
33 |
33 |
34 | o 2: 30ae917c0e4f 'C'
34 | o 2: 30ae917c0e4f 'C'
35 | |
35 | |
36 | o 1: 0f4f7cb4f549 'B'
36 | o 1: 0f4f7cb4f549 'B'
37 |/
37 |/
38 o 0: 1e635d440a73 'A'
38 o 0: 1e635d440a73 'A'
39
39
40 $ hg rebase -s 1 -d 3
40 $ hg rebase -s 1 -d 3
41 rebasing 1:0f4f7cb4f549 "B"
41 rebasing 1:0f4f7cb4f549 "B"
42 merging a
42 merging a
43 rebasing 2:30ae917c0e4f "C"
43 rebasing 2:30ae917c0e4f "C"
44 merging a
44 merging a
45 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/0f4f7cb4f549-82b3b163-rebase.hg
45 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/0f4f7cb4f549-82b3b163-rebase.hg
46
46
47 $ hg tglog
47 $ hg tglog
48 o 3: 25773bc4b4b0 'C'
48 o 3: 25773bc4b4b0 'C'
49 |
49 |
50 o 2: c09015405f75 'B'
50 o 2: c09015405f75 'B'
51 |
51 |
52 @ 1: 3878212183bd 'AD'
52 @ 1: 3878212183bd 'AD'
53 |
53 |
54 o 0: 1e635d440a73 'A'
54 o 0: 1e635d440a73 'A'
55
55
56
56
57 $ cd ..
57 $ cd ..
58
58
59
59
60 Test rebasing of merges with ancestors of the rebase destination - a situation
60 Test rebasing of merges with ancestors of the rebase destination - a situation
61 that often happens when trying to recover from repeated merging with a mainline
61 that often happens when trying to recover from repeated merging with a mainline
62 branch.
62 branch.
63
63
64 The test case creates a dev branch that contains a couple of merges from the
64 The test case creates a dev branch that contains a couple of merges from the
65 default branch. When rebasing to the default branch, these merges would be
65 default branch. When rebasing to the default branch, these merges would be
66 merges with ancestors on the same branch. The merges _could_ contain some
66 merges with ancestors on the same branch. The merges _could_ contain some
67 interesting conflict resolutions or additional changes in the merge commit, but
67 interesting conflict resolutions or additional changes in the merge commit, but
68 that is mixed up with the actual merge stuff and there is in general no way to
68 that is mixed up with the actual merge stuff and there is in general no way to
69 separate them.
69 separate them.
70
70
71 Note: The dev branch contains _no_ changes to f-default. It might be unclear
71 Note: The dev branch contains _no_ changes to f-default. It might be unclear
72 how rebasing of ancestor merges should be handled, but the current behavior
72 how rebasing of ancestor merges should be handled, but the current behavior
73 with spurious prompts for conflicts in files that didn't change seems very
73 with spurious prompts for conflicts in files that didn't change seems very
74 wrong.
74 wrong.
75
75
76 $ hg init ancestor-merge
76 $ hg init ancestor-merge
77 $ cd ancestor-merge
77 $ cd ancestor-merge
78
78
79 $ touch f-default
79 $ touch f-default
80 $ hg ci -Aqm 'default: create f-default'
80 $ hg ci -Aqm 'default: create f-default'
81
81
82 $ hg branch -q dev
82 $ hg branch -q dev
83 $ hg ci -qm 'dev: create branch'
83 $ hg ci -qm 'dev: create branch'
84
84
85 $ echo stuff > f-dev
85 $ echo stuff > f-dev
86 $ hg ci -Aqm 'dev: f-dev stuff'
86 $ hg ci -Aqm 'dev: f-dev stuff'
87
87
88 $ hg up -q default
88 $ hg up -q default
89 $ echo stuff > f-default
89 $ echo stuff > f-default
90 $ hg ci -m 'default: f-default stuff'
90 $ hg ci -m 'default: f-default stuff'
91
91
92 $ hg up -q dev
92 $ hg up -q dev
93 $ hg merge -q default
93 $ hg merge -q default
94 $ hg ci -m 'dev: merge default'
94 $ hg ci -m 'dev: merge default'
95
95
96 $ hg up -q default
96 $ hg up -q default
97 $ hg rm f-default
97 $ hg rm f-default
98 $ hg ci -m 'default: remove f-default'
98 $ hg ci -m 'default: remove f-default'
99
99
100 $ hg up -q dev
100 $ hg up -q dev
101 $ hg merge -q default
101 $ hg merge -q default
102 $ hg ci -m 'dev: merge default'
102 $ hg ci -m 'dev: merge default'
103
103
104 $ hg up -q default
104 $ hg up -q default
105 $ echo stuff > f-other
105 $ echo stuff > f-other
106 $ hg ci -Aqm 'default: f-other stuff'
106 $ hg ci -Aqm 'default: f-other stuff'
107
107
108 $ hg tglog
108 $ hg tglog
109 @ 7: e08089805d82 'default: f-other stuff'
109 @ 7: e08089805d82 'default: f-other stuff'
110 |
110 |
111 | o 6: 9455ee510502 'dev: merge default' dev
111 | o 6: 9455ee510502 'dev: merge default' dev
112 |/|
112 |/|
113 o | 5: 462860db70a1 'default: remove f-default'
113 o | 5: 462860db70a1 'default: remove f-default'
114 | |
114 | |
115 | o 4: 4b019212aaf6 'dev: merge default' dev
115 | o 4: 4b019212aaf6 'dev: merge default' dev
116 |/|
116 |/|
117 o | 3: f157ecfd2b6b 'default: f-default stuff'
117 o | 3: f157ecfd2b6b 'default: f-default stuff'
118 | |
118 | |
119 | o 2: ec2c14fb2984 'dev: f-dev stuff' dev
119 | o 2: ec2c14fb2984 'dev: f-dev stuff' dev
120 | |
120 | |
121 | o 1: 1d1a643d390e 'dev: create branch' dev
121 | o 1: 1d1a643d390e 'dev: create branch' dev
122 |/
122 |/
123 o 0: e90e8eb90b6f 'default: create f-default'
123 o 0: e90e8eb90b6f 'default: create f-default'
124
124
125 $ hg clone -qU . ../ancestor-merge-2
125 $ hg clone -qU . ../ancestor-merge-2
126
126
127 Full rebase all the way back from branching point:
127 Full rebase all the way back from branching point:
128
128
129 $ hg rebase -r 'only(dev,default)' -d default --config ui.interactive=True << EOF
129 $ hg rebase -r 'only(dev,default)' -d default --config ui.interactive=True << EOF
130 > c
130 > c
131 > EOF
131 > EOF
132 rebasing 1:1d1a643d390e "dev: create branch"
132 rebasing 1:1d1a643d390e "dev: create branch"
133 note: not rebasing 1:1d1a643d390e "dev: create branch", its destination already has all its changes
133 note: not rebasing 1:1d1a643d390e "dev: create branch", its destination already has all its changes
134 rebasing 2:ec2c14fb2984 "dev: f-dev stuff"
134 rebasing 2:ec2c14fb2984 "dev: f-dev stuff"
135 rebasing 4:4b019212aaf6 "dev: merge default"
135 rebasing 4:4b019212aaf6 "dev: merge default"
136 file 'f-default' was deleted in local [dest] but was modified in other [source].
136 file 'f-default' was deleted in local [dest] but was modified in other [source].
137 What do you want to do?
137 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
138 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
138 What do you want to do? c
139 rebasing 6:9455ee510502 "dev: merge default"
139 rebasing 6:9455ee510502 "dev: merge default"
140 saved backup bundle to $TESTTMP/ancestor-merge/.hg/strip-backup/1d1a643d390e-43e9e04b-rebase.hg
140 saved backup bundle to $TESTTMP/ancestor-merge/.hg/strip-backup/1d1a643d390e-43e9e04b-rebase.hg
141 $ hg tglog
141 $ hg tglog
142 o 6: fbc098e72227 'dev: merge default'
142 o 6: fbc098e72227 'dev: merge default'
143 |
143 |
144 o 5: eda7b7f46f5d 'dev: merge default'
144 o 5: eda7b7f46f5d 'dev: merge default'
145 |
145 |
146 o 4: 3e075b1c0a40 'dev: f-dev stuff'
146 o 4: 3e075b1c0a40 'dev: f-dev stuff'
147 |
147 |
148 @ 3: e08089805d82 'default: f-other stuff'
148 @ 3: e08089805d82 'default: f-other stuff'
149 |
149 |
150 o 2: 462860db70a1 'default: remove f-default'
150 o 2: 462860db70a1 'default: remove f-default'
151 |
151 |
152 o 1: f157ecfd2b6b 'default: f-default stuff'
152 o 1: f157ecfd2b6b 'default: f-default stuff'
153 |
153 |
154 o 0: e90e8eb90b6f 'default: create f-default'
154 o 0: e90e8eb90b6f 'default: create f-default'
155
155
156 Grafty cherry picking rebasing:
156 Grafty cherry picking rebasing:
157
157
158 $ cd ../ancestor-merge-2
158 $ cd ../ancestor-merge-2
159
159
160 $ hg phase -fdr0:
160 $ hg phase -fdr0:
161 $ hg rebase -r 'children(only(dev,default))' -d default --config ui.interactive=True << EOF
161 $ hg rebase -r 'children(only(dev,default))' -d default --config ui.interactive=True << EOF
162 > c
162 > c
163 > EOF
163 > EOF
164 rebasing 2:ec2c14fb2984 "dev: f-dev stuff"
164 rebasing 2:ec2c14fb2984 "dev: f-dev stuff"
165 rebasing 4:4b019212aaf6 "dev: merge default"
165 rebasing 4:4b019212aaf6 "dev: merge default"
166 file 'f-default' was deleted in local [dest] but was modified in other [source].
166 file 'f-default' was deleted in local [dest] but was modified in other [source].
167 What do you want to do?
167 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
168 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
168 What do you want to do? c
169 rebasing 6:9455ee510502 "dev: merge default"
169 rebasing 6:9455ee510502 "dev: merge default"
170 saved backup bundle to $TESTTMP/ancestor-merge-2/.hg/strip-backup/ec2c14fb2984-62d0b222-rebase.hg
170 saved backup bundle to $TESTTMP/ancestor-merge-2/.hg/strip-backup/ec2c14fb2984-62d0b222-rebase.hg
171 $ hg tglog
171 $ hg tglog
172 o 7: fbc098e72227 'dev: merge default'
172 o 7: fbc098e72227 'dev: merge default'
173 |
173 |
174 o 6: eda7b7f46f5d 'dev: merge default'
174 o 6: eda7b7f46f5d 'dev: merge default'
175 |
175 |
176 o 5: 3e075b1c0a40 'dev: f-dev stuff'
176 o 5: 3e075b1c0a40 'dev: f-dev stuff'
177 |
177 |
178 o 4: e08089805d82 'default: f-other stuff'
178 o 4: e08089805d82 'default: f-other stuff'
179 |
179 |
180 o 3: 462860db70a1 'default: remove f-default'
180 o 3: 462860db70a1 'default: remove f-default'
181 |
181 |
182 o 2: f157ecfd2b6b 'default: f-default stuff'
182 o 2: f157ecfd2b6b 'default: f-default stuff'
183 |
183 |
184 | o 1: 1d1a643d390e 'dev: create branch' dev
184 | o 1: 1d1a643d390e 'dev: create branch' dev
185 |/
185 |/
186 o 0: e90e8eb90b6f 'default: create f-default'
186 o 0: e90e8eb90b6f 'default: create f-default'
187
187
188 $ cd ..
188 $ cd ..
189
189
190
190
191 Test order of parents of rebased merged with un-rebased changes as p1.
191 Test order of parents of rebased merged with un-rebased changes as p1.
192
192
193 $ hg init parentorder
193 $ hg init parentorder
194 $ cd parentorder
194 $ cd parentorder
195 $ touch f
195 $ touch f
196 $ hg ci -Aqm common
196 $ hg ci -Aqm common
197 $ touch change
197 $ touch change
198 $ hg ci -Aqm change
198 $ hg ci -Aqm change
199 $ touch target
199 $ touch target
200 $ hg ci -Aqm target
200 $ hg ci -Aqm target
201 $ hg up -qr 0
201 $ hg up -qr 0
202 $ touch outside
202 $ touch outside
203 $ hg ci -Aqm outside
203 $ hg ci -Aqm outside
204 $ hg merge -qr 1
204 $ hg merge -qr 1
205 $ hg ci -m 'merge p1 3=outside p2 1=ancestor'
205 $ hg ci -m 'merge p1 3=outside p2 1=ancestor'
206 $ hg par
206 $ hg par
207 changeset: 4:6990226659be
207 changeset: 4:6990226659be
208 tag: tip
208 tag: tip
209 parent: 3:f59da8fc0fcf
209 parent: 3:f59da8fc0fcf
210 parent: 1:dd40c13f7a6f
210 parent: 1:dd40c13f7a6f
211 user: test
211 user: test
212 date: Thu Jan 01 00:00:00 1970 +0000
212 date: Thu Jan 01 00:00:00 1970 +0000
213 summary: merge p1 3=outside p2 1=ancestor
213 summary: merge p1 3=outside p2 1=ancestor
214
214
215 $ hg up -qr 1
215 $ hg up -qr 1
216 $ hg merge -qr 3
216 $ hg merge -qr 3
217 $ hg ci -qm 'merge p1 1=ancestor p2 3=outside'
217 $ hg ci -qm 'merge p1 1=ancestor p2 3=outside'
218 $ hg par
218 $ hg par
219 changeset: 5:a57575f79074
219 changeset: 5:a57575f79074
220 tag: tip
220 tag: tip
221 parent: 1:dd40c13f7a6f
221 parent: 1:dd40c13f7a6f
222 parent: 3:f59da8fc0fcf
222 parent: 3:f59da8fc0fcf
223 user: test
223 user: test
224 date: Thu Jan 01 00:00:00 1970 +0000
224 date: Thu Jan 01 00:00:00 1970 +0000
225 summary: merge p1 1=ancestor p2 3=outside
225 summary: merge p1 1=ancestor p2 3=outside
226
226
227 $ hg tglog
227 $ hg tglog
228 @ 5: a57575f79074 'merge p1 1=ancestor p2 3=outside'
228 @ 5: a57575f79074 'merge p1 1=ancestor p2 3=outside'
229 |\
229 |\
230 +---o 4: 6990226659be 'merge p1 3=outside p2 1=ancestor'
230 +---o 4: 6990226659be 'merge p1 3=outside p2 1=ancestor'
231 | |/
231 | |/
232 | o 3: f59da8fc0fcf 'outside'
232 | o 3: f59da8fc0fcf 'outside'
233 | |
233 | |
234 +---o 2: a60552eb93fb 'target'
234 +---o 2: a60552eb93fb 'target'
235 | |
235 | |
236 o | 1: dd40c13f7a6f 'change'
236 o | 1: dd40c13f7a6f 'change'
237 |/
237 |/
238 o 0: 02f0f58d5300 'common'
238 o 0: 02f0f58d5300 'common'
239
239
240 $ hg rebase -r 4 -d 2
240 $ hg rebase -r 4 -d 2
241 rebasing 4:6990226659be "merge p1 3=outside p2 1=ancestor"
241 rebasing 4:6990226659be "merge p1 3=outside p2 1=ancestor"
242 saved backup bundle to $TESTTMP/parentorder/.hg/strip-backup/6990226659be-4d67a0d3-rebase.hg
242 saved backup bundle to $TESTTMP/parentorder/.hg/strip-backup/6990226659be-4d67a0d3-rebase.hg
243 $ hg tip
243 $ hg tip
244 changeset: 5:cca50676b1c5
244 changeset: 5:cca50676b1c5
245 tag: tip
245 tag: tip
246 parent: 2:a60552eb93fb
246 parent: 2:a60552eb93fb
247 parent: 3:f59da8fc0fcf
247 parent: 3:f59da8fc0fcf
248 user: test
248 user: test
249 date: Thu Jan 01 00:00:00 1970 +0000
249 date: Thu Jan 01 00:00:00 1970 +0000
250 summary: merge p1 3=outside p2 1=ancestor
250 summary: merge p1 3=outside p2 1=ancestor
251
251
252 $ hg rebase -r 4 -d 2
252 $ hg rebase -r 4 -d 2
253 rebasing 4:a57575f79074 "merge p1 1=ancestor p2 3=outside"
253 rebasing 4:a57575f79074 "merge p1 1=ancestor p2 3=outside"
254 saved backup bundle to $TESTTMP/parentorder/.hg/strip-backup/a57575f79074-385426e5-rebase.hg
254 saved backup bundle to $TESTTMP/parentorder/.hg/strip-backup/a57575f79074-385426e5-rebase.hg
255 $ hg tip
255 $ hg tip
256 changeset: 5:f9daf77ffe76
256 changeset: 5:f9daf77ffe76
257 tag: tip
257 tag: tip
258 parent: 2:a60552eb93fb
258 parent: 2:a60552eb93fb
259 parent: 3:f59da8fc0fcf
259 parent: 3:f59da8fc0fcf
260 user: test
260 user: test
261 date: Thu Jan 01 00:00:00 1970 +0000
261 date: Thu Jan 01 00:00:00 1970 +0000
262 summary: merge p1 1=ancestor p2 3=outside
262 summary: merge p1 1=ancestor p2 3=outside
263
263
264 $ hg tglog
264 $ hg tglog
265 @ 5: f9daf77ffe76 'merge p1 1=ancestor p2 3=outside'
265 @ 5: f9daf77ffe76 'merge p1 1=ancestor p2 3=outside'
266 |\
266 |\
267 +---o 4: cca50676b1c5 'merge p1 3=outside p2 1=ancestor'
267 +---o 4: cca50676b1c5 'merge p1 3=outside p2 1=ancestor'
268 | |/
268 | |/
269 | o 3: f59da8fc0fcf 'outside'
269 | o 3: f59da8fc0fcf 'outside'
270 | |
270 | |
271 o | 2: a60552eb93fb 'target'
271 o | 2: a60552eb93fb 'target'
272 | |
272 | |
273 o | 1: dd40c13f7a6f 'change'
273 o | 1: dd40c13f7a6f 'change'
274 |/
274 |/
275 o 0: 02f0f58d5300 'common'
275 o 0: 02f0f58d5300 'common'
276
276
277 rebase of merge of ancestors
277 rebase of merge of ancestors
278
278
279 $ hg up -qr 2
279 $ hg up -qr 2
280 $ hg merge -qr 3
280 $ hg merge -qr 3
281 $ echo 'other change while merging future "rebase ancestors"' > other
281 $ echo 'other change while merging future "rebase ancestors"' > other
282 $ hg ci -Aqm 'merge rebase ancestors'
282 $ hg ci -Aqm 'merge rebase ancestors'
283 $ hg rebase -d 5 -v
283 $ hg rebase -d 5 -v
284 rebasing 6:4c5f12f25ebe "merge rebase ancestors" (tip)
284 rebasing 6:4c5f12f25ebe "merge rebase ancestors" (tip)
285 resolving manifests
285 resolving manifests
286 removing other
286 removing other
287 note: merging f9daf77ffe76+ and 4c5f12f25ebe using bids from ancestors a60552eb93fb and f59da8fc0fcf
287 note: merging f9daf77ffe76+ and 4c5f12f25ebe using bids from ancestors a60552eb93fb and f59da8fc0fcf
288
288
289 calculating bids for ancestor a60552eb93fb
289 calculating bids for ancestor a60552eb93fb
290 resolving manifests
290 resolving manifests
291
291
292 calculating bids for ancestor f59da8fc0fcf
292 calculating bids for ancestor f59da8fc0fcf
293 resolving manifests
293 resolving manifests
294
294
295 auction for merging merge bids
295 auction for merging merge bids
296 other: consensus for g
296 other: consensus for g
297 end of auction
297 end of auction
298
298
299 getting other
299 getting other
300 committing files:
300 committing files:
301 other
301 other
302 committing manifest
302 committing manifest
303 committing changelog
303 committing changelog
304 rebase merging completed
304 rebase merging completed
305 1 changesets found
305 1 changesets found
306 uncompressed size of bundle content:
306 uncompressed size of bundle content:
307 199 (changelog)
307 199 (changelog)
308 216 (manifests)
308 216 (manifests)
309 182 other
309 182 other
310 saved backup bundle to $TESTTMP/parentorder/.hg/strip-backup/4c5f12f25ebe-f46990e5-rebase.hg
310 saved backup bundle to $TESTTMP/parentorder/.hg/strip-backup/4c5f12f25ebe-f46990e5-rebase.hg
311 1 changesets found
311 1 changesets found
312 uncompressed size of bundle content:
312 uncompressed size of bundle content:
313 254 (changelog)
313 254 (changelog)
314 167 (manifests)
314 167 (manifests)
315 182 other
315 182 other
316 adding branch
316 adding branch
317 adding changesets
317 adding changesets
318 adding manifests
318 adding manifests
319 adding file changes
319 adding file changes
320 added 1 changesets with 1 changes to 1 files
320 added 1 changesets with 1 changes to 1 files
321 rebase completed
321 rebase completed
322 $ hg tglog
322 $ hg tglog
323 @ 6: 113755df812b 'merge rebase ancestors'
323 @ 6: 113755df812b 'merge rebase ancestors'
324 |
324 |
325 o 5: f9daf77ffe76 'merge p1 1=ancestor p2 3=outside'
325 o 5: f9daf77ffe76 'merge p1 1=ancestor p2 3=outside'
326 |\
326 |\
327 +---o 4: cca50676b1c5 'merge p1 3=outside p2 1=ancestor'
327 +---o 4: cca50676b1c5 'merge p1 3=outside p2 1=ancestor'
328 | |/
328 | |/
329 | o 3: f59da8fc0fcf 'outside'
329 | o 3: f59da8fc0fcf 'outside'
330 | |
330 | |
331 o | 2: a60552eb93fb 'target'
331 o | 2: a60552eb93fb 'target'
332 | |
332 | |
333 o | 1: dd40c13f7a6f 'change'
333 o | 1: dd40c13f7a6f 'change'
334 |/
334 |/
335 o 0: 02f0f58d5300 'common'
335 o 0: 02f0f58d5300 'common'
336
336
337 Due to the limitation of 3-way merge algorithm (1 merge base), rebasing a merge
337 Due to the limitation of 3-way merge algorithm (1 merge base), rebasing a merge
338 may include unwanted content:
338 may include unwanted content:
339
339
340 $ hg init $TESTTMP/dual-merge-base1
340 $ hg init $TESTTMP/dual-merge-base1
341 $ cd $TESTTMP/dual-merge-base1
341 $ cd $TESTTMP/dual-merge-base1
342 $ hg debugdrawdag <<'EOS'
342 $ hg debugdrawdag <<'EOS'
343 > F
343 > F
344 > /|
344 > /|
345 > D E
345 > D E
346 > | |
346 > | |
347 > B C
347 > B C
348 > |/
348 > |/
349 > A Z
349 > A Z
350 > |/
350 > |/
351 > R
351 > R
352 > EOS
352 > EOS
353 $ hg rebase -r D+E+F -d Z
353 $ hg rebase -r D+E+F -d Z
354 rebasing 5:5f2c926dfecf "D" (D)
354 rebasing 5:5f2c926dfecf "D" (D)
355 rebasing 6:b296604d9846 "E" (E)
355 rebasing 6:b296604d9846 "E" (E)
356 rebasing 7:caa9781e507d "F" (F tip)
356 rebasing 7:caa9781e507d "F" (F tip)
357 abort: rebasing 7:caa9781e507d will include unwanted changes from 4:d6003a550c2c or 3:c1e6b162678d
357 abort: rebasing 7:caa9781e507d will include unwanted changes from 4:d6003a550c2c or 3:c1e6b162678d
358 [255]
358 [255]
359
359
360 The warning does not get printed if there is no unwanted change detected:
360 The warning does not get printed if there is no unwanted change detected:
361
361
362 $ hg init $TESTTMP/dual-merge-base2
362 $ hg init $TESTTMP/dual-merge-base2
363 $ cd $TESTTMP/dual-merge-base2
363 $ cd $TESTTMP/dual-merge-base2
364 $ hg debugdrawdag <<'EOS'
364 $ hg debugdrawdag <<'EOS'
365 > D
365 > D
366 > /|
366 > /|
367 > B C
367 > B C
368 > |/
368 > |/
369 > A Z
369 > A Z
370 > |/
370 > |/
371 > R
371 > R
372 > EOS
372 > EOS
373 $ hg rebase -r B+C+D -d Z
373 $ hg rebase -r B+C+D -d Z
374 rebasing 3:c1e6b162678d "B" (B)
374 rebasing 3:c1e6b162678d "B" (B)
375 rebasing 4:d6003a550c2c "C" (C)
375 rebasing 4:d6003a550c2c "C" (C)
376 rebasing 5:c8f78076273e "D" (D tip)
376 rebasing 5:c8f78076273e "D" (D tip)
377 saved backup bundle to $TESTTMP/dual-merge-base2/.hg/strip-backup/d6003a550c2c-6f1424b6-rebase.hg
377 saved backup bundle to $TESTTMP/dual-merge-base2/.hg/strip-backup/d6003a550c2c-6f1424b6-rebase.hg
378 $ hg manifest -r 'desc(D)'
378 $ hg manifest -r 'desc(D)'
379 B
379 B
380 C
380 C
381 R
381 R
382 Z
382 Z
383
383
384 The merge base could be different from old p1 (changed parent becomes new p1):
384 The merge base could be different from old p1 (changed parent becomes new p1):
385
385
386 $ hg init $TESTTMP/chosen-merge-base1
386 $ hg init $TESTTMP/chosen-merge-base1
387 $ cd $TESTTMP/chosen-merge-base1
387 $ cd $TESTTMP/chosen-merge-base1
388 $ hg debugdrawdag <<'EOS'
388 $ hg debugdrawdag <<'EOS'
389 > F
389 > F
390 > /|
390 > /|
391 > D E
391 > D E
392 > | |
392 > | |
393 > B C Z
393 > B C Z
394 > EOS
394 > EOS
395 $ hg rebase -r D+F -d Z
395 $ hg rebase -r D+F -d Z
396 rebasing 3:004dc1679908 "D" (D)
396 rebasing 3:004dc1679908 "D" (D)
397 rebasing 5:4be4cbf6f206 "F" (F tip)
397 rebasing 5:4be4cbf6f206 "F" (F tip)
398 saved backup bundle to $TESTTMP/chosen-merge-base1/.hg/strip-backup/004dc1679908-06a66a3c-rebase.hg
398 saved backup bundle to $TESTTMP/chosen-merge-base1/.hg/strip-backup/004dc1679908-06a66a3c-rebase.hg
399 $ hg manifest -r 'desc(F)'
399 $ hg manifest -r 'desc(F)'
400 C
400 C
401 D
401 D
402 E
402 E
403 Z
403 Z
404 $ hg log -r `hg log -r 'desc(F)' -T '{p1node}'` -T '{desc}\n'
404 $ hg log -r `hg log -r 'desc(F)' -T '{p1node}'` -T '{desc}\n'
405 D
405 D
406
406
407 $ hg init $TESTTMP/chosen-merge-base2
407 $ hg init $TESTTMP/chosen-merge-base2
408 $ cd $TESTTMP/chosen-merge-base2
408 $ cd $TESTTMP/chosen-merge-base2
409 $ hg debugdrawdag <<'EOS'
409 $ hg debugdrawdag <<'EOS'
410 > F
410 > F
411 > /|
411 > /|
412 > D E
412 > D E
413 > | |
413 > | |
414 > B C Z
414 > B C Z
415 > EOS
415 > EOS
416 $ hg rebase -r E+F -d Z
416 $ hg rebase -r E+F -d Z
417 rebasing 4:974e4943c210 "E" (E)
417 rebasing 4:974e4943c210 "E" (E)
418 rebasing 5:4be4cbf6f206 "F" (F tip)
418 rebasing 5:4be4cbf6f206 "F" (F tip)
419 saved backup bundle to $TESTTMP/chosen-merge-base2/.hg/strip-backup/974e4943c210-b2874da5-rebase.hg
419 saved backup bundle to $TESTTMP/chosen-merge-base2/.hg/strip-backup/974e4943c210-b2874da5-rebase.hg
420 $ hg manifest -r 'desc(F)'
420 $ hg manifest -r 'desc(F)'
421 B
421 B
422 D
422 D
423 E
423 E
424 Z
424 Z
425 $ hg log -r `hg log -r 'desc(F)' -T '{p1node}'` -T '{desc}\n'
425 $ hg log -r `hg log -r 'desc(F)' -T '{p1node}'` -T '{desc}\n'
426 E
426 E
@@ -1,1055 +1,1055 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], "w")
6 > f = open(sys.argv[1], "w")
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 $ um() { up $1; hg mv $1 $2; }
71 $ um() { up $1; hg mv $1 $2; }
72 $ nc() { hg cp $1 $2; } # just copy
72 $ nc() { hg cp $1 $2; } # just copy
73 $ nm() { hg mv $1 $2; } # just move
73 $ nm() { hg mv $1 $2; } # just move
74 $ tm "up a " "nc a b" " " "1 get local a to b"
74 $ tm "up a " "nc a b" " " "1 get local a to b"
75 created new head
75 created new head
76 --------------
76 --------------
77 test L:up a R:nc a b W: - 1 get local a to b
77 test L:up a R:nc a b W: - 1 get local a to b
78 --------------
78 --------------
79 unmatched files in other:
79 unmatched files in other:
80 b
80 b
81 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
81 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
82 src: 'a' -> dst: 'b' *
82 src: 'a' -> dst: 'b' *
83 checking for directory renames
83 checking for directory renames
84 resolving manifests
84 resolving manifests
85 branchmerge: True, force: False, partial: False
85 branchmerge: True, force: False, partial: False
86 ancestor: 924404dff337, local: e300d1c794ec+, remote: 4ce40f5aca24
86 ancestor: 924404dff337, local: e300d1c794ec+, remote: 4ce40f5aca24
87 preserving a for resolve of b
87 preserving a for resolve of b
88 preserving rev for resolve of rev
88 preserving rev for resolve of rev
89 starting 4 threads for background file closing (?)
89 starting 4 threads for background file closing (?)
90 b: remote copied from a -> m (premerge)
90 b: remote copied from a -> m (premerge)
91 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
91 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
92 merging a and b to b
92 merging a and b to b
93 my b@e300d1c794ec+ other b@4ce40f5aca24 ancestor a@924404dff337
93 my b@e300d1c794ec+ other b@4ce40f5aca24 ancestor a@924404dff337
94 premerge successful
94 premerge successful
95 rev: versions differ -> m (premerge)
95 rev: versions differ -> m (premerge)
96 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
96 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
97 merging rev
97 merging rev
98 my rev@e300d1c794ec+ other rev@4ce40f5aca24 ancestor rev@924404dff337
98 my rev@e300d1c794ec+ other rev@4ce40f5aca24 ancestor rev@924404dff337
99 rev: versions differ -> m (merge)
99 rev: versions differ -> m (merge)
100 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
100 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
101 my rev@e300d1c794ec+ other rev@4ce40f5aca24 ancestor rev@924404dff337
101 my rev@e300d1c794ec+ other rev@4ce40f5aca24 ancestor rev@924404dff337
102 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
102 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
103 merge tool returned: 0
103 merge tool returned: 0
104 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
104 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
105 (branch merge, don't forget to commit)
105 (branch merge, don't forget to commit)
106 --------------
106 --------------
107 M b
107 M b
108 a
108 a
109 C a
109 C a
110 --------------
110 --------------
111
111
112 $ tm "nc a b" "up a " " " "2 get rem change to a and b"
112 $ tm "nc a b" "up a " " " "2 get rem change to a and b"
113 created new head
113 created new head
114 --------------
114 --------------
115 test L:nc a b R:up a W: - 2 get rem change to a and b
115 test L:nc a b R:up a W: - 2 get rem change to a and b
116 --------------
116 --------------
117 unmatched files in local:
117 unmatched files in local:
118 b
118 b
119 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
119 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
120 src: 'a' -> dst: 'b' *
120 src: 'a' -> dst: 'b' *
121 checking for directory renames
121 checking for directory renames
122 resolving manifests
122 resolving manifests
123 branchmerge: True, force: False, partial: False
123 branchmerge: True, force: False, partial: False
124 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: f4db7e329e71
124 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: f4db7e329e71
125 preserving b for resolve of b
125 preserving b for resolve of b
126 preserving rev for resolve of rev
126 preserving rev for resolve of rev
127 a: remote is newer -> g
127 a: remote is newer -> g
128 getting a
128 getting a
129 b: local copied/moved from a -> m (premerge)
129 b: local copied/moved from a -> m (premerge)
130 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
130 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
131 merging b and a to b
131 merging b and a to b
132 my b@86a2aa42fc76+ other a@f4db7e329e71 ancestor a@924404dff337
132 my b@86a2aa42fc76+ other a@f4db7e329e71 ancestor a@924404dff337
133 premerge successful
133 premerge successful
134 rev: versions differ -> m (premerge)
134 rev: versions differ -> m (premerge)
135 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
135 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
136 merging rev
136 merging rev
137 my rev@86a2aa42fc76+ other rev@f4db7e329e71 ancestor rev@924404dff337
137 my rev@86a2aa42fc76+ other rev@f4db7e329e71 ancestor rev@924404dff337
138 rev: versions differ -> m (merge)
138 rev: versions differ -> m (merge)
139 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
139 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
140 my rev@86a2aa42fc76+ other rev@f4db7e329e71 ancestor rev@924404dff337
140 my rev@86a2aa42fc76+ other rev@f4db7e329e71 ancestor rev@924404dff337
141 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
141 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
142 merge tool returned: 0
142 merge tool returned: 0
143 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
143 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
144 (branch merge, don't forget to commit)
144 (branch merge, don't forget to commit)
145 --------------
145 --------------
146 M a
146 M a
147 M b
147 M b
148 a
148 a
149 --------------
149 --------------
150
150
151 $ tm "up a " "nm a b" " " "3 get local a change to b, remove a"
151 $ tm "up a " "nm a b" " " "3 get local a change to b, remove a"
152 created new head
152 created new head
153 --------------
153 --------------
154 test L:up a R:nm a b W: - 3 get local a change to b, remove a
154 test L:up a R:nm a b W: - 3 get local a change to b, remove a
155 --------------
155 --------------
156 unmatched files in other:
156 unmatched files in other:
157 b
157 b
158 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
158 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
159 src: 'a' -> dst: 'b' *
159 src: 'a' -> dst: 'b' *
160 checking for directory renames
160 checking for directory renames
161 resolving manifests
161 resolving manifests
162 branchmerge: True, force: False, partial: False
162 branchmerge: True, force: False, partial: False
163 ancestor: 924404dff337, local: e300d1c794ec+, remote: bdb19105162a
163 ancestor: 924404dff337, local: e300d1c794ec+, remote: bdb19105162a
164 preserving a for resolve of b
164 preserving a for resolve of b
165 preserving rev for resolve of rev
165 preserving rev for resolve of rev
166 removing a
166 removing a
167 starting 4 threads for background file closing (?)
167 starting 4 threads for background file closing (?)
168 b: remote moved from a -> m (premerge)
168 b: remote moved from a -> m (premerge)
169 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
169 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
170 merging a and b to b
170 merging a and b to b
171 my b@e300d1c794ec+ other b@bdb19105162a ancestor a@924404dff337
171 my b@e300d1c794ec+ other b@bdb19105162a ancestor a@924404dff337
172 premerge successful
172 premerge successful
173 rev: versions differ -> m (premerge)
173 rev: versions differ -> m (premerge)
174 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
174 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
175 merging rev
175 merging rev
176 my rev@e300d1c794ec+ other rev@bdb19105162a ancestor rev@924404dff337
176 my rev@e300d1c794ec+ other rev@bdb19105162a ancestor rev@924404dff337
177 rev: versions differ -> m (merge)
177 rev: versions differ -> m (merge)
178 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
178 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
179 my rev@e300d1c794ec+ other rev@bdb19105162a ancestor rev@924404dff337
179 my rev@e300d1c794ec+ other rev@bdb19105162a ancestor rev@924404dff337
180 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
180 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
181 merge tool returned: 0
181 merge tool returned: 0
182 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
182 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
183 (branch merge, don't forget to commit)
183 (branch merge, don't forget to commit)
184 --------------
184 --------------
185 M b
185 M b
186 a
186 a
187 --------------
187 --------------
188
188
189 $ tm "nm a b" "up a " " " "4 get remote change to b"
189 $ tm "nm a b" "up a " " " "4 get remote change to b"
190 created new head
190 created new head
191 --------------
191 --------------
192 test L:nm a b R:up a W: - 4 get remote change to b
192 test L:nm a b R:up a W: - 4 get remote change to b
193 --------------
193 --------------
194 unmatched files in local:
194 unmatched files in local:
195 b
195 b
196 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
196 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
197 src: 'a' -> dst: 'b' *
197 src: 'a' -> dst: 'b' *
198 checking for directory renames
198 checking for directory renames
199 resolving manifests
199 resolving manifests
200 branchmerge: True, force: False, partial: False
200 branchmerge: True, force: False, partial: False
201 ancestor: 924404dff337, local: 02963e448370+, remote: f4db7e329e71
201 ancestor: 924404dff337, local: 02963e448370+, remote: f4db7e329e71
202 preserving b for resolve of b
202 preserving b for resolve of b
203 preserving rev for resolve of rev
203 preserving rev for resolve of rev
204 starting 4 threads for background file closing (?)
204 starting 4 threads for background file closing (?)
205 b: local copied/moved from a -> m (premerge)
205 b: local copied/moved from a -> m (premerge)
206 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
206 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
207 merging b and a to b
207 merging b and a to b
208 my b@02963e448370+ other a@f4db7e329e71 ancestor a@924404dff337
208 my b@02963e448370+ other a@f4db7e329e71 ancestor a@924404dff337
209 premerge successful
209 premerge successful
210 rev: versions differ -> m (premerge)
210 rev: versions differ -> m (premerge)
211 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
211 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
212 merging rev
212 merging rev
213 my rev@02963e448370+ other rev@f4db7e329e71 ancestor rev@924404dff337
213 my rev@02963e448370+ other rev@f4db7e329e71 ancestor rev@924404dff337
214 rev: versions differ -> m (merge)
214 rev: versions differ -> m (merge)
215 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
215 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
216 my rev@02963e448370+ other rev@f4db7e329e71 ancestor rev@924404dff337
216 my rev@02963e448370+ other rev@f4db7e329e71 ancestor rev@924404dff337
217 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
217 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
218 merge tool returned: 0
218 merge tool returned: 0
219 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
219 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
220 (branch merge, don't forget to commit)
220 (branch merge, don't forget to commit)
221 --------------
221 --------------
222 M b
222 M b
223 a
223 a
224 --------------
224 --------------
225
225
226 $ tm " " "nc a b" " " "5 get b"
226 $ tm " " "nc a b" " " "5 get b"
227 created new head
227 created new head
228 --------------
228 --------------
229 test L: R:nc a b W: - 5 get b
229 test L: R:nc a b W: - 5 get b
230 --------------
230 --------------
231 unmatched files in other:
231 unmatched files in other:
232 b
232 b
233 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
233 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
234 src: 'a' -> dst: 'b'
234 src: 'a' -> dst: 'b'
235 checking for directory renames
235 checking for directory renames
236 resolving manifests
236 resolving manifests
237 branchmerge: True, force: False, partial: False
237 branchmerge: True, force: False, partial: False
238 ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: 4ce40f5aca24
238 ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: 4ce40f5aca24
239 preserving rev for resolve of rev
239 preserving rev for resolve of rev
240 b: remote created -> g
240 b: remote created -> g
241 getting b
241 getting b
242 rev: versions differ -> m (premerge)
242 rev: versions differ -> m (premerge)
243 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
243 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
244 merging rev
244 merging rev
245 my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
245 my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
246 rev: versions differ -> m (merge)
246 rev: versions differ -> m (merge)
247 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
247 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
248 my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
248 my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
249 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
249 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
250 merge tool returned: 0
250 merge tool returned: 0
251 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
251 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
252 (branch merge, don't forget to commit)
252 (branch merge, don't forget to commit)
253 --------------
253 --------------
254 M b
254 M b
255 C a
255 C a
256 --------------
256 --------------
257
257
258 $ tm "nc a b" " " " " "6 nothing"
258 $ tm "nc a b" " " " " "6 nothing"
259 created new head
259 created new head
260 --------------
260 --------------
261 test L:nc a b R: W: - 6 nothing
261 test L:nc a b R: W: - 6 nothing
262 --------------
262 --------------
263 unmatched files in local:
263 unmatched files in local:
264 b
264 b
265 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
265 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
266 src: 'a' -> dst: 'b'
266 src: 'a' -> dst: 'b'
267 checking for directory renames
267 checking for directory renames
268 resolving manifests
268 resolving manifests
269 branchmerge: True, force: False, partial: False
269 branchmerge: True, force: False, partial: False
270 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 97c705ade336
270 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 97c705ade336
271 preserving rev for resolve of rev
271 preserving rev for resolve of rev
272 starting 4 threads for background file closing (?)
272 starting 4 threads for background file closing (?)
273 rev: versions differ -> m (premerge)
273 rev: versions differ -> m (premerge)
274 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
274 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
275 merging rev
275 merging rev
276 my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
276 my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
277 rev: versions differ -> m (merge)
277 rev: versions differ -> m (merge)
278 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
278 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
279 my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
279 my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
280 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
280 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
281 merge tool returned: 0
281 merge tool returned: 0
282 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
282 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
283 (branch merge, don't forget to commit)
283 (branch merge, don't forget to commit)
284 --------------
284 --------------
285 C a
285 C a
286 C b
286 C b
287 --------------
287 --------------
288
288
289 $ tm " " "nm a b" " " "7 get b"
289 $ tm " " "nm a b" " " "7 get b"
290 created new head
290 created new head
291 --------------
291 --------------
292 test L: R:nm a b W: - 7 get b
292 test L: R:nm a b W: - 7 get b
293 --------------
293 --------------
294 unmatched files in other:
294 unmatched files in other:
295 b
295 b
296 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
296 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
297 src: 'a' -> dst: 'b'
297 src: 'a' -> dst: 'b'
298 checking for directory renames
298 checking for directory renames
299 resolving manifests
299 resolving manifests
300 branchmerge: True, force: False, partial: False
300 branchmerge: True, force: False, partial: False
301 ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: bdb19105162a
301 ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: bdb19105162a
302 preserving rev for resolve of rev
302 preserving rev for resolve of rev
303 a: other deleted -> r
303 a: other deleted -> r
304 removing a
304 removing a
305 b: remote created -> g
305 b: remote created -> g
306 getting b
306 getting b
307 rev: versions differ -> m (premerge)
307 rev: versions differ -> m (premerge)
308 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
308 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
309 merging rev
309 merging rev
310 my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
310 my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
311 rev: versions differ -> m (merge)
311 rev: versions differ -> m (merge)
312 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
312 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
313 my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
313 my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
314 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
314 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
315 merge tool returned: 0
315 merge tool returned: 0
316 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
316 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
317 (branch merge, don't forget to commit)
317 (branch merge, don't forget to commit)
318 --------------
318 --------------
319 M b
319 M b
320 --------------
320 --------------
321
321
322 $ tm "nm a b" " " " " "8 nothing"
322 $ tm "nm a b" " " " " "8 nothing"
323 created new head
323 created new head
324 --------------
324 --------------
325 test L:nm a b R: W: - 8 nothing
325 test L:nm a b R: W: - 8 nothing
326 --------------
326 --------------
327 unmatched files in local:
327 unmatched files in local:
328 b
328 b
329 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
329 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
330 src: 'a' -> dst: 'b'
330 src: 'a' -> dst: 'b'
331 checking for directory renames
331 checking for directory renames
332 resolving manifests
332 resolving manifests
333 branchmerge: True, force: False, partial: False
333 branchmerge: True, force: False, partial: False
334 ancestor: 924404dff337, local: 02963e448370+, remote: 97c705ade336
334 ancestor: 924404dff337, local: 02963e448370+, remote: 97c705ade336
335 preserving rev for resolve of rev
335 preserving rev for resolve of rev
336 starting 4 threads for background file closing (?)
336 starting 4 threads for background file closing (?)
337 rev: versions differ -> m (premerge)
337 rev: versions differ -> m (premerge)
338 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
338 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
339 merging rev
339 merging rev
340 my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
340 my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
341 rev: versions differ -> m (merge)
341 rev: versions differ -> m (merge)
342 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
342 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
343 my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
343 my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
344 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
344 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
345 merge tool returned: 0
345 merge tool returned: 0
346 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
346 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
347 (branch merge, don't forget to commit)
347 (branch merge, don't forget to commit)
348 --------------
348 --------------
349 C b
349 C b
350 --------------
350 --------------
351
351
352 $ tm "um a b" "um a b" " " "9 do merge with ancestor in a"
352 $ tm "um a b" "um a b" " " "9 do merge with ancestor in a"
353 created new head
353 created new head
354 --------------
354 --------------
355 test L:um a b R:um a b W: - 9 do merge with ancestor in a
355 test L:um a b R:um a b W: - 9 do merge with ancestor in a
356 --------------
356 --------------
357 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
357 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
358 src: 'a' -> dst: 'b' *
358 src: 'a' -> dst: 'b' *
359 checking for directory renames
359 checking for directory renames
360 resolving manifests
360 resolving manifests
361 branchmerge: True, force: False, partial: False
361 branchmerge: True, force: False, partial: False
362 ancestor: 924404dff337, local: 62e7bf090eba+, remote: 49b6d8032493
362 ancestor: 924404dff337, local: 62e7bf090eba+, remote: 49b6d8032493
363 preserving b for resolve of b
363 preserving b for resolve of b
364 preserving rev for resolve of rev
364 preserving rev for resolve of rev
365 starting 4 threads for background file closing (?)
365 starting 4 threads for background file closing (?)
366 b: both renamed from a -> m (premerge)
366 b: both renamed from a -> m (premerge)
367 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
367 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
368 merging b
368 merging b
369 my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
369 my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
370 rev: versions differ -> m (premerge)
370 rev: versions differ -> m (premerge)
371 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
371 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
372 merging rev
372 merging rev
373 my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
373 my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
374 b: both renamed from a -> m (merge)
374 b: both renamed from a -> m (merge)
375 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
375 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
376 my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
376 my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
377 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
377 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
378 merge tool returned: 0
378 merge tool returned: 0
379 rev: versions differ -> m (merge)
379 rev: versions differ -> m (merge)
380 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
380 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
381 my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
381 my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
382 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
382 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
383 merge tool returned: 0
383 merge tool returned: 0
384 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
384 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
385 (branch merge, don't forget to commit)
385 (branch merge, don't forget to commit)
386 --------------
386 --------------
387 M b
387 M b
388 --------------
388 --------------
389
389
390
390
391 m "um a c" "um x c" " " "10 do merge with no ancestor"
391 m "um a c" "um x c" " " "10 do merge with no ancestor"
392
392
393 $ tm "nm a b" "nm a c" " " "11 get c, keep b"
393 $ tm "nm a b" "nm a c" " " "11 get c, keep b"
394 created new head
394 created new head
395 --------------
395 --------------
396 test L:nm a b R:nm a c W: - 11 get c, keep b
396 test L:nm a b R:nm a c W: - 11 get c, keep b
397 --------------
397 --------------
398 unmatched files in local:
398 unmatched files in local:
399 b
399 b
400 unmatched files in other:
400 unmatched files in other:
401 c
401 c
402 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
402 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
403 src: 'a' -> dst: 'b' !
403 src: 'a' -> dst: 'b' !
404 src: 'a' -> dst: 'c' !
404 src: 'a' -> dst: 'c' !
405 checking for directory renames
405 checking for directory renames
406 resolving manifests
406 resolving manifests
407 branchmerge: True, force: False, partial: False
407 branchmerge: True, force: False, partial: False
408 ancestor: 924404dff337, local: 02963e448370+, remote: fe905ef2c33e
408 ancestor: 924404dff337, local: 02963e448370+, remote: fe905ef2c33e
409 note: possible conflict - a was renamed multiple times to:
409 note: possible conflict - a was renamed multiple times to:
410 b
410 b
411 c
411 c
412 preserving rev for resolve of rev
412 preserving rev for resolve of rev
413 c: remote created -> g
413 c: remote created -> g
414 getting c
414 getting c
415 rev: versions differ -> m (premerge)
415 rev: versions differ -> m (premerge)
416 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
416 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
417 merging rev
417 merging rev
418 my rev@02963e448370+ other rev@fe905ef2c33e ancestor rev@924404dff337
418 my rev@02963e448370+ other rev@fe905ef2c33e ancestor rev@924404dff337
419 rev: versions differ -> m (merge)
419 rev: versions differ -> m (merge)
420 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
420 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
421 my rev@02963e448370+ other rev@fe905ef2c33e ancestor rev@924404dff337
421 my rev@02963e448370+ other rev@fe905ef2c33e ancestor rev@924404dff337
422 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
422 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
423 merge tool returned: 0
423 merge tool returned: 0
424 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
424 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
425 (branch merge, don't forget to commit)
425 (branch merge, don't forget to commit)
426 --------------
426 --------------
427 M c
427 M c
428 C b
428 C b
429 --------------
429 --------------
430
430
431 $ tm "nc a b" "up b " " " "12 merge b no ancestor"
431 $ tm "nc a b" "up b " " " "12 merge b no ancestor"
432 created new head
432 created new head
433 --------------
433 --------------
434 test L:nc a b R:up b W: - 12 merge b no ancestor
434 test L:nc a b R:up b W: - 12 merge b no ancestor
435 --------------
435 --------------
436 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
436 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
437 src: 'a' -> dst: 'b'
437 src: 'a' -> dst: 'b'
438 checking for directory renames
438 checking for directory renames
439 resolving manifests
439 resolving manifests
440 branchmerge: True, force: False, partial: False
440 branchmerge: True, force: False, partial: False
441 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: af30c7647fc7
441 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: af30c7647fc7
442 preserving b for resolve of b
442 preserving b for resolve of b
443 preserving rev for resolve of rev
443 preserving rev for resolve of rev
444 starting 4 threads for background file closing (?)
444 starting 4 threads for background file closing (?)
445 b: both created -> m (premerge)
445 b: both created -> m (premerge)
446 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
446 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
447 merging b
447 merging b
448 my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
448 my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
449 rev: versions differ -> m (premerge)
449 rev: versions differ -> m (premerge)
450 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
450 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
451 merging rev
451 merging rev
452 my rev@86a2aa42fc76+ other rev@af30c7647fc7 ancestor rev@924404dff337
452 my rev@86a2aa42fc76+ other rev@af30c7647fc7 ancestor rev@924404dff337
453 b: both created -> m (merge)
453 b: both created -> m (merge)
454 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
454 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
455 my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
455 my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
456 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
456 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
457 merge tool returned: 0
457 merge tool returned: 0
458 rev: versions differ -> m (merge)
458 rev: versions differ -> m (merge)
459 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
459 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
460 my rev@86a2aa42fc76+ other rev@af30c7647fc7 ancestor rev@924404dff337
460 my rev@86a2aa42fc76+ other rev@af30c7647fc7 ancestor rev@924404dff337
461 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
461 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
462 merge tool returned: 0
462 merge tool returned: 0
463 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
463 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
464 (branch merge, don't forget to commit)
464 (branch merge, don't forget to commit)
465 --------------
465 --------------
466 M b
466 M b
467 C a
467 C a
468 --------------
468 --------------
469
469
470 $ tm "up b " "nm a b" " " "13 merge b no ancestor"
470 $ tm "up b " "nm a b" " " "13 merge b no ancestor"
471 created new head
471 created new head
472 --------------
472 --------------
473 test L:up b R:nm a b W: - 13 merge b no ancestor
473 test L:up b R:nm a b W: - 13 merge b no ancestor
474 --------------
474 --------------
475 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
475 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
476 src: 'a' -> dst: 'b'
476 src: 'a' -> dst: 'b'
477 checking for directory renames
477 checking for directory renames
478 resolving manifests
478 resolving manifests
479 branchmerge: True, force: False, partial: False
479 branchmerge: True, force: False, partial: False
480 ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a
480 ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a
481 preserving b for resolve of b
481 preserving b for resolve of b
482 preserving rev for resolve of rev
482 preserving rev for resolve of rev
483 a: other deleted -> r
483 a: other deleted -> r
484 removing a
484 removing a
485 starting 4 threads for background file closing (?)
485 starting 4 threads for background file closing (?)
486 b: both created -> m (premerge)
486 b: both created -> m (premerge)
487 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
487 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
488 merging b
488 merging b
489 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
489 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
490 rev: versions differ -> m (premerge)
490 rev: versions differ -> m (premerge)
491 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
491 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
492 merging rev
492 merging rev
493 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
493 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
494 b: both created -> m (merge)
494 b: both created -> m (merge)
495 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
495 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
496 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
496 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
497 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
497 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
498 merge tool returned: 0
498 merge tool returned: 0
499 rev: versions differ -> m (merge)
499 rev: versions differ -> m (merge)
500 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
500 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
501 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
501 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
502 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
502 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
503 merge tool returned: 0
503 merge tool returned: 0
504 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
504 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
505 (branch merge, don't forget to commit)
505 (branch merge, don't forget to commit)
506 --------------
506 --------------
507 M b
507 M b
508 --------------
508 --------------
509
509
510 $ tm "nc a b" "up a b" " " "14 merge b no ancestor"
510 $ tm "nc a b" "up a b" " " "14 merge b no ancestor"
511 created new head
511 created new head
512 --------------
512 --------------
513 test L:nc a b R:up a b W: - 14 merge b no ancestor
513 test L:nc a b R:up a b W: - 14 merge b no ancestor
514 --------------
514 --------------
515 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
515 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
516 src: 'a' -> dst: 'b'
516 src: 'a' -> dst: 'b'
517 checking for directory renames
517 checking for directory renames
518 resolving manifests
518 resolving manifests
519 branchmerge: True, force: False, partial: False
519 branchmerge: True, force: False, partial: False
520 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a
520 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a
521 preserving b for resolve of b
521 preserving b for resolve of b
522 preserving rev for resolve of rev
522 preserving rev for resolve of rev
523 a: remote is newer -> g
523 a: remote is newer -> g
524 getting a
524 getting a
525 b: both created -> m (premerge)
525 b: both created -> m (premerge)
526 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
526 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
527 merging b
527 merging b
528 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
528 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
529 rev: versions differ -> m (premerge)
529 rev: versions differ -> m (premerge)
530 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
530 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
531 merging rev
531 merging rev
532 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
532 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
533 b: both created -> m (merge)
533 b: both created -> m (merge)
534 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
534 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
535 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
535 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
536 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
536 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
537 merge tool returned: 0
537 merge tool returned: 0
538 rev: versions differ -> m (merge)
538 rev: versions differ -> m (merge)
539 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
539 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
540 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
540 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
541 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
541 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
542 merge tool returned: 0
542 merge tool returned: 0
543 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
543 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
544 (branch merge, don't forget to commit)
544 (branch merge, don't forget to commit)
545 --------------
545 --------------
546 M a
546 M a
547 M b
547 M b
548 --------------
548 --------------
549
549
550 $ tm "up b " "nm a b" " " "15 merge b no ancestor, remove a"
550 $ tm "up b " "nm a b" " " "15 merge b no ancestor, remove a"
551 created new head
551 created new head
552 --------------
552 --------------
553 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
553 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
554 --------------
554 --------------
555 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
555 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
556 src: 'a' -> dst: 'b'
556 src: 'a' -> dst: 'b'
557 checking for directory renames
557 checking for directory renames
558 resolving manifests
558 resolving manifests
559 branchmerge: True, force: False, partial: False
559 branchmerge: True, force: False, partial: False
560 ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a
560 ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a
561 preserving b for resolve of b
561 preserving b for resolve of b
562 preserving rev for resolve of rev
562 preserving rev for resolve of rev
563 a: other deleted -> r
563 a: other deleted -> r
564 removing a
564 removing a
565 starting 4 threads for background file closing (?)
565 starting 4 threads for background file closing (?)
566 b: both created -> m (premerge)
566 b: both created -> m (premerge)
567 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
567 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
568 merging b
568 merging b
569 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
569 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
570 rev: versions differ -> m (premerge)
570 rev: versions differ -> m (premerge)
571 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
571 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
572 merging rev
572 merging rev
573 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
573 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
574 b: both created -> m (merge)
574 b: both created -> m (merge)
575 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
575 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
576 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
576 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
577 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
577 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
578 merge tool returned: 0
578 merge tool returned: 0
579 rev: versions differ -> m (merge)
579 rev: versions differ -> m (merge)
580 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
580 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
581 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
581 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
582 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
582 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
583 merge tool returned: 0
583 merge tool returned: 0
584 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
584 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
585 (branch merge, don't forget to commit)
585 (branch merge, don't forget to commit)
586 --------------
586 --------------
587 M b
587 M b
588 --------------
588 --------------
589
589
590 $ tm "nc a b" "up a b" " " "16 get a, merge b no ancestor"
590 $ tm "nc a b" "up a b" " " "16 get a, merge b no ancestor"
591 created new head
591 created new head
592 --------------
592 --------------
593 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
593 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
594 --------------
594 --------------
595 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
595 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
596 src: 'a' -> dst: 'b'
596 src: 'a' -> dst: 'b'
597 checking for directory renames
597 checking for directory renames
598 resolving manifests
598 resolving manifests
599 branchmerge: True, force: False, partial: False
599 branchmerge: True, force: False, partial: False
600 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a
600 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a
601 preserving b for resolve of b
601 preserving b for resolve of b
602 preserving rev for resolve of rev
602 preserving rev for resolve of rev
603 a: remote is newer -> g
603 a: remote is newer -> g
604 getting a
604 getting a
605 b: both created -> m (premerge)
605 b: both created -> m (premerge)
606 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
606 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
607 merging b
607 merging b
608 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
608 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
609 rev: versions differ -> m (premerge)
609 rev: versions differ -> m (premerge)
610 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
610 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
611 merging rev
611 merging rev
612 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
612 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
613 b: both created -> m (merge)
613 b: both created -> m (merge)
614 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
614 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
615 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
615 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
616 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
616 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
617 merge tool returned: 0
617 merge tool returned: 0
618 rev: versions differ -> m (merge)
618 rev: versions differ -> m (merge)
619 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
619 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
620 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
620 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
621 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
621 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
622 merge tool returned: 0
622 merge tool returned: 0
623 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
623 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
624 (branch merge, don't forget to commit)
624 (branch merge, don't forget to commit)
625 --------------
625 --------------
626 M a
626 M a
627 M b
627 M b
628 --------------
628 --------------
629
629
630 $ tm "up a b" "nc a b" " " "17 keep a, merge b no ancestor"
630 $ tm "up a b" "nc a b" " " "17 keep a, merge b no ancestor"
631 created new head
631 created new head
632 --------------
632 --------------
633 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
633 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
634 --------------
634 --------------
635 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
635 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
636 src: 'a' -> dst: 'b'
636 src: 'a' -> dst: 'b'
637 checking for directory renames
637 checking for directory renames
638 resolving manifests
638 resolving manifests
639 branchmerge: True, force: False, partial: False
639 branchmerge: True, force: False, partial: False
640 ancestor: 924404dff337, local: 0b76e65c8289+, remote: 4ce40f5aca24
640 ancestor: 924404dff337, local: 0b76e65c8289+, remote: 4ce40f5aca24
641 preserving b for resolve of b
641 preserving b for resolve of b
642 preserving rev for resolve of rev
642 preserving rev for resolve of rev
643 starting 4 threads for background file closing (?)
643 starting 4 threads for background file closing (?)
644 b: both created -> m (premerge)
644 b: both created -> m (premerge)
645 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
645 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
646 merging b
646 merging b
647 my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
647 my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
648 rev: versions differ -> m (premerge)
648 rev: versions differ -> m (premerge)
649 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
649 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
650 merging rev
650 merging rev
651 my rev@0b76e65c8289+ other rev@4ce40f5aca24 ancestor rev@924404dff337
651 my rev@0b76e65c8289+ other rev@4ce40f5aca24 ancestor rev@924404dff337
652 b: both created -> m (merge)
652 b: both created -> m (merge)
653 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
653 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
654 my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
654 my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
655 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
655 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
656 merge tool returned: 0
656 merge tool returned: 0
657 rev: versions differ -> m (merge)
657 rev: versions differ -> m (merge)
658 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
658 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
659 my rev@0b76e65c8289+ other rev@4ce40f5aca24 ancestor rev@924404dff337
659 my rev@0b76e65c8289+ other rev@4ce40f5aca24 ancestor rev@924404dff337
660 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
660 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
661 merge tool returned: 0
661 merge tool returned: 0
662 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
662 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
663 (branch merge, don't forget to commit)
663 (branch merge, don't forget to commit)
664 --------------
664 --------------
665 M b
665 M b
666 C a
666 C a
667 --------------
667 --------------
668
668
669 $ tm "nm a b" "up a b" " " "18 merge b no ancestor"
669 $ tm "nm a b" "up a b" " " "18 merge b no ancestor"
670 created new head
670 created new head
671 --------------
671 --------------
672 test L:nm a b R:up a b W: - 18 merge b no ancestor
672 test L:nm a b R:up a b W: - 18 merge b no ancestor
673 --------------
673 --------------
674 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
674 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
675 src: 'a' -> dst: 'b'
675 src: 'a' -> dst: 'b'
676 checking for directory renames
676 checking for directory renames
677 resolving manifests
677 resolving manifests
678 branchmerge: True, force: False, partial: False
678 branchmerge: True, force: False, partial: False
679 ancestor: 924404dff337, local: 02963e448370+, remote: 8dbce441892a
679 ancestor: 924404dff337, local: 02963e448370+, remote: 8dbce441892a
680 preserving b for resolve of b
680 preserving b for resolve of b
681 preserving rev for resolve of rev
681 preserving rev for resolve of rev
682 starting 4 threads for background file closing (?)
682 starting 4 threads for background file closing (?)
683 a: prompt deleted/changed -> m (premerge)
683 a: prompt deleted/changed -> m (premerge)
684 picked tool ':prompt' for a (binary False symlink False changedelete True)
684 picked tool ':prompt' for a (binary False symlink False changedelete True)
685 file 'a' was deleted in local [working copy] but was modified in other [merge rev].
685 file 'a' was deleted in local [working copy] but was modified in other [merge rev].
686 What do you want to do?
686 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
687 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
687 What do you want to do? u
688 b: both created -> m (premerge)
688 b: both created -> m (premerge)
689 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
689 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
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 '* ../merge' for rev (binary False symlink False changedelete False) (glob)
693 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
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 '* ../merge' for b (binary False symlink False changedelete False) (glob)
697 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
698 my b@02963e448370+ other b@8dbce441892a ancestor b@000000000000
698 my b@02963e448370+ other b@8dbce441892a ancestor b@000000000000
699 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
699 launching merge tool: * ../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 '* ../merge' for rev (binary False symlink False changedelete False) (glob)
702 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
703 my rev@02963e448370+ other rev@8dbce441892a ancestor rev@924404dff337
703 my rev@02963e448370+ other rev@8dbce441892a ancestor rev@924404dff337
704 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
704 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
705 merge tool returned: 0
705 merge tool returned: 0
706 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
706 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
707 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
707 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' 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 abort: unresolved merge conflicts (see 'hg help resolve')
712 --------------
712 --------------
713
713
714 $ 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"
715 created new head
715 created new head
716 --------------
716 --------------
717 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
718 --------------
718 --------------
719 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
719 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
720 src: 'a' -> dst: 'b'
720 src: 'a' -> dst: 'b'
721 checking for directory renames
721 checking for directory renames
722 resolving manifests
722 resolving manifests
723 branchmerge: True, force: False, partial: False
723 branchmerge: True, force: False, partial: False
724 ancestor: 924404dff337, local: 0b76e65c8289+, remote: bdb19105162a
724 ancestor: 924404dff337, local: 0b76e65c8289+, remote: bdb19105162a
725 preserving a for resolve of a
725 preserving a for resolve of a
726 preserving b for resolve of b
726 preserving b for resolve of b
727 preserving rev for resolve of rev
727 preserving rev for resolve of rev
728 starting 4 threads for background file closing (?)
728 starting 4 threads for background file closing (?)
729 a: prompt changed/deleted -> m (premerge)
729 a: prompt changed/deleted -> m (premerge)
730 picked tool ':prompt' for a (binary False symlink False changedelete True)
730 picked tool ':prompt' for a (binary False symlink False changedelete True)
731 file 'a' was deleted in other [merge rev] but was modified in local [working copy].
731 file 'a' was deleted in other [merge rev] but was modified in local [working copy].
732 What do you want to do?
732 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
733 use (c)hanged version, (d)elete, or leave (u)nresolved? u
733 What do you want to do? u
734 b: both created -> m (premerge)
734 b: both created -> m (premerge)
735 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
735 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
736 merging b
736 merging b
737 my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
737 my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
738 rev: versions differ -> m (premerge)
738 rev: versions differ -> m (premerge)
739 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
739 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
740 merging rev
740 merging rev
741 my rev@0b76e65c8289+ other rev@bdb19105162a ancestor rev@924404dff337
741 my rev@0b76e65c8289+ other rev@bdb19105162a ancestor rev@924404dff337
742 b: both created -> m (merge)
742 b: both created -> m (merge)
743 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
743 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
744 my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
744 my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
745 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
745 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
746 merge tool returned: 0
746 merge tool returned: 0
747 rev: versions differ -> m (merge)
747 rev: versions differ -> m (merge)
748 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
748 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
749 my rev@0b76e65c8289+ other rev@bdb19105162a ancestor rev@924404dff337
749 my rev@0b76e65c8289+ other rev@bdb19105162a ancestor rev@924404dff337
750 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
750 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
751 merge tool returned: 0
751 merge tool returned: 0
752 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
752 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
753 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
753 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
754 --------------
754 --------------
755 M b
755 M b
756 C a
756 C a
757 abort: unresolved merge conflicts (see 'hg help resolve')
757 abort: unresolved merge conflicts (see 'hg help resolve')
758 --------------
758 --------------
759
759
760 $ tm "up a " "um a b" " " "20 merge a and b to b, remove a"
760 $ tm "up a " "um a b" " " "20 merge a and b to b, remove a"
761 created new head
761 created new head
762 --------------
762 --------------
763 test L:up a R:um a b W: - 20 merge a and b to b, remove a
763 test L:up a R:um a b W: - 20 merge a and b to b, remove a
764 --------------
764 --------------
765 unmatched files in other:
765 unmatched files in other:
766 b
766 b
767 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
767 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
768 src: 'a' -> dst: 'b' *
768 src: 'a' -> dst: 'b' *
769 checking for directory renames
769 checking for directory renames
770 resolving manifests
770 resolving manifests
771 branchmerge: True, force: False, partial: False
771 branchmerge: True, force: False, partial: False
772 ancestor: 924404dff337, local: e300d1c794ec+, remote: 49b6d8032493
772 ancestor: 924404dff337, local: e300d1c794ec+, remote: 49b6d8032493
773 preserving a for resolve of b
773 preserving a for resolve of b
774 preserving rev for resolve of rev
774 preserving rev for resolve of rev
775 removing a
775 removing a
776 starting 4 threads for background file closing (?)
776 starting 4 threads for background file closing (?)
777 b: remote moved from a -> m (premerge)
777 b: remote moved from a -> m (premerge)
778 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
778 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
779 merging a and b to b
779 merging a and b to b
780 my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
780 my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
781 rev: versions differ -> m (premerge)
781 rev: versions differ -> m (premerge)
782 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
782 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
783 merging rev
783 merging rev
784 my rev@e300d1c794ec+ other rev@49b6d8032493 ancestor rev@924404dff337
784 my rev@e300d1c794ec+ other rev@49b6d8032493 ancestor rev@924404dff337
785 b: remote moved from a -> m (merge)
785 b: remote moved from a -> m (merge)
786 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
786 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
787 my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
787 my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
788 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
788 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
789 merge tool returned: 0
789 merge tool returned: 0
790 rev: versions differ -> m (merge)
790 rev: versions differ -> m (merge)
791 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
791 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
792 my rev@e300d1c794ec+ other rev@49b6d8032493 ancestor rev@924404dff337
792 my rev@e300d1c794ec+ other rev@49b6d8032493 ancestor rev@924404dff337
793 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
793 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
794 merge tool returned: 0
794 merge tool returned: 0
795 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
795 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
796 (branch merge, don't forget to commit)
796 (branch merge, don't forget to commit)
797 --------------
797 --------------
798 M b
798 M b
799 a
799 a
800 --------------
800 --------------
801
801
802 $ tm "um a b" "up a " " " "21 merge a and b to b"
802 $ tm "um a b" "up a " " " "21 merge a and b to b"
803 created new head
803 created new head
804 --------------
804 --------------
805 test L:um a b R:up a W: - 21 merge a and b to b
805 test L:um a b R:up a W: - 21 merge a and b to b
806 --------------
806 --------------
807 unmatched files in local:
807 unmatched files in local:
808 b
808 b
809 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
809 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
810 src: 'a' -> dst: 'b' *
810 src: 'a' -> dst: 'b' *
811 checking for directory renames
811 checking for directory renames
812 resolving manifests
812 resolving manifests
813 branchmerge: True, force: False, partial: False
813 branchmerge: True, force: False, partial: False
814 ancestor: 924404dff337, local: 62e7bf090eba+, remote: f4db7e329e71
814 ancestor: 924404dff337, local: 62e7bf090eba+, remote: f4db7e329e71
815 preserving b for resolve of b
815 preserving b for resolve of b
816 preserving rev for resolve of rev
816 preserving rev for resolve of rev
817 starting 4 threads for background file closing (?)
817 starting 4 threads for background file closing (?)
818 b: local copied/moved from a -> m (premerge)
818 b: local copied/moved from a -> m (premerge)
819 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
819 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
820 merging b and a to b
820 merging b and a to b
821 my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
821 my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
822 rev: versions differ -> m (premerge)
822 rev: versions differ -> m (premerge)
823 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
823 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
824 merging rev
824 merging rev
825 my rev@62e7bf090eba+ other rev@f4db7e329e71 ancestor rev@924404dff337
825 my rev@62e7bf090eba+ other rev@f4db7e329e71 ancestor rev@924404dff337
826 b: local copied/moved from a -> m (merge)
826 b: local copied/moved from a -> m (merge)
827 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
827 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
828 my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
828 my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
829 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
829 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
830 merge tool returned: 0
830 merge tool returned: 0
831 rev: versions differ -> m (merge)
831 rev: versions differ -> m (merge)
832 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
832 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
833 my rev@62e7bf090eba+ other rev@f4db7e329e71 ancestor rev@924404dff337
833 my rev@62e7bf090eba+ other rev@f4db7e329e71 ancestor rev@924404dff337
834 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
834 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
835 merge tool returned: 0
835 merge tool returned: 0
836 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
836 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
837 (branch merge, don't forget to commit)
837 (branch merge, don't forget to commit)
838 --------------
838 --------------
839 M b
839 M b
840 a
840 a
841 --------------
841 --------------
842
842
843
843
844 m "nm a b" "um x a" " " "22 get a, keep b"
844 m "nm a b" "um x a" " " "22 get a, keep b"
845
845
846 $ tm "nm a b" "up a c" " " "23 get c, keep b"
846 $ tm "nm a b" "up a c" " " "23 get c, keep b"
847 created new head
847 created new head
848 --------------
848 --------------
849 test L:nm a b R:up a c W: - 23 get c, keep b
849 test L:nm a b R:up a c W: - 23 get c, keep b
850 --------------
850 --------------
851 unmatched files in local:
851 unmatched files in local:
852 b
852 b
853 unmatched files in other:
853 unmatched files in other:
854 c
854 c
855 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
855 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
856 src: 'a' -> dst: 'b' *
856 src: 'a' -> dst: 'b' *
857 checking for directory renames
857 checking for directory renames
858 resolving manifests
858 resolving manifests
859 branchmerge: True, force: False, partial: False
859 branchmerge: True, force: False, partial: False
860 ancestor: 924404dff337, local: 02963e448370+, remote: 2b958612230f
860 ancestor: 924404dff337, local: 02963e448370+, remote: 2b958612230f
861 preserving b for resolve of b
861 preserving b for resolve of b
862 preserving rev for resolve of rev
862 preserving rev for resolve of rev
863 c: remote created -> g
863 c: remote created -> g
864 getting c
864 getting c
865 b: local copied/moved from a -> m (premerge)
865 b: local copied/moved from a -> m (premerge)
866 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
866 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
867 merging b and a to b
867 merging b and a to b
868 my b@02963e448370+ other a@2b958612230f ancestor a@924404dff337
868 my b@02963e448370+ other a@2b958612230f ancestor a@924404dff337
869 premerge successful
869 premerge successful
870 rev: versions differ -> m (premerge)
870 rev: versions differ -> m (premerge)
871 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
871 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
872 merging rev
872 merging rev
873 my rev@02963e448370+ other rev@2b958612230f ancestor rev@924404dff337
873 my rev@02963e448370+ other rev@2b958612230f ancestor rev@924404dff337
874 rev: versions differ -> m (merge)
874 rev: versions differ -> m (merge)
875 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
875 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
876 my rev@02963e448370+ other rev@2b958612230f ancestor rev@924404dff337
876 my rev@02963e448370+ other rev@2b958612230f ancestor rev@924404dff337
877 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
877 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
878 merge tool returned: 0
878 merge tool returned: 0
879 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
879 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
880 (branch merge, don't forget to commit)
880 (branch merge, don't forget to commit)
881 --------------
881 --------------
882 M b
882 M b
883 a
883 a
884 M c
884 M c
885 --------------
885 --------------
886
886
887
887
888 $ cd ..
888 $ cd ..
889
889
890
890
891 Systematic and terse testing of merge merges and ancestor calculation:
891 Systematic and terse testing of merge merges and ancestor calculation:
892
892
893 Expected result:
893 Expected result:
894
894
895 \ a m1 m2 dst
895 \ a m1 m2 dst
896 0 - f f f "versions differ"
896 0 - f f f "versions differ"
897 1 f g g g "versions differ"
897 1 f g g g "versions differ"
898 2 f f f f "versions differ"
898 2 f f f f "versions differ"
899 3 f f g f+g "remote copied to " + f
899 3 f f g f+g "remote copied to " + f
900 4 f f g g "remote moved to " + f
900 4 f f g g "remote moved to " + f
901 5 f g f f+g "local copied to " + f2
901 5 f g f f+g "local copied to " + f2
902 6 f g f g "local moved to " + f2
902 6 f g f g "local moved to " + f2
903 7 - (f) f f "remote differs from untracked local"
903 7 - (f) f f "remote differs from untracked local"
904 8 f (f) f f "remote differs from untracked local"
904 8 f (f) f f "remote differs from untracked local"
905
905
906 $ hg init ancestortest
906 $ hg init ancestortest
907 $ cd ancestortest
907 $ cd ancestortest
908 $ for x in 1 2 3 4 5 6 8; do mkdir $x; echo a > $x/f; done
908 $ for x in 1 2 3 4 5 6 8; do mkdir $x; echo a > $x/f; done
909 $ hg ci -Aqm "a"
909 $ hg ci -Aqm "a"
910 $ mkdir 0
910 $ mkdir 0
911 $ touch 0/f
911 $ touch 0/f
912 $ hg mv 1/f 1/g
912 $ hg mv 1/f 1/g
913 $ hg cp 5/f 5/g
913 $ hg cp 5/f 5/g
914 $ hg mv 6/f 6/g
914 $ hg mv 6/f 6/g
915 $ hg rm 8/f
915 $ hg rm 8/f
916 $ for x in */*; do echo m1 > $x; done
916 $ for x in */*; do echo m1 > $x; done
917 $ hg ci -Aqm "m1"
917 $ hg ci -Aqm "m1"
918 $ hg up -qr0
918 $ hg up -qr0
919 $ mkdir 0 7
919 $ mkdir 0 7
920 $ touch 0/f 7/f
920 $ touch 0/f 7/f
921 $ hg mv 1/f 1/g
921 $ hg mv 1/f 1/g
922 $ hg cp 3/f 3/g
922 $ hg cp 3/f 3/g
923 $ hg mv 4/f 4/g
923 $ hg mv 4/f 4/g
924 $ for x in */*; do echo m2 > $x; done
924 $ for x in */*; do echo m2 > $x; done
925 $ hg ci -Aqm "m2"
925 $ hg ci -Aqm "m2"
926 $ hg up -qr1
926 $ hg up -qr1
927 $ mkdir 7 8
927 $ mkdir 7 8
928 $ echo m > 7/f
928 $ echo m > 7/f
929 $ echo m > 8/f
929 $ echo m > 8/f
930 $ hg merge -f --tool internal:dump -v --debug -r2 | sed '/^resolving manifests/,$d' 2> /dev/null
930 $ hg merge -f --tool internal:dump -v --debug -r2 | sed '/^resolving manifests/,$d' 2> /dev/null
931 unmatched files in local:
931 unmatched files in local:
932 5/g
932 5/g
933 6/g
933 6/g
934 unmatched files in other:
934 unmatched files in other:
935 3/g
935 3/g
936 4/g
936 4/g
937 7/f
937 7/f
938 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
938 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
939 src: '1/f' -> dst: '1/g' *
939 src: '1/f' -> dst: '1/g' *
940 src: '3/f' -> dst: '3/g' *
940 src: '3/f' -> dst: '3/g' *
941 src: '4/f' -> dst: '4/g' *
941 src: '4/f' -> dst: '4/g' *
942 src: '5/f' -> dst: '5/g' *
942 src: '5/f' -> dst: '5/g' *
943 src: '6/f' -> dst: '6/g' *
943 src: '6/f' -> dst: '6/g' *
944 checking for directory renames
944 checking for directory renames
945 $ hg mani
945 $ hg mani
946 0/f
946 0/f
947 1/g
947 1/g
948 2/f
948 2/f
949 3/f
949 3/f
950 4/f
950 4/f
951 5/f
951 5/f
952 5/g
952 5/g
953 6/g
953 6/g
954 $ for f in */*; do echo $f:; cat $f; done
954 $ for f in */*; do echo $f:; cat $f; done
955 0/f:
955 0/f:
956 m1
956 m1
957 0/f.base:
957 0/f.base:
958 0/f.local:
958 0/f.local:
959 m1
959 m1
960 0/f.orig:
960 0/f.orig:
961 m1
961 m1
962 0/f.other:
962 0/f.other:
963 m2
963 m2
964 1/g:
964 1/g:
965 m1
965 m1
966 1/g.base:
966 1/g.base:
967 a
967 a
968 1/g.local:
968 1/g.local:
969 m1
969 m1
970 1/g.orig:
970 1/g.orig:
971 m1
971 m1
972 1/g.other:
972 1/g.other:
973 m2
973 m2
974 2/f:
974 2/f:
975 m1
975 m1
976 2/f.base:
976 2/f.base:
977 a
977 a
978 2/f.local:
978 2/f.local:
979 m1
979 m1
980 2/f.orig:
980 2/f.orig:
981 m1
981 m1
982 2/f.other:
982 2/f.other:
983 m2
983 m2
984 3/f:
984 3/f:
985 m1
985 m1
986 3/f.base:
986 3/f.base:
987 a
987 a
988 3/f.local:
988 3/f.local:
989 m1
989 m1
990 3/f.orig:
990 3/f.orig:
991 m1
991 m1
992 3/f.other:
992 3/f.other:
993 m2
993 m2
994 3/g:
994 3/g:
995 m1
995 m1
996 3/g.base:
996 3/g.base:
997 a
997 a
998 3/g.local:
998 3/g.local:
999 m1
999 m1
1000 3/g.orig:
1000 3/g.orig:
1001 m1
1001 m1
1002 3/g.other:
1002 3/g.other:
1003 m2
1003 m2
1004 4/g:
1004 4/g:
1005 m1
1005 m1
1006 4/g.base:
1006 4/g.base:
1007 a
1007 a
1008 4/g.local:
1008 4/g.local:
1009 m1
1009 m1
1010 4/g.orig:
1010 4/g.orig:
1011 m1
1011 m1
1012 4/g.other:
1012 4/g.other:
1013 m2
1013 m2
1014 5/f:
1014 5/f:
1015 m1
1015 m1
1016 5/f.base:
1016 5/f.base:
1017 a
1017 a
1018 5/f.local:
1018 5/f.local:
1019 m1
1019 m1
1020 5/f.orig:
1020 5/f.orig:
1021 m1
1021 m1
1022 5/f.other:
1022 5/f.other:
1023 m2
1023 m2
1024 5/g:
1024 5/g:
1025 m1
1025 m1
1026 5/g.base:
1026 5/g.base:
1027 a
1027 a
1028 5/g.local:
1028 5/g.local:
1029 m1
1029 m1
1030 5/g.orig:
1030 5/g.orig:
1031 m1
1031 m1
1032 5/g.other:
1032 5/g.other:
1033 m2
1033 m2
1034 6/g:
1034 6/g:
1035 m1
1035 m1
1036 6/g.base:
1036 6/g.base:
1037 a
1037 a
1038 6/g.local:
1038 6/g.local:
1039 m1
1039 m1
1040 6/g.orig:
1040 6/g.orig:
1041 m1
1041 m1
1042 6/g.other:
1042 6/g.other:
1043 m2
1043 m2
1044 7/f:
1044 7/f:
1045 m
1045 m
1046 7/f.base:
1046 7/f.base:
1047 7/f.local:
1047 7/f.local:
1048 m
1048 m
1049 7/f.orig:
1049 7/f.orig:
1050 m
1050 m
1051 7/f.other:
1051 7/f.other:
1052 m2
1052 m2
1053 8/f:
1053 8/f:
1054 m2
1054 m2
1055 $ cd ..
1055 $ cd ..
@@ -1,800 +1,800 b''
1 test that a commit clears the merge state.
1 test that a commit clears the merge state.
2
2
3 $ hg init repo
3 $ hg init repo
4 $ cd repo
4 $ cd repo
5
5
6 $ echo foo > file1
6 $ echo foo > file1
7 $ echo foo > file2
7 $ echo foo > file2
8 $ hg commit -Am 'add files'
8 $ hg commit -Am 'add files'
9 adding file1
9 adding file1
10 adding file2
10 adding file2
11
11
12 $ echo bar >> file1
12 $ echo bar >> file1
13 $ echo bar >> file2
13 $ echo bar >> file2
14 $ hg commit -Am 'append bar to files'
14 $ hg commit -Am 'append bar to files'
15
15
16 create a second head with conflicting edits
16 create a second head with conflicting edits
17
17
18 $ hg up -C 0
18 $ hg up -C 0
19 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
19 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
20 $ echo baz >> file1
20 $ echo baz >> file1
21 $ echo baz >> file2
21 $ echo baz >> file2
22 $ hg commit -Am 'append baz to files'
22 $ hg commit -Am 'append baz to files'
23 created new head
23 created new head
24
24
25 create a third head with no conflicting edits
25 create a third head with no conflicting edits
26 $ hg up -qC 0
26 $ hg up -qC 0
27 $ echo foo > file3
27 $ echo foo > file3
28 $ hg commit -Am 'add non-conflicting file'
28 $ hg commit -Am 'add non-conflicting file'
29 adding file3
29 adding file3
30 created new head
30 created new head
31
31
32 failing merge
32 failing merge
33
33
34 $ hg up -qC 2
34 $ hg up -qC 2
35 $ hg merge --tool=internal:fail 1
35 $ hg merge --tool=internal:fail 1
36 0 files updated, 0 files merged, 0 files removed, 2 files unresolved
36 0 files updated, 0 files merged, 0 files removed, 2 files unresolved
37 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
37 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
38 [1]
38 [1]
39
39
40 resolve -l should contain unresolved entries
40 resolve -l should contain unresolved entries
41
41
42 $ hg resolve -l
42 $ hg resolve -l
43 U file1
43 U file1
44 U file2
44 U file2
45
45
46 $ hg resolve -l --no-status
46 $ hg resolve -l --no-status
47 file1
47 file1
48 file2
48 file2
49
49
50 resolving an unknown path should emit a warning, but not for -l
50 resolving an unknown path should emit a warning, but not for -l
51
51
52 $ hg resolve -m does-not-exist
52 $ hg resolve -m does-not-exist
53 arguments do not match paths that need resolving
53 arguments do not match paths that need resolving
54 $ hg resolve -l does-not-exist
54 $ hg resolve -l does-not-exist
55
55
56 tell users how they could have used resolve
56 tell users how they could have used resolve
57
57
58 $ mkdir nested
58 $ mkdir nested
59 $ cd nested
59 $ cd nested
60 $ hg resolve -m file1
60 $ hg resolve -m file1
61 arguments do not match paths that need resolving
61 arguments do not match paths that need resolving
62 (try: hg resolve -m path:file1)
62 (try: hg resolve -m path:file1)
63 $ hg resolve -m file1 filez
63 $ hg resolve -m file1 filez
64 arguments do not match paths that need resolving
64 arguments do not match paths that need resolving
65 (try: hg resolve -m path:file1 path:filez)
65 (try: hg resolve -m path:file1 path:filez)
66 $ hg resolve -m path:file1 path:filez
66 $ hg resolve -m path:file1 path:filez
67 $ hg resolve -l
67 $ hg resolve -l
68 R file1
68 R file1
69 U file2
69 U file2
70 $ hg resolve -l --config ui.relative-paths=yes
70 $ hg resolve -l --config ui.relative-paths=yes
71 R ../file1
71 R ../file1
72 U ../file2
72 U ../file2
73 $ hg resolve --re-merge filez file2
73 $ hg resolve --re-merge filez file2
74 arguments do not match paths that need resolving
74 arguments do not match paths that need resolving
75 (try: hg resolve --re-merge path:filez path:file2)
75 (try: hg resolve --re-merge path:filez path:file2)
76 $ hg resolve -m filez file2
76 $ hg resolve -m filez file2
77 arguments do not match paths that need resolving
77 arguments do not match paths that need resolving
78 (try: hg resolve -m path:filez path:file2)
78 (try: hg resolve -m path:filez path:file2)
79 $ hg resolve -m path:filez path:file2
79 $ hg resolve -m path:filez path:file2
80 (no more unresolved files)
80 (no more unresolved files)
81 $ hg resolve -l
81 $ hg resolve -l
82 R file1
82 R file1
83 R file2
83 R file2
84
84
85 cleanup
85 cleanup
86 $ hg resolve -u
86 $ hg resolve -u
87 $ cd ..
87 $ cd ..
88 $ rmdir nested
88 $ rmdir nested
89
89
90 don't allow marking or unmarking driver-resolved files
90 don't allow marking or unmarking driver-resolved files
91
91
92 $ cat > $TESTTMP/markdriver.py << EOF
92 $ cat > $TESTTMP/markdriver.py << EOF
93 > '''mark and unmark files as driver-resolved'''
93 > '''mark and unmark files as driver-resolved'''
94 > from mercurial import (
94 > from mercurial import (
95 > merge,
95 > merge,
96 > pycompat,
96 > pycompat,
97 > registrar,
97 > registrar,
98 > scmutil,
98 > scmutil,
99 > )
99 > )
100 > cmdtable = {}
100 > cmdtable = {}
101 > command = registrar.command(cmdtable)
101 > command = registrar.command(cmdtable)
102 > @command(b'markdriver',
102 > @command(b'markdriver',
103 > [(b'u', b'unmark', None, b'')],
103 > [(b'u', b'unmark', None, b'')],
104 > b'FILE...')
104 > b'FILE...')
105 > def markdriver(ui, repo, *pats, **opts):
105 > def markdriver(ui, repo, *pats, **opts):
106 > wlock = repo.wlock()
106 > wlock = repo.wlock()
107 > opts = pycompat.byteskwargs(opts)
107 > opts = pycompat.byteskwargs(opts)
108 > try:
108 > try:
109 > ms = merge.mergestate.read(repo)
109 > ms = merge.mergestate.read(repo)
110 > m = scmutil.match(repo[None], pats, opts)
110 > m = scmutil.match(repo[None], pats, opts)
111 > for f in ms:
111 > for f in ms:
112 > if not m(f):
112 > if not m(f):
113 > continue
113 > continue
114 > if not opts[b'unmark']:
114 > if not opts[b'unmark']:
115 > ms.mark(f, b'd')
115 > ms.mark(f, b'd')
116 > else:
116 > else:
117 > ms.mark(f, b'u')
117 > ms.mark(f, b'u')
118 > ms.commit()
118 > ms.commit()
119 > finally:
119 > finally:
120 > wlock.release()
120 > wlock.release()
121 > EOF
121 > EOF
122 $ hg --config extensions.markdriver=$TESTTMP/markdriver.py markdriver file1
122 $ hg --config extensions.markdriver=$TESTTMP/markdriver.py markdriver file1
123 $ hg resolve --list
123 $ hg resolve --list
124 D file1
124 D file1
125 U file2
125 U file2
126 $ hg resolve --mark file1
126 $ hg resolve --mark file1
127 not marking file1 as it is driver-resolved
127 not marking file1 as it is driver-resolved
128 this should not print out file1
128 this should not print out file1
129 $ hg resolve --mark --all
129 $ hg resolve --mark --all
130 (no more unresolved files -- run "hg resolve --all" to conclude)
130 (no more unresolved files -- run "hg resolve --all" to conclude)
131 $ hg resolve --mark 'glob:file*'
131 $ hg resolve --mark 'glob:file*'
132 (no more unresolved files -- run "hg resolve --all" to conclude)
132 (no more unresolved files -- run "hg resolve --all" to conclude)
133 $ hg resolve --list
133 $ hg resolve --list
134 D file1
134 D file1
135 R file2
135 R file2
136 $ hg resolve --unmark file1
136 $ hg resolve --unmark file1
137 not unmarking file1 as it is driver-resolved
137 not unmarking file1 as it is driver-resolved
138 (no more unresolved files -- run "hg resolve --all" to conclude)
138 (no more unresolved files -- run "hg resolve --all" to conclude)
139 $ hg resolve --unmark --all
139 $ hg resolve --unmark --all
140 $ hg resolve --list
140 $ hg resolve --list
141 D file1
141 D file1
142 U file2
142 U file2
143 $ hg --config extensions.markdriver=$TESTTMP/markdriver.py markdriver --unmark file1
143 $ hg --config extensions.markdriver=$TESTTMP/markdriver.py markdriver --unmark file1
144 $ hg resolve --list
144 $ hg resolve --list
145 U file1
145 U file1
146 U file2
146 U file2
147
147
148 resolve the failure
148 resolve the failure
149
149
150 $ echo resolved > file1
150 $ echo resolved > file1
151 $ hg resolve -m file1
151 $ hg resolve -m file1
152
152
153 resolve -l should show resolved file as resolved
153 resolve -l should show resolved file as resolved
154
154
155 $ hg resolve -l
155 $ hg resolve -l
156 R file1
156 R file1
157 U file2
157 U file2
158
158
159 $ hg resolve -l -Tjson
159 $ hg resolve -l -Tjson
160 [
160 [
161 {
161 {
162 "mergestatus": "R",
162 "mergestatus": "R",
163 "path": "file1"
163 "path": "file1"
164 },
164 },
165 {
165 {
166 "mergestatus": "U",
166 "mergestatus": "U",
167 "path": "file2"
167 "path": "file2"
168 }
168 }
169 ]
169 ]
170
170
171 $ hg resolve -l -T '{path} {mergestatus} {status} {p1rev} {p2rev}\n'
171 $ hg resolve -l -T '{path} {mergestatus} {status} {p1rev} {p2rev}\n'
172 file1 R M 2 1
172 file1 R M 2 1
173 file2 U M 2 1
173 file2 U M 2 1
174
174
175 resolve -m without paths should mark all resolved
175 resolve -m without paths should mark all resolved
176
176
177 $ hg resolve -m
177 $ hg resolve -m
178 (no more unresolved files)
178 (no more unresolved files)
179 $ hg commit -m 'resolved'
179 $ hg commit -m 'resolved'
180
180
181 resolve -l should be empty after commit
181 resolve -l should be empty after commit
182
182
183 $ hg resolve -l
183 $ hg resolve -l
184
184
185 $ hg resolve -l -Tjson
185 $ hg resolve -l -Tjson
186 [
186 [
187 ]
187 ]
188
188
189 resolve --all should abort when no merge in progress
189 resolve --all should abort when no merge in progress
190
190
191 $ hg resolve --all
191 $ hg resolve --all
192 abort: resolve command not applicable when not merging
192 abort: resolve command not applicable when not merging
193 [255]
193 [255]
194
194
195 resolve -m should abort when no merge in progress
195 resolve -m should abort when no merge in progress
196
196
197 $ hg resolve -m
197 $ hg resolve -m
198 abort: resolve command not applicable when not merging
198 abort: resolve command not applicable when not merging
199 [255]
199 [255]
200
200
201 can not update or merge when there are unresolved conflicts
201 can not update or merge when there are unresolved conflicts
202
202
203 $ hg up -qC 0
203 $ hg up -qC 0
204 $ echo quux >> file1
204 $ echo quux >> file1
205 $ hg up 1
205 $ hg up 1
206 merging file1
206 merging file1
207 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
207 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
208 1 files updated, 0 files merged, 0 files removed, 1 files unresolved
208 1 files updated, 0 files merged, 0 files removed, 1 files unresolved
209 use 'hg resolve' to retry unresolved file merges
209 use 'hg resolve' to retry unresolved file merges
210 [1]
210 [1]
211 $ hg up 0
211 $ hg up 0
212 abort: outstanding merge conflicts
212 abort: outstanding merge conflicts
213 [255]
213 [255]
214 $ hg merge 2
214 $ hg merge 2
215 abort: outstanding merge conflicts
215 abort: outstanding merge conflicts
216 [255]
216 [255]
217 $ hg merge --force 2
217 $ hg merge --force 2
218 abort: outstanding merge conflicts
218 abort: outstanding merge conflicts
219 [255]
219 [255]
220
220
221 set up conflict-free merge
221 set up conflict-free merge
222
222
223 $ hg up -qC 3
223 $ hg up -qC 3
224 $ hg merge 1
224 $ hg merge 1
225 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
225 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
226 (branch merge, don't forget to commit)
226 (branch merge, don't forget to commit)
227
227
228 resolve --all should do nothing in merge without conflicts
228 resolve --all should do nothing in merge without conflicts
229 $ hg resolve --all
229 $ hg resolve --all
230 (no more unresolved files)
230 (no more unresolved files)
231
231
232 resolve -m should do nothing in merge without conflicts
232 resolve -m should do nothing in merge without conflicts
233
233
234 $ hg resolve -m
234 $ hg resolve -m
235 (no more unresolved files)
235 (no more unresolved files)
236
236
237 get back to conflicting state
237 get back to conflicting state
238
238
239 $ hg up -qC 2
239 $ hg up -qC 2
240 $ hg merge --tool=internal:fail 1
240 $ hg merge --tool=internal:fail 1
241 0 files updated, 0 files merged, 0 files removed, 2 files unresolved
241 0 files updated, 0 files merged, 0 files removed, 2 files unresolved
242 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
242 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
243 [1]
243 [1]
244
244
245 resolve without arguments should suggest --all
245 resolve without arguments should suggest --all
246 $ hg resolve
246 $ hg resolve
247 abort: no files or directories specified
247 abort: no files or directories specified
248 (use --all to re-merge all unresolved files)
248 (use --all to re-merge all unresolved files)
249 [255]
249 [255]
250
250
251 resolve --all should re-merge all unresolved files
251 resolve --all should re-merge all unresolved files
252 $ hg resolve --all
252 $ hg resolve --all
253 merging file1
253 merging file1
254 merging file2
254 merging file2
255 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
255 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
256 warning: conflicts while merging file2! (edit, then use 'hg resolve --mark')
256 warning: conflicts while merging file2! (edit, then use 'hg resolve --mark')
257 [1]
257 [1]
258 $ cat file1.orig
258 $ cat file1.orig
259 foo
259 foo
260 baz
260 baz
261 $ cat file2.orig
261 $ cat file2.orig
262 foo
262 foo
263 baz
263 baz
264
264
265 .orig files should exists where specified
265 .orig files should exists where specified
266 $ hg resolve --all --verbose --config 'ui.origbackuppath=.hg/origbackups'
266 $ hg resolve --all --verbose --config 'ui.origbackuppath=.hg/origbackups'
267 merging file1
267 merging file1
268 creating directory: $TESTTMP/repo/.hg/origbackups
268 creating directory: $TESTTMP/repo/.hg/origbackups
269 merging file2
269 merging file2
270 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
270 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
271 warning: conflicts while merging file2! (edit, then use 'hg resolve --mark')
271 warning: conflicts while merging file2! (edit, then use 'hg resolve --mark')
272 [1]
272 [1]
273 $ ls .hg/origbackups
273 $ ls .hg/origbackups
274 file1
274 file1
275 file2
275 file2
276 $ grep '<<<' file1 > /dev/null
276 $ grep '<<<' file1 > /dev/null
277 $ grep '<<<' file2 > /dev/null
277 $ grep '<<<' file2 > /dev/null
278
278
279 resolve <file> should re-merge file
279 resolve <file> should re-merge file
280 $ echo resolved > file1
280 $ echo resolved > file1
281 $ hg resolve -q file1
281 $ hg resolve -q file1
282 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
282 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
283 [1]
283 [1]
284 $ grep '<<<' file1 > /dev/null
284 $ grep '<<<' file1 > /dev/null
285
285
286 test .orig behavior with resolve
286 test .orig behavior with resolve
287
287
288 $ hg resolve -q file1 --tool "sh -c 'f --dump \"$TESTTMP/repo/file1.orig\"'"
288 $ hg resolve -q file1 --tool "sh -c 'f --dump \"$TESTTMP/repo/file1.orig\"'"
289 $TESTTMP/repo/file1.orig:
289 $TESTTMP/repo/file1.orig:
290 >>>
290 >>>
291 foo
291 foo
292 baz
292 baz
293 <<<
293 <<<
294
294
295 resolve <file> should do nothing if 'file' was marked resolved
295 resolve <file> should do nothing if 'file' was marked resolved
296 $ echo resolved > file1
296 $ echo resolved > file1
297 $ hg resolve -m file1
297 $ hg resolve -m file1
298 $ hg resolve -q file1
298 $ hg resolve -q file1
299 $ cat file1
299 $ cat file1
300 resolved
300 resolved
301
301
302 insert unsupported advisory merge record
302 insert unsupported advisory merge record
303
303
304 $ hg --config extensions.fakemergerecord=$TESTDIR/fakemergerecord.py fakemergerecord -x
304 $ hg --config extensions.fakemergerecord=$TESTDIR/fakemergerecord.py fakemergerecord -x
305 $ hg debugmergestate
305 $ hg debugmergestate
306 * version 2 records
306 * version 2 records
307 local: 57653b9f834a4493f7240b0681efcb9ae7cab745
307 local: 57653b9f834a4493f7240b0681efcb9ae7cab745
308 other: dc77451844e37f03f5c559e3b8529b2b48d381d1
308 other: dc77451844e37f03f5c559e3b8529b2b48d381d1
309 labels:
309 labels:
310 local: working copy
310 local: working copy
311 other: merge rev
311 other: merge rev
312 unrecognized entry: x advisory record
312 unrecognized entry: x advisory record
313 file extras: file1 (ancestorlinknode = 99726c03216e233810a2564cbc0adfe395007eac)
313 file extras: file1 (ancestorlinknode = 99726c03216e233810a2564cbc0adfe395007eac)
314 file: file1 (record type "F", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
314 file: file1 (record type "F", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
315 local path: file1 (flags "")
315 local path: file1 (flags "")
316 ancestor path: file1 (node 2ed2a3912a0b24502043eae84ee4b279c18b90dd)
316 ancestor path: file1 (node 2ed2a3912a0b24502043eae84ee4b279c18b90dd)
317 other path: file1 (node 6f4310b00b9a147241b071a60c28a650827fb03d)
317 other path: file1 (node 6f4310b00b9a147241b071a60c28a650827fb03d)
318 file extras: file2 (ancestorlinknode = 99726c03216e233810a2564cbc0adfe395007eac)
318 file extras: file2 (ancestorlinknode = 99726c03216e233810a2564cbc0adfe395007eac)
319 file: file2 (record type "F", state "u", hash cb99b709a1978bd205ab9dfd4c5aaa1fc91c7523)
319 file: file2 (record type "F", state "u", hash cb99b709a1978bd205ab9dfd4c5aaa1fc91c7523)
320 local path: file2 (flags "")
320 local path: file2 (flags "")
321 ancestor path: file2 (node 2ed2a3912a0b24502043eae84ee4b279c18b90dd)
321 ancestor path: file2 (node 2ed2a3912a0b24502043eae84ee4b279c18b90dd)
322 other path: file2 (node 6f4310b00b9a147241b071a60c28a650827fb03d)
322 other path: file2 (node 6f4310b00b9a147241b071a60c28a650827fb03d)
323 $ hg resolve -l
323 $ hg resolve -l
324 R file1
324 R file1
325 U file2
325 U file2
326
326
327 insert unsupported mandatory merge record
327 insert unsupported mandatory merge record
328
328
329 $ hg --config extensions.fakemergerecord=$TESTDIR/fakemergerecord.py fakemergerecord -X
329 $ hg --config extensions.fakemergerecord=$TESTDIR/fakemergerecord.py fakemergerecord -X
330 $ hg debugmergestate
330 $ hg debugmergestate
331 * version 2 records
331 * version 2 records
332 local: 57653b9f834a4493f7240b0681efcb9ae7cab745
332 local: 57653b9f834a4493f7240b0681efcb9ae7cab745
333 other: dc77451844e37f03f5c559e3b8529b2b48d381d1
333 other: dc77451844e37f03f5c559e3b8529b2b48d381d1
334 labels:
334 labels:
335 local: working copy
335 local: working copy
336 other: merge rev
336 other: merge rev
337 file extras: file1 (ancestorlinknode = 99726c03216e233810a2564cbc0adfe395007eac)
337 file extras: file1 (ancestorlinknode = 99726c03216e233810a2564cbc0adfe395007eac)
338 file: file1 (record type "F", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
338 file: file1 (record type "F", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
339 local path: file1 (flags "")
339 local path: file1 (flags "")
340 ancestor path: file1 (node 2ed2a3912a0b24502043eae84ee4b279c18b90dd)
340 ancestor path: file1 (node 2ed2a3912a0b24502043eae84ee4b279c18b90dd)
341 other path: file1 (node 6f4310b00b9a147241b071a60c28a650827fb03d)
341 other path: file1 (node 6f4310b00b9a147241b071a60c28a650827fb03d)
342 file extras: file2 (ancestorlinknode = 99726c03216e233810a2564cbc0adfe395007eac)
342 file extras: file2 (ancestorlinknode = 99726c03216e233810a2564cbc0adfe395007eac)
343 file: file2 (record type "F", state "u", hash cb99b709a1978bd205ab9dfd4c5aaa1fc91c7523)
343 file: file2 (record type "F", state "u", hash cb99b709a1978bd205ab9dfd4c5aaa1fc91c7523)
344 local path: file2 (flags "")
344 local path: file2 (flags "")
345 ancestor path: file2 (node 2ed2a3912a0b24502043eae84ee4b279c18b90dd)
345 ancestor path: file2 (node 2ed2a3912a0b24502043eae84ee4b279c18b90dd)
346 other path: file2 (node 6f4310b00b9a147241b071a60c28a650827fb03d)
346 other path: file2 (node 6f4310b00b9a147241b071a60c28a650827fb03d)
347 unrecognized entry: X mandatory record
347 unrecognized entry: X mandatory record
348 $ hg resolve -l
348 $ hg resolve -l
349 abort: unsupported merge state records: X
349 abort: unsupported merge state records: X
350 (see https://mercurial-scm.org/wiki/MergeStateRecords for more information)
350 (see https://mercurial-scm.org/wiki/MergeStateRecords for more information)
351 [255]
351 [255]
352 $ hg resolve -ma
352 $ hg resolve -ma
353 abort: unsupported merge state records: X
353 abort: unsupported merge state records: X
354 (see https://mercurial-scm.org/wiki/MergeStateRecords for more information)
354 (see https://mercurial-scm.org/wiki/MergeStateRecords for more information)
355 [255]
355 [255]
356 $ hg summary
356 $ hg summary
357 warning: merge state has unsupported record types: X
357 warning: merge state has unsupported record types: X
358 parent: 2:57653b9f834a
358 parent: 2:57653b9f834a
359 append baz to files
359 append baz to files
360 parent: 1:dc77451844e3
360 parent: 1:dc77451844e3
361 append bar to files
361 append bar to files
362 branch: default
362 branch: default
363 commit: 2 modified, 2 unknown (merge)
363 commit: 2 modified, 2 unknown (merge)
364 update: 2 new changesets (update)
364 update: 2 new changesets (update)
365 phases: 5 draft
365 phases: 5 draft
366
366
367 update --clean shouldn't abort on unsupported records
367 update --clean shouldn't abort on unsupported records
368
368
369 $ hg up -qC 1
369 $ hg up -qC 1
370 $ hg debugmergestate
370 $ hg debugmergestate
371 no merge state found
371 no merge state found
372
372
373 test crashed merge with empty mergestate
373 test crashed merge with empty mergestate
374
374
375 $ mkdir .hg/merge
375 $ mkdir .hg/merge
376 $ touch .hg/merge/state
376 $ touch .hg/merge/state
377
377
378 resolve -l should be empty
378 resolve -l should be empty
379
379
380 $ hg resolve -l
380 $ hg resolve -l
381
381
382 resolve -m can be configured to look for remaining conflict markers
382 resolve -m can be configured to look for remaining conflict markers
383 $ hg up -qC 2
383 $ hg up -qC 2
384 $ hg merge -q --tool=internal:merge 1
384 $ hg merge -q --tool=internal:merge 1
385 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
385 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
386 warning: conflicts while merging file2! (edit, then use 'hg resolve --mark')
386 warning: conflicts while merging file2! (edit, then use 'hg resolve --mark')
387 [1]
387 [1]
388 $ hg resolve -l
388 $ hg resolve -l
389 U file1
389 U file1
390 U file2
390 U file2
391 $ echo 'remove markers' > file1
391 $ echo 'remove markers' > file1
392 $ hg --config commands.resolve.mark-check=abort resolve -m
392 $ hg --config commands.resolve.mark-check=abort resolve -m
393 warning: the following files still have conflict markers:
393 warning: the following files still have conflict markers:
394 file2
394 file2
395 abort: conflict markers detected
395 abort: conflict markers detected
396 (use --all to mark anyway)
396 (use --all to mark anyway)
397 [255]
397 [255]
398 $ hg resolve -l
398 $ hg resolve -l
399 U file1
399 U file1
400 U file2
400 U file2
401 Try with --all from the hint
401 Try with --all from the hint
402 $ hg --config commands.resolve.mark-check=abort resolve -m --all
402 $ hg --config commands.resolve.mark-check=abort resolve -m --all
403 warning: the following files still have conflict markers:
403 warning: the following files still have conflict markers:
404 file2
404 file2
405 (no more unresolved files)
405 (no more unresolved files)
406 $ hg resolve -l
406 $ hg resolve -l
407 R file1
407 R file1
408 R file2
408 R file2
409 Test option value 'warn'
409 Test option value 'warn'
410 $ hg resolve --unmark
410 $ hg resolve --unmark
411 $ hg resolve -l
411 $ hg resolve -l
412 U file1
412 U file1
413 U file2
413 U file2
414 $ hg --config commands.resolve.mark-check=warn resolve -m
414 $ hg --config commands.resolve.mark-check=warn resolve -m
415 warning: the following files still have conflict markers:
415 warning: the following files still have conflict markers:
416 file2
416 file2
417 (no more unresolved files)
417 (no more unresolved files)
418 $ hg resolve -l
418 $ hg resolve -l
419 R file1
419 R file1
420 R file2
420 R file2
421 If the file is already marked as resolved, we don't warn about it
421 If the file is already marked as resolved, we don't warn about it
422 $ hg resolve --unmark file1
422 $ hg resolve --unmark file1
423 $ hg resolve -l
423 $ hg resolve -l
424 U file1
424 U file1
425 R file2
425 R file2
426 $ hg --config commands.resolve.mark-check=warn resolve -m
426 $ hg --config commands.resolve.mark-check=warn resolve -m
427 (no more unresolved files)
427 (no more unresolved files)
428 $ hg resolve -l
428 $ hg resolve -l
429 R file1
429 R file1
430 R file2
430 R file2
431 If the user passes an invalid value, we treat it as 'none'.
431 If the user passes an invalid value, we treat it as 'none'.
432 $ hg resolve --unmark
432 $ hg resolve --unmark
433 $ hg resolve -l
433 $ hg resolve -l
434 U file1
434 U file1
435 U file2
435 U file2
436 $ hg --config commands.resolve.mark-check=nope resolve -m
436 $ hg --config commands.resolve.mark-check=nope resolve -m
437 (no more unresolved files)
437 (no more unresolved files)
438 $ hg resolve -l
438 $ hg resolve -l
439 R file1
439 R file1
440 R file2
440 R file2
441 Test explicitly setting the option to 'none'
441 Test explicitly setting the option to 'none'
442 $ hg resolve --unmark
442 $ hg resolve --unmark
443 $ hg resolve -l
443 $ hg resolve -l
444 U file1
444 U file1
445 U file2
445 U file2
446 $ hg --config commands.resolve.mark-check=none resolve -m
446 $ hg --config commands.resolve.mark-check=none resolve -m
447 (no more unresolved files)
447 (no more unresolved files)
448 $ hg resolve -l
448 $ hg resolve -l
449 R file1
449 R file1
450 R file2
450 R file2
451 Test with marking an explicit file as resolved, this should not abort (since
451 Test with marking an explicit file as resolved, this should not abort (since
452 there's no --force flag, we have no way of combining --all with a filename)
452 there's no --force flag, we have no way of combining --all with a filename)
453 $ hg resolve --unmark
453 $ hg resolve --unmark
454 $ hg resolve -l
454 $ hg resolve -l
455 U file1
455 U file1
456 U file2
456 U file2
457 (This downgrades to a warning since an explicit file was specified).
457 (This downgrades to a warning since an explicit file was specified).
458 $ hg --config commands.resolve.mark-check=abort resolve -m file2
458 $ hg --config commands.resolve.mark-check=abort resolve -m file2
459 warning: the following files still have conflict markers:
459 warning: the following files still have conflict markers:
460 file2
460 file2
461 $ hg resolve -l
461 $ hg resolve -l
462 U file1
462 U file1
463 R file2
463 R file2
464 Testing the --re-merge flag
464 Testing the --re-merge flag
465 $ hg resolve --unmark file1
465 $ hg resolve --unmark file1
466 $ hg resolve -l
466 $ hg resolve -l
467 U file1
467 U file1
468 R file2
468 R file2
469 $ hg resolve --mark --re-merge
469 $ hg resolve --mark --re-merge
470 abort: too many actions specified
470 abort: too many actions specified
471 [255]
471 [255]
472 $ hg resolve --re-merge --all
472 $ hg resolve --re-merge --all
473 merging file1
473 merging file1
474 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
474 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
475 [1]
475 [1]
476 Explicit re-merge
476 Explicit re-merge
477 $ hg resolve --unmark file1
477 $ hg resolve --unmark file1
478 $ hg resolve --config commands.resolve.explicit-re-merge=1 --all
478 $ hg resolve --config commands.resolve.explicit-re-merge=1 --all
479 abort: no action specified
479 abort: no action specified
480 (use --mark, --unmark, --list or --re-merge)
480 (use --mark, --unmark, --list or --re-merge)
481 [255]
481 [255]
482 $ hg resolve --config commands.resolve.explicit-re-merge=1 --re-merge --all
482 $ hg resolve --config commands.resolve.explicit-re-merge=1 --re-merge --all
483 merging file1
483 merging file1
484 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
484 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
485 [1]
485 [1]
486
486
487 $ cd ..
487 $ cd ..
488
488
489 ======================================================
489 ======================================================
490 Test 'hg resolve' confirm config option functionality |
490 Test 'hg resolve' confirm config option functionality |
491 ======================================================
491 ======================================================
492 $ cat >> $HGRCPATH << EOF
492 $ cat >> $HGRCPATH << EOF
493 > [extensions]
493 > [extensions]
494 > rebase=
494 > rebase=
495 > EOF
495 > EOF
496
496
497 $ hg init repo2
497 $ hg init repo2
498 $ cd repo2
498 $ cd repo2
499
499
500 $ echo boss > boss
500 $ echo boss > boss
501 $ hg ci -Am "add boss"
501 $ hg ci -Am "add boss"
502 adding boss
502 adding boss
503
503
504 $ for emp in emp1 emp2 emp3; do echo work > $emp; done;
504 $ for emp in emp1 emp2 emp3; do echo work > $emp; done;
505 $ hg ci -Aqm "added emp1 emp2 emp3"
505 $ hg ci -Aqm "added emp1 emp2 emp3"
506
506
507 $ hg up 0
507 $ hg up 0
508 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
508 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
509
509
510 $ for emp in emp1 emp2 emp3; do echo nowork > $emp; done;
510 $ for emp in emp1 emp2 emp3; do echo nowork > $emp; done;
511 $ hg ci -Aqm "added lazy emp1 emp2 emp3"
511 $ hg ci -Aqm "added lazy emp1 emp2 emp3"
512
512
513 $ hg log -GT "{rev} {node|short} {firstline(desc)}\n"
513 $ hg log -GT "{rev} {node|short} {firstline(desc)}\n"
514 @ 2 0acfd4a49af0 added lazy emp1 emp2 emp3
514 @ 2 0acfd4a49af0 added lazy emp1 emp2 emp3
515 |
515 |
516 | o 1 f30f98a8181f added emp1 emp2 emp3
516 | o 1 f30f98a8181f added emp1 emp2 emp3
517 |/
517 |/
518 o 0 88660038d466 add boss
518 o 0 88660038d466 add boss
519
519
520 $ hg rebase -s 1 -d 2
520 $ hg rebase -s 1 -d 2
521 rebasing 1:f30f98a8181f "added emp1 emp2 emp3"
521 rebasing 1:f30f98a8181f "added emp1 emp2 emp3"
522 merging emp1
522 merging emp1
523 merging emp2
523 merging emp2
524 merging emp3
524 merging emp3
525 warning: conflicts while merging emp1! (edit, then use 'hg resolve --mark')
525 warning: conflicts while merging emp1! (edit, then use 'hg resolve --mark')
526 warning: conflicts while merging emp2! (edit, then use 'hg resolve --mark')
526 warning: conflicts while merging emp2! (edit, then use 'hg resolve --mark')
527 warning: conflicts while merging emp3! (edit, then use 'hg resolve --mark')
527 warning: conflicts while merging emp3! (edit, then use 'hg resolve --mark')
528 unresolved conflicts (see hg resolve, then hg rebase --continue)
528 unresolved conflicts (see hg resolve, then hg rebase --continue)
529 [1]
529 [1]
530
530
531 Test when commands.resolve.confirm config option is not set:
531 Test when commands.resolve.confirm config option is not set:
532 ===========================================================
532 ===========================================================
533 $ hg resolve --all
533 $ hg resolve --all
534 merging emp1
534 merging emp1
535 merging emp2
535 merging emp2
536 merging emp3
536 merging emp3
537 warning: conflicts while merging emp1! (edit, then use 'hg resolve --mark')
537 warning: conflicts while merging emp1! (edit, then use 'hg resolve --mark')
538 warning: conflicts while merging emp2! (edit, then use 'hg resolve --mark')
538 warning: conflicts while merging emp2! (edit, then use 'hg resolve --mark')
539 warning: conflicts while merging emp3! (edit, then use 'hg resolve --mark')
539 warning: conflicts while merging emp3! (edit, then use 'hg resolve --mark')
540 [1]
540 [1]
541
541
542 Test when config option is set:
542 Test when config option is set:
543 ==============================
543 ==============================
544 $ cat >> .hg/hgrc << EOF
544 $ cat >> .hg/hgrc << EOF
545 > [ui]
545 > [ui]
546 > interactive = True
546 > interactive = True
547 > [commands]
547 > [commands]
548 > resolve.confirm = True
548 > resolve.confirm = True
549 > EOF
549 > EOF
550
550
551 $ hg resolve
551 $ hg resolve
552 abort: no files or directories specified
552 abort: no files or directories specified
553 (use --all to re-merge all unresolved files)
553 (use --all to re-merge all unresolved files)
554 [255]
554 [255]
555 $ hg resolve --all << EOF
555 $ hg resolve --all << EOF
556 > n
556 > n
557 > EOF
557 > EOF
558 re-merge all unresolved files (yn)? n
558 re-merge all unresolved files (yn)? n
559 abort: user quit
559 abort: user quit
560 [255]
560 [255]
561
561
562 $ hg resolve --all << EOF
562 $ hg resolve --all << EOF
563 > y
563 > y
564 > EOF
564 > EOF
565 re-merge all unresolved files (yn)? y
565 re-merge all unresolved files (yn)? y
566 merging emp1
566 merging emp1
567 merging emp2
567 merging emp2
568 merging emp3
568 merging emp3
569 warning: conflicts while merging emp1! (edit, then use 'hg resolve --mark')
569 warning: conflicts while merging emp1! (edit, then use 'hg resolve --mark')
570 warning: conflicts while merging emp2! (edit, then use 'hg resolve --mark')
570 warning: conflicts while merging emp2! (edit, then use 'hg resolve --mark')
571 warning: conflicts while merging emp3! (edit, then use 'hg resolve --mark')
571 warning: conflicts while merging emp3! (edit, then use 'hg resolve --mark')
572 [1]
572 [1]
573
573
574 Test that commands.resolve.confirm respect --mark option (only when no patterns args are given):
574 Test that commands.resolve.confirm respect --mark option (only when no patterns args are given):
575 ===============================================================================================
575 ===============================================================================================
576
576
577 $ hg resolve -m emp1
577 $ hg resolve -m emp1
578 $ hg resolve -l
578 $ hg resolve -l
579 R emp1
579 R emp1
580 U emp2
580 U emp2
581 U emp3
581 U emp3
582
582
583 $ hg resolve -m << EOF
583 $ hg resolve -m << EOF
584 > n
584 > n
585 > EOF
585 > EOF
586 mark all unresolved files as resolved (yn)? n
586 mark all unresolved files as resolved (yn)? n
587 abort: user quit
587 abort: user quit
588 [255]
588 [255]
589
589
590 $ hg resolve -m << EOF
590 $ hg resolve -m << EOF
591 > y
591 > y
592 > EOF
592 > EOF
593 mark all unresolved files as resolved (yn)? y
593 mark all unresolved files as resolved (yn)? y
594 (no more unresolved files)
594 (no more unresolved files)
595 continue: hg rebase --continue
595 continue: hg rebase --continue
596 $ hg resolve -l
596 $ hg resolve -l
597 R emp1
597 R emp1
598 R emp2
598 R emp2
599 R emp3
599 R emp3
600
600
601 Test that commands.resolve.confirm respect --unmark option (only when no patterns args are given):
601 Test that commands.resolve.confirm respect --unmark option (only when no patterns args are given):
602 =================================================================================================
602 =================================================================================================
603
603
604 $ hg resolve -u emp1
604 $ hg resolve -u emp1
605
605
606 $ hg resolve -l
606 $ hg resolve -l
607 U emp1
607 U emp1
608 R emp2
608 R emp2
609 R emp3
609 R emp3
610
610
611 $ hg resolve -u << EOF
611 $ hg resolve -u << EOF
612 > n
612 > n
613 > EOF
613 > EOF
614 mark all resolved files as unresolved (yn)? n
614 mark all resolved files as unresolved (yn)? n
615 abort: user quit
615 abort: user quit
616 [255]
616 [255]
617
617
618 $ hg resolve -m << EOF
618 $ hg resolve -m << EOF
619 > y
619 > y
620 > EOF
620 > EOF
621 mark all unresolved files as resolved (yn)? y
621 mark all unresolved files as resolved (yn)? y
622 (no more unresolved files)
622 (no more unresolved files)
623 continue: hg rebase --continue
623 continue: hg rebase --continue
624
624
625 $ hg resolve -l
625 $ hg resolve -l
626 R emp1
626 R emp1
627 R emp2
627 R emp2
628 R emp3
628 R emp3
629
629
630 $ hg rebase --abort
630 $ hg rebase --abort
631 rebase aborted
631 rebase aborted
632
632
633 Done with commands.resolve.confirm tests:
633 Done with commands.resolve.confirm tests:
634 $ cd ..
634 $ cd ..
635
635
636 Test that commands.resolve.mark-check works even if there are deleted files:
636 Test that commands.resolve.mark-check works even if there are deleted files:
637 $ hg init resolve-deleted
637 $ hg init resolve-deleted
638 $ cd resolve-deleted
638 $ cd resolve-deleted
639 $ echo r0 > file1
639 $ echo r0 > file1
640 $ hg ci -qAm r0
640 $ hg ci -qAm r0
641 $ echo r1 > file1
641 $ echo r1 > file1
642 $ hg ci -qm r1
642 $ hg ci -qm r1
643 $ hg co -qr 0
643 $ hg co -qr 0
644 $ hg rm file1
644 $ hg rm file1
645 $ hg ci -qm "r2 (delete file1)"
645 $ hg ci -qm "r2 (delete file1)"
646
646
647 (At this point we have r0 creating file1, and sibling commits r1 and r2, which
647 (At this point we have r0 creating file1, and sibling commits r1 and r2, which
648 modify and delete file1, respectively)
648 modify and delete file1, respectively)
649
649
650 $ hg merge -r 1
650 $ hg merge -r 1
651 file 'file1' was deleted in local [working copy] but was modified in other [merge rev].
651 file 'file1' was deleted in local [working copy] but was modified in other [merge rev].
652 What do you want to do?
652 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
653 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
653 What do you want to do? u
654 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
654 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
655 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
655 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
656 [1]
656 [1]
657 $ hg resolve --list
657 $ hg resolve --list
658 U file1
658 U file1
659 Because we left it as 'unresolved' the file should still exist.
659 Because we left it as 'unresolved' the file should still exist.
660 $ [ -f file1 ] || echo "File does not exist?"
660 $ [ -f file1 ] || echo "File does not exist?"
661 BC behavior: `hg resolve --mark` accepts that the file is still there, and
661 BC behavior: `hg resolve --mark` accepts that the file is still there, and
662 doesn't have a problem with this situation.
662 doesn't have a problem with this situation.
663 $ hg resolve --mark --config commands.resolve.mark-check=abort
663 $ hg resolve --mark --config commands.resolve.mark-check=abort
664 (no more unresolved files)
664 (no more unresolved files)
665 $ hg resolve --list
665 $ hg resolve --list
666 R file1
666 R file1
667 The file is still there:
667 The file is still there:
668 $ [ -f file1 ] || echo "File does not exist?"
668 $ [ -f file1 ] || echo "File does not exist?"
669 Let's check mark-check=warn:
669 Let's check mark-check=warn:
670 $ hg resolve --unmark file1
670 $ hg resolve --unmark file1
671 $ hg resolve --mark --config commands.resolve.mark-check=warn
671 $ hg resolve --mark --config commands.resolve.mark-check=warn
672 (no more unresolved files)
672 (no more unresolved files)
673 $ hg resolve --list
673 $ hg resolve --list
674 R file1
674 R file1
675 The file is still there:
675 The file is still there:
676 $ [ -f file1 ] || echo "File does not exist?"
676 $ [ -f file1 ] || echo "File does not exist?"
677 Let's resolve the issue by deleting the file via `hg resolve`
677 Let's resolve the issue by deleting the file via `hg resolve`
678 $ hg resolve --unmark file1
678 $ hg resolve --unmark file1
679 $ echo 'd' | hg resolve file1 --config ui.interactive=1
679 $ echo 'd' | hg resolve file1 --config ui.interactive=1
680 file 'file1' was deleted in local [working copy] but was modified in other [merge rev].
680 file 'file1' was deleted in local [working copy] but was modified in other [merge rev].
681 What do you want to do?
681 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
682 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? d
682 What do you want to do? d
683 (no more unresolved files)
683 (no more unresolved files)
684 $ hg resolve --list
684 $ hg resolve --list
685 R file1
685 R file1
686 The file is deleted:
686 The file is deleted:
687 $ [ -f file1 ] && echo "File still exists?" || true
687 $ [ -f file1 ] && echo "File still exists?" || true
688 Doing `hg resolve --mark` doesn't break now that the file is missing:
688 Doing `hg resolve --mark` doesn't break now that the file is missing:
689 $ hg resolve --mark --config commands.resolve.mark-check=abort
689 $ hg resolve --mark --config commands.resolve.mark-check=abort
690 (no more unresolved files)
690 (no more unresolved files)
691 $ hg resolve --mark --config commands.resolve.mark-check=warn
691 $ hg resolve --mark --config commands.resolve.mark-check=warn
692 (no more unresolved files)
692 (no more unresolved files)
693 Resurrect the file, and delete it outside of hg:
693 Resurrect the file, and delete it outside of hg:
694 $ hg resolve --unmark file1
694 $ hg resolve --unmark file1
695 $ hg resolve file1
695 $ hg resolve file1
696 file 'file1' was deleted in local [working copy] but was modified in other [merge rev].
696 file 'file1' was deleted in local [working copy] but was modified in other [merge rev].
697 What do you want to do?
697 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
698 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
698 What do you want to do? u
699 [1]
699 [1]
700 $ [ -f file1 ] || echo "File does not exist?"
700 $ [ -f file1 ] || echo "File does not exist?"
701 $ hg resolve --list
701 $ hg resolve --list
702 U file1
702 U file1
703 $ rm file1
703 $ rm file1
704 $ hg resolve --mark --config commands.resolve.mark-check=abort
704 $ hg resolve --mark --config commands.resolve.mark-check=abort
705 (no more unresolved files)
705 (no more unresolved files)
706 $ hg resolve --list
706 $ hg resolve --list
707 R file1
707 R file1
708 $ hg resolve --unmark file1
708 $ hg resolve --unmark file1
709 $ hg resolve file1
709 $ hg resolve file1
710 file 'file1' was deleted in local [working copy] but was modified in other [merge rev].
710 file 'file1' was deleted in local [working copy] but was modified in other [merge rev].
711 What do you want to do?
711 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
712 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
712 What do you want to do? u
713 [1]
713 [1]
714 $ [ -f file1 ] || echo "File does not exist?"
714 $ [ -f file1 ] || echo "File does not exist?"
715 $ hg resolve --list
715 $ hg resolve --list
716 U file1
716 U file1
717 $ rm file1
717 $ rm file1
718 $ hg resolve --mark --config commands.resolve.mark-check=warn
718 $ hg resolve --mark --config commands.resolve.mark-check=warn
719 (no more unresolved files)
719 (no more unresolved files)
720 $ hg resolve --list
720 $ hg resolve --list
721 R file1
721 R file1
722
722
723
723
724 For completeness, let's try that in the opposite direction (merging r2 into r1,
724 For completeness, let's try that in the opposite direction (merging r2 into r1,
725 instead of r1 into r2):
725 instead of r1 into r2):
726 $ hg update -qCr 1
726 $ hg update -qCr 1
727 $ hg merge -r 2
727 $ hg merge -r 2
728 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
728 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
729 What do you want to do?
729 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
730 use (c)hanged version, (d)elete, or leave (u)nresolved? u
730 What do you want to do? u
731 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
731 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
732 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
732 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
733 [1]
733 [1]
734 $ hg resolve --list
734 $ hg resolve --list
735 U file1
735 U file1
736 Because we left it as 'unresolved' the file should still exist.
736 Because we left it as 'unresolved' the file should still exist.
737 $ [ -f file1 ] || echo "File does not exist?"
737 $ [ -f file1 ] || echo "File does not exist?"
738 BC behavior: `hg resolve --mark` accepts that the file is still there, and
738 BC behavior: `hg resolve --mark` accepts that the file is still there, and
739 doesn't have a problem with this situation.
739 doesn't have a problem with this situation.
740 $ hg resolve --mark --config commands.resolve.mark-check=abort
740 $ hg resolve --mark --config commands.resolve.mark-check=abort
741 (no more unresolved files)
741 (no more unresolved files)
742 $ hg resolve --list
742 $ hg resolve --list
743 R file1
743 R file1
744 The file is still there:
744 The file is still there:
745 $ [ -f file1 ] || echo "File does not exist?"
745 $ [ -f file1 ] || echo "File does not exist?"
746 Let's check mark-check=warn:
746 Let's check mark-check=warn:
747 $ hg resolve --unmark file1
747 $ hg resolve --unmark file1
748 $ hg resolve --mark --config commands.resolve.mark-check=warn
748 $ hg resolve --mark --config commands.resolve.mark-check=warn
749 (no more unresolved files)
749 (no more unresolved files)
750 $ hg resolve --list
750 $ hg resolve --list
751 R file1
751 R file1
752 The file is still there:
752 The file is still there:
753 $ [ -f file1 ] || echo "File does not exist?"
753 $ [ -f file1 ] || echo "File does not exist?"
754 Let's resolve the issue by deleting the file via `hg resolve`
754 Let's resolve the issue by deleting the file via `hg resolve`
755 $ hg resolve --unmark file1
755 $ hg resolve --unmark file1
756 $ echo 'd' | hg resolve file1 --config ui.interactive=1
756 $ echo 'd' | hg resolve file1 --config ui.interactive=1
757 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
757 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
758 What do you want to do?
758 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
759 use (c)hanged version, (d)elete, or leave (u)nresolved? d
759 What do you want to do? d
760 (no more unresolved files)
760 (no more unresolved files)
761 $ hg resolve --list
761 $ hg resolve --list
762 R file1
762 R file1
763 The file is deleted:
763 The file is deleted:
764 $ [ -f file1 ] && echo "File still exists?" || true
764 $ [ -f file1 ] && echo "File still exists?" || true
765 Doing `hg resolve --mark` doesn't break now that the file is missing:
765 Doing `hg resolve --mark` doesn't break now that the file is missing:
766 $ hg resolve --mark --config commands.resolve.mark-check=abort
766 $ hg resolve --mark --config commands.resolve.mark-check=abort
767 (no more unresolved files)
767 (no more unresolved files)
768 $ hg resolve --mark --config commands.resolve.mark-check=warn
768 $ hg resolve --mark --config commands.resolve.mark-check=warn
769 (no more unresolved files)
769 (no more unresolved files)
770 Resurrect the file, and delete it outside of hg:
770 Resurrect the file, and delete it outside of hg:
771 $ hg resolve --unmark file1
771 $ hg resolve --unmark file1
772 $ hg resolve file1
772 $ hg resolve file1
773 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
773 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
774 What do you want to do?
774 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
775 use (c)hanged version, (d)elete, or leave (u)nresolved? u
775 What do you want to do? u
776 [1]
776 [1]
777 $ [ -f file1 ] || echo "File does not exist?"
777 $ [ -f file1 ] || echo "File does not exist?"
778 $ hg resolve --list
778 $ hg resolve --list
779 U file1
779 U file1
780 $ rm file1
780 $ rm file1
781 $ hg resolve --mark --config commands.resolve.mark-check=abort
781 $ hg resolve --mark --config commands.resolve.mark-check=abort
782 (no more unresolved files)
782 (no more unresolved files)
783 $ hg resolve --list
783 $ hg resolve --list
784 R file1
784 R file1
785 $ hg resolve --unmark file1
785 $ hg resolve --unmark file1
786 $ hg resolve file1
786 $ hg resolve file1
787 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
787 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
788 What do you want to do?
788 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
789 use (c)hanged version, (d)elete, or leave (u)nresolved? u
789 What do you want to do? u
790 [1]
790 [1]
791 $ [ -f file1 ] || echo "File does not exist?"
791 $ [ -f file1 ] || echo "File does not exist?"
792 $ hg resolve --list
792 $ hg resolve --list
793 U file1
793 U file1
794 $ rm file1
794 $ rm file1
795 $ hg resolve --mark --config commands.resolve.mark-check=warn
795 $ hg resolve --mark --config commands.resolve.mark-check=warn
796 (no more unresolved files)
796 (no more unresolved files)
797 $ hg resolve --list
797 $ hg resolve --list
798 R file1
798 R file1
799
799
800 $ cd ..
800 $ cd ..
@@ -1,188 +1,188 b''
1 test merging things outside of the sparse checkout
1 test merging things outside of the sparse checkout
2
2
3 $ hg init myrepo
3 $ hg init myrepo
4 $ cd myrepo
4 $ cd myrepo
5 $ cat > .hg/hgrc <<EOF
5 $ cat > .hg/hgrc <<EOF
6 > [extensions]
6 > [extensions]
7 > sparse=
7 > sparse=
8 > EOF
8 > EOF
9
9
10 $ echo foo > foo
10 $ echo foo > foo
11 $ echo bar > bar
11 $ echo bar > bar
12 $ hg add foo bar
12 $ hg add foo bar
13 $ hg commit -m initial
13 $ hg commit -m initial
14
14
15 $ hg branch feature
15 $ hg branch feature
16 marked working directory as branch feature
16 marked working directory as branch feature
17 (branches are permanent and global, did you want a bookmark?)
17 (branches are permanent and global, did you want a bookmark?)
18 $ echo bar2 >> bar
18 $ echo bar2 >> bar
19 $ hg commit -m 'feature - bar2'
19 $ hg commit -m 'feature - bar2'
20
20
21 $ hg update -q default
21 $ hg update -q default
22 $ hg debugsparse --exclude 'bar**'
22 $ hg debugsparse --exclude 'bar**'
23
23
24 $ hg merge feature
24 $ hg merge feature
25 temporarily included 1 file(s) in the sparse checkout for merging
25 temporarily included 1 file(s) in the sparse checkout for merging
26 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
26 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
27 (branch merge, don't forget to commit)
27 (branch merge, don't forget to commit)
28
28
29 Verify bar was merged temporarily
29 Verify bar was merged temporarily
30
30
31 $ ls
31 $ ls
32 bar
32 bar
33 foo
33 foo
34 $ hg status
34 $ hg status
35 M bar
35 M bar
36
36
37 Verify bar disappears automatically when the working copy becomes clean
37 Verify bar disappears automatically when the working copy becomes clean
38
38
39 $ hg commit -m "merged"
39 $ hg commit -m "merged"
40 cleaned up 1 temporarily added file(s) from the sparse checkout
40 cleaned up 1 temporarily added file(s) from the sparse checkout
41 $ hg status
41 $ hg status
42 $ ls
42 $ ls
43 foo
43 foo
44
44
45 $ hg cat -r . bar
45 $ hg cat -r . bar
46 bar
46 bar
47 bar2
47 bar2
48
48
49 Test merging things outside of the sparse checkout that are not in the working
49 Test merging things outside of the sparse checkout that are not in the working
50 copy
50 copy
51
51
52 $ hg strip -q -r . --config extensions.strip=
52 $ hg strip -q -r . --config extensions.strip=
53 $ hg up -q feature
53 $ hg up -q feature
54 $ touch branchonly
54 $ touch branchonly
55 $ hg ci -Aqm 'add branchonly'
55 $ hg ci -Aqm 'add branchonly'
56
56
57 $ hg up -q default
57 $ hg up -q default
58 $ hg debugsparse -X branchonly
58 $ hg debugsparse -X branchonly
59 $ hg merge feature
59 $ hg merge feature
60 temporarily included 2 file(s) in the sparse checkout for merging
60 temporarily included 2 file(s) in the sparse checkout for merging
61 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
61 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
62 (branch merge, don't forget to commit)
62 (branch merge, don't forget to commit)
63
63
64 $ cd ..
64 $ cd ..
65
65
66 Tests merging a file which is modified in one branch and deleted in another and
66 Tests merging a file which is modified in one branch and deleted in another and
67 file is excluded from sparse checkout
67 file is excluded from sparse checkout
68
68
69 $ hg init ytest
69 $ hg init ytest
70 $ cd ytest
70 $ cd ytest
71 $ echo "syntax: glob" >> .hgignore
71 $ echo "syntax: glob" >> .hgignore
72 $ echo "*.orig" >> .hgignore
72 $ echo "*.orig" >> .hgignore
73 $ hg ci -Aqm "added .hgignore"
73 $ hg ci -Aqm "added .hgignore"
74 $ for ch in a d; do echo foo > $ch; hg ci -Aqm "added "$ch; done;
74 $ for ch in a d; do echo foo > $ch; hg ci -Aqm "added "$ch; done;
75 $ cat >> .hg/hgrc <<EOF
75 $ cat >> .hg/hgrc <<EOF
76 > [alias]
76 > [alias]
77 > glog = log -GT "{rev}:{node|short} {desc}"
77 > glog = log -GT "{rev}:{node|short} {desc}"
78 > [extensions]
78 > [extensions]
79 > sparse =
79 > sparse =
80 > EOF
80 > EOF
81
81
82 $ hg glog
82 $ hg glog
83 @ 2:f29feff37cfc added d
83 @ 2:f29feff37cfc added d
84 |
84 |
85 o 1:617125d27d6b added a
85 o 1:617125d27d6b added a
86 |
86 |
87 o 0:53f3774ed939 added .hgignore
87 o 0:53f3774ed939 added .hgignore
88
88
89 $ hg rm d
89 $ hg rm d
90 $ hg ci -m "removed d"
90 $ hg ci -m "removed d"
91
91
92 $ hg up '.^'
92 $ hg up '.^'
93 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
93 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
94 $ hg debugsparse --reset
94 $ hg debugsparse --reset
95 $ echo bar >> d
95 $ echo bar >> d
96 $ hg ci -Am "added bar to d"
96 $ hg ci -Am "added bar to d"
97 created new head
97 created new head
98
98
99 $ hg glog
99 $ hg glog
100 @ 4:6527874a90e4 added bar to d
100 @ 4:6527874a90e4 added bar to d
101 |
101 |
102 | o 3:372c8558de45 removed d
102 | o 3:372c8558de45 removed d
103 |/
103 |/
104 o 2:f29feff37cfc added d
104 o 2:f29feff37cfc added d
105 |
105 |
106 o 1:617125d27d6b added a
106 o 1:617125d27d6b added a
107 |
107 |
108 o 0:53f3774ed939 added .hgignore
108 o 0:53f3774ed939 added .hgignore
109
109
110 $ hg debugsparse --exclude "d"
110 $ hg debugsparse --exclude "d"
111 $ ls
111 $ ls
112 a
112 a
113
113
114 $ hg merge
114 $ hg merge
115 temporarily included 1 file(s) in the sparse checkout for merging
115 temporarily included 1 file(s) in the sparse checkout for merging
116 file 'd' was deleted in other [merge rev] but was modified in local [working copy].
116 file 'd' was deleted in other [merge rev] but was modified in local [working copy].
117 What do you want to do?
117 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
118 use (c)hanged version, (d)elete, or leave (u)nresolved? u
118 What do you want to do? u
119 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
119 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
120 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
120 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
121 [1]
121 [1]
122
122
123 $ cd ..
123 $ cd ..
124
124
125 Testing merging of a file which is renamed+modified on one side and modified on
125 Testing merging of a file which is renamed+modified on one side and modified on
126 another
126 another
127
127
128 $ hg init mvtest
128 $ hg init mvtest
129 $ cd mvtest
129 $ cd mvtest
130 $ echo "syntax: glob" >> .hgignore
130 $ echo "syntax: glob" >> .hgignore
131 $ echo "*.orig" >> .hgignore
131 $ echo "*.orig" >> .hgignore
132 $ hg ci -Aqm "added .hgignore"
132 $ hg ci -Aqm "added .hgignore"
133 $ for ch in a d; do echo foo > $ch; hg ci -Aqm "added "$ch; done;
133 $ for ch in a d; do echo foo > $ch; hg ci -Aqm "added "$ch; done;
134 $ cat >> .hg/hgrc <<EOF
134 $ cat >> .hg/hgrc <<EOF
135 > [alias]
135 > [alias]
136 > glog = log -GT "{rev}:{node|short} {desc}"
136 > glog = log -GT "{rev}:{node|short} {desc}"
137 > [extensions]
137 > [extensions]
138 > sparse =
138 > sparse =
139 > EOF
139 > EOF
140
140
141 $ hg glog
141 $ hg glog
142 @ 2:f29feff37cfc added d
142 @ 2:f29feff37cfc added d
143 |
143 |
144 o 1:617125d27d6b added a
144 o 1:617125d27d6b added a
145 |
145 |
146 o 0:53f3774ed939 added .hgignore
146 o 0:53f3774ed939 added .hgignore
147
147
148 $ echo babar >> a
148 $ echo babar >> a
149 $ hg ci -m "added babar to a"
149 $ hg ci -m "added babar to a"
150
150
151 $ hg up '.^'
151 $ hg up '.^'
152 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
152 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
153 $ hg mv a amove
153 $ hg mv a amove
154 $ hg ci -m "moved a to amove"
154 $ hg ci -m "moved a to amove"
155 created new head
155 created new head
156
156
157 $ hg up 3
157 $ hg up 3
158 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
158 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
159 $ hg glog
159 $ hg glog
160 o 4:5d1e85955f6d moved a to amove
160 o 4:5d1e85955f6d moved a to amove
161 |
161 |
162 | @ 3:a06e41a6c16c added babar to a
162 | @ 3:a06e41a6c16c added babar to a
163 |/
163 |/
164 o 2:f29feff37cfc added d
164 o 2:f29feff37cfc added d
165 |
165 |
166 o 1:617125d27d6b added a
166 o 1:617125d27d6b added a
167 |
167 |
168 o 0:53f3774ed939 added .hgignore
168 o 0:53f3774ed939 added .hgignore
169
169
170 $ hg debugsparse --exclude "a"
170 $ hg debugsparse --exclude "a"
171 $ ls
171 $ ls
172 d
172 d
173
173
174 $ hg merge
174 $ hg merge
175 temporarily included 1 file(s) in the sparse checkout for merging
175 temporarily included 1 file(s) in the sparse checkout for merging
176 merging a and amove to amove
176 merging a and amove to amove
177 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
177 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
178 (branch merge, don't forget to commit)
178 (branch merge, don't forget to commit)
179
179
180 $ hg up -C 4
180 $ hg up -C 4
181 cleaned up 1 temporarily added file(s) from the sparse checkout
181 cleaned up 1 temporarily added file(s) from the sparse checkout
182 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
182 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
183
183
184 $ hg merge
184 $ hg merge
185 merging amove and a to amove
185 merging amove and a to amove
186 abort: cannot add 'a' - it is outside the sparse checkout
186 abort: cannot add 'a' - it is outside the sparse checkout
187 (include file with `hg debugsparse --include <pattern>` or use `hg add -s <file>` to include file directory while adding)
187 (include file with `hg debugsparse --include <pattern>` or use `hg add -s <file>` to include file directory while adding)
188 [255]
188 [255]
General Comments 0
You need to be logged in to leave comments. Login now