##// 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 1 # filemerge.py - file-level merge handling for Mercurial
2 2 #
3 3 # Copyright 2006, 2007, 2008 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 from __future__ import absolute_import
9 9
10 10 import contextlib
11 11 import os
12 12 import re
13 13 import shutil
14 14
15 15 from .i18n import _
16 16 from .node import (
17 17 hex,
18 18 nullid,
19 19 short,
20 20 )
21 21
22 22 from . import (
23 23 encoding,
24 24 error,
25 25 formatter,
26 26 match,
27 27 pycompat,
28 28 registrar,
29 29 scmutil,
30 30 simplemerge,
31 31 tagmerge,
32 32 templatekw,
33 33 templater,
34 34 templateutil,
35 35 util,
36 36 )
37 37
38 38 from .utils import (
39 39 procutil,
40 40 stringutil,
41 41 )
42 42
43 43 def _toolstr(ui, tool, part, *args):
44 44 return ui.config("merge-tools", tool + "." + part, *args)
45 45
46 46 def _toolbool(ui, tool, part,*args):
47 47 return ui.configbool("merge-tools", tool + "." + part, *args)
48 48
49 49 def _toollist(ui, tool, part):
50 50 return ui.configlist("merge-tools", tool + "." + part)
51 51
52 52 internals = {}
53 53 # Merge tools to document.
54 54 internalsdoc = {}
55 55
56 56 internaltool = registrar.internalmerge()
57 57
58 58 # internal tool merge types
59 59 nomerge = internaltool.nomerge
60 60 mergeonly = internaltool.mergeonly # just the full merge, no premerge
61 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 67 _localchangedotherdeletedmsg = _(
64 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"
66 "use (c)hanged version, (d)elete, or leave (u)nresolved?"
69 "You can use (c)hanged version, (d)elete, or leave (u)nresolved.\n"
70 "What do you want to do?"
67 71 "$$ &Changed $$ &Delete $$ &Unresolved")
68 72
69 73 _otherchangedlocaldeletedmsg = _(
70 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"
72 "use (c)hanged version, leave (d)eleted, or "
73 "leave (u)nresolved?"
75 "You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.\n"
76 "What do you want to do?"
74 77 "$$ &Changed $$ &Deleted $$ &Unresolved")
75 78
76 79 class absentfilectx(object):
77 80 """Represents a file that's ostensibly in a context but is actually not
78 81 present in it.
79 82
80 83 This is here because it's very specific to the filemerge code for now --
81 84 other code is likely going to break with the values this returns."""
82 85 def __init__(self, ctx, f):
83 86 self._ctx = ctx
84 87 self._f = f
85 88
86 89 def path(self):
87 90 return self._f
88 91
89 92 def size(self):
90 93 return None
91 94
92 95 def data(self):
93 96 return None
94 97
95 98 def filenode(self):
96 99 return nullid
97 100
98 101 _customcmp = True
99 102 def cmp(self, fctx):
100 103 """compare with other file context
101 104
102 105 returns True if different from fctx.
103 106 """
104 107 return not (fctx.isabsent() and
105 108 fctx.ctx() == self.ctx() and
106 109 fctx.path() == self.path())
107 110
108 111 def flags(self):
109 112 return ''
110 113
111 114 def changectx(self):
112 115 return self._ctx
113 116
114 117 def isbinary(self):
115 118 return False
116 119
117 120 def isabsent(self):
118 121 return True
119 122
120 123 def _findtool(ui, tool):
121 124 if tool in internals:
122 125 return tool
123 126 cmd = _toolstr(ui, tool, "executable", tool)
124 127 if cmd.startswith('python:'):
125 128 return cmd
126 129 return findexternaltool(ui, tool)
127 130
128 131 def _quotetoolpath(cmd):
129 132 if cmd.startswith('python:'):
130 133 return cmd
131 134 return procutil.shellquote(cmd)
132 135
133 136 def findexternaltool(ui, tool):
134 137 for kn in ("regkey", "regkeyalt"):
135 138 k = _toolstr(ui, tool, kn)
136 139 if not k:
137 140 continue
138 141 p = util.lookupreg(k, _toolstr(ui, tool, "regname"))
139 142 if p:
140 143 p = procutil.findexe(p + _toolstr(ui, tool, "regappend", ""))
141 144 if p:
142 145 return p
143 146 exe = _toolstr(ui, tool, "executable", tool)
144 147 return procutil.findexe(util.expandpath(exe))
145 148
146 149 def _picktool(repo, ui, path, binary, symlink, changedelete):
147 150 strictcheck = ui.configbool('merge', 'strict-capability-check')
148 151
149 152 def hascapability(tool, capability, strict=False):
150 153 if tool in internals:
151 154 return strict and internals[tool].capabilities.get(capability)
152 155 return _toolbool(ui, tool, capability)
153 156
154 157 def supportscd(tool):
155 158 return tool in internals and internals[tool].mergetype == nomerge
156 159
157 160 def check(tool, pat, symlink, binary, changedelete):
158 161 tmsg = tool
159 162 if pat:
160 163 tmsg = _("%s (for pattern %s)") % (tool, pat)
161 164 if not _findtool(ui, tool):
162 165 if pat: # explicitly requested tool deserves a warning
163 166 ui.warn(_("couldn't find merge tool %s\n") % tmsg)
164 167 else: # configured but non-existing tools are more silent
165 168 ui.note(_("couldn't find merge tool %s\n") % tmsg)
166 169 elif symlink and not hascapability(tool, "symlink", strictcheck):
167 170 ui.warn(_("tool %s can't handle symlinks\n") % tmsg)
168 171 elif binary and not hascapability(tool, "binary", strictcheck):
169 172 ui.warn(_("tool %s can't handle binary\n") % tmsg)
170 173 elif changedelete and not supportscd(tool):
171 174 # the nomerge tools are the only tools that support change/delete
172 175 # conflicts
173 176 pass
174 177 elif not procutil.gui() and _toolbool(ui, tool, "gui"):
175 178 ui.warn(_("tool %s requires a GUI\n") % tmsg)
176 179 else:
177 180 return True
178 181 return False
179 182
180 183 # internal config: ui.forcemerge
181 184 # forcemerge comes from command line arguments, highest priority
182 185 force = ui.config('ui', 'forcemerge')
183 186 if force:
184 187 toolpath = _findtool(ui, force)
185 188 if changedelete and not supportscd(toolpath):
186 189 return ":prompt", None
187 190 else:
188 191 if toolpath:
189 192 return (force, _quotetoolpath(toolpath))
190 193 else:
191 194 # mimic HGMERGE if given tool not found
192 195 return (force, force)
193 196
194 197 # HGMERGE takes next precedence
195 198 hgmerge = encoding.environ.get("HGMERGE")
196 199 if hgmerge:
197 200 if changedelete and not supportscd(hgmerge):
198 201 return ":prompt", None
199 202 else:
200 203 return (hgmerge, hgmerge)
201 204
202 205 # then patterns
203 206
204 207 # whether binary capability should be checked strictly
205 208 binarycap = binary and strictcheck
206 209
207 210 for pat, tool in ui.configitems("merge-patterns"):
208 211 mf = match.match(repo.root, '', [pat])
209 212 if mf(path) and check(tool, pat, symlink, binarycap, changedelete):
210 213 if binary and not hascapability(tool, "binary", strict=True):
211 214 ui.warn(_("warning: check merge-patterns configurations,"
212 215 " if %r for binary file %r is unintentional\n"
213 216 "(see 'hg help merge-tools'"
214 217 " for binary files capability)\n")
215 218 % (pycompat.bytestr(tool), pycompat.bytestr(path)))
216 219 toolpath = _findtool(ui, tool)
217 220 return (tool, _quotetoolpath(toolpath))
218 221
219 222 # then merge tools
220 223 tools = {}
221 224 disabled = set()
222 225 for k, v in ui.configitems("merge-tools"):
223 226 t = k.split('.')[0]
224 227 if t not in tools:
225 228 tools[t] = int(_toolstr(ui, t, "priority"))
226 229 if _toolbool(ui, t, "disabled"):
227 230 disabled.add(t)
228 231 names = tools.keys()
229 232 tools = sorted([(-p, tool) for tool, p in tools.items()
230 233 if tool not in disabled])
231 234 uimerge = ui.config("ui", "merge")
232 235 if uimerge:
233 236 # external tools defined in uimerge won't be able to handle
234 237 # change/delete conflicts
235 238 if check(uimerge, path, symlink, binary, changedelete):
236 239 if uimerge not in names and not changedelete:
237 240 return (uimerge, uimerge)
238 241 tools.insert(0, (None, uimerge)) # highest priority
239 242 tools.append((None, "hgmerge")) # the old default, if found
240 243 for p, t in tools:
241 244 if check(t, None, symlink, binary, changedelete):
242 245 toolpath = _findtool(ui, t)
243 246 return (t, _quotetoolpath(toolpath))
244 247
245 248 # internal merge or prompt as last resort
246 249 if symlink or binary or changedelete:
247 250 if not changedelete and len(tools):
248 251 # any tool is rejected by capability for symlink or binary
249 252 ui.warn(_("no tool found to merge %s\n") % path)
250 253 return ":prompt", None
251 254 return ":merge", None
252 255
253 256 def _eoltype(data):
254 257 "Guess the EOL type of a file"
255 258 if '\0' in data: # binary
256 259 return None
257 260 if '\r\n' in data: # Windows
258 261 return '\r\n'
259 262 if '\r' in data: # Old Mac
260 263 return '\r'
261 264 if '\n' in data: # UNIX
262 265 return '\n'
263 266 return None # unknown
264 267
265 268 def _matcheol(file, back):
266 269 "Convert EOL markers in a file to match origfile"
267 270 tostyle = _eoltype(back.data()) # No repo.wread filters?
268 271 if tostyle:
269 272 data = util.readfile(file)
270 273 style = _eoltype(data)
271 274 if style:
272 275 newdata = data.replace(style, tostyle)
273 276 if newdata != data:
274 277 util.writefile(file, newdata)
275 278
276 279 @internaltool('prompt', nomerge)
277 280 def _iprompt(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
278 281 """Asks the user which of the local `p1()` or the other `p2()` version to
279 282 keep as the merged version."""
280 283 ui = repo.ui
281 284 fd = fcd.path()
282 285 uipathfn = scmutil.getuipathfn(repo)
283 286
284 287 # Avoid prompting during an in-memory merge since it doesn't support merge
285 288 # conflicts.
286 289 if fcd.changectx().isinmemory():
287 290 raise error.InMemoryMergeConflictsError('in-memory merge does not '
288 291 'support file conflicts')
289 292
290 293 prompts = partextras(labels)
291 294 prompts['fd'] = uipathfn(fd)
292 295 try:
293 296 if fco.isabsent():
294 297 index = ui.promptchoice(
295 298 _localchangedotherdeletedmsg % prompts, 2)
296 299 choice = ['local', 'other', 'unresolved'][index]
297 300 elif fcd.isabsent():
298 301 index = ui.promptchoice(
299 302 _otherchangedlocaldeletedmsg % prompts, 2)
300 303 choice = ['other', 'local', 'unresolved'][index]
301 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 308 index = ui.promptchoice(
303 _("keep (l)ocal%(l)s, take (o)ther%(o)s, or leave (u)nresolved"
304 " for %(fd)s?"
309 _("file '%(fd)s' needs to be resolved.\n"
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 313 "$$ &Local $$ &Other $$ &Unresolved") % prompts, 2)
306 314 choice = ['local', 'other', 'unresolved'][index]
307 315
308 316 if choice == 'other':
309 317 return _iother(repo, mynode, orig, fcd, fco, fca, toolconf,
310 318 labels)
311 319 elif choice == 'local':
312 320 return _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf,
313 321 labels)
314 322 elif choice == 'unresolved':
315 323 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
316 324 labels)
317 325 except error.ResponseExpected:
318 326 ui.write("\n")
319 327 return _ifail(repo, mynode, orig, fcd, fco, fca, toolconf,
320 328 labels)
321 329
322 330 @internaltool('local', nomerge)
323 331 def _ilocal(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
324 332 """Uses the local `p1()` version of files as the merged version."""
325 333 return 0, fcd.isabsent()
326 334
327 335 @internaltool('other', nomerge)
328 336 def _iother(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
329 337 """Uses the other `p2()` version of files as the merged version."""
330 338 if fco.isabsent():
331 339 # local changed, remote deleted -- 'deleted' picked
332 340 _underlyingfctxifabsent(fcd).remove()
333 341 deleted = True
334 342 else:
335 343 _underlyingfctxifabsent(fcd).write(fco.data(), fco.flags())
336 344 deleted = False
337 345 return 0, deleted
338 346
339 347 @internaltool('fail', nomerge)
340 348 def _ifail(repo, mynode, orig, fcd, fco, fca, toolconf, labels=None):
341 349 """
342 350 Rather than attempting to merge files that were modified on both
343 351 branches, it marks them as unresolved. The resolve command must be
344 352 used to resolve these conflicts."""
345 353 # for change/delete conflicts write out the changed version, then fail
346 354 if fcd.isabsent():
347 355 _underlyingfctxifabsent(fcd).write(fco.data(), fco.flags())
348 356 return 1, False
349 357
350 358 def _underlyingfctxifabsent(filectx):
351 359 """Sometimes when resolving, our fcd is actually an absentfilectx, but
352 360 we want to write to it (to do the resolve). This helper returns the
353 361 underyling workingfilectx in that case.
354 362 """
355 363 if filectx.isabsent():
356 364 return filectx.changectx()[filectx.path()]
357 365 else:
358 366 return filectx
359 367
360 368 def _premerge(repo, fcd, fco, fca, toolconf, files, labels=None):
361 369 tool, toolpath, binary, symlink, scriptfn = toolconf
362 370 if symlink or fcd.isabsent() or fco.isabsent():
363 371 return 1
364 372 unused, unused, unused, back = files
365 373
366 374 ui = repo.ui
367 375
368 376 validkeep = ['keep', 'keep-merge3']
369 377
370 378 # do we attempt to simplemerge first?
371 379 try:
372 380 premerge = _toolbool(ui, tool, "premerge", not binary)
373 381 except error.ConfigError:
374 382 premerge = _toolstr(ui, tool, "premerge", "").lower()
375 383 if premerge not in validkeep:
376 384 _valid = ', '.join(["'" + v + "'" for v in validkeep])
377 385 raise error.ConfigError(_("%s.premerge not valid "
378 386 "('%s' is neither boolean nor %s)") %
379 387 (tool, premerge, _valid))
380 388
381 389 if premerge:
382 390 if premerge == 'keep-merge3':
383 391 if not labels:
384 392 labels = _defaultconflictlabels
385 393 if len(labels) < 3:
386 394 labels.append('base')
387 395 r = simplemerge.simplemerge(ui, fcd, fca, fco, quiet=True, label=labels)
388 396 if not r:
389 397 ui.debug(" premerge successful\n")
390 398 return 0
391 399 if premerge not in validkeep:
392 400 # restore from backup and try again
393 401 _restorebackup(fcd, back)
394 402 return 1 # continue merging
395 403
396 404 def _mergecheck(repo, mynode, orig, fcd, fco, fca, toolconf):
397 405 tool, toolpath, binary, symlink, scriptfn = toolconf
398 406 uipathfn = scmutil.getuipathfn(repo)
399 407 if symlink:
400 408 repo.ui.warn(_('warning: internal %s cannot merge symlinks '
401 409 'for %s\n') % (tool, uipathfn(fcd.path())))
402 410 return False
403 411 if fcd.isabsent() or fco.isabsent():
404 412 repo.ui.warn(_('warning: internal %s cannot merge change/delete '
405 413 'conflict for %s\n') % (tool, uipathfn(fcd.path())))
406 414 return False
407 415 return True
408 416
409 417 def _merge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels, mode):
410 418 """
411 419 Uses the internal non-interactive simple merge algorithm for merging
412 420 files. It will fail if there are any conflicts and leave markers in
413 421 the partially merged file. Markers will have two sections, one for each side
414 422 of merge, unless mode equals 'union' which suppresses the markers."""
415 423 ui = repo.ui
416 424
417 425 r = simplemerge.simplemerge(ui, fcd, fca, fco, label=labels, mode=mode)
418 426 return True, r, False
419 427
420 428 @internaltool('union', fullmerge,
421 429 _("warning: conflicts while merging %s! "
422 430 "(edit, then use 'hg resolve --mark')\n"),
423 431 precheck=_mergecheck)
424 432 def _iunion(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
425 433 """
426 434 Uses the internal non-interactive simple merge algorithm for merging
427 435 files. It will use both left and right sides for conflict regions.
428 436 No markers are inserted."""
429 437 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
430 438 files, labels, 'union')
431 439
432 440 @internaltool('merge', fullmerge,
433 441 _("warning: conflicts while merging %s! "
434 442 "(edit, then use 'hg resolve --mark')\n"),
435 443 precheck=_mergecheck)
436 444 def _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
437 445 """
438 446 Uses the internal non-interactive simple merge algorithm for merging
439 447 files. It will fail if there are any conflicts and leave markers in
440 448 the partially merged file. Markers will have two sections, one for each side
441 449 of merge."""
442 450 return _merge(repo, mynode, orig, fcd, fco, fca, toolconf,
443 451 files, labels, 'merge')
444 452
445 453 @internaltool('merge3', fullmerge,
446 454 _("warning: conflicts while merging %s! "
447 455 "(edit, then use 'hg resolve --mark')\n"),
448 456 precheck=_mergecheck)
449 457 def _imerge3(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
450 458 """
451 459 Uses the internal non-interactive simple merge algorithm for merging
452 460 files. It will fail if there are any conflicts and leave markers in
453 461 the partially merged file. Marker will have three sections, one from each
454 462 side of the merge and one for the base content."""
455 463 if not labels:
456 464 labels = _defaultconflictlabels
457 465 if len(labels) < 3:
458 466 labels.append('base')
459 467 return _imerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels)
460 468
461 469 def _imergeauto(repo, mynode, orig, fcd, fco, fca, toolconf, files,
462 470 labels=None, localorother=None):
463 471 """
464 472 Generic driver for _imergelocal and _imergeother
465 473 """
466 474 assert localorother is not None
467 475 r = simplemerge.simplemerge(repo.ui, fcd, fca, fco, label=labels,
468 476 localorother=localorother)
469 477 return True, r
470 478
471 479 @internaltool('merge-local', mergeonly, precheck=_mergecheck)
472 480 def _imergelocal(*args, **kwargs):
473 481 """
474 482 Like :merge, but resolve all conflicts non-interactively in favor
475 483 of the local `p1()` changes."""
476 484 success, status = _imergeauto(localorother='local', *args, **kwargs)
477 485 return success, status, False
478 486
479 487 @internaltool('merge-other', mergeonly, precheck=_mergecheck)
480 488 def _imergeother(*args, **kwargs):
481 489 """
482 490 Like :merge, but resolve all conflicts non-interactively in favor
483 491 of the other `p2()` changes."""
484 492 success, status = _imergeauto(localorother='other', *args, **kwargs)
485 493 return success, status, False
486 494
487 495 @internaltool('tagmerge', mergeonly,
488 496 _("automatic tag merging of %s failed! "
489 497 "(use 'hg resolve --tool :merge' or another merge "
490 498 "tool of your choice)\n"))
491 499 def _itagmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
492 500 """
493 501 Uses the internal tag merge algorithm (experimental).
494 502 """
495 503 success, status = tagmerge.merge(repo, fcd, fco, fca)
496 504 return success, status, False
497 505
498 506 @internaltool('dump', fullmerge, binary=True, symlink=True)
499 507 def _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
500 508 """
501 509 Creates three versions of the files to merge, containing the
502 510 contents of local, other and base. These files can then be used to
503 511 perform a merge manually. If the file to be merged is named
504 512 ``a.txt``, these files will accordingly be named ``a.txt.local``,
505 513 ``a.txt.other`` and ``a.txt.base`` and they will be placed in the
506 514 same directory as ``a.txt``.
507 515
508 516 This implies premerge. Therefore, files aren't dumped, if premerge
509 517 runs successfully. Use :forcedump to forcibly write files out.
510 518 """
511 519 a = _workingpath(repo, fcd)
512 520 fd = fcd.path()
513 521
514 522 from . import context
515 523 if isinstance(fcd, context.overlayworkingfilectx):
516 524 raise error.InMemoryMergeConflictsError('in-memory merge does not '
517 525 'support the :dump tool.')
518 526
519 527 util.writefile(a + ".local", fcd.decodeddata())
520 528 repo.wwrite(fd + ".other", fco.data(), fco.flags())
521 529 repo.wwrite(fd + ".base", fca.data(), fca.flags())
522 530 return False, 1, False
523 531
524 532 @internaltool('forcedump', mergeonly, binary=True, symlink=True)
525 533 def _forcedump(repo, mynode, orig, fcd, fco, fca, toolconf, files,
526 534 labels=None):
527 535 """
528 536 Creates three versions of the files as same as :dump, but omits premerge.
529 537 """
530 538 return _idump(repo, mynode, orig, fcd, fco, fca, toolconf, files,
531 539 labels=labels)
532 540
533 541 def _xmergeimm(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
534 542 # In-memory merge simply raises an exception on all external merge tools,
535 543 # for now.
536 544 #
537 545 # It would be possible to run most tools with temporary files, but this
538 546 # raises the question of what to do if the user only partially resolves the
539 547 # file -- we can't leave a merge state. (Copy to somewhere in the .hg/
540 548 # directory and tell the user how to get it is my best idea, but it's
541 549 # clunky.)
542 550 raise error.InMemoryMergeConflictsError('in-memory merge does not support '
543 551 'external merge tools')
544 552
545 553 def _describemerge(ui, repo, mynode, fcl, fcb, fco, env, toolpath, args):
546 554 tmpl = ui.config('ui', 'pre-merge-tool-output-template')
547 555 if not tmpl:
548 556 return
549 557
550 558 mappingdict = templateutil.mappingdict
551 559 props = {'ctx': fcl.changectx(),
552 560 'node': hex(mynode),
553 561 'path': fcl.path(),
554 562 'local': mappingdict({'ctx': fcl.changectx(),
555 563 'fctx': fcl,
556 564 'node': hex(mynode),
557 565 'name': _('local'),
558 566 'islink': 'l' in fcl.flags(),
559 567 'label': env['HG_MY_LABEL']}),
560 568 'base': mappingdict({'ctx': fcb.changectx(),
561 569 'fctx': fcb,
562 570 'name': _('base'),
563 571 'islink': 'l' in fcb.flags(),
564 572 'label': env['HG_BASE_LABEL']}),
565 573 'other': mappingdict({'ctx': fco.changectx(),
566 574 'fctx': fco,
567 575 'name': _('other'),
568 576 'islink': 'l' in fco.flags(),
569 577 'label': env['HG_OTHER_LABEL']}),
570 578 'toolpath': toolpath,
571 579 'toolargs': args}
572 580
573 581 # TODO: make all of this something that can be specified on a per-tool basis
574 582 tmpl = templater.unquotestring(tmpl)
575 583
576 584 # Not using cmdutil.rendertemplate here since it causes errors importing
577 585 # things for us to import cmdutil.
578 586 tres = formatter.templateresources(ui, repo)
579 587 t = formatter.maketemplater(ui, tmpl, defaults=templatekw.keywords,
580 588 resources=tres)
581 589 ui.status(t.renderdefault(props))
582 590
583 591 def _xmerge(repo, mynode, orig, fcd, fco, fca, toolconf, files, labels=None):
584 592 tool, toolpath, binary, symlink, scriptfn = toolconf
585 593 uipathfn = scmutil.getuipathfn(repo)
586 594 if fcd.isabsent() or fco.isabsent():
587 595 repo.ui.warn(_('warning: %s cannot merge change/delete conflict '
588 596 'for %s\n') % (tool, uipathfn(fcd.path())))
589 597 return False, 1, None
590 598 unused, unused, unused, back = files
591 599 localpath = _workingpath(repo, fcd)
592 600 args = _toolstr(repo.ui, tool, "args")
593 601
594 602 with _maketempfiles(repo, fco, fca, repo.wvfs.join(back.path()),
595 603 "$output" in args) as temppaths:
596 604 basepath, otherpath, localoutputpath = temppaths
597 605 outpath = ""
598 606 mylabel, otherlabel = labels[:2]
599 607 if len(labels) >= 3:
600 608 baselabel = labels[2]
601 609 else:
602 610 baselabel = 'base'
603 611 env = {'HG_FILE': fcd.path(),
604 612 'HG_MY_NODE': short(mynode),
605 613 'HG_OTHER_NODE': short(fco.changectx().node()),
606 614 'HG_BASE_NODE': short(fca.changectx().node()),
607 615 'HG_MY_ISLINK': 'l' in fcd.flags(),
608 616 'HG_OTHER_ISLINK': 'l' in fco.flags(),
609 617 'HG_BASE_ISLINK': 'l' in fca.flags(),
610 618 'HG_MY_LABEL': mylabel,
611 619 'HG_OTHER_LABEL': otherlabel,
612 620 'HG_BASE_LABEL': baselabel,
613 621 }
614 622 ui = repo.ui
615 623
616 624 if "$output" in args:
617 625 # read input from backup, write to original
618 626 outpath = localpath
619 627 localpath = localoutputpath
620 628 replace = {'local': localpath, 'base': basepath, 'other': otherpath,
621 629 'output': outpath, 'labellocal': mylabel,
622 630 'labelother': otherlabel, 'labelbase': baselabel}
623 631 args = util.interpolate(
624 632 br'\$', replace, args,
625 633 lambda s: procutil.shellquote(util.localpath(s)))
626 634 if _toolbool(ui, tool, "gui"):
627 635 repo.ui.status(_('running merge tool %s for file %s\n') %
628 636 (tool, uipathfn(fcd.path())))
629 637 if scriptfn is None:
630 638 cmd = toolpath + ' ' + args
631 639 repo.ui.debug('launching merge tool: %s\n' % cmd)
632 640 _describemerge(ui, repo, mynode, fcd, fca, fco, env, toolpath, args)
633 641 r = ui.system(cmd, cwd=repo.root, environ=env,
634 642 blockedtag='mergetool')
635 643 else:
636 644 repo.ui.debug('launching python merge script: %s:%s\n' %
637 645 (toolpath, scriptfn))
638 646 r = 0
639 647 try:
640 648 # avoid cycle cmdutil->merge->filemerge->extensions->cmdutil
641 649 from . import extensions
642 650 mod = extensions.loadpath(toolpath, 'hgmerge.%s' % tool)
643 651 except Exception:
644 652 raise error.Abort(_("loading python merge script failed: %s") %
645 653 toolpath)
646 654 mergefn = getattr(mod, scriptfn, None)
647 655 if mergefn is None:
648 656 raise error.Abort(_("%s does not have function: %s") %
649 657 (toolpath, scriptfn))
650 658 argslist = procutil.shellsplit(args)
651 659 # avoid cycle cmdutil->merge->filemerge->hook->extensions->cmdutil
652 660 from . import hook
653 661 ret, raised = hook.pythonhook(ui, repo, "merge", toolpath,
654 662 mergefn, {'args': argslist}, True)
655 663 if raised:
656 664 r = 1
657 665 repo.ui.debug('merge tool returned: %d\n' % r)
658 666 return True, r, False
659 667
660 668 def _formatconflictmarker(ctx, template, label, pad):
661 669 """Applies the given template to the ctx, prefixed by the label.
662 670
663 671 Pad is the minimum width of the label prefix, so that multiple markers
664 672 can have aligned templated parts.
665 673 """
666 674 if ctx.node() is None:
667 675 ctx = ctx.p1()
668 676
669 677 props = {'ctx': ctx}
670 678 templateresult = template.renderdefault(props)
671 679
672 680 label = ('%s:' % label).ljust(pad + 1)
673 681 mark = '%s %s' % (label, templateresult)
674 682
675 683 if mark:
676 684 mark = mark.splitlines()[0] # split for safety
677 685
678 686 # 8 for the prefix of conflict marker lines (e.g. '<<<<<<< ')
679 687 return stringutil.ellipsis(mark, 80 - 8)
680 688
681 689 _defaultconflictlabels = ['local', 'other']
682 690
683 691 def _formatlabels(repo, fcd, fco, fca, labels, tool=None):
684 692 """Formats the given labels using the conflict marker template.
685 693
686 694 Returns a list of formatted labels.
687 695 """
688 696 cd = fcd.changectx()
689 697 co = fco.changectx()
690 698 ca = fca.changectx()
691 699
692 700 ui = repo.ui
693 701 template = ui.config('ui', 'mergemarkertemplate')
694 702 if tool is not None:
695 703 template = _toolstr(ui, tool, 'mergemarkertemplate', template)
696 704 template = templater.unquotestring(template)
697 705 tres = formatter.templateresources(ui, repo)
698 706 tmpl = formatter.maketemplater(ui, template, defaults=templatekw.keywords,
699 707 resources=tres)
700 708
701 709 pad = max(len(l) for l in labels)
702 710
703 711 newlabels = [_formatconflictmarker(cd, tmpl, labels[0], pad),
704 712 _formatconflictmarker(co, tmpl, labels[1], pad)]
705 713 if len(labels) > 2:
706 714 newlabels.append(_formatconflictmarker(ca, tmpl, labels[2], pad))
707 715 return newlabels
708 716
709 717 def partextras(labels):
710 718 """Return a dictionary of extra labels for use in prompts to the user
711 719
712 720 Intended use is in strings of the form "(l)ocal%(l)s".
713 721 """
714 722 if labels is None:
715 723 return {
716 724 "l": "",
717 725 "o": "",
718 726 }
719 727
720 728 return {
721 729 "l": " [%s]" % labels[0],
722 730 "o": " [%s]" % labels[1],
723 731 }
724 732
725 733 def _restorebackup(fcd, back):
726 734 # TODO: Add a workingfilectx.write(otherfilectx) path so we can use
727 735 # util.copy here instead.
728 736 fcd.write(back.data(), fcd.flags())
729 737
730 738 def _makebackup(repo, ui, wctx, fcd, premerge):
731 739 """Makes and returns a filectx-like object for ``fcd``'s backup file.
732 740
733 741 In addition to preserving the user's pre-existing modifications to `fcd`
734 742 (if any), the backup is used to undo certain premerges, confirm whether a
735 743 merge changed anything, and determine what line endings the new file should
736 744 have.
737 745
738 746 Backups only need to be written once (right before the premerge) since their
739 747 content doesn't change afterwards.
740 748 """
741 749 if fcd.isabsent():
742 750 return None
743 751 # TODO: Break this import cycle somehow. (filectx -> ctx -> fileset ->
744 752 # merge -> filemerge). (I suspect the fileset import is the weakest link)
745 753 from . import context
746 754 back = scmutil.backuppath(ui, repo, fcd.path())
747 755 inworkingdir = (back.startswith(repo.wvfs.base) and not
748 756 back.startswith(repo.vfs.base))
749 757 if isinstance(fcd, context.overlayworkingfilectx) and inworkingdir:
750 758 # If the backup file is to be in the working directory, and we're
751 759 # merging in-memory, we must redirect the backup to the memory context
752 760 # so we don't disturb the working directory.
753 761 relpath = back[len(repo.wvfs.base) + 1:]
754 762 if premerge:
755 763 wctx[relpath].write(fcd.data(), fcd.flags())
756 764 return wctx[relpath]
757 765 else:
758 766 if premerge:
759 767 # Otherwise, write to wherever path the user specified the backups
760 768 # should go. We still need to switch based on whether the source is
761 769 # in-memory so we can use the fast path of ``util.copy`` if both are
762 770 # on disk.
763 771 if isinstance(fcd, context.overlayworkingfilectx):
764 772 util.writefile(back, fcd.data())
765 773 else:
766 774 a = _workingpath(repo, fcd)
767 775 util.copyfile(a, back)
768 776 # A arbitraryfilectx is returned, so we can run the same functions on
769 777 # the backup context regardless of where it lives.
770 778 return context.arbitraryfilectx(back, repo=repo)
771 779
772 780 @contextlib.contextmanager
773 781 def _maketempfiles(repo, fco, fca, localpath, uselocalpath):
774 782 """Writes out `fco` and `fca` as temporary files, and (if uselocalpath)
775 783 copies `localpath` to another temporary file, so an external merge tool may
776 784 use them.
777 785 """
778 786 tmproot = None
779 787 tmprootprefix = repo.ui.config('experimental', 'mergetempdirprefix')
780 788 if tmprootprefix:
781 789 tmproot = pycompat.mkdtemp(prefix=tmprootprefix)
782 790
783 791 def maketempfrompath(prefix, path):
784 792 fullbase, ext = os.path.splitext(path)
785 793 pre = "%s~%s" % (os.path.basename(fullbase), prefix)
786 794 if tmproot:
787 795 name = os.path.join(tmproot, pre)
788 796 if ext:
789 797 name += ext
790 798 f = open(name, r"wb")
791 799 else:
792 800 fd, name = pycompat.mkstemp(prefix=pre + '.', suffix=ext)
793 801 f = os.fdopen(fd, r"wb")
794 802 return f, name
795 803
796 804 def tempfromcontext(prefix, ctx):
797 805 f, name = maketempfrompath(prefix, ctx.path())
798 806 data = repo.wwritedata(ctx.path(), ctx.data())
799 807 f.write(data)
800 808 f.close()
801 809 return name
802 810
803 811 b = tempfromcontext("base", fca)
804 812 c = tempfromcontext("other", fco)
805 813 d = localpath
806 814 if uselocalpath:
807 815 # We start off with this being the backup filename, so remove the .orig
808 816 # to make syntax-highlighting more likely.
809 817 if d.endswith('.orig'):
810 818 d, _ = os.path.splitext(d)
811 819 f, d = maketempfrompath("local", d)
812 820 with open(localpath, 'rb') as src:
813 821 f.write(src.read())
814 822 f.close()
815 823
816 824 try:
817 825 yield b, c, d
818 826 finally:
819 827 if tmproot:
820 828 shutil.rmtree(tmproot)
821 829 else:
822 830 util.unlink(b)
823 831 util.unlink(c)
824 832 # if not uselocalpath, d is the 'orig'/backup file which we
825 833 # shouldn't delete.
826 834 if d and uselocalpath:
827 835 util.unlink(d)
828 836
829 837 def _filemerge(premerge, repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
830 838 """perform a 3-way merge in the working directory
831 839
832 840 premerge = whether this is a premerge
833 841 mynode = parent node before merge
834 842 orig = original local filename before merge
835 843 fco = other file context
836 844 fca = ancestor file context
837 845 fcd = local file context for current/destination file
838 846
839 847 Returns whether the merge is complete, the return value of the merge, and
840 848 a boolean indicating whether the file was deleted from disk."""
841 849
842 850 if not fco.cmp(fcd): # files identical?
843 851 return True, None, False
844 852
845 853 ui = repo.ui
846 854 fd = fcd.path()
847 855 uipathfn = scmutil.getuipathfn(repo)
848 856 fduipath = uipathfn(fd)
849 857 binary = fcd.isbinary() or fco.isbinary() or fca.isbinary()
850 858 symlink = 'l' in fcd.flags() + fco.flags()
851 859 changedelete = fcd.isabsent() or fco.isabsent()
852 860 tool, toolpath = _picktool(repo, ui, fd, binary, symlink, changedelete)
853 861 scriptfn = None
854 862 if tool in internals and tool.startswith('internal:'):
855 863 # normalize to new-style names (':merge' etc)
856 864 tool = tool[len('internal'):]
857 865 if toolpath and toolpath.startswith('python:'):
858 866 invalidsyntax = False
859 867 if toolpath.count(':') >= 2:
860 868 script, scriptfn = toolpath[7:].rsplit(':', 1)
861 869 if not scriptfn:
862 870 invalidsyntax = True
863 871 # missing :callable can lead to spliting on windows drive letter
864 872 if '\\' in scriptfn or '/' in scriptfn:
865 873 invalidsyntax = True
866 874 else:
867 875 invalidsyntax = True
868 876 if invalidsyntax:
869 877 raise error.Abort(_("invalid 'python:' syntax: %s") % toolpath)
870 878 toolpath = script
871 879 ui.debug("picked tool '%s' for %s (binary %s symlink %s changedelete %s)\n"
872 880 % (tool, fduipath, pycompat.bytestr(binary),
873 881 pycompat.bytestr(symlink), pycompat.bytestr(changedelete)))
874 882
875 883 if tool in internals:
876 884 func = internals[tool]
877 885 mergetype = func.mergetype
878 886 onfailure = func.onfailure
879 887 precheck = func.precheck
880 888 isexternal = False
881 889 else:
882 890 if wctx.isinmemory():
883 891 func = _xmergeimm
884 892 else:
885 893 func = _xmerge
886 894 mergetype = fullmerge
887 895 onfailure = _("merging %s failed!\n")
888 896 precheck = None
889 897 isexternal = True
890 898
891 899 toolconf = tool, toolpath, binary, symlink, scriptfn
892 900
893 901 if mergetype == nomerge:
894 902 r, deleted = func(repo, mynode, orig, fcd, fco, fca, toolconf, labels)
895 903 return True, r, deleted
896 904
897 905 if premerge:
898 906 if orig != fco.path():
899 907 ui.status(_("merging %s and %s to %s\n") %
900 908 (uipathfn(orig), uipathfn(fco.path()), fduipath))
901 909 else:
902 910 ui.status(_("merging %s\n") % fduipath)
903 911
904 912 ui.debug("my %s other %s ancestor %s\n" % (fcd, fco, fca))
905 913
906 914 if precheck and not precheck(repo, mynode, orig, fcd, fco, fca,
907 915 toolconf):
908 916 if onfailure:
909 917 if wctx.isinmemory():
910 918 raise error.InMemoryMergeConflictsError('in-memory merge does '
911 919 'not support merge '
912 920 'conflicts')
913 921 ui.warn(onfailure % fduipath)
914 922 return True, 1, False
915 923
916 924 back = _makebackup(repo, ui, wctx, fcd, premerge)
917 925 files = (None, None, None, back)
918 926 r = 1
919 927 try:
920 928 internalmarkerstyle = ui.config('ui', 'mergemarkers')
921 929 if isexternal:
922 930 markerstyle = _toolstr(ui, tool, 'mergemarkers')
923 931 else:
924 932 markerstyle = internalmarkerstyle
925 933
926 934 if not labels:
927 935 labels = _defaultconflictlabels
928 936 formattedlabels = labels
929 937 if markerstyle != 'basic':
930 938 formattedlabels = _formatlabels(repo, fcd, fco, fca, labels,
931 939 tool=tool)
932 940
933 941 if premerge and mergetype == fullmerge:
934 942 # conflict markers generated by premerge will use 'detailed'
935 943 # settings if either ui.mergemarkers or the tool's mergemarkers
936 944 # setting is 'detailed'. This way tools can have basic labels in
937 945 # space-constrained areas of the UI, but still get full information
938 946 # in conflict markers if premerge is 'keep' or 'keep-merge3'.
939 947 premergelabels = labels
940 948 labeltool = None
941 949 if markerstyle != 'basic':
942 950 # respect 'tool's mergemarkertemplate (which defaults to
943 951 # ui.mergemarkertemplate)
944 952 labeltool = tool
945 953 if internalmarkerstyle != 'basic' or markerstyle != 'basic':
946 954 premergelabels = _formatlabels(repo, fcd, fco, fca,
947 955 premergelabels, tool=labeltool)
948 956
949 957 r = _premerge(repo, fcd, fco, fca, toolconf, files,
950 958 labels=premergelabels)
951 959 # complete if premerge successful (r is 0)
952 960 return not r, r, False
953 961
954 962 needcheck, r, deleted = func(repo, mynode, orig, fcd, fco, fca,
955 963 toolconf, files, labels=formattedlabels)
956 964
957 965 if needcheck:
958 966 r = _check(repo, r, ui, tool, fcd, files)
959 967
960 968 if r:
961 969 if onfailure:
962 970 if wctx.isinmemory():
963 971 raise error.InMemoryMergeConflictsError('in-memory merge '
964 972 'does not support '
965 973 'merge conflicts')
966 974 ui.warn(onfailure % fduipath)
967 975 _onfilemergefailure(ui)
968 976
969 977 return True, r, deleted
970 978 finally:
971 979 if not r and back is not None:
972 980 back.remove()
973 981
974 982 def _haltmerge():
975 983 msg = _('merge halted after failed merge (see hg resolve)')
976 984 raise error.InterventionRequired(msg)
977 985
978 986 def _onfilemergefailure(ui):
979 987 action = ui.config('merge', 'on-failure')
980 988 if action == 'prompt':
981 989 msg = _('continue merge operation (yn)?' '$$ &Yes $$ &No')
982 990 if ui.promptchoice(msg, 0) == 1:
983 991 _haltmerge()
984 992 if action == 'halt':
985 993 _haltmerge()
986 994 # default action is 'continue', in which case we neither prompt nor halt
987 995
988 996 def hasconflictmarkers(data):
989 997 return bool(re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", data,
990 998 re.MULTILINE))
991 999
992 1000 def _check(repo, r, ui, tool, fcd, files):
993 1001 fd = fcd.path()
994 1002 uipathfn = scmutil.getuipathfn(repo)
995 1003 unused, unused, unused, back = files
996 1004
997 1005 if not r and (_toolbool(ui, tool, "checkconflicts") or
998 1006 'conflicts' in _toollist(ui, tool, "check")):
999 1007 if hasconflictmarkers(fcd.data()):
1000 1008 r = 1
1001 1009
1002 1010 checked = False
1003 1011 if 'prompt' in _toollist(ui, tool, "check"):
1004 1012 checked = True
1005 1013 if ui.promptchoice(_("was merge of '%s' successful (yn)?"
1006 1014 "$$ &Yes $$ &No") % uipathfn(fd), 1):
1007 1015 r = 1
1008 1016
1009 1017 if not r and not checked and (_toolbool(ui, tool, "checkchanged") or
1010 1018 'changed' in
1011 1019 _toollist(ui, tool, "check")):
1012 1020 if back is not None and not fcd.cmp(back):
1013 1021 if ui.promptchoice(_(" output file %s appears unchanged\n"
1014 1022 "was merge successful (yn)?"
1015 1023 "$$ &Yes $$ &No") % uipathfn(fd), 1):
1016 1024 r = 1
1017 1025
1018 1026 if back is not None and _toolbool(ui, tool, "fixeol"):
1019 1027 _matcheol(_workingpath(repo, fcd), back)
1020 1028
1021 1029 return r
1022 1030
1023 1031 def _workingpath(repo, ctx):
1024 1032 return repo.wjoin(ctx.path())
1025 1033
1026 1034 def premerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
1027 1035 return _filemerge(True, repo, wctx, mynode, orig, fcd, fco, fca,
1028 1036 labels=labels)
1029 1037
1030 1038 def filemerge(repo, wctx, mynode, orig, fcd, fco, fca, labels=None):
1031 1039 return _filemerge(False, repo, wctx, mynode, orig, fcd, fco, fca,
1032 1040 labels=labels)
1033 1041
1034 1042 def loadinternalmerge(ui, extname, registrarobj):
1035 1043 """Load internal merge tool from specified registrarobj
1036 1044 """
1037 1045 for name, func in registrarobj._table.iteritems():
1038 1046 fullname = ':' + name
1039 1047 internals[fullname] = func
1040 1048 internals['internal:' + name] = func
1041 1049 internalsdoc[fullname] = func
1042 1050
1043 1051 capabilities = sorted([k for k, v in func.capabilities.items() if v])
1044 1052 if capabilities:
1045 1053 capdesc = " (actual capabilities: %s)" % ', '.join(capabilities)
1046 1054 func.__doc__ = (func.__doc__ +
1047 1055 pycompat.sysstr("\n\n%s" % capdesc))
1048 1056
1049 1057 # to put i18n comments into hg.pot for automatically generated texts
1050 1058
1051 1059 # i18n: "binary" and "symlink" are keywords
1052 1060 # i18n: this text is added automatically
1053 1061 _(" (actual capabilities: binary, symlink)")
1054 1062 # i18n: "binary" is keyword
1055 1063 # i18n: this text is added automatically
1056 1064 _(" (actual capabilities: binary)")
1057 1065 # i18n: "symlink" is keyword
1058 1066 # i18n: this text is added automatically
1059 1067 _(" (actual capabilities: symlink)")
1060 1068
1061 1069 # load built-in merge tools explicitly to setup internalsdoc
1062 1070 loadinternalmerge(None, None, internaltool)
1063 1071
1064 1072 # tell hggettext to extract docstrings from these functions:
1065 1073 i18nfunctions = internals.values()
@@ -1,1319 +1,1319 b''
1 1 $ hg init
2 2
3 3 Setup:
4 4
5 5 $ echo a >> a
6 6 $ hg ci -Am 'base'
7 7 adding a
8 8
9 9 Refuse to amend public csets:
10 10
11 11 $ hg phase -r . -p
12 12 $ hg ci --amend
13 13 abort: cannot amend public changesets
14 14 (see 'hg help phases' for details)
15 15 [255]
16 16 $ hg phase -r . -f -d
17 17
18 18 $ echo a >> a
19 19 $ hg ci -Am 'base1'
20 20
21 21 Nothing to amend:
22 22
23 23 $ hg ci --amend -m 'base1'
24 24 nothing changed
25 25 [1]
26 26
27 27 $ cat >> $HGRCPATH <<EOF
28 28 > [hooks]
29 29 > pretxncommit.foo = sh -c "echo \\"pretxncommit \$HG_NODE\\"; hg id -r \$HG_NODE"
30 30 > EOF
31 31
32 32 Amending changeset with changes in working dir:
33 33 (and check that --message does not trigger an editor)
34 34
35 35 $ echo a >> a
36 36 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -m 'amend base1'
37 37 pretxncommit 43f1ba15f28a50abf0aae529cf8a16bfced7b149
38 38 43f1ba15f28a tip
39 39 saved backup bundle to $TESTTMP/.hg/strip-backup/489edb5b847d-5ab4f721-amend.hg
40 40 $ echo 'pretxncommit.foo = ' >> $HGRCPATH
41 41 $ hg diff -c .
42 42 diff -r ad120869acf0 -r 43f1ba15f28a a
43 43 --- a/a Thu Jan 01 00:00:00 1970 +0000
44 44 +++ b/a Thu Jan 01 00:00:00 1970 +0000
45 45 @@ -1,1 +1,3 @@
46 46 a
47 47 +a
48 48 +a
49 49 $ hg log
50 50 changeset: 1:43f1ba15f28a
51 51 tag: tip
52 52 user: test
53 53 date: Thu Jan 01 00:00:00 1970 +0000
54 54 summary: amend base1
55 55
56 56 changeset: 0:ad120869acf0
57 57 user: test
58 58 date: Thu Jan 01 00:00:00 1970 +0000
59 59 summary: base
60 60
61 61
62 62 Check proper abort for empty message
63 63
64 64 $ cat > editor.sh << '__EOF__'
65 65 > #!/bin/sh
66 66 > echo "" > "$1"
67 67 > __EOF__
68 68
69 69 Update the existing file to ensure that the dirstate is not in pending state
70 70 (where the status of some files in the working copy is not known yet). This in
71 71 turn ensures that when the transaction is aborted due to an empty message during
72 72 the amend, there should be no rollback.
73 73 $ echo a >> a
74 74
75 75 $ echo b > b
76 76 $ hg add b
77 77 $ hg summary
78 78 parent: 1:43f1ba15f28a tip
79 79 amend base1
80 80 branch: default
81 81 commit: 1 modified, 1 added, 1 unknown
82 82 update: (current)
83 83 phases: 2 draft
84 84 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend
85 85 abort: empty commit message
86 86 [255]
87 87 $ hg summary
88 88 parent: 1:43f1ba15f28a tip
89 89 amend base1
90 90 branch: default
91 91 commit: 1 modified, 1 added, 1 unknown
92 92 update: (current)
93 93 phases: 2 draft
94 94
95 95 Add new file along with modified existing file:
96 96 $ hg ci --amend -m 'amend base1 new file'
97 97 saved backup bundle to $TESTTMP/.hg/strip-backup/43f1ba15f28a-007467c2-amend.hg
98 98
99 99 Remove file that was added in amended commit:
100 100 (and test logfile option)
101 101 (and test that logfile option do not trigger an editor)
102 102
103 103 $ hg rm b
104 104 $ echo 'amend base1 remove new file' > ../logfile
105 105 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg ci --amend --logfile ../logfile
106 106 saved backup bundle to $TESTTMP/.hg/strip-backup/c16295aaf401-1ada9901-amend.hg
107 107
108 108 $ hg cat b
109 109 b: no such file in rev 47343646fa3d
110 110 [1]
111 111
112 112 No changes, just a different message:
113 113
114 114 $ hg ci -v --amend -m 'no changes, new message'
115 115 amending changeset 47343646fa3d
116 116 copying changeset 47343646fa3d to ad120869acf0
117 117 committing files:
118 118 a
119 119 committing manifest
120 120 committing changelog
121 121 1 changesets found
122 122 uncompressed size of bundle content:
123 123 254 (changelog)
124 124 163 (manifests)
125 125 131 a
126 126 saved backup bundle to $TESTTMP/.hg/strip-backup/47343646fa3d-c2758885-amend.hg
127 127 1 changesets found
128 128 uncompressed size of bundle content:
129 129 250 (changelog)
130 130 163 (manifests)
131 131 131 a
132 132 adding branch
133 133 adding changesets
134 134 adding manifests
135 135 adding file changes
136 136 added 1 changesets with 1 changes to 1 files
137 137 committed changeset 1:401431e913a1
138 138 $ hg diff -c .
139 139 diff -r ad120869acf0 -r 401431e913a1 a
140 140 --- a/a Thu Jan 01 00:00:00 1970 +0000
141 141 +++ b/a Thu Jan 01 00:00:00 1970 +0000
142 142 @@ -1,1 +1,4 @@
143 143 a
144 144 +a
145 145 +a
146 146 +a
147 147 $ hg log
148 148 changeset: 1:401431e913a1
149 149 tag: tip
150 150 user: test
151 151 date: Thu Jan 01 00:00:00 1970 +0000
152 152 summary: no changes, new message
153 153
154 154 changeset: 0:ad120869acf0
155 155 user: test
156 156 date: Thu Jan 01 00:00:00 1970 +0000
157 157 summary: base
158 158
159 159
160 160 Disable default date on commit so when -d isn't given, the old date is preserved:
161 161
162 162 $ echo '[defaults]' >> $HGRCPATH
163 163 $ echo 'commit=' >> $HGRCPATH
164 164
165 165 Test -u/-d:
166 166
167 167 $ cat > .hg/checkeditform.sh <<EOF
168 168 > env | grep HGEDITFORM
169 169 > true
170 170 > EOF
171 171 $ HGEDITOR="sh .hg/checkeditform.sh" hg ci --amend -u foo -d '1 0'
172 172 HGEDITFORM=commit.amend.normal
173 173 saved backup bundle to $TESTTMP/.hg/strip-backup/401431e913a1-5e8e532c-amend.hg
174 174 $ echo a >> a
175 175 $ hg ci --amend -u foo -d '1 0'
176 176 saved backup bundle to $TESTTMP/.hg/strip-backup/d96b1d28ae33-677e0afb-amend.hg
177 177 $ hg log -r .
178 178 changeset: 1:a9a13940fc03
179 179 tag: tip
180 180 user: foo
181 181 date: Thu Jan 01 00:00:01 1970 +0000
182 182 summary: no changes, new message
183 183
184 184
185 185 Open editor with old commit message if a message isn't given otherwise:
186 186
187 187 $ cat > editor.sh << '__EOF__'
188 188 > #!/bin/sh
189 189 > cat $1
190 190 > echo "another precious commit message" > "$1"
191 191 > __EOF__
192 192
193 193 at first, test saving last-message.txt
194 194
195 195 $ cat > .hg/hgrc << '__EOF__'
196 196 > [hooks]
197 197 > pretxncommit.test-saving-last-message = false
198 198 > __EOF__
199 199
200 200 $ rm -f .hg/last-message.txt
201 201 $ hg commit --amend -v -m "message given from command line"
202 202 amending changeset a9a13940fc03
203 203 copying changeset a9a13940fc03 to ad120869acf0
204 204 committing files:
205 205 a
206 206 committing manifest
207 207 committing changelog
208 208 running hook pretxncommit.test-saving-last-message: false
209 209 transaction abort!
210 210 rollback completed
211 211 abort: pretxncommit.test-saving-last-message hook exited with status 1
212 212 [255]
213 213 $ cat .hg/last-message.txt
214 214 message given from command line (no-eol)
215 215
216 216 $ rm -f .hg/last-message.txt
217 217 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
218 218 amending changeset a9a13940fc03
219 219 copying changeset a9a13940fc03 to ad120869acf0
220 220 no changes, new message
221 221
222 222
223 223 HG: Enter commit message. Lines beginning with 'HG:' are removed.
224 224 HG: Leave message empty to abort commit.
225 225 HG: --
226 226 HG: user: foo
227 227 HG: branch 'default'
228 228 HG: changed a
229 229 committing files:
230 230 a
231 231 committing manifest
232 232 committing changelog
233 233 running hook pretxncommit.test-saving-last-message: false
234 234 transaction abort!
235 235 rollback completed
236 236 abort: pretxncommit.test-saving-last-message hook exited with status 1
237 237 [255]
238 238
239 239 $ cat .hg/last-message.txt
240 240 another precious commit message
241 241
242 242 $ cat > .hg/hgrc << '__EOF__'
243 243 > [hooks]
244 244 > pretxncommit.test-saving-last-message =
245 245 > __EOF__
246 246
247 247 then, test editing custom commit message
248 248
249 249 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
250 250 amending changeset a9a13940fc03
251 251 copying changeset a9a13940fc03 to ad120869acf0
252 252 no changes, new message
253 253
254 254
255 255 HG: Enter commit message. Lines beginning with 'HG:' are removed.
256 256 HG: Leave message empty to abort commit.
257 257 HG: --
258 258 HG: user: foo
259 259 HG: branch 'default'
260 260 HG: changed a
261 261 committing files:
262 262 a
263 263 committing manifest
264 264 committing changelog
265 265 1 changesets found
266 266 uncompressed size of bundle content:
267 267 249 (changelog)
268 268 163 (manifests)
269 269 133 a
270 270 saved backup bundle to $TESTTMP/.hg/strip-backup/a9a13940fc03-7c2e8674-amend.hg
271 271 1 changesets found
272 272 uncompressed size of bundle content:
273 273 257 (changelog)
274 274 163 (manifests)
275 275 133 a
276 276 adding branch
277 277 adding changesets
278 278 adding manifests
279 279 adding file changes
280 280 added 1 changesets with 1 changes to 1 files
281 281 committed changeset 1:64a124ba1b44
282 282
283 283 Same, but with changes in working dir (different code path):
284 284
285 285 $ echo a >> a
286 286 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend -v
287 287 amending changeset 64a124ba1b44
288 288 another precious commit message
289 289
290 290
291 291 HG: Enter commit message. Lines beginning with 'HG:' are removed.
292 292 HG: Leave message empty to abort commit.
293 293 HG: --
294 294 HG: user: foo
295 295 HG: branch 'default'
296 296 HG: changed a
297 297 committing files:
298 298 a
299 299 committing manifest
300 300 committing changelog
301 301 1 changesets found
302 302 uncompressed size of bundle content:
303 303 257 (changelog)
304 304 163 (manifests)
305 305 133 a
306 306 saved backup bundle to $TESTTMP/.hg/strip-backup/64a124ba1b44-10374b8f-amend.hg
307 307 1 changesets found
308 308 uncompressed size of bundle content:
309 309 257 (changelog)
310 310 163 (manifests)
311 311 135 a
312 312 adding branch
313 313 adding changesets
314 314 adding manifests
315 315 adding file changes
316 316 added 1 changesets with 1 changes to 1 files
317 317 committed changeset 1:7892795b8e38
318 318
319 319 $ rm editor.sh
320 320 $ hg log -r .
321 321 changeset: 1:7892795b8e38
322 322 tag: tip
323 323 user: foo
324 324 date: Thu Jan 01 00:00:01 1970 +0000
325 325 summary: another precious commit message
326 326
327 327
328 328 Moving bookmarks, preserve active bookmark:
329 329
330 330 $ hg book book1
331 331 $ hg book book2
332 332 $ hg ci --amend -m 'move bookmarks'
333 333 saved backup bundle to $TESTTMP/.hg/strip-backup/7892795b8e38-3fb46217-amend.hg
334 334 $ hg book
335 335 book1 1:8311f17e2616
336 336 * book2 1:8311f17e2616
337 337 $ echo a >> a
338 338 $ hg ci --amend -m 'move bookmarks'
339 339 saved backup bundle to $TESTTMP/.hg/strip-backup/8311f17e2616-f0504fe3-amend.hg
340 340 $ hg book
341 341 book1 1:a3b65065808c
342 342 * book2 1:a3b65065808c
343 343
344 344 abort does not loose bookmarks
345 345
346 346 $ cat > editor.sh << '__EOF__'
347 347 > #!/bin/sh
348 348 > echo "" > "$1"
349 349 > __EOF__
350 350 $ echo a >> a
351 351 $ HGEDITOR="\"sh\" \"`pwd`/editor.sh\"" hg commit --amend
352 352 abort: empty commit message
353 353 [255]
354 354 $ hg book
355 355 book1 1:a3b65065808c
356 356 * book2 1:a3b65065808c
357 357 $ hg revert -Caq
358 358 $ rm editor.sh
359 359
360 360 $ echo '[defaults]' >> $HGRCPATH
361 361 $ echo "commit=-d '0 0'" >> $HGRCPATH
362 362
363 363 Moving branches:
364 364
365 365 $ hg branch foo
366 366 marked working directory as branch foo
367 367 (branches are permanent and global, did you want a bookmark?)
368 368 $ echo a >> a
369 369 $ hg ci -m 'branch foo'
370 370 $ hg branch default -f
371 371 marked working directory as branch default
372 372 $ hg ci --amend -m 'back to default'
373 373 saved backup bundle to $TESTTMP/.hg/strip-backup/f8339a38efe1-c18453c9-amend.hg
374 374 $ hg branches
375 375 default 2:9c07515f2650
376 376
377 377 Close branch:
378 378
379 379 $ hg up -q 0
380 380 $ echo b >> b
381 381 $ hg branch foo
382 382 marked working directory as branch foo
383 383 (branches are permanent and global, did you want a bookmark?)
384 384 $ hg ci -Am 'fork'
385 385 adding b
386 386 $ echo b >> b
387 387 $ hg ci -mb
388 388 $ hg ci --amend --close-branch -m 'closing branch foo'
389 389 saved backup bundle to $TESTTMP/.hg/strip-backup/c962248fa264-54245dc7-amend.hg
390 390
391 391 Same thing, different code path:
392 392
393 393 $ echo b >> b
394 394 $ hg ci -m 'reopen branch'
395 395 reopening closed branch head 4
396 396 $ echo b >> b
397 397 $ hg ci --amend --close-branch
398 398 saved backup bundle to $TESTTMP/.hg/strip-backup/027371728205-b900d9fa-amend.hg
399 399 $ hg branches
400 400 default 2:9c07515f2650
401 401
402 402 Refuse to amend during a merge:
403 403
404 404 $ hg up -q default
405 405 $ hg merge foo
406 406 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
407 407 (branch merge, don't forget to commit)
408 408 $ hg ci --amend
409 409 abort: cannot amend while merging
410 410 [255]
411 411 $ hg ci -m 'merge'
412 412
413 413 Refuse to amend if there is a merge conflict (issue5805):
414 414
415 415 $ hg up -q foo
416 416 $ echo c > a
417 417 $ hg up default -t :fail
418 418 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
419 419 use 'hg resolve' to retry unresolved file merges
420 420 [1]
421 421 $ hg resolve -l
422 422 U a
423 423
424 424 $ hg ci --amend
425 425 abort: unresolved merge conflicts (see 'hg help resolve')
426 426 [255]
427 427
428 428 $ hg up -qC .
429 429
430 430 Follow copies/renames:
431 431
432 432 $ hg mv b c
433 433 $ hg ci -m 'b -> c'
434 434 $ hg mv c d
435 435 $ hg ci --amend -m 'b -> d'
436 436 saved backup bundle to $TESTTMP/.hg/strip-backup/42f3f27a067d-f23cc9f7-amend.hg
437 437 $ hg st --rev '.^' --copies d
438 438 A d
439 439 b
440 440 $ hg cp d e
441 441 $ hg ci -m 'e = d'
442 442 $ hg cp e f
443 443 $ hg ci --amend -m 'f = d'
444 444 saved backup bundle to $TESTTMP/.hg/strip-backup/9198f73182d5-251d584a-amend.hg
445 445 $ hg st --rev '.^' --copies f
446 446 A f
447 447 d
448 448
449 449 $ mv f f.orig
450 450 $ hg rm -A f
451 451 $ hg ci -m removef
452 452 $ hg cp a f
453 453 $ mv f.orig f
454 454 $ hg ci --amend -m replacef
455 455 saved backup bundle to $TESTTMP/.hg/strip-backup/f0993ab6b482-eda301bf-amend.hg
456 456 $ hg st --change . --copies
457 457 $ hg log -r . --template "{file_copies}\n"
458 458
459 459
460 460 Move added file (issue3410):
461 461
462 462 $ echo g >> g
463 463 $ hg ci -Am g
464 464 adding g
465 465 $ hg mv g h
466 466 $ hg ci --amend
467 467 saved backup bundle to $TESTTMP/.hg/strip-backup/58585e3f095c-0f5ebcda-amend.hg
468 468 $ hg st --change . --copies h
469 469 A h
470 470 $ hg log -r . --template "{file_copies}\n"
471 471
472 472
473 473 Can't rollback an amend:
474 474
475 475 $ hg rollback
476 476 no rollback information available
477 477 [1]
478 478
479 479 Preserve extra dict (issue3430):
480 480
481 481 $ hg branch a
482 482 marked working directory as branch a
483 483 (branches are permanent and global, did you want a bookmark?)
484 484 $ echo a >> a
485 485 $ hg ci -ma
486 486 $ hg ci --amend -m "a'"
487 487 saved backup bundle to $TESTTMP/.hg/strip-backup/39a162f1d65e-9dfe13d8-amend.hg
488 488 $ hg log -r . --template "{branch}\n"
489 489 a
490 490 $ hg ci --amend -m "a''"
491 491 saved backup bundle to $TESTTMP/.hg/strip-backup/d5ca7b1ac72b-0b4c1a34-amend.hg
492 492 $ hg log -r . --template "{branch}\n"
493 493 a
494 494
495 495 Also preserve other entries in the dict that are in the old commit,
496 496 first graft something so there's an additional entry:
497 497
498 498 $ hg up 0 -q
499 499 $ echo z > z
500 500 $ hg ci -Am 'fork'
501 501 adding z
502 502 created new head
503 503 $ hg up 11
504 504 5 files updated, 0 files merged, 1 files removed, 0 files unresolved
505 505 $ hg graft 12
506 506 grafting 12:2647734878ef "fork" (tip)
507 507 $ hg ci --amend -m 'graft amend'
508 508 saved backup bundle to $TESTTMP/.hg/strip-backup/fe8c6f7957ca-25638666-amend.hg
509 509 $ hg log -r . --debug | grep extra
510 510 extra: amend_source=fe8c6f7957ca1665ed77496ed7a07657d469ac60
511 511 extra: branch=a
512 512 extra: source=2647734878ef0236dda712fae9c1651cf694ea8a
513 513
514 514 Preserve phase
515 515
516 516 $ hg phase '.^::.'
517 517 11: draft
518 518 13: draft
519 519 $ hg phase --secret --force .
520 520 $ hg phase '.^::.'
521 521 11: draft
522 522 13: secret
523 523 $ hg commit --amend -m 'amend for phase' -q
524 524 $ hg phase '.^::.'
525 525 11: draft
526 526 13: secret
527 527
528 528 Test amend with obsolete
529 529 ---------------------------
530 530
531 531 Enable obsolete
532 532
533 533 $ cat >> $HGRCPATH << EOF
534 534 > [experimental]
535 535 > evolution.createmarkers=True
536 536 > evolution.allowunstable=True
537 537 > EOF
538 538
539 539 Amend with no files changes
540 540
541 541 $ hg id -n
542 542 13
543 543 $ hg ci --amend -m 'babar'
544 544 $ hg id -n
545 545 14
546 546 $ hg log -Gl 3 --style=compact
547 547 @ 14[tip]:11 682950e85999 1970-01-01 00:00 +0000 test
548 548 | babar
549 549 |
550 550 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
551 551 | | fork
552 552 | ~
553 553 o 11 0ddb275cfad1 1970-01-01 00:00 +0000 test
554 554 | a''
555 555 ~
556 556 $ hg log -Gl 4 --hidden --style=compact
557 557 @ 14[tip]:11 682950e85999 1970-01-01 00:00 +0000 test
558 558 | babar
559 559 |
560 560 | x 13:11 5167600b0f7a 1970-01-01 00:00 +0000 test
561 561 |/ amend for phase
562 562 |
563 563 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
564 564 | | fork
565 565 | ~
566 566 o 11 0ddb275cfad1 1970-01-01 00:00 +0000 test
567 567 | a''
568 568 ~
569 569
570 570 Amend with files changes
571 571
572 572 (note: the extra commit over 15 is a temporary junk I would be happy to get
573 573 ride of)
574 574
575 575 $ echo 'babar' >> a
576 576 $ hg commit --amend
577 577 $ hg log -Gl 6 --hidden --style=compact
578 578 @ 15[tip]:11 a5b42b49b0d5 1970-01-01 00:00 +0000 test
579 579 | babar
580 580 |
581 581 | x 14:11 682950e85999 1970-01-01 00:00 +0000 test
582 582 |/ babar
583 583 |
584 584 | x 13:11 5167600b0f7a 1970-01-01 00:00 +0000 test
585 585 |/ amend for phase
586 586 |
587 587 | o 12:0 2647734878ef 1970-01-01 00:00 +0000 test
588 588 | | fork
589 589 | ~
590 590 o 11 0ddb275cfad1 1970-01-01 00:00 +0000 test
591 591 | a''
592 592 |
593 593 o 10 5fa75032e226 1970-01-01 00:00 +0000 test
594 594 | g
595 595 ~
596 596
597 597
598 598 Test that amend does not make it easy to create obsolescence cycle
599 599 ---------------------------------------------------------------------
600 600
601 601 $ hg id -r 14 --hidden
602 602 682950e85999 (a)
603 603 $ hg revert -ar 14 --hidden
604 604 reverting a
605 605 $ hg commit --amend
606 606 $ hg id
607 607 37973c7e0b61 (a) tip
608 608
609 609 Test that rewriting leaving instability behind is allowed
610 610 ---------------------------------------------------------------------
611 611
612 612 $ hg up '.^'
613 613 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
614 614 $ echo 'b' >> a
615 615 $ hg log --style compact -r 'children(.)'
616 616 16[tip]:11 37973c7e0b61 1970-01-01 00:00 +0000 test
617 617 babar
618 618
619 619 $ hg commit --amend
620 620 1 new orphan changesets
621 621 $ hg log -r 'orphan()'
622 622 changeset: 16:37973c7e0b61
623 623 branch: a
624 624 parent: 11:0ddb275cfad1
625 625 user: test
626 626 date: Thu Jan 01 00:00:00 1970 +0000
627 627 instability: orphan
628 628 summary: babar
629 629
630 630
631 631 Amend a merge changeset (with renames and conflicts from the second parent):
632 632
633 633 $ hg up -q default
634 634 $ hg branch -q bar
635 635 $ hg cp a aa
636 636 $ hg mv z zz
637 637 $ echo cc > cc
638 638 $ hg add cc
639 639 $ hg ci -m aazzcc
640 640 $ hg up -q default
641 641 $ echo a >> a
642 642 $ echo dd > cc
643 643 $ hg add cc
644 644 $ hg ci -m aa
645 645 $ hg merge -q bar
646 646 warning: conflicts while merging cc! (edit, then use 'hg resolve --mark')
647 647 [1]
648 648 $ hg resolve -m cc
649 649 (no more unresolved files)
650 650 $ hg ci -m 'merge bar'
651 651 $ hg log --config diff.git=1 -pr .
652 652 changeset: 20:163cfd7219f7
653 653 tag: tip
654 654 parent: 19:30d96aeaf27b
655 655 parent: 18:1aa437659d19
656 656 user: test
657 657 date: Thu Jan 01 00:00:00 1970 +0000
658 658 summary: merge bar
659 659
660 660 diff --git a/a b/aa
661 661 copy from a
662 662 copy to aa
663 663 diff --git a/cc b/cc
664 664 --- a/cc
665 665 +++ b/cc
666 666 @@ -1,1 +1,5 @@
667 667 +<<<<<<< working copy: 30d96aeaf27b - test: aa
668 668 dd
669 669 +=======
670 670 +cc
671 671 +>>>>>>> merge rev: 1aa437659d19 bar - test: aazzcc
672 672 diff --git a/z b/zz
673 673 rename from z
674 674 rename to zz
675 675
676 676 $ hg debugrename aa
677 677 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
678 678 $ hg debugrename zz
679 679 zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
680 680 $ hg debugrename cc
681 681 cc not renamed
682 682 $ HGEDITOR="sh .hg/checkeditform.sh" hg ci --amend -m 'merge bar (amend message)' --edit
683 683 HGEDITFORM=commit.amend.merge
684 684 $ hg log --config diff.git=1 -pr .
685 685 changeset: 21:bca52d4ed186
686 686 tag: tip
687 687 parent: 19:30d96aeaf27b
688 688 parent: 18:1aa437659d19
689 689 user: test
690 690 date: Thu Jan 01 00:00:00 1970 +0000
691 691 summary: merge bar (amend message)
692 692
693 693 diff --git a/a b/aa
694 694 copy from a
695 695 copy to aa
696 696 diff --git a/cc b/cc
697 697 --- a/cc
698 698 +++ b/cc
699 699 @@ -1,1 +1,5 @@
700 700 +<<<<<<< working copy: 30d96aeaf27b - test: aa
701 701 dd
702 702 +=======
703 703 +cc
704 704 +>>>>>>> merge rev: 1aa437659d19 bar - test: aazzcc
705 705 diff --git a/z b/zz
706 706 rename from z
707 707 rename to zz
708 708
709 709 $ hg debugrename aa
710 710 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
711 711 $ hg debugrename zz
712 712 zz renamed from z:69a1b67522704ec122181c0890bd16e9d3e7516a
713 713 $ hg debugrename cc
714 714 cc not renamed
715 715 $ hg mv zz z
716 716 $ hg ci --amend -m 'merge bar (undo rename)'
717 717 $ hg log --config diff.git=1 -pr .
718 718 changeset: 22:12594a98ca3f
719 719 tag: tip
720 720 parent: 19:30d96aeaf27b
721 721 parent: 18:1aa437659d19
722 722 user: test
723 723 date: Thu Jan 01 00:00:00 1970 +0000
724 724 summary: merge bar (undo rename)
725 725
726 726 diff --git a/a b/aa
727 727 copy from a
728 728 copy to aa
729 729 diff --git a/cc b/cc
730 730 --- a/cc
731 731 +++ b/cc
732 732 @@ -1,1 +1,5 @@
733 733 +<<<<<<< working copy: 30d96aeaf27b - test: aa
734 734 dd
735 735 +=======
736 736 +cc
737 737 +>>>>>>> merge rev: 1aa437659d19 bar - test: aazzcc
738 738
739 739 $ hg debugrename z
740 740 z not renamed
741 741
742 742 Amend a merge changeset (with renames during the merge):
743 743
744 744 $ hg up -q bar
745 745 $ echo x > x
746 746 $ hg add x
747 747 $ hg ci -m x
748 748 $ hg up -q default
749 749 $ hg merge -q bar
750 750 $ hg mv aa aaa
751 751 $ echo aa >> aaa
752 752 $ hg ci -m 'merge bar again'
753 753 $ hg log --config diff.git=1 -pr .
754 754 changeset: 24:dffde028b388
755 755 tag: tip
756 756 parent: 22:12594a98ca3f
757 757 parent: 23:4c94d5bc65f5
758 758 user: test
759 759 date: Thu Jan 01 00:00:00 1970 +0000
760 760 summary: merge bar again
761 761
762 762 diff --git a/aa b/aa
763 763 deleted file mode 100644
764 764 --- a/aa
765 765 +++ /dev/null
766 766 @@ -1,2 +0,0 @@
767 767 -a
768 768 -a
769 769 diff --git a/aaa b/aaa
770 770 new file mode 100644
771 771 --- /dev/null
772 772 +++ b/aaa
773 773 @@ -0,0 +1,3 @@
774 774 +a
775 775 +a
776 776 +aa
777 777 diff --git a/x b/x
778 778 new file mode 100644
779 779 --- /dev/null
780 780 +++ b/x
781 781 @@ -0,0 +1,1 @@
782 782 +x
783 783
784 784 $ hg debugrename aaa
785 785 aaa renamed from aa:37d9b5d994eab34eda9c16b195ace52c7b129980
786 786
787 787 Update to p1 with 'aaa' modified. 'aaa' was renamed from 'aa' in p2. 'aa' exists
788 788 in p1 too, but it was recorded as copied from p2.
789 789 $ echo modified >> aaa
790 790 $ hg co -m '.^' -t :merge3
791 791 file 'aaa' was deleted in other [destination] but was modified in local [working copy].
792 What do you want to do?
793 use (c)hanged version, (d)elete, or leave (u)nresolved? u
792 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
793 What do you want to do? u
794 794 1 files updated, 0 files merged, 1 files removed, 1 files unresolved
795 795 use 'hg resolve' to retry unresolved file merges
796 796 [1]
797 797 $ hg co -C tip
798 798 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
799 799
800 800 $ hg mv aaa aa
801 801 $ hg ci --amend -m 'merge bar again (undo rename)'
802 802 $ hg log --config diff.git=1 -pr .
803 803 changeset: 25:18e3ba160489
804 804 tag: tip
805 805 parent: 22:12594a98ca3f
806 806 parent: 23:4c94d5bc65f5
807 807 user: test
808 808 date: Thu Jan 01 00:00:00 1970 +0000
809 809 summary: merge bar again (undo rename)
810 810
811 811 diff --git a/aa b/aa
812 812 --- a/aa
813 813 +++ b/aa
814 814 @@ -1,2 +1,3 @@
815 815 a
816 816 a
817 817 +aa
818 818 diff --git a/x b/x
819 819 new file mode 100644
820 820 --- /dev/null
821 821 +++ b/x
822 822 @@ -0,0 +1,1 @@
823 823 +x
824 824
825 825 $ hg debugrename aa
826 826 aa not renamed
827 827 $ hg debugrename -r '.^' aa
828 828 aa renamed from a:a80d06849b333b8a3d5c445f8ba3142010dcdc9e
829 829
830 830 Amend a merge changeset (with manifest-level conflicts):
831 831
832 832 $ hg up -q bar
833 833 $ hg rm aa
834 834 $ hg ci -m 'rm aa'
835 835 $ hg up -q default
836 836 $ echo aa >> aa
837 837 $ hg ci -m aa
838 838 $ hg merge -q bar --config ui.interactive=True << EOF
839 839 > c
840 840 > EOF
841 841 file 'aa' was deleted in other [merge rev] but was modified in local [working copy].
842 What do you want to do?
843 use (c)hanged version, (d)elete, or leave (u)nresolved? c
842 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
843 What do you want to do? c
844 844 $ hg ci -m 'merge bar (with conflicts)'
845 845 $ hg log --config diff.git=1 -pr .
846 846 changeset: 28:b4c3035e2544
847 847 tag: tip
848 848 parent: 27:4b216ca5ba97
849 849 parent: 26:67db8847a540
850 850 user: test
851 851 date: Thu Jan 01 00:00:00 1970 +0000
852 852 summary: merge bar (with conflicts)
853 853
854 854
855 855 $ hg rm aa
856 856 $ hg ci --amend -m 'merge bar (with conflicts, amended)'
857 857 $ hg log --config diff.git=1 -pr .
858 858 changeset: 29:1205ed810051
859 859 tag: tip
860 860 parent: 27:4b216ca5ba97
861 861 parent: 26:67db8847a540
862 862 user: test
863 863 date: Thu Jan 01 00:00:00 1970 +0000
864 864 summary: merge bar (with conflicts, amended)
865 865
866 866 diff --git a/aa b/aa
867 867 deleted file mode 100644
868 868 --- a/aa
869 869 +++ /dev/null
870 870 @@ -1,4 +0,0 @@
871 871 -a
872 872 -a
873 873 -aa
874 874 -aa
875 875
876 876 Issue 3445: amending with --close-branch a commit that created a new head should fail
877 877 This shouldn't be possible:
878 878
879 879 $ hg up -q default
880 880 $ hg branch closewithamend
881 881 marked working directory as branch closewithamend
882 882 $ echo foo > foo
883 883 $ hg add foo
884 884 $ hg ci -m..
885 885 $ hg ci --amend --close-branch -m 'closing'
886 886 abort: can only close branch heads
887 887 [255]
888 888
889 889 This silliness fails:
890 890
891 891 $ hg branch silliness
892 892 marked working directory as branch silliness
893 893 $ echo b >> b
894 894 $ hg ci --close-branch -m'open and close'
895 895 abort: branch "silliness" has no heads to close
896 896 [255]
897 897
898 898 Test that amend with --secret creates new secret changeset forcibly
899 899 ---------------------------------------------------------------------
900 900
901 901 $ hg phase '.^::.'
902 902 29: draft
903 903 30: draft
904 904 $ hg commit --amend --secret -m 'amend as secret' -q
905 905 $ hg phase '.^::.'
906 906 29: draft
907 907 31: secret
908 908
909 909 Test that amend with --edit invokes editor forcibly
910 910 ---------------------------------------------------
911 911
912 912 $ hg parents --template "{desc}\n"
913 913 amend as secret
914 914 $ HGEDITOR=cat hg commit --amend -m "editor should be suppressed"
915 915 $ hg parents --template "{desc}\n"
916 916 editor should be suppressed
917 917
918 918 $ hg status --rev '.^1::.'
919 919 A foo
920 920 $ HGEDITOR=cat hg commit --amend -m "editor should be invoked" --edit
921 921 editor should be invoked
922 922
923 923
924 924 HG: Enter commit message. Lines beginning with 'HG:' are removed.
925 925 HG: Leave message empty to abort commit.
926 926 HG: --
927 927 HG: user: test
928 928 HG: branch 'silliness'
929 929 HG: added foo
930 930 $ hg parents --template "{desc}\n"
931 931 editor should be invoked
932 932
933 933 Test that amend with --no-edit avoids the editor
934 934 ------------------------------------------------
935 935
936 936 $ hg commit --amend -m "before anything happens"
937 937 $ hg parents --template "{desc}\n"
938 938 before anything happens
939 939 $ HGEDITOR=cat hg commit --amend --no-edit -m "editor should be suppressed"
940 940 $ hg parents --template "{desc}\n"
941 941 editor should be suppressed
942 942
943 943 (We need a file change here since we won't have a message change)
944 944 $ cp foo foo.orig
945 945 $ echo hi >> foo
946 946 $ HGEDITOR=cat hg commit --amend --no-edit
947 947 $ hg parents --template "{desc}\n"
948 948 editor should be suppressed
949 949 $ hg status -mar
950 950 (Let's undo adding that "hi" so later tests don't need to be adjusted)
951 951 $ mv foo.orig foo
952 952 $ hg commit --amend --no-edit
953 953
954 954 Test that "diff()" in committemplate works correctly for amending
955 955 -----------------------------------------------------------------
956 956
957 957 $ cat >> .hg/hgrc <<EOF
958 958 > [committemplate]
959 959 > changeset.commit.amend = {desc}\n
960 960 > HG: M: {file_mods}
961 961 > HG: A: {file_adds}
962 962 > HG: R: {file_dels}
963 963 > {splitlines(diff()) % 'HG: {line}\n'}
964 964 > EOF
965 965
966 966 $ hg parents --template "M: {file_mods}\nA: {file_adds}\nR: {file_dels}\n"
967 967 M:
968 968 A: foo
969 969 R:
970 970 $ hg status -amr
971 971 $ HGEDITOR=cat hg commit --amend -e -m "expecting diff of foo"
972 972 expecting diff of foo
973 973
974 974 HG: M:
975 975 HG: A: foo
976 976 HG: R:
977 977 HG: diff -r 1205ed810051 foo
978 978 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
979 979 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
980 980 HG: @@ -0,0 +1,1 @@
981 981 HG: +foo
982 982
983 983 $ echo y > y
984 984 $ hg add y
985 985 $ HGEDITOR=cat hg commit --amend -e -m "expecting diff of foo and y"
986 986 expecting diff of foo and y
987 987
988 988 HG: M:
989 989 HG: A: foo y
990 990 HG: R:
991 991 HG: diff -r 1205ed810051 foo
992 992 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
993 993 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
994 994 HG: @@ -0,0 +1,1 @@
995 995 HG: +foo
996 996 HG: diff -r 1205ed810051 y
997 997 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
998 998 HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
999 999 HG: @@ -0,0 +1,1 @@
1000 1000 HG: +y
1001 1001
1002 1002 $ hg rm a
1003 1003 $ HGEDITOR=cat hg commit --amend -e -m "expecting diff of a, foo and y"
1004 1004 expecting diff of a, foo and y
1005 1005
1006 1006 HG: M:
1007 1007 HG: A: foo y
1008 1008 HG: R: a
1009 1009 HG: diff -r 1205ed810051 a
1010 1010 HG: --- a/a Thu Jan 01 00:00:00 1970 +0000
1011 1011 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1012 1012 HG: @@ -1,2 +0,0 @@
1013 1013 HG: -a
1014 1014 HG: -a
1015 1015 HG: diff -r 1205ed810051 foo
1016 1016 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1017 1017 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
1018 1018 HG: @@ -0,0 +1,1 @@
1019 1019 HG: +foo
1020 1020 HG: diff -r 1205ed810051 y
1021 1021 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1022 1022 HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
1023 1023 HG: @@ -0,0 +1,1 @@
1024 1024 HG: +y
1025 1025
1026 1026 $ hg rm x
1027 1027 $ HGEDITOR=cat hg commit --amend -e -m "expecting diff of a, foo, x and y"
1028 1028 expecting diff of a, foo, x and y
1029 1029
1030 1030 HG: M:
1031 1031 HG: A: foo y
1032 1032 HG: R: a x
1033 1033 HG: diff -r 1205ed810051 a
1034 1034 HG: --- a/a Thu Jan 01 00:00:00 1970 +0000
1035 1035 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1036 1036 HG: @@ -1,2 +0,0 @@
1037 1037 HG: -a
1038 1038 HG: -a
1039 1039 HG: diff -r 1205ed810051 foo
1040 1040 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1041 1041 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
1042 1042 HG: @@ -0,0 +1,1 @@
1043 1043 HG: +foo
1044 1044 HG: diff -r 1205ed810051 x
1045 1045 HG: --- a/x Thu Jan 01 00:00:00 1970 +0000
1046 1046 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1047 1047 HG: @@ -1,1 +0,0 @@
1048 1048 HG: -x
1049 1049 HG: diff -r 1205ed810051 y
1050 1050 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1051 1051 HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
1052 1052 HG: @@ -0,0 +1,1 @@
1053 1053 HG: +y
1054 1054
1055 1055 $ echo cccc >> cc
1056 1056 $ hg status -amr
1057 1057 M cc
1058 1058 $ HGEDITOR=cat hg commit --amend -e -m "cc should be excluded" -X cc
1059 1059 cc should be excluded
1060 1060
1061 1061 HG: M:
1062 1062 HG: A: foo y
1063 1063 HG: R: a x
1064 1064 HG: diff -r 1205ed810051 a
1065 1065 HG: --- a/a Thu Jan 01 00:00:00 1970 +0000
1066 1066 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1067 1067 HG: @@ -1,2 +0,0 @@
1068 1068 HG: -a
1069 1069 HG: -a
1070 1070 HG: diff -r 1205ed810051 foo
1071 1071 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1072 1072 HG: +++ b/foo Thu Jan 01 00:00:00 1970 +0000
1073 1073 HG: @@ -0,0 +1,1 @@
1074 1074 HG: +foo
1075 1075 HG: diff -r 1205ed810051 x
1076 1076 HG: --- a/x Thu Jan 01 00:00:00 1970 +0000
1077 1077 HG: +++ /dev/null Thu Jan 01 00:00:00 1970 +0000
1078 1078 HG: @@ -1,1 +0,0 @@
1079 1079 HG: -x
1080 1080 HG: diff -r 1205ed810051 y
1081 1081 HG: --- /dev/null Thu Jan 01 00:00:00 1970 +0000
1082 1082 HG: +++ b/y Thu Jan 01 00:00:00 1970 +0000
1083 1083 HG: @@ -0,0 +1,1 @@
1084 1084 HG: +y
1085 1085
1086 1086 Check for issue4405
1087 1087 -------------------
1088 1088
1089 1089 Setup the repo with a file that gets moved in a second commit.
1090 1090 $ hg init repo
1091 1091 $ cd repo
1092 1092 $ touch a0
1093 1093 $ hg add a0
1094 1094 $ hg commit -m a0
1095 1095 $ hg mv a0 a1
1096 1096 $ hg commit -m a1
1097 1097 $ hg up -q 0
1098 1098 $ hg log -G --template '{rev} {desc}'
1099 1099 o 1 a1
1100 1100 |
1101 1101 @ 0 a0
1102 1102
1103 1103
1104 1104 Now we branch the repro, but re-use the file contents, so we have a divergence
1105 1105 in the file revlog topology and the changelog topology.
1106 1106 $ hg revert --rev 1 --all
1107 1107 removing a0
1108 1108 adding a1
1109 1109 $ hg ci -qm 'a1-amend'
1110 1110 $ hg log -G --template '{rev} {desc}'
1111 1111 @ 2 a1-amend
1112 1112 |
1113 1113 | o 1 a1
1114 1114 |/
1115 1115 o 0 a0
1116 1116
1117 1117
1118 1118 The way mercurial does amends is by folding the working copy and old commit
1119 1119 together into another commit (rev 3). During this process, _findlimit is called
1120 1120 to check how far back to look for the transitive closure of file copy
1121 1121 information, but due to the divergence of the filelog and changelog graph
1122 1122 topologies, before _findlimit was fixed, it returned a rev which was not far
1123 1123 enough back in this case.
1124 1124 $ hg mv a1 a2
1125 1125 $ hg status --copies --rev 0
1126 1126 A a2
1127 1127 a0
1128 1128 R a0
1129 1129 $ hg ci --amend -q
1130 1130 $ hg log -G --template '{rev} {desc}'
1131 1131 @ 3 a1-amend
1132 1132 |
1133 1133 | o 1 a1
1134 1134 |/
1135 1135 o 0 a0
1136 1136
1137 1137
1138 1138 Before the fix, the copy information was lost.
1139 1139 $ hg status --copies --rev 0
1140 1140 A a2
1141 1141 a0
1142 1142 R a0
1143 1143 $ cd ..
1144 1144
1145 1145 Check that amend properly preserve rename from directory rename (issue-4516)
1146 1146
1147 1147 If a parent of the merge renames a full directory, any files added to the old
1148 1148 directory in the other parent will be renamed to the new directory. For some
1149 1149 reason, the rename metadata was when amending such merge. This test ensure we
1150 1150 do not regress. We have a dedicated repo because it needs a setup with renamed
1151 1151 directory)
1152 1152
1153 1153 $ hg init issue4516
1154 1154 $ cd issue4516
1155 1155 $ mkdir olddirname
1156 1156 $ echo line1 > olddirname/commonfile.py
1157 1157 $ hg add olddirname/commonfile.py
1158 1158 $ hg ci -m first
1159 1159
1160 1160 $ hg branch newdirname
1161 1161 marked working directory as branch newdirname
1162 1162 (branches are permanent and global, did you want a bookmark?)
1163 1163 $ hg mv olddirname newdirname
1164 1164 moving olddirname/commonfile.py to newdirname/commonfile.py
1165 1165 $ hg ci -m rename
1166 1166
1167 1167 $ hg update default
1168 1168 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1169 1169 $ echo line1 > olddirname/newfile.py
1170 1170 $ hg add olddirname/newfile.py
1171 1171 $ hg ci -m log
1172 1172
1173 1173 $ hg up newdirname
1174 1174 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
1175 1175 $ # create newdirname/newfile.py
1176 1176 $ hg merge default
1177 1177 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1178 1178 (branch merge, don't forget to commit)
1179 1179 $ hg ci -m add
1180 1180 $
1181 1181 $ hg debugrename newdirname/newfile.py
1182 1182 newdirname/newfile.py renamed from olddirname/newfile.py:690b295714aed510803d3020da9c70fca8336def
1183 1183 $ hg status -C --change .
1184 1184 A newdirname/newfile.py
1185 1185 $ hg status -C --rev 1
1186 1186 A newdirname/newfile.py
1187 1187 $ hg status -C --rev 2
1188 1188 A newdirname/commonfile.py
1189 1189 olddirname/commonfile.py
1190 1190 A newdirname/newfile.py
1191 1191 olddirname/newfile.py
1192 1192 R olddirname/commonfile.py
1193 1193 R olddirname/newfile.py
1194 1194 $ hg debugindex newdirname/newfile.py
1195 1195 rev linkrev nodeid p1 p2
1196 1196 0 3 34a4d536c0c0 000000000000 000000000000
1197 1197
1198 1198 $ echo a >> newdirname/commonfile.py
1199 1199 $ hg ci --amend -m bug
1200 1200 $ hg debugrename newdirname/newfile.py
1201 1201 newdirname/newfile.py renamed from olddirname/newfile.py:690b295714aed510803d3020da9c70fca8336def
1202 1202 $ hg debugindex newdirname/newfile.py
1203 1203 rev linkrev nodeid p1 p2
1204 1204 0 3 34a4d536c0c0 000000000000 000000000000
1205 1205
1206 1206 #if execbit
1207 1207
1208 1208 Test if amend preserves executable bit changes
1209 1209 $ chmod +x newdirname/commonfile.py
1210 1210 $ hg ci -m chmod
1211 1211 $ hg ci --amend -m "chmod amended"
1212 1212 $ hg ci --amend -m "chmod amended second time"
1213 1213 $ hg log -p --git -r .
1214 1214 changeset: 7:b1326f52dddf
1215 1215 branch: newdirname
1216 1216 tag: tip
1217 1217 parent: 4:7fd235f7cb2f
1218 1218 user: test
1219 1219 date: Thu Jan 01 00:00:00 1970 +0000
1220 1220 summary: chmod amended second time
1221 1221
1222 1222 diff --git a/newdirname/commonfile.py b/newdirname/commonfile.py
1223 1223 old mode 100644
1224 1224 new mode 100755
1225 1225
1226 1226 #endif
1227 1227
1228 1228 Test amend with file inclusion options
1229 1229 --------------------------------------
1230 1230
1231 1231 These tests ensure that we are always amending some files that were part of the
1232 1232 pre-amend commit. We want to test that the remaining files in the pre-amend
1233 1233 commit were not changed in the amended commit. We do so by performing a diff of
1234 1234 the amended commit against its parent commit.
1235 1235 $ cd ..
1236 1236 $ hg init testfileinclusions
1237 1237 $ cd testfileinclusions
1238 1238 $ echo a > a
1239 1239 $ echo b > b
1240 1240 $ hg commit -Aqm "Adding a and b"
1241 1241
1242 1242 Only add changes to a particular file
1243 1243 $ echo a >> a
1244 1244 $ echo b >> b
1245 1245 $ hg commit --amend -I a
1246 1246 $ hg diff --git -r null -r .
1247 1247 diff --git a/a b/a
1248 1248 new file mode 100644
1249 1249 --- /dev/null
1250 1250 +++ b/a
1251 1251 @@ -0,0 +1,2 @@
1252 1252 +a
1253 1253 +a
1254 1254 diff --git a/b b/b
1255 1255 new file mode 100644
1256 1256 --- /dev/null
1257 1257 +++ b/b
1258 1258 @@ -0,0 +1,1 @@
1259 1259 +b
1260 1260
1261 1261 $ echo a >> a
1262 1262 $ hg commit --amend b
1263 1263 $ hg diff --git -r null -r .
1264 1264 diff --git a/a b/a
1265 1265 new file mode 100644
1266 1266 --- /dev/null
1267 1267 +++ b/a
1268 1268 @@ -0,0 +1,2 @@
1269 1269 +a
1270 1270 +a
1271 1271 diff --git a/b b/b
1272 1272 new file mode 100644
1273 1273 --- /dev/null
1274 1274 +++ b/b
1275 1275 @@ -0,0 +1,2 @@
1276 1276 +b
1277 1277 +b
1278 1278
1279 1279 Exclude changes to a particular file
1280 1280 $ echo b >> b
1281 1281 $ hg commit --amend -X a
1282 1282 $ hg diff --git -r null -r .
1283 1283 diff --git a/a b/a
1284 1284 new file mode 100644
1285 1285 --- /dev/null
1286 1286 +++ b/a
1287 1287 @@ -0,0 +1,2 @@
1288 1288 +a
1289 1289 +a
1290 1290 diff --git a/b b/b
1291 1291 new file mode 100644
1292 1292 --- /dev/null
1293 1293 +++ b/b
1294 1294 @@ -0,0 +1,3 @@
1295 1295 +b
1296 1296 +b
1297 1297 +b
1298 1298
1299 1299 Check the addremove flag
1300 1300 $ echo c > c
1301 1301 $ rm a
1302 1302 $ hg commit --amend -A
1303 1303 removing a
1304 1304 adding c
1305 1305 $ hg diff --git -r null -r .
1306 1306 diff --git a/b b/b
1307 1307 new file mode 100644
1308 1308 --- /dev/null
1309 1309 +++ b/b
1310 1310 @@ -0,0 +1,3 @@
1311 1311 +b
1312 1312 +b
1313 1313 +b
1314 1314 diff --git a/c b/c
1315 1315 new file mode 100644
1316 1316 --- /dev/null
1317 1317 +++ b/c
1318 1318 @@ -0,0 +1,1 @@
1319 1319 +c
@@ -1,171 +1,171 b''
1 1 Test for the full copytracing algorithm
2 2 =======================================
3 3
4 4 $ hg init t
5 5 $ cd t
6 6
7 7 $ echo 1 > a
8 8 $ hg ci -qAm "first"
9 9
10 10 $ hg cp a b
11 11 $ hg mv a c
12 12 $ echo 2 >> b
13 13 $ echo 2 >> c
14 14
15 15 $ hg ci -qAm "second"
16 16
17 17 $ hg co -C 0
18 18 1 files updated, 0 files merged, 2 files removed, 0 files unresolved
19 19
20 20 $ echo 0 > a
21 21 $ echo 1 >> a
22 22
23 23 $ hg ci -qAm "other"
24 24
25 25 $ hg merge --debug
26 26 unmatched files in other:
27 27 b
28 28 c
29 29 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
30 30 src: 'a' -> dst: 'b' *
31 31 src: 'a' -> dst: 'c' *
32 32 checking for directory renames
33 33 resolving manifests
34 34 branchmerge: True, force: False, partial: False
35 35 ancestor: b8bf91eeebbc, local: add3f11052fa+, remote: 17c05bb7fcb6
36 36 preserving a for resolve of b
37 37 preserving a for resolve of c
38 38 removing a
39 39 starting 4 threads for background file closing (?)
40 40 b: remote moved from a -> m (premerge)
41 41 picked tool ':merge' for b (binary False symlink False changedelete False)
42 42 merging a and b to b
43 43 my b@add3f11052fa+ other b@17c05bb7fcb6 ancestor a@b8bf91eeebbc
44 44 premerge successful
45 45 c: remote moved from a -> m (premerge)
46 46 picked tool ':merge' for c (binary False symlink False changedelete False)
47 47 merging a and c to c
48 48 my c@add3f11052fa+ other c@17c05bb7fcb6 ancestor a@b8bf91eeebbc
49 49 premerge successful
50 50 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
51 51 (branch merge, don't forget to commit)
52 52
53 53 file b
54 54 $ cat b
55 55 0
56 56 1
57 57 2
58 58
59 59 file c
60 60 $ cat c
61 61 0
62 62 1
63 63 2
64 64
65 65 Test disabling copy tracing
66 66
67 67 - first verify copy metadata was kept
68 68
69 69 $ hg up -qC 2
70 70 $ hg rebase --keep -d 1 -b 2 --config extensions.rebase=
71 71 rebasing 2:add3f11052fa "other" (tip)
72 72 merging b and a to b
73 73 merging c and a to c
74 74
75 75 $ cat b
76 76 0
77 77 1
78 78 2
79 79
80 80 - next verify copy metadata is lost when disabled
81 81
82 82 $ hg strip -r . --config extensions.strip=
83 83 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
84 84 saved backup bundle to $TESTTMP/t/.hg/strip-backup/550bd84c0cd3-fc575957-backup.hg
85 85 $ hg up -qC 2
86 86 $ hg rebase --keep -d 1 -b 2 --config extensions.rebase= --config experimental.copytrace=off --config ui.interactive=True << EOF
87 87 > c
88 88 > EOF
89 89 rebasing 2:add3f11052fa "other" (tip)
90 90 file 'a' was deleted in local [dest] but was modified in other [source].
91 What do you want to do?
92 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
91 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
92 What do you want to do? c
93 93
94 94 $ cat b
95 95 1
96 96 2
97 97
98 98 $ cd ..
99 99
100 100 Verify disabling copy tracing still keeps copies from rebase source
101 101
102 102 $ hg init copydisable
103 103 $ cd copydisable
104 104 $ touch a
105 105 $ hg ci -Aqm 'add a'
106 106 $ touch b
107 107 $ hg ci -Aqm 'add b, c'
108 108 $ hg cp b x
109 109 $ echo x >> x
110 110 $ hg ci -qm 'copy b->x'
111 111 $ hg up -q 1
112 112 $ touch z
113 113 $ hg ci -Aqm 'add z'
114 114 $ hg log -G -T '{rev} {desc}\n'
115 115 @ 3 add z
116 116 |
117 117 | o 2 copy b->x
118 118 |/
119 119 o 1 add b, c
120 120 |
121 121 o 0 add a
122 122
123 123 $ hg rebase -d . -b 2 --config extensions.rebase= --config experimental.copytrace=off
124 124 rebasing 2:6adcf8c12e7d "copy b->x"
125 125 saved backup bundle to $TESTTMP/copydisable/.hg/strip-backup/6adcf8c12e7d-ce4b3e75-rebase.hg
126 126 $ hg up -q 3
127 127 $ hg log -f x -T '{rev} {desc}\n'
128 128 3 copy b->x
129 129 1 add b, c
130 130
131 131 $ cd ../
132 132
133 133 Verify we duplicate existing copies, instead of detecting them
134 134
135 135 $ hg init copydisable3
136 136 $ cd copydisable3
137 137 $ touch a
138 138 $ hg ci -Aqm 'add a'
139 139 $ hg cp a b
140 140 $ hg ci -Aqm 'copy a->b'
141 141 $ hg mv b c
142 142 $ hg ci -Aqm 'move b->c'
143 143 $ hg up -q 0
144 144 $ hg cp a b
145 145 $ echo b >> b
146 146 $ hg ci -Aqm 'copy a->b (2)'
147 147 $ hg log -G -T '{rev} {desc}\n'
148 148 @ 3 copy a->b (2)
149 149 |
150 150 | o 2 move b->c
151 151 | |
152 152 | o 1 copy a->b
153 153 |/
154 154 o 0 add a
155 155
156 156 $ hg rebase -d 2 -s 3 --config extensions.rebase= --config experimental.copytrace=off
157 157 rebasing 3:47e1a9e6273b "copy a->b (2)" (tip)
158 158 saved backup bundle to $TESTTMP/copydisable3/.hg/strip-backup/47e1a9e6273b-2d099c59-rebase.hg
159 159
160 160 $ hg log -G -f b
161 161 @ changeset: 3:76024fb4b05b
162 162 : tag: tip
163 163 : user: test
164 164 : date: Thu Jan 01 00:00:00 1970 +0000
165 165 : summary: copy a->b (2)
166 166 :
167 167 o changeset: 0:ac82d8b1f7c4
168 168 user: test
169 169 date: Thu Jan 01 00:00:00 1970 +0000
170 170 summary: add a
171 171
@@ -1,720 +1,720 b''
1 1 Test for the heuristic copytracing algorithm
2 2 ============================================
3 3
4 4 $ cat >> $TESTTMP/copytrace.sh << '__EOF__'
5 5 > initclient() {
6 6 > cat >> $1/.hg/hgrc <<EOF
7 7 > [experimental]
8 8 > copytrace = heuristics
9 9 > copytrace.sourcecommitlimit = -1
10 10 > EOF
11 11 > }
12 12 > __EOF__
13 13 $ . "$TESTTMP/copytrace.sh"
14 14
15 15 $ cat >> $HGRCPATH << EOF
16 16 > [extensions]
17 17 > rebase=
18 18 > [alias]
19 19 > l = log -G -T 'rev: {rev}\ndesc: {desc}\n'
20 20 > pl = log -G -T 'rev: {rev}, phase: {phase}\ndesc: {desc}\n'
21 21 > EOF
22 22
23 23 NOTE: calling initclient() set copytrace.sourcecommitlimit=-1 as we want to
24 24 prevent the full copytrace algorithm to run and test the heuristic algorithm
25 25 without complexing the test cases with public and draft commits.
26 26
27 27 Check filename heuristics (same dirname and same basename)
28 28 ----------------------------------------------------------
29 29
30 30 $ hg init repo
31 31 $ initclient repo
32 32 $ cd repo
33 33 $ echo a > a
34 34 $ mkdir dir
35 35 $ echo a > dir/file.txt
36 36 $ hg addremove
37 37 adding a
38 38 adding dir/file.txt
39 39 $ hg ci -m initial
40 40 $ hg mv a b
41 41 $ hg mv -q dir dir2
42 42 $ hg ci -m 'mv a b, mv dir/ dir2/'
43 43 $ hg up -q 0
44 44 $ echo b > a
45 45 $ echo b > dir/file.txt
46 46 $ hg ci -qm 'mod a, mod dir/file.txt'
47 47
48 48 $ hg l
49 49 @ rev: 2
50 50 | desc: mod a, mod dir/file.txt
51 51 | o rev: 1
52 52 |/ desc: mv a b, mv dir/ dir2/
53 53 o rev: 0
54 54 desc: initial
55 55
56 56 $ hg rebase -s . -d 1
57 57 rebasing 2:557f403c0afd "mod a, mod dir/file.txt" (tip)
58 58 merging b and a to b
59 59 merging dir2/file.txt and dir/file.txt to dir2/file.txt
60 60 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/557f403c0afd-9926eeff-rebase.hg
61 61 $ cd ..
62 62 $ rm -rf repo
63 63
64 64 Make sure filename heuristics do not when they are not related
65 65 --------------------------------------------------------------
66 66
67 67 $ hg init repo
68 68 $ initclient repo
69 69 $ cd repo
70 70 $ echo 'somecontent' > a
71 71 $ hg add a
72 72 $ hg ci -m initial
73 73 $ hg rm a
74 74 $ echo 'completelydifferentcontext' > b
75 75 $ hg add b
76 76 $ hg ci -m 'rm a, add b'
77 77 $ hg up -q 0
78 78 $ printf 'somecontent\nmoarcontent' > a
79 79 $ hg ci -qm 'mode a'
80 80
81 81 $ hg l
82 82 @ rev: 2
83 83 | desc: mode a
84 84 | o rev: 1
85 85 |/ desc: rm a, add b
86 86 o rev: 0
87 87 desc: initial
88 88
89 89 $ hg rebase -s . -d 1
90 90 rebasing 2:d526312210b9 "mode a" (tip)
91 91 file 'a' was deleted in local [dest] but was modified in other [source].
92 What do you want to do?
93 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
92 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
93 What do you want to do? u
94 94 unresolved conflicts (see hg resolve, then hg rebase --continue)
95 95 [1]
96 96
97 97 $ cd ..
98 98 $ rm -rf repo
99 99
100 100 Test when lca didn't modified the file that was moved
101 101 -----------------------------------------------------
102 102
103 103 $ hg init repo
104 104 $ initclient repo
105 105 $ cd repo
106 106 $ echo 'somecontent' > a
107 107 $ hg add a
108 108 $ hg ci -m initial
109 109 $ echo c > c
110 110 $ hg add c
111 111 $ hg ci -m randomcommit
112 112 $ hg mv a b
113 113 $ hg ci -m 'mv a b'
114 114 $ hg up -q 1
115 115 $ echo b > a
116 116 $ hg ci -qm 'mod a'
117 117
118 118 $ hg pl
119 119 @ rev: 3, phase: draft
120 120 | desc: mod a
121 121 | o rev: 2, phase: draft
122 122 |/ desc: mv a b
123 123 o rev: 1, phase: draft
124 124 | desc: randomcommit
125 125 o rev: 0, phase: draft
126 126 desc: initial
127 127
128 128 $ hg rebase -s . -d 2
129 129 rebasing 3:9d5cf99c3d9f "mod a" (tip)
130 130 merging b and a to b
131 131 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/9d5cf99c3d9f-f02358cc-rebase.hg
132 132 $ cd ..
133 133 $ rm -rf repo
134 134
135 135 Rebase "backwards"
136 136 ------------------
137 137
138 138 $ hg init repo
139 139 $ initclient repo
140 140 $ cd repo
141 141 $ echo 'somecontent' > a
142 142 $ hg add a
143 143 $ hg ci -m initial
144 144 $ echo c > c
145 145 $ hg add c
146 146 $ hg ci -m randomcommit
147 147 $ hg mv a b
148 148 $ hg ci -m 'mv a b'
149 149 $ hg up -q 2
150 150 $ echo b > b
151 151 $ hg ci -qm 'mod b'
152 152
153 153 $ hg l
154 154 @ rev: 3
155 155 | desc: mod b
156 156 o rev: 2
157 157 | desc: mv a b
158 158 o rev: 1
159 159 | desc: randomcommit
160 160 o rev: 0
161 161 desc: initial
162 162
163 163 $ hg rebase -s . -d 0
164 164 rebasing 3:fbe97126b396 "mod b" (tip)
165 165 merging a and b to a
166 166 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/fbe97126b396-cf5452a1-rebase.hg
167 167 $ cd ..
168 168 $ rm -rf repo
169 169
170 170 Check a few potential move candidates
171 171 -------------------------------------
172 172
173 173 $ hg init repo
174 174 $ initclient repo
175 175 $ cd repo
176 176 $ mkdir dir
177 177 $ echo a > dir/a
178 178 $ hg add dir/a
179 179 $ hg ci -qm initial
180 180 $ hg mv dir/a dir/b
181 181 $ hg ci -qm 'mv dir/a dir/b'
182 182 $ mkdir dir2
183 183 $ echo b > dir2/a
184 184 $ hg add dir2/a
185 185 $ hg ci -qm 'create dir2/a'
186 186 $ hg up -q 0
187 187 $ echo b > dir/a
188 188 $ hg ci -qm 'mod dir/a'
189 189
190 190 $ hg l
191 191 @ rev: 3
192 192 | desc: mod dir/a
193 193 | o rev: 2
194 194 | | desc: create dir2/a
195 195 | o rev: 1
196 196 |/ desc: mv dir/a dir/b
197 197 o rev: 0
198 198 desc: initial
199 199
200 200 $ hg rebase -s . -d 2
201 201 rebasing 3:6b2f4cece40f "mod dir/a" (tip)
202 202 merging dir/b and dir/a to dir/b
203 203 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/6b2f4cece40f-503efe60-rebase.hg
204 204 $ cd ..
205 205 $ rm -rf repo
206 206
207 207 Test the copytrace.movecandidateslimit with many move candidates
208 208 ----------------------------------------------------------------
209 209
210 210 $ hg init repo
211 211 $ initclient repo
212 212 $ cd repo
213 213 $ echo a > a
214 214 $ hg add a
215 215 $ hg ci -m initial
216 216 $ hg mv a foo
217 217 $ echo a > b
218 218 $ echo a > c
219 219 $ echo a > d
220 220 $ echo a > e
221 221 $ echo a > f
222 222 $ echo a > g
223 223 $ hg add b
224 224 $ hg add c
225 225 $ hg add d
226 226 $ hg add e
227 227 $ hg add f
228 228 $ hg add g
229 229 $ hg ci -m 'mv a foo, add many files'
230 230 $ hg up -q ".^"
231 231 $ echo b > a
232 232 $ hg ci -m 'mod a'
233 233 created new head
234 234
235 235 $ hg l
236 236 @ rev: 2
237 237 | desc: mod a
238 238 | o rev: 1
239 239 |/ desc: mv a foo, add many files
240 240 o rev: 0
241 241 desc: initial
242 242
243 243 With small limit
244 244
245 245 $ hg rebase -s 2 -d 1 --config experimental.copytrace.movecandidateslimit=0
246 246 rebasing 2:ef716627c70b "mod a" (tip)
247 247 skipping copytracing for 'a', more candidates than the limit: 7
248 248 file 'a' was deleted in local [dest] but was modified in other [source].
249 What do you want to do?
250 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
249 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
250 What do you want to do? u
251 251 unresolved conflicts (see hg resolve, then hg rebase --continue)
252 252 [1]
253 253
254 254 $ hg rebase --abort
255 255 rebase aborted
256 256
257 257 With default limit which is 100
258 258
259 259 $ hg rebase -s 2 -d 1
260 260 rebasing 2:ef716627c70b "mod a" (tip)
261 261 merging foo and a to foo
262 262 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/ef716627c70b-24681561-rebase.hg
263 263
264 264 $ cd ..
265 265 $ rm -rf repo
266 266
267 267 Move file in one branch and delete it in another
268 268 -----------------------------------------------
269 269
270 270 $ hg init repo
271 271 $ initclient repo
272 272 $ cd repo
273 273 $ echo a > a
274 274 $ hg add a
275 275 $ hg ci -m initial
276 276 $ hg mv a b
277 277 $ hg ci -m 'mv a b'
278 278 $ hg up -q ".^"
279 279 $ hg rm a
280 280 $ hg ci -m 'del a'
281 281 created new head
282 282
283 283 $ hg pl
284 284 @ rev: 2, phase: draft
285 285 | desc: del a
286 286 | o rev: 1, phase: draft
287 287 |/ desc: mv a b
288 288 o rev: 0, phase: draft
289 289 desc: initial
290 290
291 291 $ hg rebase -s 1 -d 2
292 292 rebasing 1:472e38d57782 "mv a b"
293 293 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/472e38d57782-17d50e29-rebase.hg
294 294 $ hg up -q c492ed3c7e35dcd1dc938053b8adf56e2cfbd062
295 295 $ ls
296 296 b
297 297 $ cd ..
298 298 $ rm -rf repo
299 299
300 300 Move a directory in draft branch
301 301 --------------------------------
302 302
303 303 $ hg init repo
304 304 $ initclient repo
305 305 $ cd repo
306 306 $ mkdir dir
307 307 $ echo a > dir/a
308 308 $ hg add dir/a
309 309 $ hg ci -qm initial
310 310 $ echo b > dir/a
311 311 $ hg ci -qm 'mod dir/a'
312 312 $ hg up -q ".^"
313 313 $ hg mv -q dir/ dir2
314 314 $ hg ci -qm 'mv dir/ dir2/'
315 315
316 316 $ hg l
317 317 @ rev: 2
318 318 | desc: mv dir/ dir2/
319 319 | o rev: 1
320 320 |/ desc: mod dir/a
321 321 o rev: 0
322 322 desc: initial
323 323
324 324 $ hg rebase -s . -d 1
325 325 rebasing 2:a33d80b6e352 "mv dir/ dir2/" (tip)
326 326 merging dir/a and dir2/a to dir2/a
327 327 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/a33d80b6e352-fecb9ada-rebase.hg
328 328 $ cd ..
329 329 $ rm -rf server
330 330 $ rm -rf repo
331 331
332 332 Move file twice and rebase mod on top of moves
333 333 ----------------------------------------------
334 334
335 335 $ hg init repo
336 336 $ initclient repo
337 337 $ cd repo
338 338 $ echo a > a
339 339 $ hg add a
340 340 $ hg ci -m initial
341 341 $ hg mv a b
342 342 $ hg ci -m 'mv a b'
343 343 $ hg mv b c
344 344 $ hg ci -m 'mv b c'
345 345 $ hg up -q 0
346 346 $ echo c > a
347 347 $ hg ci -m 'mod a'
348 348 created new head
349 349
350 350 $ hg l
351 351 @ rev: 3
352 352 | desc: mod a
353 353 | o rev: 2
354 354 | | desc: mv b c
355 355 | o rev: 1
356 356 |/ desc: mv a b
357 357 o rev: 0
358 358 desc: initial
359 359 $ hg rebase -s . -d 2
360 360 rebasing 3:d41316942216 "mod a" (tip)
361 361 merging c and a to c
362 362 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/d41316942216-2b5949bc-rebase.hg
363 363
364 364 $ cd ..
365 365 $ rm -rf repo
366 366
367 367 Move file twice and rebase moves on top of mods
368 368 -----------------------------------------------
369 369
370 370 $ hg init repo
371 371 $ initclient repo
372 372 $ cd repo
373 373 $ echo a > a
374 374 $ hg add a
375 375 $ hg ci -m initial
376 376 $ hg mv a b
377 377 $ hg ci -m 'mv a b'
378 378 $ hg mv b c
379 379 $ hg ci -m 'mv b c'
380 380 $ hg up -q 0
381 381 $ echo c > a
382 382 $ hg ci -m 'mod a'
383 383 created new head
384 384 $ hg l
385 385 @ rev: 3
386 386 | desc: mod a
387 387 | o rev: 2
388 388 | | desc: mv b c
389 389 | o rev: 1
390 390 |/ desc: mv a b
391 391 o rev: 0
392 392 desc: initial
393 393 $ hg rebase -s 1 -d .
394 394 rebasing 1:472e38d57782 "mv a b"
395 395 merging a and b to b
396 396 rebasing 2:d3efd280421d "mv b c"
397 397 merging b and c to c
398 398 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/472e38d57782-ab8d3c58-rebase.hg
399 399
400 400 $ cd ..
401 401 $ rm -rf repo
402 402
403 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 406 $ hg init repo
407 407 $ initclient repo
408 408 $ cd repo
409 409 $ echo a > a
410 410 $ hg add a
411 411 $ hg ci -m initial
412 412 $ hg mv a b
413 413 $ hg ci -m 'mv a b'
414 414 $ echo c > c
415 415 $ hg add c
416 416 $ hg ci -m 'add c'
417 417 $ hg up -q 0
418 418 $ echo b > a
419 419 $ hg ci -m 'mod a'
420 420 created new head
421 421
422 422 $ hg l
423 423 @ rev: 3
424 424 | desc: mod a
425 425 | o rev: 2
426 426 | | desc: add c
427 427 | o rev: 1
428 428 |/ desc: mv a b
429 429 o rev: 0
430 430 desc: initial
431 431
432 432 $ hg rebase -s . -d 2
433 433 rebasing 3:ef716627c70b "mod a" (tip)
434 434 merging b and a to b
435 435 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/ef716627c70b-24681561-rebase.hg
436 436 $ ls
437 437 b
438 438 c
439 439 $ cat b
440 440 b
441 441 $ rm -rf repo
442 442
443 443 Merge test
444 444 ----------
445 445
446 446 $ hg init repo
447 447 $ initclient repo
448 448 $ cd repo
449 449 $ echo a > a
450 450 $ hg add a
451 451 $ hg ci -m initial
452 452 $ echo b > a
453 453 $ hg ci -m 'modify a'
454 454 $ hg up -q 0
455 455 $ hg mv a b
456 456 $ hg ci -m 'mv a b'
457 457 created new head
458 458 $ hg up -q 2
459 459
460 460 $ hg l
461 461 @ rev: 2
462 462 | desc: mv a b
463 463 | o rev: 1
464 464 |/ desc: modify a
465 465 o rev: 0
466 466 desc: initial
467 467
468 468 $ hg merge 1
469 469 merging b and a to b
470 470 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
471 471 (branch merge, don't forget to commit)
472 472 $ hg ci -m merge
473 473 $ ls
474 474 b
475 475 $ cd ..
476 476 $ rm -rf repo
477 477
478 478 Copy and move file
479 479 ------------------
480 480
481 481 $ hg init repo
482 482 $ initclient repo
483 483 $ cd repo
484 484 $ echo a > a
485 485 $ hg add a
486 486 $ hg ci -m initial
487 487 $ hg cp a c
488 488 $ hg mv a b
489 489 $ hg ci -m 'cp a c, mv a b'
490 490 $ hg up -q 0
491 491 $ echo b > a
492 492 $ hg ci -m 'mod a'
493 493 created new head
494 494
495 495 $ hg l
496 496 @ rev: 2
497 497 | desc: mod a
498 498 | o rev: 1
499 499 |/ desc: cp a c, mv a b
500 500 o rev: 0
501 501 desc: initial
502 502
503 503 $ hg rebase -s . -d 1
504 504 rebasing 2:ef716627c70b "mod a" (tip)
505 505 merging b and a to b
506 506 merging c and a to c
507 507 saved backup bundle to $TESTTMP/repo/repo/.hg/strip-backup/ef716627c70b-24681561-rebase.hg
508 508 $ ls
509 509 b
510 510 c
511 511 $ cat b
512 512 b
513 513 $ cat c
514 514 b
515 515 $ cd ..
516 516 $ rm -rf repo
517 517
518 518 Do a merge commit with many consequent moves in one branch
519 519 ----------------------------------------------------------
520 520
521 521 $ hg init repo
522 522 $ initclient repo
523 523 $ cd repo
524 524 $ echo a > a
525 525 $ hg add a
526 526 $ hg ci -m initial
527 527 $ echo b > a
528 528 $ hg ci -qm 'mod a'
529 529 $ hg up -q ".^"
530 530 $ hg mv a b
531 531 $ hg ci -qm 'mv a b'
532 532 $ hg mv b c
533 533 $ hg ci -qm 'mv b c'
534 534 $ hg up -q 1
535 535 $ hg l
536 536 o rev: 3
537 537 | desc: mv b c
538 538 o rev: 2
539 539 | desc: mv a b
540 540 | @ rev: 1
541 541 |/ desc: mod a
542 542 o rev: 0
543 543 desc: initial
544 544
545 545 $ hg merge 3
546 546 merging a and c to c
547 547 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
548 548 (branch merge, don't forget to commit)
549 549 $ hg ci -qm 'merge'
550 550 $ hg pl
551 551 @ rev: 4, phase: draft
552 552 |\ desc: merge
553 553 | o rev: 3, phase: draft
554 554 | | desc: mv b c
555 555 | o rev: 2, phase: draft
556 556 | | desc: mv a b
557 557 o | rev: 1, phase: draft
558 558 |/ desc: mod a
559 559 o rev: 0, phase: draft
560 560 desc: initial
561 561 $ ls
562 562 c
563 563 $ cd ..
564 564 $ rm -rf repo
565 565
566 566 Test shelve/unshelve
567 567 -------------------
568 568
569 569 $ hg init repo
570 570 $ initclient repo
571 571 $ cd repo
572 572 $ echo a > a
573 573 $ hg add a
574 574 $ hg ci -m initial
575 575 $ echo b > a
576 576 $ hg shelve
577 577 shelved as default
578 578 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
579 579 $ hg mv a b
580 580 $ hg ci -m 'mv a b'
581 581
582 582 $ hg l
583 583 @ rev: 1
584 584 | desc: mv a b
585 585 o rev: 0
586 586 desc: initial
587 587 $ hg unshelve
588 588 unshelving change 'default'
589 589 rebasing shelved changes
590 590 merging b and a to b
591 591 $ ls
592 592 b
593 593 $ cat b
594 594 b
595 595 $ cd ..
596 596 $ rm -rf repo
597 597
598 598 Test full copytrace ability on draft branch
599 599 -------------------------------------------
600 600
601 601 File directory and base name changed in same move
602 602 $ hg init repo
603 603 $ initclient repo
604 604 $ mkdir repo/dir1
605 605 $ cd repo/dir1
606 606 $ echo a > a
607 607 $ hg add a
608 608 $ hg ci -qm initial
609 609 $ cd ..
610 610 $ hg mv -q dir1 dir2
611 611 $ hg mv dir2/a dir2/b
612 612 $ hg ci -qm 'mv a b; mv dir1 dir2'
613 613 $ hg up -q '.^'
614 614 $ cd dir1
615 615 $ echo b >> a
616 616 $ cd ..
617 617 $ hg ci -qm 'mod a'
618 618
619 619 $ hg pl
620 620 @ rev: 2, phase: draft
621 621 | desc: mod a
622 622 | o rev: 1, phase: draft
623 623 |/ desc: mv a b; mv dir1 dir2
624 624 o rev: 0, phase: draft
625 625 desc: initial
626 626
627 627 $ hg rebase -s . -d 1 --config experimental.copytrace.sourcecommitlimit=100
628 628 rebasing 2:6207d2d318e7 "mod a" (tip)
629 629 merging dir2/b and dir1/a to dir2/b
630 630 saved backup bundle to $TESTTMP/repo/repo/.hg/strip-backup/6207d2d318e7-1c9779ad-rebase.hg
631 631 $ cat dir2/b
632 632 a
633 633 b
634 634 $ cd ..
635 635 $ rm -rf repo
636 636
637 637 Move directory in one merge parent, while adding file to original directory
638 638 in other merge parent. File moved on rebase.
639 639
640 640 $ hg init repo
641 641 $ initclient repo
642 642 $ mkdir repo/dir1
643 643 $ cd repo/dir1
644 644 $ echo dummy > dummy
645 645 $ hg add dummy
646 646 $ cd ..
647 647 $ hg ci -qm initial
648 648 $ cd dir1
649 649 $ echo a > a
650 650 $ hg add a
651 651 $ cd ..
652 652 $ hg ci -qm 'hg add dir1/a'
653 653 $ hg up -q '.^'
654 654 $ hg mv -q dir1 dir2
655 655 $ hg ci -qm 'mv dir1 dir2'
656 656
657 657 $ hg pl
658 658 @ rev: 2, phase: draft
659 659 | desc: mv dir1 dir2
660 660 | o rev: 1, phase: draft
661 661 |/ desc: hg add dir1/a
662 662 o rev: 0, phase: draft
663 663 desc: initial
664 664
665 665 $ hg rebase -s . -d 1 --config experimental.copytrace.sourcecommitlimit=100
666 666 rebasing 2:e8919e7df8d0 "mv dir1 dir2" (tip)
667 667 saved backup bundle to $TESTTMP/repo/repo/.hg/strip-backup/e8919e7df8d0-f62fab62-rebase.hg
668 668 $ ls dir2
669 669 a
670 670 dummy
671 671 $ rm -rf repo
672 672
673 673 Testing the sourcecommitlimit config
674 674 -----------------------------------
675 675
676 676 $ hg init repo
677 677 $ initclient repo
678 678 $ cd repo
679 679 $ echo a > a
680 680 $ hg ci -Aqm "added a"
681 681 $ echo "more things" >> a
682 682 $ hg ci -qm "added more things to a"
683 683 $ hg up 0
684 684 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
685 685 $ echo b > b
686 686 $ hg ci -Aqm "added b"
687 687 $ mkdir foo
688 688 $ hg mv a foo/bar
689 689 $ hg ci -m "Moved a to foo/bar"
690 690 $ hg pl
691 691 @ rev: 3, phase: draft
692 692 | desc: Moved a to foo/bar
693 693 o rev: 2, phase: draft
694 694 | desc: added b
695 695 | o rev: 1, phase: draft
696 696 |/ desc: added more things to a
697 697 o rev: 0, phase: draft
698 698 desc: added a
699 699
700 700 When the sourcecommitlimit is small and we have more drafts, we use heuristics only
701 701
702 702 $ hg rebase -s 1 -d .
703 703 rebasing 1:8b6e13696c38 "added more things to a"
704 704 file 'a' was deleted in local [dest] but was modified in other [source].
705 What do you want to do?
706 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
705 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
706 What do you want to do? u
707 707 unresolved conflicts (see hg resolve, then hg rebase --continue)
708 708 [1]
709 709
710 710 But when we have "sourcecommitlimit > (no. of drafts from base to c1)", we do
711 711 fullcopytracing
712 712
713 713 $ hg rebase --abort
714 714 rebase aborted
715 715 $ hg rebase -s 1 -d . --config experimental.copytrace.sourcecommitlimit=100
716 716 rebasing 1:8b6e13696c38 "added more things to a"
717 717 merging foo/bar and a to foo/bar
718 718 saved backup bundle to $TESTTMP/repo/repo/repo/.hg/strip-backup/8b6e13696c38-fc14ac83-rebase.hg
719 719 $ cd ..
720 720 $ rm -rf repo
@@ -1,795 +1,795 b''
1 1 #require no-reposimplestore
2 2
3 3 This file focuses mainly on updating largefiles in the working
4 4 directory (and ".hg/largefiles/dirstate")
5 5
6 6 $ cat >> $HGRCPATH <<EOF
7 7 > [ui]
8 8 > merge = internal:merge
9 9 > [extensions]
10 10 > largefiles =
11 11 > [extdiff]
12 12 > # for portability:
13 13 > pdiff = sh "$RUNTESTDIR/pdiff"
14 14 > EOF
15 15
16 16 $ hg init repo
17 17 $ cd repo
18 18
19 19 $ echo large1 > large1
20 20 $ echo large2 > large2
21 21 $ hg add --large large1 large2
22 22 $ echo normal1 > normal1
23 23 $ hg add normal1
24 24 $ hg commit -m '#0'
25 25 $ echo 'large1 in #1' > large1
26 26 $ echo 'normal1 in #1' > normal1
27 27 $ hg commit -m '#1'
28 28 $ hg pdiff -r '.^' --config extensions.extdiff=
29 29 diff -Nru repo.0d9d9b8dc9a3/.hglf/large1 repo/.hglf/large1
30 30 --- repo.0d9d9b8dc9a3/.hglf/large1 * (glob)
31 31 +++ repo/.hglf/large1 * (glob)
32 32 @@ -1* +1* @@ (glob)
33 33 -4669e532d5b2c093a78eca010077e708a071bb64
34 34 +58e24f733a964da346e2407a2bee99d9001184f5
35 35 diff -Nru repo.0d9d9b8dc9a3/normal1 repo/normal1
36 36 --- repo.0d9d9b8dc9a3/normal1 * (glob)
37 37 +++ repo/normal1 * (glob)
38 38 @@ -1* +1* @@ (glob)
39 39 -normal1
40 40 +normal1 in #1
41 41 [1]
42 42 $ hg update -q -C 0
43 43 $ echo 'large2 in #2' > large2
44 44 $ hg commit -m '#2'
45 45 created new head
46 46
47 47 Test that update also updates the lfdirstate of 'unsure' largefiles after
48 48 hashing them:
49 49
50 50 The previous operations will usually have left us with largefiles with a mtime
51 51 within the same second as the dirstate was written.
52 52 The lfdirstate entries will thus have been written with an invalidated/unset
53 53 mtime to make sure further changes within the same second is detected.
54 54 We will however occasionally be "lucky" and get a tick between writing
55 55 largefiles and writing dirstate so we get valid lfdirstate timestamps. The
56 56 following verification is thus disabled but can be verified manually.
57 57
58 58 #if false
59 59 $ hg debugdirstate --large --nodate
60 60 n 644 7 unset large1
61 61 n 644 13 unset large2
62 62 #endif
63 63
64 64 Wait to make sure we get a tick so the mtime of the largefiles become valid.
65 65
66 66 $ sleep 1
67 67
68 68 A linear merge will update standins before performing the actual merge. It will
69 69 do a lfdirstate status walk and find 'unset'/'unsure' files, hash them, and
70 70 update the corresponding standins.
71 71 Verify that it actually marks the clean files as clean in lfdirstate so
72 72 we don't have to hash them again next time we update.
73 73
74 74 $ hg up
75 75 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
76 76 updated to "f74e50bd9e55: #2"
77 77 1 other heads for branch "default"
78 78 $ hg debugdirstate --large --nodate
79 79 n 644 7 set large1
80 80 n 644 13 set large2
81 81
82 82 Test that lfdirstate keeps track of last modification of largefiles and
83 83 prevents unnecessary hashing of content - also after linear/noop update
84 84
85 85 $ sleep 1
86 86 $ hg st
87 87 $ hg debugdirstate --large --nodate
88 88 n 644 7 set large1
89 89 n 644 13 set large2
90 90 $ hg up
91 91 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
92 92 updated to "f74e50bd9e55: #2"
93 93 1 other heads for branch "default"
94 94 $ hg debugdirstate --large --nodate
95 95 n 644 7 set large1
96 96 n 644 13 set large2
97 97
98 98 Test that "hg merge" updates largefiles from "other" correctly
99 99
100 100 (getting largefiles from "other" normally)
101 101
102 102 $ hg status -A large1
103 103 C large1
104 104 $ cat large1
105 105 large1
106 106 $ cat .hglf/large1
107 107 4669e532d5b2c093a78eca010077e708a071bb64
108 108 $ hg merge --config debug.dirstate.delaywrite=2
109 109 getting changed largefiles
110 110 1 largefiles updated, 0 removed
111 111 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
112 112 (branch merge, don't forget to commit)
113 113 $ hg status -A large1
114 114 M large1
115 115 $ cat large1
116 116 large1 in #1
117 117 $ cat .hglf/large1
118 118 58e24f733a964da346e2407a2bee99d9001184f5
119 119 $ hg diff -c 1 --nodates .hglf/large1 | grep '^[+-][0-9a-z]'
120 120 -4669e532d5b2c093a78eca010077e708a071bb64
121 121 +58e24f733a964da346e2407a2bee99d9001184f5
122 122
123 123 (getting largefiles from "other" via conflict prompt)
124 124
125 125 $ hg update -q -C 2
126 126 $ echo 'large1 in #3' > large1
127 127 $ echo 'normal1 in #3' > normal1
128 128 $ hg commit -m '#3'
129 129 $ cat .hglf/large1
130 130 e5bb990443d6a92aaf7223813720f7566c9dd05b
131 131 $ hg merge --config debug.dirstate.delaywrite=2 --config ui.interactive=True <<EOF
132 132 > o
133 133 > EOF
134 134 largefile large1 has a merge conflict
135 135 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
136 136 keep (l)ocal e5bb990443d6a92aaf7223813720f7566c9dd05b or
137 137 take (o)ther 58e24f733a964da346e2407a2bee99d9001184f5? o
138 138 merging normal1
139 139 warning: conflicts while merging normal1! (edit, then use 'hg resolve --mark')
140 140 getting changed largefiles
141 141 1 largefiles updated, 0 removed
142 142 0 files updated, 1 files merged, 0 files removed, 1 files unresolved
143 143 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
144 144 [1]
145 145 $ hg status -A large1
146 146 M large1
147 147 $ cat large1
148 148 large1 in #1
149 149 $ cat .hglf/large1
150 150 58e24f733a964da346e2407a2bee99d9001184f5
151 151 $ rm normal1.orig
152 152
153 153 (merge non-existing largefiles from "other" via conflict prompt -
154 154 make sure the following commit doesn't abort in a confusing way when trying to
155 155 mark the non-existing file as normal in lfdirstate)
156 156
157 157 $ mv .hg/largefiles/58e24f733a964da346e2407a2bee99d9001184f5 .
158 158 $ hg update -q -C 3
159 159 $ hg merge --config largefiles.usercache=not --config debug.dirstate.delaywrite=2 --tool :local --config ui.interactive=True <<EOF
160 160 > o
161 161 > EOF
162 162 largefile large1 has a merge conflict
163 163 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
164 164 keep (l)ocal e5bb990443d6a92aaf7223813720f7566c9dd05b or
165 165 take (o)ther 58e24f733a964da346e2407a2bee99d9001184f5? o
166 166 getting changed largefiles
167 167 large1: largefile 58e24f733a964da346e2407a2bee99d9001184f5 not available from file:/*/$TESTTMP/repo (glob)
168 168 0 largefiles updated, 0 removed
169 169 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
170 170 (branch merge, don't forget to commit)
171 171 $ hg commit -m '1-2-3 testing' --config largefiles.usercache=not
172 172 large1: largefile 58e24f733a964da346e2407a2bee99d9001184f5 not available from local store
173 173 $ hg up -C . --config largefiles.usercache=not
174 174 getting changed largefiles
175 175 large1: largefile 58e24f733a964da346e2407a2bee99d9001184f5 not available from file:/*/$TESTTMP/repo (glob)
176 176 0 largefiles updated, 0 removed
177 177 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
178 178 $ hg st large1
179 179 ! large1
180 180 $ hg rollback -q
181 181 $ mv 58e24f733a964da346e2407a2bee99d9001184f5 .hg/largefiles/
182 182
183 183 Test that "hg revert -r REV" updates largefiles from "REV" correctly
184 184
185 185 $ hg update -q -C 3
186 186 $ hg status -A large1
187 187 C large1
188 188 $ cat large1
189 189 large1 in #3
190 190 $ cat .hglf/large1
191 191 e5bb990443d6a92aaf7223813720f7566c9dd05b
192 192 $ hg diff -c 1 --nodates .hglf/large1 | grep '^[+-][0-9a-z]'
193 193 -4669e532d5b2c093a78eca010077e708a071bb64
194 194 +58e24f733a964da346e2407a2bee99d9001184f5
195 195 $ hg revert --no-backup -r 1 --config debug.dirstate.delaywrite=2 large1
196 196 $ hg status -A large1
197 197 M large1
198 198 $ cat large1
199 199 large1 in #1
200 200 $ cat .hglf/large1
201 201 58e24f733a964da346e2407a2bee99d9001184f5
202 202
203 203 Test that "hg rollback" restores status of largefiles correctly
204 204
205 205 $ hg update -C -q
206 206 $ hg remove large1
207 207 $ test -f .hglf/large1
208 208 [1]
209 209 $ hg forget large2
210 210 $ test -f .hglf/large2
211 211 [1]
212 212 $ echo largeX > largeX
213 213 $ hg add --large largeX
214 214 $ cat .hglf/largeX
215 215
216 216 $ hg commit -m 'will be rollback-ed soon'
217 217 $ echo largeY > largeY
218 218 $ hg add --large largeY
219 219
220 220 $ hg status -A large1
221 221 large1: $ENOENT$
222 222
223 223 $ hg status -A large2
224 224 ? large2
225 225 $ hg status -A largeX
226 226 C largeX
227 227 $ hg status -A largeY
228 228 A largeY
229 229 $ hg rollback
230 230 repository tip rolled back to revision 3 (undo commit)
231 231 working directory now based on revision 3
232 232 $ hg status -A large1
233 233 R large1
234 234 $ test -f .hglf/large1
235 235 [1]
236 236 $ hg status -A large2
237 237 R large2
238 238 $ test -f .hglf/large2
239 239 [1]
240 240 $ hg status -A largeX
241 241 A largeX
242 242 $ cat .hglf/largeX
243 243
244 244 $ hg status -A largeY
245 245 ? largeY
246 246 $ test -f .hglf/largeY
247 247 [1]
248 248 $ rm largeY
249 249
250 250 Test that "hg rollback" restores standins correctly
251 251
252 252 $ hg commit -m 'will be rollback-ed soon'
253 253 $ hg update -q -C 2
254 254 $ cat large1
255 255 large1
256 256 $ cat .hglf/large1
257 257 4669e532d5b2c093a78eca010077e708a071bb64
258 258 $ cat large2
259 259 large2 in #2
260 260 $ cat .hglf/large2
261 261 3cfce6277e7668985707b6887ce56f9f62f6ccd9
262 262
263 263 $ hg rollback -q -f
264 264 $ cat large1
265 265 large1
266 266 $ cat .hglf/large1
267 267 4669e532d5b2c093a78eca010077e708a071bb64
268 268 $ cat large2
269 269 large2 in #2
270 270 $ cat .hglf/large2
271 271 3cfce6277e7668985707b6887ce56f9f62f6ccd9
272 272
273 273 (rollback the parent of the working directory, when the parent of it
274 274 is not branch-tip)
275 275
276 276 $ hg update -q -C 1
277 277 $ cat .hglf/large1
278 278 58e24f733a964da346e2407a2bee99d9001184f5
279 279 $ cat .hglf/large2
280 280 1deebade43c8c498a3c8daddac0244dc55d1331d
281 281
282 282 $ echo normalX > normalX
283 283 $ hg add normalX
284 284 $ hg commit -m 'will be rollback-ed soon'
285 285 $ hg rollback -q
286 286
287 287 $ cat .hglf/large1
288 288 58e24f733a964da346e2407a2bee99d9001184f5
289 289 $ cat .hglf/large2
290 290 1deebade43c8c498a3c8daddac0244dc55d1331d
291 291 $ rm normalX
292 292
293 293 Test that "hg status" shows status of largefiles correctly just after
294 294 automated commit like rebase/transplant
295 295
296 296 $ cat >> .hg/hgrc <<EOF
297 297 > [extensions]
298 298 > rebase =
299 299 > strip =
300 300 > transplant =
301 301 > EOF
302 302 $ hg update -q -C 1
303 303 $ hg remove large1
304 304 $ echo largeX > largeX
305 305 $ hg add --large largeX
306 306 $ hg commit -m '#4'
307 307
308 308 $ hg rebase -s 1 -d 2 --keep
309 309 rebasing 1:72518492caa6 "#1"
310 310 rebasing 4:07d6153b5c04 "#4" (tip)
311 311
312 312 $ hg status -A large1
313 313 large1: $ENOENT$
314 314
315 315 $ hg status -A largeX
316 316 C largeX
317 317 $ hg strip -q 5
318 318
319 319 $ hg update -q -C 2
320 320 $ hg transplant -q 1 4
321 321
322 322 $ hg status -A large1
323 323 large1: $ENOENT$
324 324
325 325 $ hg status -A largeX
326 326 C largeX
327 327 $ hg strip -q 5
328 328
329 329 $ hg update -q -C 2
330 330 $ hg transplant -q --merge 1 --merge 4
331 331
332 332 $ hg status -A large1
333 333 large1: $ENOENT$
334 334
335 335 $ hg status -A largeX
336 336 C largeX
337 337 $ hg strip -q 5
338 338
339 339 Test that linear merge can detect modification (and conflict) correctly
340 340
341 341 (linear merge without conflict)
342 342
343 343 $ echo 'large2 for linear merge (no conflict)' > large2
344 344 $ hg update 3 --config debug.dirstate.delaywrite=2
345 345 getting changed largefiles
346 346 1 largefiles updated, 0 removed
347 347 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
348 348 $ hg status -A large2
349 349 M large2
350 350 $ cat large2
351 351 large2 for linear merge (no conflict)
352 352 $ cat .hglf/large2
353 353 9c4bf8f1b33536d6e5f89447e10620cfe52ea710
354 354
355 355 (linear merge with conflict, choosing "other")
356 356
357 357 $ hg update -q -C 2
358 358 $ echo 'large1 for linear merge (conflict)' > large1
359 359 $ hg update 3 --config ui.interactive=True <<EOF
360 360 > o
361 361 > EOF
362 362 largefile large1 has a merge conflict
363 363 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
364 364 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
365 365 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? o
366 366 getting changed largefiles
367 367 1 largefiles updated, 0 removed
368 368 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
369 369 $ hg status -A large1
370 370 C large1
371 371 $ cat large1
372 372 large1 in #3
373 373 $ cat .hglf/large1
374 374 e5bb990443d6a92aaf7223813720f7566c9dd05b
375 375
376 376 (linear merge with conflict, choosing "local")
377 377
378 378 $ hg update -q -C 2
379 379 $ echo 'large1 for linear merge (conflict)' > large1
380 380 $ hg update 3 --config debug.dirstate.delaywrite=2
381 381 largefile large1 has a merge conflict
382 382 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
383 383 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
384 384 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? l
385 385 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
386 386 $ hg status -A large1
387 387 M large1
388 388 $ cat large1
389 389 large1 for linear merge (conflict)
390 390 $ cat .hglf/large1
391 391 ba94c2efe5b7c5e0af8d189295ce00553b0612b7
392 392
393 393 Test a linear merge to a revision containing same-name normal file
394 394
395 395 $ hg update -q -C 3
396 396 $ hg remove large2
397 397 $ echo 'large2 as normal file' > large2
398 398 $ hg add large2
399 399 $ echo 'large3 as normal file' > large3
400 400 $ hg add large3
401 401 $ hg commit -m '#5'
402 402 $ hg manifest
403 403 .hglf/large1
404 404 large2
405 405 large3
406 406 normal1
407 407
408 408 (modified largefile is already switched to normal)
409 409
410 410 $ hg update -q -C 2
411 411 $ echo 'modified large2 for linear merge' > large2
412 412 $ hg update -q 5
413 413 remote turned local largefile large2 into a normal file
414 414 keep (l)argefile or use (n)ormal file? l
415 415 $ hg debugdirstate --no-dates | grep large2
416 416 a 0 -1 unset .hglf/large2
417 417 r 0 0 set large2
418 418 $ hg status -A large2
419 419 A large2
420 420 $ cat large2
421 421 modified large2 for linear merge
422 422
423 423 (added largefile is already committed as normal)
424 424
425 425 $ hg update -q -C 2
426 426 $ echo 'large3 as large file for linear merge' > large3
427 427 $ hg add --large large3
428 428 $ hg update -q 5
429 429 remote turned local largefile large3 into a normal file
430 430 keep (l)argefile or use (n)ormal file? l
431 431 $ hg debugdirstate --no-dates | grep large3
432 432 a 0 -1 unset .hglf/large3
433 433 r 0 0 set large3
434 434 $ hg status -A large3
435 435 A large3
436 436 $ cat large3
437 437 large3 as large file for linear merge
438 438 $ rm -f large3 .hglf/large3
439 439
440 440 Test that the internal linear merging works correctly
441 441 (both heads are stripped to keep pairing of revision number and commit log)
442 442
443 443 $ hg update -q -C 2
444 444 $ hg strip 3 4
445 445 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/9530e27857f7-2e7b195d-backup.hg
446 446 $ mv .hg/strip-backup/9530e27857f7-2e7b195d-backup.hg $TESTTMP
447 447
448 448 (internal linear merging at "hg pull --update")
449 449
450 450 $ echo 'large1 for linear merge (conflict)' > large1
451 451 $ echo 'large2 for linear merge (conflict with normal file)' > large2
452 452 $ hg pull --update --config debug.dirstate.delaywrite=2 $TESTTMP/9530e27857f7-2e7b195d-backup.hg
453 453 pulling from $TESTTMP/9530e27857f7-2e7b195d-backup.hg
454 454 searching for changes
455 455 adding changesets
456 456 adding manifests
457 457 adding file changes
458 458 added 3 changesets with 5 changes to 5 files
459 459 new changesets 9530e27857f7:d65e59e952a9 (3 drafts)
460 460 remote turned local largefile large2 into a normal file
461 461 keep (l)argefile or use (n)ormal file? l
462 462 largefile large1 has a merge conflict
463 463 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
464 464 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
465 465 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? l
466 466 2 files updated, 1 files merged, 0 files removed, 0 files unresolved
467 467 updated to "d65e59e952a9: #5"
468 468 1 other heads for branch "default"
469 469
470 470 $ hg status -A large1
471 471 M large1
472 472 $ cat large1
473 473 large1 for linear merge (conflict)
474 474 $ cat .hglf/large1
475 475 ba94c2efe5b7c5e0af8d189295ce00553b0612b7
476 476 $ hg status -A large2
477 477 A large2
478 478 $ cat large2
479 479 large2 for linear merge (conflict with normal file)
480 480 $ cat .hglf/large2
481 481 d7591fe9be0f6227d90bddf3e4f52ff41fc1f544
482 482
483 483 (internal linear merging at "hg unbundle --update")
484 484
485 485 $ hg update -q -C 2
486 486 $ hg rollback -q
487 487
488 488 $ echo 'large1 for linear merge (conflict)' > large1
489 489 $ echo 'large2 for linear merge (conflict with normal file)' > large2
490 490 $ hg unbundle --update --config debug.dirstate.delaywrite=2 $TESTTMP/9530e27857f7-2e7b195d-backup.hg
491 491 adding changesets
492 492 adding manifests
493 493 adding file changes
494 494 added 3 changesets with 5 changes to 5 files
495 495 new changesets 9530e27857f7:d65e59e952a9 (3 drafts)
496 496 remote turned local largefile large2 into a normal file
497 497 keep (l)argefile or use (n)ormal file? l
498 498 largefile large1 has a merge conflict
499 499 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
500 500 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
501 501 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? l
502 502 2 files updated, 1 files merged, 0 files removed, 0 files unresolved
503 503 updated to "d65e59e952a9: #5"
504 504 1 other heads for branch "default"
505 505
506 506 $ hg status -A large1
507 507 M large1
508 508 $ cat large1
509 509 large1 for linear merge (conflict)
510 510 $ cat .hglf/large1
511 511 ba94c2efe5b7c5e0af8d189295ce00553b0612b7
512 512 $ hg status -A large2
513 513 A large2
514 514 $ cat large2
515 515 large2 for linear merge (conflict with normal file)
516 516 $ cat .hglf/large2
517 517 d7591fe9be0f6227d90bddf3e4f52ff41fc1f544
518 518
519 519 (internal linear merging in subrepo at "hg update")
520 520
521 521 $ cd ..
522 522 $ hg init subparent
523 523 $ cd subparent
524 524
525 525 $ hg clone -q -u 2 ../repo sub
526 526 $ cat > .hgsub <<EOF
527 527 > sub = sub
528 528 > EOF
529 529 $ hg add .hgsub
530 530 $ hg commit -m '#0@parent'
531 531 $ cat .hgsubstate
532 532 f74e50bd9e5594b7cf1e6c5cbab86ddd25f3ca2f sub
533 533 $ hg -R sub update -q
534 534 $ hg commit -m '#1@parent'
535 535 $ cat .hgsubstate
536 536 d65e59e952a9638e2ce863b41a420ca723dd3e8d sub
537 537 $ hg update -q 0
538 538
539 539 $ echo 'large1 for linear merge (conflict)' > sub/large1
540 540 $ echo 'large2 for linear merge (conflict with normal file)' > sub/large2
541 541 $ hg update --config ui.interactive=True --config debug.dirstate.delaywrite=2 <<EOF
542 542 > m
543 543 > r
544 544 > l
545 545 > l
546 546 > EOF
547 547 subrepository sub diverged (local revision: f74e50bd9e55, remote revision: d65e59e952a9)
548 548 (M)erge, keep (l)ocal [working copy] or keep (r)emote [destination]? m
549 549 subrepository sources for sub differ (in checked out version)
550 550 use (l)ocal source (f74e50bd9e55) or (r)emote source (d65e59e952a9)? r
551 551 remote turned local largefile large2 into a normal file
552 552 keep (l)argefile or use (n)ormal file? l
553 553 largefile large1 has a merge conflict
554 554 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
555 555 keep (l)ocal ba94c2efe5b7c5e0af8d189295ce00553b0612b7 or
556 556 take (o)ther e5bb990443d6a92aaf7223813720f7566c9dd05b? l
557 557 2 files updated, 1 files merged, 0 files removed, 0 files unresolved
558 558 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
559 559
560 560 $ hg -R sub status -A sub/large1
561 561 M sub/large1
562 562 $ cat sub/large1
563 563 large1 for linear merge (conflict)
564 564 $ cat sub/.hglf/large1
565 565 ba94c2efe5b7c5e0af8d189295ce00553b0612b7
566 566 $ hg -R sub status -A sub/large2
567 567 A sub/large2
568 568 $ cat sub/large2
569 569 large2 for linear merge (conflict with normal file)
570 570 $ cat sub/.hglf/large2
571 571 d7591fe9be0f6227d90bddf3e4f52ff41fc1f544
572 572
573 573 $ cd ..
574 574 $ cd repo
575 575
576 576 Test that rebase updates largefiles in the working directory even if
577 577 it is aborted by conflict.
578 578
579 579 $ hg update -q -C 3
580 580 $ cat .hglf/large1
581 581 e5bb990443d6a92aaf7223813720f7566c9dd05b
582 582 $ cat large1
583 583 large1 in #3
584 584 $ hg rebase -s 1 -d 3 --keep --config ui.interactive=True <<EOF
585 585 > o
586 586 > EOF
587 587 rebasing 1:72518492caa6 "#1"
588 588 largefile large1 has a merge conflict
589 589 ancestor was 4669e532d5b2c093a78eca010077e708a071bb64
590 590 keep (l)ocal e5bb990443d6a92aaf7223813720f7566c9dd05b or
591 591 take (o)ther 58e24f733a964da346e2407a2bee99d9001184f5? o
592 592 merging normal1
593 593 warning: conflicts while merging normal1! (edit, then use 'hg resolve --mark')
594 594 unresolved conflicts (see hg resolve, then hg rebase --continue)
595 595 [1]
596 596 $ cat .hglf/large1
597 597 58e24f733a964da346e2407a2bee99d9001184f5
598 598 $ cat large1
599 599 large1 in #1
600 600 $ rm normal1.orig
601 601
602 602 Test that rebase updates standins for manually modified largefiles at
603 603 the 1st commit of resuming.
604 604
605 605 $ echo "manually modified before 'hg rebase --continue'" > large1
606 606 $ hg resolve -m normal1
607 607 (no more unresolved files)
608 608 continue: hg rebase --continue
609 609 $ hg rebase --continue --config ui.interactive=True <<EOF
610 610 > c
611 611 > EOF
612 612 rebasing 1:72518492caa6 "#1"
613 613 rebasing 4:07d6153b5c04 "#4"
614 614 file '.hglf/large1' was deleted in other [source] but was modified in local [dest].
615 What do you want to do?
616 use (c)hanged version, (d)elete, or leave (u)nresolved? c
615 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
616 What do you want to do? c
617 617
618 618 $ hg diff -c "tip~1" --nodates .hglf/large1 | grep '^[+-][0-9a-z]'
619 619 -e5bb990443d6a92aaf7223813720f7566c9dd05b
620 620 +8a4f783556e7dea21139ca0466eafce954c75c13
621 621 $ rm -f large1
622 622 $ hg update -q -C tip
623 623 $ cat large1
624 624 manually modified before 'hg rebase --continue'
625 625
626 626 Test that transplant updates largefiles, of which standins are safely
627 627 changed, even if it is aborted by conflict of other.
628 628
629 629 $ hg update -q -C 5
630 630 $ cat .hglf/large1
631 631 e5bb990443d6a92aaf7223813720f7566c9dd05b
632 632 $ cat large1
633 633 large1 in #3
634 634 $ hg diff -c 4 .hglf/largeX | grep '^[+-][0-9a-z]'
635 635 +fa44618ea25181aff4f48b70428294790cec9f61
636 636 $ hg transplant 4
637 637 applying 07d6153b5c04
638 638 patching file .hglf/large1
639 639 Hunk #1 FAILED at 0
640 640 1 out of 1 hunks FAILED -- saving rejects to file .hglf/large1.rej
641 641 patch failed to apply
642 642 abort: fix up the working directory and run hg transplant --continue
643 643 [255]
644 644 $ hg status -A large1
645 645 C large1
646 646 $ cat .hglf/large1
647 647 e5bb990443d6a92aaf7223813720f7566c9dd05b
648 648 $ cat large1
649 649 large1 in #3
650 650 $ hg status -A largeX
651 651 A largeX
652 652 $ cat .hglf/largeX
653 653 fa44618ea25181aff4f48b70428294790cec9f61
654 654 $ cat largeX
655 655 largeX
656 656
657 657 Test that transplant updates standins for manually modified largefiles
658 658 at the 1st commit of resuming.
659 659
660 660 $ echo "manually modified before 'hg transplant --continue'" > large1
661 661 $ hg transplant --continue
662 662 07d6153b5c04 transplanted as f1bf30eb88cc
663 663 $ hg diff -c tip .hglf/large1 | grep '^[+-][0-9a-z]'
664 664 -e5bb990443d6a92aaf7223813720f7566c9dd05b
665 665 +6a4f36d4075fbe0f30ec1d26ca44e63c05903671
666 666 $ rm -f large1
667 667 $ hg update -q -C tip
668 668 $ cat large1
669 669 manually modified before 'hg transplant --continue'
670 670
671 671 Test that "hg status" doesn't show removal of largefiles not managed
672 672 in the target context.
673 673
674 674 $ hg update -q -C 4
675 675 $ hg remove largeX
676 676 $ hg status -A largeX
677 677 R largeX
678 678 $ hg status -A --rev '.^1' largeX
679 679
680 680 #if execbit
681 681
682 682 Test that "hg status" against revisions other than parent notices exec
683 683 bit changes of largefiles.
684 684
685 685 $ hg update -q -C 4
686 686
687 687 (the case that large2 doesn't have exec bit in the target context but
688 688 in the working context)
689 689
690 690 $ chmod +x large2
691 691 $ hg status -A --rev 0 large2
692 692 M large2
693 693 $ hg commit -m 'chmod +x large2'
694 694
695 695 (the case that large2 has exec bit in the target context but not in
696 696 the working context)
697 697
698 698 $ echo dummy > dummy
699 699 $ hg add dummy
700 700 $ hg commit -m 'revision for separation'
701 701 $ chmod -x large2
702 702 $ hg status -A --rev '.^1' large2
703 703 M large2
704 704
705 705 #else
706 706
707 707 Test that "hg status" against revisions other than parent ignores exec
708 708 bit correctly on the platform being unaware of it.
709 709
710 710 $ hg update -q -C 4
711 711
712 712 $ cat > ../exec-bit.patch <<EOF
713 713 > # HG changeset patch
714 714 > # User test
715 715 > # Date 0 0
716 716 > # Thu Jan 01 00:00:00 1970 +0000
717 717 > # Node ID be1b433a65b12b27b5519d92213e14f7e1769b90
718 718 > # Parent 07d6153b5c04313efb75deec9ba577de7faeb727
719 719 > chmod +x large2
720 720 >
721 721 > diff --git a/.hglf/large2 b/.hglf/large2
722 722 > old mode 100644
723 723 > new mode 100755
724 724 > EOF
725 725 $ hg import --exact --bypass ../exec-bit.patch
726 726 applying ../exec-bit.patch
727 727 $ hg status -A --rev tip large2
728 728 C large2
729 729
730 730 #endif
731 731
732 732 The fileset revset is evaluated for each revision, instead of once on wdir(),
733 733 and then patterns matched on each revision. Here, no exec bits are set in
734 734 wdir(), but a matching revision is detected.
735 735
736 736 (Teach large2 is not an executable. Maybe this is a bug of largefiles.)
737 737 #if execbit
738 738 $ chmod -x .hglf/large2
739 739 #endif
740 740
741 741 $ hg files 'set:exec()'
742 742 [1]
743 743 $ hg log -qr 'file("set:exec()")'
744 744 9:be1b433a65b1
745 745
746 746 Test a fatal error interrupting an update. Verify that status report dirty
747 747 files correctly after an interrupted update. Also verify that checking all
748 748 hashes reveals it isn't clean.
749 749
750 750 Start with clean dirstates:
751 751 $ hg up --quiet --clean --rev "8^"
752 752 $ sleep 1
753 753 $ hg st
754 754 Update standins without updating largefiles - large1 is modified and largeX is
755 755 added:
756 756 $ cat << EOF > ../crashupdatelfiles.py
757 757 > import hgext.largefiles.lfutil
758 758 > def getlfilestoupdate(oldstandins, newstandins):
759 759 > raise SystemExit(7)
760 760 > hgext.largefiles.lfutil.getlfilestoupdate = getlfilestoupdate
761 761 > EOF
762 762 $ hg up -Cr "8" --config extensions.crashupdatelfiles=../crashupdatelfiles.py
763 763 [7]
764 764 Check large1 content and status ... and that update will undo modifications:
765 765 $ cat large1
766 766 large1 in #3
767 767 $ hg st
768 768 M large1
769 769 ! largeX
770 770 $ hg up -Cr .
771 771 getting changed largefiles
772 772 2 largefiles updated, 0 removed
773 773 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
774 774 $ cat large1
775 775 manually modified before 'hg transplant --continue'
776 776 $ hg st
777 777 Force largefiles rehashing and check that all changes have been caught by
778 778 status and update:
779 779 $ rm .hg/largefiles/dirstate
780 780 $ hg st
781 781
782 782 $ cd ..
783 783
784 784 Test that "hg convert" avoids copying largefiles from the working
785 785 directory into store, because "hg convert" doesn't update largefiles
786 786 in the working directory (removing files under ".cache/largefiles"
787 787 forces "hg convert" to copy corresponding largefiles)
788 788
789 789 $ cat >> $HGRCPATH <<EOF
790 790 > [extensions]
791 791 > convert =
792 792 > EOF
793 793
794 794 $ rm $TESTTMP/.cache/largefiles/6a4f36d4075fbe0f30ec1d26ca44e63c05903671
795 795 $ hg convert -q repo repo.converted
@@ -1,405 +1,407 b''
1 1 $ USERCACHE="$TESTTMP/cache"; export USERCACHE
2 2 $ mkdir "${USERCACHE}"
3 3 $ cat >> $HGRCPATH <<EOF
4 4 > [extensions]
5 5 > largefiles =
6 6 > share =
7 7 > strip =
8 8 > convert =
9 9 > [largefiles]
10 10 > minsize = 0.5
11 11 > patterns = **.other
12 12 > **.dat
13 13 > usercache=${USERCACHE}
14 14 > EOF
15 15
16 16 "lfconvert" works
17 17 $ hg init bigfile-repo
18 18 $ cd bigfile-repo
19 19 $ cat >> .hg/hgrc <<EOF
20 20 > [extensions]
21 21 > largefiles = !
22 22 > EOF
23 23 $ mkdir sub
24 24 $ dd if=/dev/zero bs=1k count=256 > large 2> /dev/null
25 25 $ dd if=/dev/zero bs=1k count=256 > large2 2> /dev/null
26 26 $ echo normal > normal1
27 27 $ echo alsonormal > sub/normal2
28 28 $ dd if=/dev/zero bs=1k count=10 > sub/maybelarge.dat 2> /dev/null
29 29 $ hg addremove
30 30 adding large
31 31 adding large2
32 32 adding normal1
33 33 adding sub/maybelarge.dat
34 34 adding sub/normal2
35 35 $ hg commit -m"add large, normal1" large normal1
36 36 $ hg commit -m"add sub/*" sub
37 37
38 38 Test tag parsing
39 39 $ cat >> .hgtags <<EOF
40 40 > IncorrectlyFormattedTag!
41 41 > invalidhash sometag
42 42 > 0123456789abcdef anothertag
43 43 > EOF
44 44 $ hg add .hgtags
45 45 $ hg commit -m"add large2" large2 .hgtags
46 46
47 47 Test link+rename largefile codepath
48 48 $ [ -d .hg/largefiles ] && echo fail || echo pass
49 49 pass
50 50 $ cd ..
51 51 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
52 52 initializing destination largefiles-repo
53 53 skipping incorrectly formatted tag IncorrectlyFormattedTag!
54 54 skipping incorrectly formatted id invalidhash
55 55 no mapping for id 0123456789abcdef
56 56 #if symlink
57 57 $ hg --cwd bigfile-repo rename large2 large3
58 58 $ ln -sf large bigfile-repo/large3
59 59 $ hg --cwd bigfile-repo commit -m"make large2 a symlink" large2 large3
60 60 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo-symlink
61 61 initializing destination largefiles-repo-symlink
62 62 skipping incorrectly formatted tag IncorrectlyFormattedTag!
63 63 skipping incorrectly formatted id invalidhash
64 64 no mapping for id 0123456789abcdef
65 65 abort: renamed/copied largefile large3 becomes symlink
66 66 [255]
67 67 #endif
68 68 $ cd bigfile-repo
69 69 $ hg strip --no-backup 2
70 70 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
71 71 $ cd ..
72 72 $ rm -rf largefiles-repo largefiles-repo-symlink
73 73
74 74 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
75 75 initializing destination largefiles-repo
76 76
77 77 "lfconvert" converts content correctly
78 78 $ cd largefiles-repo
79 79 $ hg up
80 80 getting changed largefiles
81 81 2 largefiles updated, 0 removed
82 82 4 files updated, 0 files merged, 0 files removed, 0 files unresolved
83 83 $ hg locate
84 84 .hglf/large
85 85 .hglf/sub/maybelarge.dat
86 86 normal1
87 87 sub/normal2
88 88 $ cat normal1
89 89 normal
90 90 $ cat sub/normal2
91 91 alsonormal
92 92 $ md5sum.py large sub/maybelarge.dat
93 93 ec87a838931d4d5d2e94a04644788a55 large
94 94 1276481102f218c981e0324180bafd9f sub/maybelarge.dat
95 95
96 96 "lfconvert" adds 'largefiles' to .hg/requires.
97 97 $ cat .hg/requires
98 98 dotencode
99 99 fncache
100 100 generaldelta
101 101 largefiles
102 102 revlogv1
103 103 sparserevlog
104 104 store
105 105 testonly-simplestore (reposimplestore !)
106 106
107 107 "lfconvert" includes a newline at the end of the standin files.
108 108 $ cat .hglf/large .hglf/sub/maybelarge.dat
109 109 2e000fa7e85759c7f4c254d4d9c33ef481e459a7
110 110 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
111 111 $ cd ..
112 112
113 113 add some changesets to rename/remove/merge
114 114 $ cd bigfile-repo
115 115 $ hg mv -q sub stuff
116 116 $ hg commit -m"rename sub/ to stuff/"
117 117 $ hg update -q 1
118 118 $ echo blah >> normal3
119 119 $ echo blah >> sub/normal2
120 120 $ echo blah >> sub/maybelarge.dat
121 121 $ md5sum.py sub/maybelarge.dat
122 122 1dd0b99ff80e19cff409702a1d3f5e15 sub/maybelarge.dat
123 123 $ hg commit -A -m"add normal3, modify sub/*"
124 124 adding normal3
125 125 created new head
126 126 $ hg rm large normal3
127 127 $ hg commit -q -m"remove large, normal3"
128 128 $ hg merge
129 129 tool internal:merge (for pattern stuff/maybelarge.dat) can't handle binary
130 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 134 merging sub/normal2 and stuff/normal2 to stuff/normal2
133 135 0 files updated, 1 files merged, 0 files removed, 1 files unresolved
134 136 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
135 137 [1]
136 138 $ hg cat -r . sub/maybelarge.dat > stuff/maybelarge.dat
137 139 $ hg resolve -m stuff/maybelarge.dat
138 140 (no more unresolved files)
139 141 $ hg commit -m"merge"
140 142 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
141 143 @ 5:4884f215abda merge
142 144 |\
143 145 | o 4:7285f817b77e remove large, normal3
144 146 | |
145 147 | o 3:67e3892e3534 add normal3, modify sub/*
146 148 | |
147 149 o | 2:c96c8beb5d56 rename sub/ to stuff/
148 150 |/
149 151 o 1:020c65d24e11 add sub/*
150 152 |
151 153 o 0:117b8328f97a add large, normal1
152 154
153 155 $ cd ..
154 156
155 157 lfconvert with rename, merge, and remove
156 158 $ rm -rf largefiles-repo
157 159 $ hg lfconvert --size 0.2 bigfile-repo largefiles-repo
158 160 initializing destination largefiles-repo
159 161 $ cd largefiles-repo
160 162 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
161 163 o 5:8e05f5f2b77e merge
162 164 |\
163 165 | o 4:a5a02de7a8e4 remove large, normal3
164 166 | |
165 167 | o 3:55759520c76f add normal3, modify sub/*
166 168 | |
167 169 o | 2:261ad3f3f037 rename sub/ to stuff/
168 170 |/
169 171 o 1:334e5237836d add sub/*
170 172 |
171 173 o 0:d4892ec57ce2 add large, normal1
172 174
173 175 $ hg locate -r 2
174 176 .hglf/large
175 177 .hglf/stuff/maybelarge.dat
176 178 normal1
177 179 stuff/normal2
178 180 $ hg locate -r 3
179 181 .hglf/large
180 182 .hglf/sub/maybelarge.dat
181 183 normal1
182 184 normal3
183 185 sub/normal2
184 186 $ hg locate -r 4
185 187 .hglf/sub/maybelarge.dat
186 188 normal1
187 189 sub/normal2
188 190 $ hg locate -r 5
189 191 .hglf/stuff/maybelarge.dat
190 192 normal1
191 193 stuff/normal2
192 194 $ hg update
193 195 getting changed largefiles
194 196 1 largefiles updated, 0 removed
195 197 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
196 198 $ cat stuff/normal2
197 199 alsonormal
198 200 blah
199 201 $ md5sum.py stuff/maybelarge.dat
200 202 1dd0b99ff80e19cff409702a1d3f5e15 stuff/maybelarge.dat
201 203 $ cat .hglf/stuff/maybelarge.dat
202 204 76236b6a2c6102826c61af4297dd738fb3b1de38
203 205 $ cd ..
204 206
205 207 "lfconvert" error cases
206 208 $ hg lfconvert http://localhost/foo foo
207 209 abort: http://localhost/foo is not a local Mercurial repo
208 210 [255]
209 211 $ hg lfconvert foo ssh://localhost/foo
210 212 abort: ssh://localhost/foo is not a local Mercurial repo
211 213 [255]
212 214 $ hg lfconvert nosuchrepo foo
213 215 abort: repository nosuchrepo not found!
214 216 [255]
215 217 $ hg share -q -U bigfile-repo shared
216 218 $ printf 'bogus' > shared/.hg/sharedpath
217 219 $ hg lfconvert shared foo
218 220 abort: .hg/sharedpath points to nonexistent directory $TESTTMP/bogus!
219 221 [255]
220 222 $ hg lfconvert bigfile-repo largefiles-repo
221 223 initializing destination largefiles-repo
222 224 abort: repository largefiles-repo already exists!
223 225 [255]
224 226
225 227 add another largefile to the new largefiles repo
226 228 $ cd largefiles-repo
227 229 $ dd if=/dev/zero bs=1k count=1k > anotherlarge 2> /dev/null
228 230 $ hg add --lfsize=1 anotherlarge
229 231 $ hg commit -m "add anotherlarge (should be a largefile)"
230 232 $ cat .hglf/anotherlarge
231 233 3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3
232 234 $ hg tag mytag
233 235 $ cd ..
234 236
235 237 round-trip: converting back to a normal (non-largefiles) repo with
236 238 "lfconvert --to-normal" should give the same as ../bigfile-repo. The
237 239 convert extension is disabled to show config items can be loaded without it.
238 240 $ cd largefiles-repo
239 241 $ hg --config extensions.convert=! lfconvert --to-normal . ../normal-repo
240 242 initializing destination ../normal-repo
241 243 0 additional largefiles cached
242 244 scanning source...
243 245 sorting...
244 246 converting...
245 247 7 add large, normal1
246 248 6 add sub/*
247 249 5 rename sub/ to stuff/
248 250 4 add normal3, modify sub/*
249 251 3 remove large, normal3
250 252 2 merge
251 253 1 add anotherlarge (should be a largefile)
252 254 0 Added tag mytag for changeset abacddda7028
253 255 $ cd ../normal-repo
254 256 $ cat >> .hg/hgrc <<EOF
255 257 > [extensions]
256 258 > largefiles = !
257 259 > EOF
258 260
259 261 $ hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
260 262 o 7:b5fedc110b9d Added tag mytag for changeset 867ab992ecf4
261 263 |
262 264 o 6:867ab992ecf4 add anotherlarge (should be a largefile)
263 265 |
264 266 o 5:4884f215abda merge
265 267 |\
266 268 | o 4:7285f817b77e remove large, normal3
267 269 | |
268 270 | o 3:67e3892e3534 add normal3, modify sub/*
269 271 | |
270 272 o | 2:c96c8beb5d56 rename sub/ to stuff/
271 273 |/
272 274 o 1:020c65d24e11 add sub/*
273 275 |
274 276 o 0:117b8328f97a add large, normal1
275 277
276 278 $ hg update
277 279 5 files updated, 0 files merged, 0 files removed, 0 files unresolved
278 280 $ hg locate
279 281 .hgtags
280 282 anotherlarge
281 283 normal1
282 284 stuff/maybelarge.dat
283 285 stuff/normal2
284 286 $ [ -d .hg/largefiles ] && echo fail || echo pass
285 287 pass
286 288
287 289 $ cd ..
288 290
289 291 Clearing the usercache ensures that commitctx doesn't try to cache largefiles
290 292 from the working dir on a convert.
291 293 $ rm "${USERCACHE}"/*
292 294 $ hg convert largefiles-repo
293 295 assuming destination largefiles-repo-hg
294 296 initializing destination largefiles-repo-hg repository
295 297 scanning source...
296 298 sorting...
297 299 converting...
298 300 7 add large, normal1
299 301 6 add sub/*
300 302 5 rename sub/ to stuff/
301 303 4 add normal3, modify sub/*
302 304 3 remove large, normal3
303 305 2 merge
304 306 1 add anotherlarge (should be a largefile)
305 307 0 Added tag mytag for changeset abacddda7028
306 308
307 309 $ hg -R largefiles-repo-hg log -G --template "{rev}:{node|short} {desc|firstline}\n"
308 310 o 7:2f08f66459b7 Added tag mytag for changeset 17126745edfd
309 311 |
310 312 o 6:17126745edfd add anotherlarge (should be a largefile)
311 313 |
312 314 o 5:9cc5aa7204f0 merge
313 315 |\
314 316 | o 4:a5a02de7a8e4 remove large, normal3
315 317 | |
316 318 | o 3:55759520c76f add normal3, modify sub/*
317 319 | |
318 320 o | 2:261ad3f3f037 rename sub/ to stuff/
319 321 |/
320 322 o 1:334e5237836d add sub/*
321 323 |
322 324 o 0:d4892ec57ce2 add large, normal1
323 325
324 326 Verify will fail (for now) if the usercache is purged before converting, since
325 327 largefiles are not cached in the converted repo's local store by the conversion
326 328 process.
327 329 $ cd largefiles-repo-hg
328 330 $ cat >> .hg/hgrc <<EOF
329 331 > [experimental]
330 332 > evolution.createmarkers=True
331 333 > EOF
332 334 $ hg debugobsolete `hg log -r tip -T "{node}"`
333 335 obsoleted 1 changesets
334 336 $ cd ..
335 337
336 338 $ hg -R largefiles-repo-hg verify --large --lfa
337 339 checking changesets
338 340 checking manifests
339 341 crosschecking files in changesets and manifests
340 342 checking files
341 343 checked 8 changesets with 13 changes to 9 files
342 344 searching 7 changesets for largefiles
343 345 changeset 0:d4892ec57ce2: large references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/2e000fa7e85759c7f4c254d4d9c33ef481e459a7
344 346 changeset 1:334e5237836d: sub/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
345 347 changeset 2:261ad3f3f037: stuff/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c
346 348 changeset 3:55759520c76f: sub/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/76236b6a2c6102826c61af4297dd738fb3b1de38
347 349 changeset 5:9cc5aa7204f0: stuff/maybelarge.dat references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/76236b6a2c6102826c61af4297dd738fb3b1de38
348 350 changeset 6:17126745edfd: anotherlarge references missing $TESTTMP/largefiles-repo-hg/.hg/largefiles/3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3
349 351 verified existence of 6 revisions of 4 largefiles
350 352 [1]
351 353 $ hg -R largefiles-repo-hg showconfig paths
352 354 [1]
353 355
354 356
355 357 Avoid a traceback if a largefile isn't available (issue3519)
356 358
357 359 Ensure the largefile can be cached in the source if necessary
358 360 $ hg clone -U largefiles-repo issue3519
359 361 $ rm -f "${USERCACHE}"/*
360 362 $ hg -R issue3519 branch -q mybranch
361 363 $ hg -R issue3519 ci -m 'change branch name only'
362 364 $ hg lfconvert --to-normal issue3519 normalized3519
363 365 initializing destination normalized3519
364 366 4 additional largefiles cached
365 367 scanning source...
366 368 sorting...
367 369 converting...
368 370 8 add large, normal1
369 371 7 add sub/*
370 372 6 rename sub/ to stuff/
371 373 5 add normal3, modify sub/*
372 374 4 remove large, normal3
373 375 3 merge
374 376 2 add anotherlarge (should be a largefile)
375 377 1 Added tag mytag for changeset abacddda7028
376 378 0 change branch name only
377 379
378 380 Ensure empty commits aren't lost in the conversion
379 381 $ hg -R normalized3519 log -r tip -T '{desc}\n'
380 382 change branch name only
381 383
382 384 Ensure the abort message is useful if a largefile is entirely unavailable
383 385 $ rm -rf normalized3519
384 386 $ rm "${USERCACHE}"/*
385 387 $ rm issue3519/.hg/largefiles/*
386 388 $ rm largefiles-repo/.hg/largefiles/*
387 389 $ hg lfconvert --to-normal issue3519 normalized3519
388 390 initializing destination normalized3519
389 391 anotherlarge: largefile 3b71f43ff30f4b15b5cd85dd9e95ebc7e84eb5a3 not available from file:/*/$TESTTMP/largefiles-repo (glob)
390 392 stuff/maybelarge.dat: largefile 76236b6a2c6102826c61af4297dd738fb3b1de38 not available from file:/*/$TESTTMP/largefiles-repo (glob)
391 393 stuff/maybelarge.dat: largefile 76236b6a2c6102826c61af4297dd738fb3b1de38 not available from file:/*/$TESTTMP/largefiles-repo (glob)
392 394 sub/maybelarge.dat: largefile 76236b6a2c6102826c61af4297dd738fb3b1de38 not available from file:/*/$TESTTMP/largefiles-repo (glob)
393 395 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
394 396 sub/maybelarge.dat: largefile 76236b6a2c6102826c61af4297dd738fb3b1de38 not available from file:/*/$TESTTMP/largefiles-repo (glob)
395 397 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
396 398 stuff/maybelarge.dat: largefile 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c not available from file:/*/$TESTTMP/largefiles-repo (glob)
397 399 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
398 400 sub/maybelarge.dat: largefile 34e163be8e43c5631d8b92e9c43ab0bf0fa62b9c not available from file:/*/$TESTTMP/largefiles-repo (glob)
399 401 large: largefile 2e000fa7e85759c7f4c254d4d9c33ef481e459a7 not available from file:/*/$TESTTMP/largefiles-repo (glob)
400 402 0 additional largefiles cached
401 403 11 largefiles failed to download
402 404 abort: all largefiles must be present locally
403 405 [255]
404 406
405 407
@@ -1,1130 +1,1140 b''
1 1 Tests for change/delete conflicts, including:
2 2 b5605d88dc27: Make ui.prompt repeat on "unrecognized response" again
3 3 (issue897)
4 4
5 5 840e2b315c1f: Fix misleading error and prompts during update/merge
6 6 (issue556)
7 7
8 8 Make sure HGMERGE doesn't interfere with the test
9 9 $ unset HGMERGE
10 10
11 11 $ status() {
12 12 > echo "--- status ---"
13 13 > hg st -A file1 file2 file3
14 14 > echo "--- resolve --list ---"
15 15 > hg resolve --list file1 file2 file3
16 16 > echo "--- debugmergestate ---"
17 17 > hg debugmergestate
18 18 > for file in file1 file2 file3; do
19 19 > if [ -f $file ]; then
20 20 > echo "--- $file ---"
21 21 > cat $file
22 22 > else
23 23 > echo "*** $file does not exist"
24 24 > fi
25 25 > done
26 26 > }
27 27
28 28 $ hg init repo
29 29 $ cd repo
30 30
31 31 $ echo 1 > file1
32 32 $ echo 2 > file2
33 33 $ echo 3 > file3
34 34 $ hg ci -Am 'added files'
35 35 adding file1
36 36 adding file2
37 37 adding file3
38 38
39 39 $ hg rm file1
40 40 $ echo changed >> file2
41 41 $ echo changed1 >> file3
42 42 $ hg ci -m 'removed file1, changed file2, changed file3'
43 43
44 44 $ hg co 0
45 45 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
46 46
47 47 $ echo changed >> file1
48 48 $ hg rm file2
49 49 $ echo changed2 >> file3
50 50 $ hg ci -m 'changed file1, removed file2, changed file3'
51 51 created new head
52 52
53 53
54 54 Non-interactive merge:
55 55
56 56 $ hg merge -y
57 57 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
58 What do you want to do?
59 use (c)hanged version, (d)elete, or leave (u)nresolved? u
58 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
59 What do you want to do? u
60 60 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
61 What do you want to do?
62 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
61 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
62 What do you want to do? u
63 63 merging file3
64 64 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
65 65 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
66 66 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
67 67 [1]
68 68
69 69 $ status
70 70 --- status ---
71 71 M file2
72 72 M file3
73 73 C file1
74 74 --- resolve --list ---
75 75 U file1
76 76 U file2
77 77 U file3
78 78 --- debugmergestate ---
79 79 * version 2 records
80 80 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
81 81 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
82 82 labels:
83 83 local: working copy
84 84 other: merge rev
85 85 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
86 86 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
87 87 local path: file1 (flags "")
88 88 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
89 89 other path: file1 (node null)
90 90 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
91 91 file: file2 (record type "C", state "u", hash null)
92 92 local path: file2 (flags "")
93 93 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
94 94 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
95 95 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
96 96 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
97 97 local path: file3 (flags "")
98 98 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
99 99 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
100 100 --- file1 ---
101 101 1
102 102 changed
103 103 --- file2 ---
104 104 2
105 105 changed
106 106 --- file3 ---
107 107 3
108 108 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
109 109 changed2
110 110 =======
111 111 changed1
112 112 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
113 113
114 114
115 115 Interactive merge:
116 116
117 117 $ hg co -C
118 118 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
119 119 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
120 120 1 other heads for branch "default"
121 121
122 122 $ hg merge --config ui.interactive=true <<EOF
123 123 > c
124 124 > d
125 125 > EOF
126 126 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
127 What do you want to do?
128 use (c)hanged version, (d)elete, or leave (u)nresolved? c
127 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
128 What do you want to do? c
129 129 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
130 What do you want to do?
131 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? d
130 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
131 What do you want to do? d
132 132 merging file3
133 133 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
134 134 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
135 135 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
136 136 [1]
137 137
138 138 $ status
139 139 --- status ---
140 140 file2: * (glob)
141 141 M file3
142 142 C file1
143 143 --- resolve --list ---
144 144 R file1
145 145 R file2
146 146 U file3
147 147 --- debugmergestate ---
148 148 * version 2 records
149 149 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
150 150 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
151 151 labels:
152 152 local: working copy
153 153 other: merge rev
154 154 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
155 155 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
156 156 local path: file1 (flags "")
157 157 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
158 158 other path: file1 (node null)
159 159 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
160 160 file: file2 (record type "C", state "r", hash null)
161 161 local path: file2 (flags "")
162 162 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
163 163 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
164 164 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
165 165 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
166 166 local path: file3 (flags "")
167 167 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
168 168 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
169 169 --- file1 ---
170 170 1
171 171 changed
172 172 *** file2 does not exist
173 173 --- file3 ---
174 174 3
175 175 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
176 176 changed2
177 177 =======
178 178 changed1
179 179 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
180 180
181 181
182 182 Interactive merge with bad input:
183 183
184 184 $ hg co -C
185 185 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
186 186 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
187 187 1 other heads for branch "default"
188 188
189 189 $ hg merge --config ui.interactive=true <<EOF
190 190 > foo
191 191 > bar
192 192 > d
193 193 > baz
194 194 > c
195 195 > EOF
196 196 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
197 What do you want to do?
198 use (c)hanged version, (d)elete, or leave (u)nresolved? foo
197 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
198 What do you want to do? foo
199 199 unrecognized response
200 200 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
201 What do you want to do?
202 use (c)hanged version, (d)elete, or leave (u)nresolved? bar
201 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
202 What do you want to do? bar
203 203 unrecognized response
204 204 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
205 What do you want to do?
206 use (c)hanged version, (d)elete, or leave (u)nresolved? d
205 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
206 What do you want to do? d
207 207 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
208 What do you want to do?
209 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? baz
208 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
209 What do you want to do? baz
210 210 unrecognized response
211 211 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
212 What do you want to do?
213 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
212 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
213 What do you want to do? c
214 214 merging file3
215 215 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
216 216 0 files updated, 1 files merged, 1 files removed, 1 files unresolved
217 217 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
218 218 [1]
219 219
220 220 $ status
221 221 --- status ---
222 222 M file2
223 223 M file3
224 224 R file1
225 225 --- resolve --list ---
226 226 R file1
227 227 R file2
228 228 U file3
229 229 --- debugmergestate ---
230 230 * version 2 records
231 231 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
232 232 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
233 233 labels:
234 234 local: working copy
235 235 other: merge rev
236 236 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
237 237 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
238 238 local path: file1 (flags "")
239 239 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
240 240 other path: file1 (node null)
241 241 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
242 242 file: file2 (record type "C", state "r", hash null)
243 243 local path: file2 (flags "")
244 244 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
245 245 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
246 246 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
247 247 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
248 248 local path: file3 (flags "")
249 249 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
250 250 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
251 251 *** file1 does not exist
252 252 --- file2 ---
253 253 2
254 254 changed
255 255 --- file3 ---
256 256 3
257 257 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
258 258 changed2
259 259 =======
260 260 changed1
261 261 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
262 262
263 263
264 264 Interactive merge with not enough input:
265 265
266 266 $ hg co -C
267 267 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
268 268 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
269 269 1 other heads for branch "default"
270 270
271 271 $ hg merge --config ui.interactive=true <<EOF
272 272 > d
273 273 > EOF
274 274 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
275 What do you want to do?
276 use (c)hanged version, (d)elete, or leave (u)nresolved? d
275 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
276 What do you want to do? d
277 277 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
278 What do you want to do?
279 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
278 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
279 What do you want to do?
280 280 merging file3
281 281 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
282 282 0 files updated, 0 files merged, 1 files removed, 2 files unresolved
283 283 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
284 284 [1]
285 285
286 286 $ status
287 287 --- status ---
288 288 M file2
289 289 M file3
290 290 R file1
291 291 --- resolve --list ---
292 292 R file1
293 293 U file2
294 294 U file3
295 295 --- debugmergestate ---
296 296 * version 2 records
297 297 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
298 298 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
299 299 labels:
300 300 local: working copy
301 301 other: merge rev
302 302 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
303 303 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
304 304 local path: file1 (flags "")
305 305 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
306 306 other path: file1 (node null)
307 307 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
308 308 file: file2 (record type "C", state "u", hash null)
309 309 local path: file2 (flags "")
310 310 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
311 311 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
312 312 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
313 313 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
314 314 local path: file3 (flags "")
315 315 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
316 316 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
317 317 *** file1 does not exist
318 318 --- file2 ---
319 319 2
320 320 changed
321 321 --- file3 ---
322 322 3
323 323 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
324 324 changed2
325 325 =======
326 326 changed1
327 327 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
328 328
329 329 Choose local versions of files
330 330
331 331 $ hg co -C
332 332 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
333 333 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
334 334 1 other heads for branch "default"
335 335
336 336 $ hg merge --tool :local
337 337 0 files updated, 3 files merged, 0 files removed, 0 files unresolved
338 338 (branch merge, don't forget to commit)
339 339 $ status 2>&1 | tee $TESTTMP/local.status
340 340 --- status ---
341 341 file2: * (glob)
342 342 M file3
343 343 C file1
344 344 --- resolve --list ---
345 345 R file1
346 346 R file2
347 347 R file3
348 348 --- debugmergestate ---
349 349 * version 2 records
350 350 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
351 351 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
352 352 labels:
353 353 local: working copy
354 354 other: merge rev
355 355 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
356 356 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
357 357 local path: file1 (flags "")
358 358 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
359 359 other path: file1 (node null)
360 360 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
361 361 file: file2 (record type "C", state "r", hash null)
362 362 local path: file2 (flags "")
363 363 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
364 364 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
365 365 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
366 366 file: file3 (record type "F", state "r", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
367 367 local path: file3 (flags "")
368 368 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
369 369 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
370 370 --- file1 ---
371 371 1
372 372 changed
373 373 *** file2 does not exist
374 374 --- file3 ---
375 375 3
376 376 changed2
377 377
378 378 Choose other versions of files
379 379
380 380 $ hg co -C
381 381 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
382 382 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
383 383 1 other heads for branch "default"
384 384
385 385 $ hg merge --tool :other
386 386 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
387 387 (branch merge, don't forget to commit)
388 388 $ status 2>&1 | tee $TESTTMP/other.status
389 389 --- status ---
390 390 M file2
391 391 M file3
392 392 R file1
393 393 --- resolve --list ---
394 394 R file1
395 395 R file2
396 396 R file3
397 397 --- debugmergestate ---
398 398 * version 2 records
399 399 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
400 400 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
401 401 labels:
402 402 local: working copy
403 403 other: merge rev
404 404 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
405 405 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
406 406 local path: file1 (flags "")
407 407 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
408 408 other path: file1 (node null)
409 409 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
410 410 file: file2 (record type "C", state "r", hash null)
411 411 local path: file2 (flags "")
412 412 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
413 413 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
414 414 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
415 415 file: file3 (record type "F", state "r", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
416 416 local path: file3 (flags "")
417 417 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
418 418 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
419 419 *** file1 does not exist
420 420 --- file2 ---
421 421 2
422 422 changed
423 423 --- file3 ---
424 424 3
425 425 changed1
426 426
427 427 Fail
428 428
429 429 $ hg co -C
430 430 2 files updated, 0 files merged, 1 files removed, 0 files unresolved
431 431 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
432 432 1 other heads for branch "default"
433 433
434 434 $ hg merge --tool :fail
435 435 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
436 436 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
437 437 [1]
438 438 $ status 2>&1 | tee $TESTTMP/fail.status
439 439 --- status ---
440 440 M file2
441 441 M file3
442 442 C file1
443 443 --- resolve --list ---
444 444 U file1
445 445 U file2
446 446 U file3
447 447 --- debugmergestate ---
448 448 * version 2 records
449 449 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
450 450 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
451 451 labels:
452 452 local: working copy
453 453 other: merge rev
454 454 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
455 455 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
456 456 local path: file1 (flags "")
457 457 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
458 458 other path: file1 (node null)
459 459 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
460 460 file: file2 (record type "C", state "u", hash null)
461 461 local path: file2 (flags "")
462 462 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
463 463 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
464 464 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
465 465 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
466 466 local path: file3 (flags "")
467 467 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
468 468 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
469 469 --- file1 ---
470 470 1
471 471 changed
472 472 --- file2 ---
473 473 2
474 474 changed
475 475 --- file3 ---
476 476 3
477 477 changed2
478 478
479 479 Force prompts with no input (should be similar to :fail)
480 480
481 481 $ hg co -C
482 482 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
483 483 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
484 484 1 other heads for branch "default"
485 485
486 486 $ hg merge --config ui.interactive=True --tool :prompt
487 487 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
488 What do you want to do?
489 use (c)hanged version, (d)elete, or leave (u)nresolved?
488 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
489 What do you want to do?
490 490 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
491 What do you want to do?
492 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
493 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for file3?
491 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
492 What do you want to do?
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 496 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
495 497 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
496 498 [1]
497 499 $ status 2>&1 | tee $TESTTMP/prompt.status
498 500 --- status ---
499 501 M file2
500 502 M file3
501 503 C file1
502 504 --- resolve --list ---
503 505 U file1
504 506 U file2
505 507 U file3
506 508 --- debugmergestate ---
507 509 * version 2 records
508 510 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
509 511 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
510 512 labels:
511 513 local: working copy
512 514 other: merge rev
513 515 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
514 516 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
515 517 local path: file1 (flags "")
516 518 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
517 519 other path: file1 (node null)
518 520 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
519 521 file: file2 (record type "C", state "u", hash null)
520 522 local path: file2 (flags "")
521 523 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
522 524 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
523 525 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
524 526 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
525 527 local path: file3 (flags "")
526 528 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
527 529 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
528 530 --- file1 ---
529 531 1
530 532 changed
531 533 --- file2 ---
532 534 2
533 535 changed
534 536 --- file3 ---
535 537 3
536 538 changed2
537 539 $ cmp $TESTTMP/fail.status $TESTTMP/prompt.status || diff -U8 $TESTTMP/fail.status $TESTTMP/prompt.status
538 540
539 541
540 542 Force prompts
541 543
542 544 $ hg co -C
543 545 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
544 546 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
545 547 1 other heads for branch "default"
546 548
547 549 $ hg merge --tool :prompt
548 550 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
549 What do you want to do?
550 use (c)hanged version, (d)elete, or leave (u)nresolved? u
551 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
552 What do you want to do? u
551 553 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
552 What do you want to do?
553 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
554 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for file3? u
554 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
555 What do you want to do? 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 559 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
556 560 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
557 561 [1]
558 562 $ status
559 563 --- status ---
560 564 M file2
561 565 M file3
562 566 C file1
563 567 --- resolve --list ---
564 568 U file1
565 569 U file2
566 570 U file3
567 571 --- debugmergestate ---
568 572 * version 2 records
569 573 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
570 574 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
571 575 labels:
572 576 local: working copy
573 577 other: merge rev
574 578 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
575 579 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
576 580 local path: file1 (flags "")
577 581 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
578 582 other path: file1 (node null)
579 583 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
580 584 file: file2 (record type "C", state "u", hash null)
581 585 local path: file2 (flags "")
582 586 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
583 587 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
584 588 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
585 589 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
586 590 local path: file3 (flags "")
587 591 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
588 592 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
589 593 --- file1 ---
590 594 1
591 595 changed
592 596 --- file2 ---
593 597 2
594 598 changed
595 599 --- file3 ---
596 600 3
597 601 changed2
598 602
599 603 Choose to merge all files
600 604
601 605 $ hg co -C
602 606 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
603 607 updated to "13910f48cf7b: changed file1, removed file2, changed file3"
604 608 1 other heads for branch "default"
605 609
606 610 $ hg merge --tool :merge3
607 611 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
608 What do you want to do?
609 use (c)hanged version, (d)elete, or leave (u)nresolved? u
612 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
613 What do you want to do? u
610 614 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
611 What do you want to do?
612 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
615 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
616 What do you want to do? u
613 617 merging file3
614 618 warning: conflicts while merging file3! (edit, then use 'hg resolve --mark')
615 619 0 files updated, 0 files merged, 0 files removed, 3 files unresolved
616 620 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
617 621 [1]
618 622 $ status
619 623 --- status ---
620 624 M file2
621 625 M file3
622 626 C file1
623 627 --- resolve --list ---
624 628 U file1
625 629 U file2
626 630 U file3
627 631 --- debugmergestate ---
628 632 * version 2 records
629 633 local: 13910f48cf7bdb2a0ba6e24b4900e4fdd5739dd4
630 634 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
631 635 labels:
632 636 local: working copy
633 637 other: merge rev
634 638 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
635 639 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
636 640 local path: file1 (flags "")
637 641 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
638 642 other path: file1 (node null)
639 643 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
640 644 file: file2 (record type "C", state "u", hash null)
641 645 local path: file2 (flags "")
642 646 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
643 647 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
644 648 file extras: file3 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
645 649 file: file3 (record type "F", state "u", hash d5b0a58bc47161b1b8a831084b366f757c4f0b11)
646 650 local path: file3 (flags "")
647 651 ancestor path: file3 (node 2661d26c649684b482d10f91960cc3db683c38b4)
648 652 other path: file3 (node a2644c43e210356772c7772a8674544a62e06beb)
649 653 --- file1 ---
650 654 1
651 655 changed
652 656 --- file2 ---
653 657 2
654 658 changed
655 659 --- file3 ---
656 660 3
657 661 <<<<<<< working copy: 13910f48cf7b - test: changed file1, removed file2, chan...
658 662 changed2
659 663 ||||||| base
660 664 =======
661 665 changed1
662 666 >>>>>>> merge rev: 10f9a0a634e8 - test: removed file1, changed file2, chan...
663 667
664 668 Exercise transitions between local, other, fail and prompt, and make sure the
665 669 dirstate stays consistent. (Compare with each other and to the above
666 670 invocations.)
667 671
668 672 $ testtransitions() {
669 673 > # this traversal order covers every transition
670 674 > tools="local other prompt local fail other local prompt other fail prompt fail local"
671 675 > lasttool="merge3"
672 676 > for tool in $tools; do
673 677 > echo "=== :$lasttool -> :$tool ==="
674 678 > ref="$TESTTMP/$tool.status"
675 679 > hg resolve --unmark --all
676 680 > hg resolve --tool ":$tool" --all --config ui.interactive=True
677 681 > status > "$TESTTMP/compare.status" 2>&1
678 682 > echo '--- diff of status ---'
679 683 > if cmp "$TESTTMP/$tool.status" "$TESTTMP/compare.status" || diff -U8 "$TESTTMP/$tool.status" "$TESTTMP/compare.status"; then
680 684 > echo '(status identical)'
681 685 > fi
682 686 > lasttool="$tool"
683 687 > echo
684 688 > done
685 689 > }
686 690
687 691 $ testtransitions
688 692 === :merge3 -> :local ===
689 693 (no more unresolved files)
690 694 --- diff of status ---
691 695 (status identical)
692 696
693 697 === :local -> :other ===
694 698 (no more unresolved files)
695 699 --- diff of status ---
696 700 (status identical)
697 701
698 702 === :other -> :prompt ===
699 703 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
700 What do you want to do?
701 use (c)hanged version, (d)elete, or leave (u)nresolved?
704 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
705 What do you want to do?
702 706 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
703 What do you want to do?
704 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
705 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for file3?
707 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
708 What do you want to do?
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 712 --- diff of status ---
707 713 (status identical)
708 714
709 715 === :prompt -> :local ===
710 716 (no more unresolved files)
711 717 --- diff of status ---
712 718 (status identical)
713 719
714 720 === :local -> :fail ===
715 721 --- diff of status ---
716 722 (status identical)
717 723
718 724 === :fail -> :other ===
719 725 (no more unresolved files)
720 726 --- diff of status ---
721 727 (status identical)
722 728
723 729 === :other -> :local ===
724 730 (no more unresolved files)
725 731 --- diff of status ---
726 732 (status identical)
727 733
728 734 === :local -> :prompt ===
729 735 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
730 What do you want to do?
731 use (c)hanged version, (d)elete, or leave (u)nresolved?
736 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
737 What do you want to do?
732 738 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
733 What do you want to do?
734 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
735 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for file3?
739 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
740 What do you want to do?
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 744 --- diff of status ---
737 745 (status identical)
738 746
739 747 === :prompt -> :other ===
740 748 (no more unresolved files)
741 749 --- diff of status ---
742 750 (status identical)
743 751
744 752 === :other -> :fail ===
745 753 --- diff of status ---
746 754 (status identical)
747 755
748 756 === :fail -> :prompt ===
749 757 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
750 What do you want to do?
751 use (c)hanged version, (d)elete, or leave (u)nresolved?
758 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
759 What do you want to do?
752 760 file 'file2' was deleted in local [working copy] but was modified in other [merge rev].
753 What do you want to do?
754 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
755 keep (l)ocal [working copy], take (o)ther [merge rev], or leave (u)nresolved for file3?
761 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
762 What do you want to do?
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 766 --- diff of status ---
757 767 (status identical)
758 768
759 769 === :prompt -> :fail ===
760 770 --- diff of status ---
761 771 (status identical)
762 772
763 773 === :fail -> :local ===
764 774 (no more unresolved files)
765 775 --- diff of status ---
766 776 (status identical)
767 777
768 778
769 779
770 780 Non-interactive linear update
771 781
772 782 $ hg co -C 0
773 783 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
774 784 $ echo changed >> file1
775 785 $ hg rm file2
776 786 $ hg update 1 -y
777 787 file 'file1' was deleted in other [destination] but was modified in local [working copy].
778 What do you want to do?
779 use (c)hanged version, (d)elete, or leave (u)nresolved? u
788 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
789 What do you want to do? u
780 790 file 'file2' was deleted in local [working copy] but was modified in other [destination].
781 What do you want to do?
782 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
791 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
792 What do you want to do? u
783 793 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
784 794 use 'hg resolve' to retry unresolved file merges
785 795 [1]
786 796 $ status
787 797 --- status ---
788 798 A file1
789 799 C file2
790 800 C file3
791 801 --- resolve --list ---
792 802 U file1
793 803 U file2
794 804 --- debugmergestate ---
795 805 * version 2 records
796 806 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
797 807 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
798 808 labels:
799 809 local: working copy
800 810 other: destination
801 811 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
802 812 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
803 813 local path: file1 (flags "")
804 814 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
805 815 other path: file1 (node null)
806 816 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
807 817 file: file2 (record type "C", state "u", hash null)
808 818 local path: file2 (flags "")
809 819 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
810 820 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
811 821 --- file1 ---
812 822 1
813 823 changed
814 824 --- file2 ---
815 825 2
816 826 changed
817 827 --- file3 ---
818 828 3
819 829 changed1
820 830
821 831 Choose local versions of files
822 832
823 833 $ hg co -C 0
824 834 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
825 835 $ echo changed >> file1
826 836 $ hg rm file2
827 837 $ hg update 1 --tool :local
828 838 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
829 839 $ status 2>&1 | tee $TESTTMP/local.status
830 840 --- status ---
831 841 file2: * (glob)
832 842 A file1
833 843 C file3
834 844 --- resolve --list ---
835 845 R file1
836 846 R file2
837 847 --- debugmergestate ---
838 848 * version 2 records
839 849 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
840 850 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
841 851 labels:
842 852 local: working copy
843 853 other: destination
844 854 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
845 855 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
846 856 local path: file1 (flags "")
847 857 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
848 858 other path: file1 (node null)
849 859 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
850 860 file: file2 (record type "C", state "r", hash null)
851 861 local path: file2 (flags "")
852 862 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
853 863 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
854 864 --- file1 ---
855 865 1
856 866 changed
857 867 *** file2 does not exist
858 868 --- file3 ---
859 869 3
860 870 changed1
861 871
862 872 Choose other versions of files
863 873
864 874 $ hg co -C 0
865 875 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
866 876 $ echo changed >> file1
867 877 $ hg rm file2
868 878 $ hg update 1 --tool :other
869 879 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
870 880 $ status 2>&1 | tee $TESTTMP/other.status
871 881 --- status ---
872 882 file1: * (glob)
873 883 C file2
874 884 C file3
875 885 --- resolve --list ---
876 886 R file1
877 887 R file2
878 888 --- debugmergestate ---
879 889 * version 2 records
880 890 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
881 891 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
882 892 labels:
883 893 local: working copy
884 894 other: destination
885 895 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
886 896 file: file1 (record type "C", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
887 897 local path: file1 (flags "")
888 898 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
889 899 other path: file1 (node null)
890 900 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
891 901 file: file2 (record type "C", state "r", hash null)
892 902 local path: file2 (flags "")
893 903 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
894 904 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
895 905 *** file1 does not exist
896 906 --- file2 ---
897 907 2
898 908 changed
899 909 --- file3 ---
900 910 3
901 911 changed1
902 912
903 913 Fail
904 914
905 915 $ hg co -C 0
906 916 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
907 917 $ echo changed >> file1
908 918 $ hg rm file2
909 919 $ hg update 1 --tool :fail
910 920 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
911 921 use 'hg resolve' to retry unresolved file merges
912 922 [1]
913 923 $ status 2>&1 | tee $TESTTMP/fail.status
914 924 --- status ---
915 925 A file1
916 926 C file2
917 927 C file3
918 928 --- resolve --list ---
919 929 U file1
920 930 U file2
921 931 --- debugmergestate ---
922 932 * version 2 records
923 933 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
924 934 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
925 935 labels:
926 936 local: working copy
927 937 other: destination
928 938 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
929 939 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
930 940 local path: file1 (flags "")
931 941 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
932 942 other path: file1 (node null)
933 943 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
934 944 file: file2 (record type "C", state "u", hash null)
935 945 local path: file2 (flags "")
936 946 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
937 947 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
938 948 --- file1 ---
939 949 1
940 950 changed
941 951 --- file2 ---
942 952 2
943 953 changed
944 954 --- file3 ---
945 955 3
946 956 changed1
947 957
948 958 Force prompts with no input
949 959
950 960 $ hg co -C 0
951 961 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
952 962 $ echo changed >> file1
953 963 $ hg rm file2
954 964 $ hg update 1 --config ui.interactive=True --tool :prompt
955 965 file 'file1' was deleted in other [destination] but was modified in local [working copy].
956 What do you want to do?
957 use (c)hanged version, (d)elete, or leave (u)nresolved?
966 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
967 What do you want to do?
958 968 file 'file2' was deleted in local [working copy] but was modified in other [destination].
959 What do you want to do?
960 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
969 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
970 What do you want to do?
961 971 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
962 972 use 'hg resolve' to retry unresolved file merges
963 973 [1]
964 974 $ status 2>&1 | tee $TESTTMP/prompt.status
965 975 --- status ---
966 976 A file1
967 977 C file2
968 978 C file3
969 979 --- resolve --list ---
970 980 U file1
971 981 U file2
972 982 --- debugmergestate ---
973 983 * version 2 records
974 984 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
975 985 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
976 986 labels:
977 987 local: working copy
978 988 other: destination
979 989 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
980 990 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
981 991 local path: file1 (flags "")
982 992 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
983 993 other path: file1 (node null)
984 994 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
985 995 file: file2 (record type "C", state "u", hash null)
986 996 local path: file2 (flags "")
987 997 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
988 998 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
989 999 --- file1 ---
990 1000 1
991 1001 changed
992 1002 --- file2 ---
993 1003 2
994 1004 changed
995 1005 --- file3 ---
996 1006 3
997 1007 changed1
998 1008 $ cmp $TESTTMP/fail.status $TESTTMP/prompt.status || diff -U8 $TESTTMP/fail.status $TESTTMP/prompt.status
999 1009
1000 1010 Choose to merge all files
1001 1011
1002 1012 $ hg co -C 0
1003 1013 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
1004 1014 $ echo changed >> file1
1005 1015 $ hg rm file2
1006 1016 $ hg update 1 --tool :merge3
1007 1017 file 'file1' was deleted in other [destination] but was modified in local [working copy].
1008 What do you want to do?
1009 use (c)hanged version, (d)elete, or leave (u)nresolved? u
1018 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
1019 What do you want to do? u
1010 1020 file 'file2' was deleted in local [working copy] but was modified in other [destination].
1011 What do you want to do?
1012 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
1021 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
1022 What do you want to do? u
1013 1023 1 files updated, 0 files merged, 0 files removed, 2 files unresolved
1014 1024 use 'hg resolve' to retry unresolved file merges
1015 1025 [1]
1016 1026 $ status
1017 1027 --- status ---
1018 1028 A file1
1019 1029 C file2
1020 1030 C file3
1021 1031 --- resolve --list ---
1022 1032 U file1
1023 1033 U file2
1024 1034 --- debugmergestate ---
1025 1035 * version 2 records
1026 1036 local: ab57bf49aa276a22d35a473592d4c34b5abc3eff
1027 1037 other: 10f9a0a634e82080907e62f075ab119cbc565ea6
1028 1038 labels:
1029 1039 local: working copy
1030 1040 other: destination
1031 1041 file extras: file1 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
1032 1042 file: file1 (record type "C", state "u", hash 60b27f004e454aca81b0480209cce5081ec52390)
1033 1043 local path: file1 (flags "")
1034 1044 ancestor path: file1 (node b8e02f6433738021a065f94175c7cd23db5f05be)
1035 1045 other path: file1 (node null)
1036 1046 file extras: file2 (ancestorlinknode = ab57bf49aa276a22d35a473592d4c34b5abc3eff)
1037 1047 file: file2 (record type "C", state "u", hash null)
1038 1048 local path: file2 (flags "")
1039 1049 ancestor path: file2 (node 5d9299349fc01ddd25d0070d149b124d8f10411e)
1040 1050 other path: file2 (node e7c1328648519852e723de86c0c0525acd779257)
1041 1051 --- file1 ---
1042 1052 1
1043 1053 changed
1044 1054 --- file2 ---
1045 1055 2
1046 1056 changed
1047 1057 --- file3 ---
1048 1058 3
1049 1059 changed1
1050 1060
1051 1061 Test transitions between different merge tools
1052 1062
1053 1063 $ testtransitions
1054 1064 === :merge3 -> :local ===
1055 1065 (no more unresolved files)
1056 1066 --- diff of status ---
1057 1067 (status identical)
1058 1068
1059 1069 === :local -> :other ===
1060 1070 (no more unresolved files)
1061 1071 --- diff of status ---
1062 1072 (status identical)
1063 1073
1064 1074 === :other -> :prompt ===
1065 1075 file 'file1' was deleted in other [destination] but was modified in local [working copy].
1066 What do you want to do?
1067 use (c)hanged version, (d)elete, or leave (u)nresolved?
1076 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
1077 What do you want to do?
1068 1078 file 'file2' was deleted in local [working copy] but was modified in other [destination].
1069 What do you want to do?
1070 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
1079 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
1080 What do you want to do?
1071 1081 --- diff of status ---
1072 1082 (status identical)
1073 1083
1074 1084 === :prompt -> :local ===
1075 1085 (no more unresolved files)
1076 1086 --- diff of status ---
1077 1087 (status identical)
1078 1088
1079 1089 === :local -> :fail ===
1080 1090 --- diff of status ---
1081 1091 (status identical)
1082 1092
1083 1093 === :fail -> :other ===
1084 1094 (no more unresolved files)
1085 1095 --- diff of status ---
1086 1096 (status identical)
1087 1097
1088 1098 === :other -> :local ===
1089 1099 (no more unresolved files)
1090 1100 --- diff of status ---
1091 1101 (status identical)
1092 1102
1093 1103 === :local -> :prompt ===
1094 1104 file 'file1' was deleted in other [destination] but was modified in local [working copy].
1095 What do you want to do?
1096 use (c)hanged version, (d)elete, or leave (u)nresolved?
1105 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
1106 What do you want to do?
1097 1107 file 'file2' was deleted in local [working copy] but was modified in other [destination].
1098 What do you want to do?
1099 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
1108 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
1109 What do you want to do?
1100 1110 --- diff of status ---
1101 1111 (status identical)
1102 1112
1103 1113 === :prompt -> :other ===
1104 1114 (no more unresolved files)
1105 1115 --- diff of status ---
1106 1116 (status identical)
1107 1117
1108 1118 === :other -> :fail ===
1109 1119 --- diff of status ---
1110 1120 (status identical)
1111 1121
1112 1122 === :fail -> :prompt ===
1113 1123 file 'file1' was deleted in other [destination] but was modified in local [working copy].
1114 What do you want to do?
1115 use (c)hanged version, (d)elete, or leave (u)nresolved?
1124 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
1125 What do you want to do?
1116 1126 file 'file2' was deleted in local [working copy] but was modified in other [destination].
1117 What do you want to do?
1118 use (c)hanged version, leave (d)eleted, or leave (u)nresolved?
1127 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
1128 What do you want to do?
1119 1129 --- diff of status ---
1120 1130 (status identical)
1121 1131
1122 1132 === :prompt -> :fail ===
1123 1133 --- diff of status ---
1124 1134 (status identical)
1125 1135
1126 1136 === :fail -> :local ===
1127 1137 (no more unresolved files)
1128 1138 --- diff of status ---
1129 1139 (status identical)
1130 1140
@@ -1,845 +1,845 b''
1 1 Set up a base, local, and remote changeset, as well as the working copy state.
2 2 Files names are of the form base_remote_local_working-copy. For example,
3 3 content1_content2_content1_content2-untracked represents a
4 4 file that was modified in the remote changeset, left untouched in the
5 5 local changeset, and then modified in the working copy to match the
6 6 remote content, then finally forgotten.
7 7
8 8 $ hg init repo
9 9 $ cd repo
10 10
11 11 Create base changeset
12 12
13 13 $ "$PYTHON" $TESTDIR/generate-working-copy-states.py state 3 1
14 14 $ hg addremove -q --similarity 0
15 15 $ hg commit -qm 'base'
16 16
17 17 Create remote changeset
18 18
19 19 $ "$PYTHON" $TESTDIR/generate-working-copy-states.py state 3 2
20 20 $ hg addremove -q --similarity 0
21 21 $ hg commit -qm 'remote'
22 22
23 23 Create local changeset
24 24
25 25 $ hg update -q 0
26 26 $ "$PYTHON" $TESTDIR/generate-working-copy-states.py state 3 3
27 27 $ hg addremove -q --similarity 0
28 28 $ hg commit -qm 'local'
29 29
30 30 Set up working directory
31 31
32 32 $ "$PYTHON" $TESTDIR/generate-working-copy-states.py state 3 wc
33 33 $ hg addremove -q --similarity 0
34 34 $ hg forget *_*_*_*-untracked
35 35 $ rm *_*_*_missing-*
36 36
37 37 $ hg status -A
38 38 M content1_content1_content1_content4-tracked
39 39 M content1_content1_content3_content1-tracked
40 40 M content1_content1_content3_content4-tracked
41 41 M content1_content2_content1_content2-tracked
42 42 M content1_content2_content1_content4-tracked
43 43 M content1_content2_content2_content1-tracked
44 44 M content1_content2_content2_content4-tracked
45 45 M content1_content2_content3_content1-tracked
46 46 M content1_content2_content3_content2-tracked
47 47 M content1_content2_content3_content4-tracked
48 48 M content1_missing_content1_content4-tracked
49 49 M content1_missing_content3_content1-tracked
50 50 M content1_missing_content3_content4-tracked
51 51 M missing_content2_content2_content4-tracked
52 52 M missing_content2_content3_content2-tracked
53 53 M missing_content2_content3_content4-tracked
54 54 M missing_missing_content3_content4-tracked
55 55 A content1_content1_missing_content1-tracked
56 56 A content1_content1_missing_content4-tracked
57 57 A content1_content2_missing_content1-tracked
58 58 A content1_content2_missing_content2-tracked
59 59 A content1_content2_missing_content4-tracked
60 60 A content1_missing_missing_content1-tracked
61 61 A content1_missing_missing_content4-tracked
62 62 A missing_content2_missing_content2-tracked
63 63 A missing_content2_missing_content4-tracked
64 64 A missing_missing_missing_content4-tracked
65 65 R content1_content1_content1_content1-untracked
66 66 R content1_content1_content1_content4-untracked
67 67 R content1_content1_content1_missing-untracked
68 68 R content1_content1_content3_content1-untracked
69 69 R content1_content1_content3_content3-untracked
70 70 R content1_content1_content3_content4-untracked
71 71 R content1_content1_content3_missing-untracked
72 72 R content1_content2_content1_content1-untracked
73 73 R content1_content2_content1_content2-untracked
74 74 R content1_content2_content1_content4-untracked
75 75 R content1_content2_content1_missing-untracked
76 76 R content1_content2_content2_content1-untracked
77 77 R content1_content2_content2_content2-untracked
78 78 R content1_content2_content2_content4-untracked
79 79 R content1_content2_content2_missing-untracked
80 80 R content1_content2_content3_content1-untracked
81 81 R content1_content2_content3_content2-untracked
82 82 R content1_content2_content3_content3-untracked
83 83 R content1_content2_content3_content4-untracked
84 84 R content1_content2_content3_missing-untracked
85 85 R content1_missing_content1_content1-untracked
86 86 R content1_missing_content1_content4-untracked
87 87 R content1_missing_content1_missing-untracked
88 88 R content1_missing_content3_content1-untracked
89 89 R content1_missing_content3_content3-untracked
90 90 R content1_missing_content3_content4-untracked
91 91 R content1_missing_content3_missing-untracked
92 92 R missing_content2_content2_content2-untracked
93 93 R missing_content2_content2_content4-untracked
94 94 R missing_content2_content2_missing-untracked
95 95 R missing_content2_content3_content2-untracked
96 96 R missing_content2_content3_content3-untracked
97 97 R missing_content2_content3_content4-untracked
98 98 R missing_content2_content3_missing-untracked
99 99 R missing_missing_content3_content3-untracked
100 100 R missing_missing_content3_content4-untracked
101 101 R missing_missing_content3_missing-untracked
102 102 ! content1_content1_content1_missing-tracked
103 103 ! content1_content1_content3_missing-tracked
104 104 ! content1_content1_missing_missing-tracked
105 105 ! content1_content2_content1_missing-tracked
106 106 ! content1_content2_content2_missing-tracked
107 107 ! content1_content2_content3_missing-tracked
108 108 ! content1_content2_missing_missing-tracked
109 109 ! content1_missing_content1_missing-tracked
110 110 ! content1_missing_content3_missing-tracked
111 111 ! content1_missing_missing_missing-tracked
112 112 ! missing_content2_content2_missing-tracked
113 113 ! missing_content2_content3_missing-tracked
114 114 ! missing_content2_missing_missing-tracked
115 115 ! missing_missing_content3_missing-tracked
116 116 ! missing_missing_missing_missing-tracked
117 117 ? content1_content1_missing_content1-untracked
118 118 ? content1_content1_missing_content4-untracked
119 119 ? content1_content2_missing_content1-untracked
120 120 ? content1_content2_missing_content2-untracked
121 121 ? content1_content2_missing_content4-untracked
122 122 ? content1_missing_missing_content1-untracked
123 123 ? content1_missing_missing_content4-untracked
124 124 ? missing_content2_missing_content2-untracked
125 125 ? missing_content2_missing_content4-untracked
126 126 ? missing_missing_missing_content4-untracked
127 127 C content1_content1_content1_content1-tracked
128 128 C content1_content1_content3_content3-tracked
129 129 C content1_content2_content1_content1-tracked
130 130 C content1_content2_content2_content2-tracked
131 131 C content1_content2_content3_content3-tracked
132 132 C content1_missing_content1_content1-tracked
133 133 C content1_missing_content3_content3-tracked
134 134 C missing_content2_content2_content2-tracked
135 135 C missing_content2_content3_content3-tracked
136 136 C missing_missing_content3_content3-tracked
137 137
138 138 Merge with remote
139 139
140 140 # Notes:
141 141 # - local and remote changed content1_content2_*_content2-untracked
142 142 # in the same way, so it could potentially be left alone
143 143
144 144 $ hg merge -f --tool internal:merge3 'desc("remote")' 2>&1 | tee $TESTTMP/merge-output-1
145 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?
147 use (c)hanged version, (d)elete, or leave (u)nresolved? u
146 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
147 What do you want to do? u
148 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?
150 use (c)hanged version, (d)elete, or leave (u)nresolved? u
149 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
150 What do you want to do? u
151 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?
153 use (c)hanged version, (d)elete, or leave (u)nresolved? u
152 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
153 What do you want to do? u
154 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?
156 use (c)hanged version, (d)elete, or leave (u)nresolved? u
155 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
156 What do you want to do? u
157 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?
159 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
158 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
159 What do you want to do? u
160 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?
162 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
161 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
162 What do you want to do? u
163 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?
165 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
164 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
165 What do you want to do? u
166 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?
168 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
167 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
168 What do you want to do? u
169 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?
171 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
170 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
171 What do you want to do? u
172 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?
174 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
173 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
174 What do you want to do? u
175 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?
177 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
176 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
177 What do you want to do? u
178 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?
180 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
179 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
180 What do you want to do? u
181 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?
183 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
182 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
183 What do you want to do? u
184 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?
186 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
185 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
186 What do you want to do? u
187 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?
189 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
188 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
189 What do you want to do? u
190 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?
192 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
191 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
192 What do you want to do? u
193 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?
195 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
194 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
195 What do you want to do? u
196 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?
198 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
197 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
198 What do you want to do? u
199 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?
201 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
200 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
201 What do you want to do? u
202 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?
204 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
203 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
204 What do you want to do? u
205 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?
207 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
206 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
207 What do you want to do? u
208 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?
210 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
209 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
210 What do you want to do? u
211 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?
213 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
212 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
213 What do you want to do? u
214 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?
216 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
215 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
216 What do you want to do? u
217 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?
219 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
218 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
219 What do you want to do? u
220 220 merging content1_content2_content1_content4-tracked
221 221 merging content1_content2_content2_content1-tracked
222 222 merging content1_content2_content2_content4-tracked
223 223 merging content1_content2_content3_content1-tracked
224 224 merging content1_content2_content3_content3-tracked
225 225 merging content1_content2_content3_content4-tracked
226 226 merging content1_content2_missing_content1-tracked
227 227 merging content1_content2_missing_content4-tracked
228 228 merging missing_content2_content2_content4-tracked
229 229 merging missing_content2_content3_content3-tracked
230 230 merging missing_content2_content3_content4-tracked
231 231 merging missing_content2_missing_content4-tracked
232 232 merging missing_content2_missing_content4-untracked
233 233 warning: conflicts while merging content1_content2_content1_content4-tracked! (edit, then use 'hg resolve --mark')
234 234 warning: conflicts while merging content1_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
235 235 warning: conflicts while merging content1_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
236 236 warning: conflicts while merging content1_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
237 237 warning: conflicts while merging content1_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
238 238 warning: conflicts while merging missing_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
239 239 warning: conflicts while merging missing_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
240 240 warning: conflicts while merging missing_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
241 241 warning: conflicts while merging missing_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
242 242 warning: conflicts while merging missing_content2_missing_content4-untracked! (edit, then use 'hg resolve --mark')
243 243 18 files updated, 3 files merged, 8 files removed, 35 files unresolved
244 244 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
245 245
246 246 Check which files need to be resolved (should correspond to the output above).
247 247 This should be the files for which the base (1st filename segment), the remote
248 248 (2nd segment) and the working copy (4th segment) are all different.
249 249
250 250 Interestingly, one untracked file got merged and added, which corresponds to the
251 251 odd 'if force and branchmerge and different' case in manifestmerge().
252 252
253 253 $ hg resolve -l
254 254 U content1_content2_content1_content1-untracked
255 255 U content1_content2_content1_content2-untracked
256 256 U content1_content2_content1_content4-tracked
257 257 U content1_content2_content1_content4-untracked
258 258 U content1_content2_content1_missing-tracked
259 259 U content1_content2_content1_missing-untracked
260 260 R content1_content2_content2_content1-tracked
261 261 U content1_content2_content2_content1-untracked
262 262 U content1_content2_content2_content2-untracked
263 263 U content1_content2_content2_content4-tracked
264 264 U content1_content2_content2_content4-untracked
265 265 U content1_content2_content2_missing-tracked
266 266 U content1_content2_content2_missing-untracked
267 267 R content1_content2_content3_content1-tracked
268 268 U content1_content2_content3_content1-untracked
269 269 U content1_content2_content3_content2-untracked
270 270 U content1_content2_content3_content3-tracked
271 271 U content1_content2_content3_content3-untracked
272 272 U content1_content2_content3_content4-tracked
273 273 U content1_content2_content3_content4-untracked
274 274 U content1_content2_content3_missing-tracked
275 275 U content1_content2_content3_missing-untracked
276 276 R content1_content2_missing_content1-tracked
277 277 U content1_content2_missing_content1-untracked
278 278 U content1_content2_missing_content2-untracked
279 279 U content1_content2_missing_content4-tracked
280 280 U content1_content2_missing_content4-untracked
281 281 U content1_content2_missing_missing-tracked
282 282 U content1_content2_missing_missing-untracked
283 283 U content1_missing_content1_content4-tracked
284 284 U content1_missing_content3_content3-tracked
285 285 U content1_missing_content3_content4-tracked
286 286 U content1_missing_missing_content4-tracked
287 287 U missing_content2_content2_content4-tracked
288 288 U missing_content2_content3_content3-tracked
289 289 U missing_content2_content3_content4-tracked
290 290 U missing_content2_missing_content4-tracked
291 291 U missing_content2_missing_content4-untracked
292 292
293 293 Check status and file content
294 294
295 295 Some files get added (e.g. content1_content2_content1_content1-untracked)
296 296
297 297 It is not intuitive that content1_content2_content1_content4-tracked gets
298 298 merged while content1_content2_content1_content4-untracked gets overwritten.
299 299 Any *_content2_*-untracked triggers the modified/deleted prompt and then gets
300 300 overwritten.
301 301
302 302 A lot of untracked files become tracked, for example
303 303 content1_content2_content2_content2-untracked.
304 304
305 305 *_missing_missing_missing-tracked is reported as removed ('R'), which
306 306 doesn't make sense since the file did not exist in the parent, but on the
307 307 other hand, merged-in additions are reported as modifications, which is
308 308 almost as strange.
309 309
310 310 missing_missing_content3_missing-tracked becomes removed ('R'), even though
311 311 the remote side did not touch the file
312 312
313 313 $ checkstatus() {
314 314 > for f in `"$PYTHON" $TESTDIR/generate-working-copy-states.py filelist 3`
315 315 > do
316 316 > echo
317 317 > hg status -A $f
318 318 > if test -f $f
319 319 > then
320 320 > cat $f
321 321 > else
322 322 > echo '<missing>'
323 323 > fi
324 324 > done
325 325 > }
326 326 $ checkstatus 2>&1 | tee $TESTTMP/status1
327 327
328 328 C content1_content1_content1_content1-tracked
329 329 content1
330 330
331 331 R content1_content1_content1_content1-untracked
332 332 content1
333 333
334 334 M content1_content1_content1_content4-tracked
335 335 content4
336 336
337 337 R content1_content1_content1_content4-untracked
338 338 content4
339 339
340 340 ! content1_content1_content1_missing-tracked
341 341 <missing>
342 342
343 343 R content1_content1_content1_missing-untracked
344 344 <missing>
345 345
346 346 M content1_content1_content3_content1-tracked
347 347 content1
348 348
349 349 R content1_content1_content3_content1-untracked
350 350 content1
351 351
352 352 C content1_content1_content3_content3-tracked
353 353 content3
354 354
355 355 R content1_content1_content3_content3-untracked
356 356 content3
357 357
358 358 M content1_content1_content3_content4-tracked
359 359 content4
360 360
361 361 R content1_content1_content3_content4-untracked
362 362 content4
363 363
364 364 ! content1_content1_content3_missing-tracked
365 365 <missing>
366 366
367 367 R content1_content1_content3_missing-untracked
368 368 <missing>
369 369
370 370 A content1_content1_missing_content1-tracked
371 371 content1
372 372
373 373 ? content1_content1_missing_content1-untracked
374 374 content1
375 375
376 376 A content1_content1_missing_content4-tracked
377 377 content4
378 378
379 379 ? content1_content1_missing_content4-untracked
380 380 content4
381 381
382 382 ! content1_content1_missing_missing-tracked
383 383 <missing>
384 384
385 385 content1_content1_missing_missing-untracked: * (glob)
386 386 <missing>
387 387
388 388 M content1_content2_content1_content1-tracked
389 389 content2
390 390
391 391 M content1_content2_content1_content1-untracked
392 392 content2
393 393
394 394 M content1_content2_content1_content2-tracked
395 395 content2
396 396
397 397 M content1_content2_content1_content2-untracked
398 398 content2
399 399
400 400 M content1_content2_content1_content4-tracked
401 401 <<<<<<< working copy: 0447570f1af6 - test: local
402 402 content4
403 403 ||||||| base
404 404 content1
405 405 =======
406 406 content2
407 407 >>>>>>> merge rev: 85100b8c675b - test: remote
408 408
409 409 M content1_content2_content1_content4-untracked
410 410 content2
411 411
412 412 M content1_content2_content1_missing-tracked
413 413 content2
414 414
415 415 M content1_content2_content1_missing-untracked
416 416 content2
417 417
418 418 M content1_content2_content2_content1-tracked
419 419 content2
420 420
421 421 M content1_content2_content2_content1-untracked
422 422 content2
423 423
424 424 C content1_content2_content2_content2-tracked
425 425 content2
426 426
427 427 M content1_content2_content2_content2-untracked
428 428 content2
429 429
430 430 M content1_content2_content2_content4-tracked
431 431 <<<<<<< working copy: 0447570f1af6 - test: local
432 432 content4
433 433 ||||||| base
434 434 content1
435 435 =======
436 436 content2
437 437 >>>>>>> merge rev: 85100b8c675b - test: remote
438 438
439 439 M content1_content2_content2_content4-untracked
440 440 content2
441 441
442 442 M content1_content2_content2_missing-tracked
443 443 content2
444 444
445 445 M content1_content2_content2_missing-untracked
446 446 content2
447 447
448 448 M content1_content2_content3_content1-tracked
449 449 content2
450 450
451 451 M content1_content2_content3_content1-untracked
452 452 content2
453 453
454 454 M content1_content2_content3_content2-tracked
455 455 content2
456 456
457 457 M content1_content2_content3_content2-untracked
458 458 content2
459 459
460 460 M content1_content2_content3_content3-tracked
461 461 <<<<<<< working copy: 0447570f1af6 - test: local
462 462 content3
463 463 ||||||| base
464 464 content1
465 465 =======
466 466 content2
467 467 >>>>>>> merge rev: 85100b8c675b - test: remote
468 468
469 469 M content1_content2_content3_content3-untracked
470 470 content2
471 471
472 472 M content1_content2_content3_content4-tracked
473 473 <<<<<<< working copy: 0447570f1af6 - test: local
474 474 content4
475 475 ||||||| base
476 476 content1
477 477 =======
478 478 content2
479 479 >>>>>>> merge rev: 85100b8c675b - test: remote
480 480
481 481 M content1_content2_content3_content4-untracked
482 482 content2
483 483
484 484 M content1_content2_content3_missing-tracked
485 485 content2
486 486
487 487 M content1_content2_content3_missing-untracked
488 488 content2
489 489
490 490 M content1_content2_missing_content1-tracked
491 491 content2
492 492
493 493 M content1_content2_missing_content1-untracked
494 494 content2
495 495
496 496 M content1_content2_missing_content2-tracked
497 497 content2
498 498
499 499 M content1_content2_missing_content2-untracked
500 500 content2
501 501
502 502 M content1_content2_missing_content4-tracked
503 503 <<<<<<< working copy: 0447570f1af6 - test: local
504 504 content4
505 505 ||||||| base
506 506 content1
507 507 =======
508 508 content2
509 509 >>>>>>> merge rev: 85100b8c675b - test: remote
510 510
511 511 M content1_content2_missing_content4-untracked
512 512 content2
513 513
514 514 M content1_content2_missing_missing-tracked
515 515 content2
516 516
517 517 M content1_content2_missing_missing-untracked
518 518 content2
519 519
520 520 R content1_missing_content1_content1-tracked
521 521 <missing>
522 522
523 523 R content1_missing_content1_content1-untracked
524 524 content1
525 525
526 526 M content1_missing_content1_content4-tracked
527 527 content4
528 528
529 529 R content1_missing_content1_content4-untracked
530 530 content4
531 531
532 532 R content1_missing_content1_missing-tracked
533 533 <missing>
534 534
535 535 R content1_missing_content1_missing-untracked
536 536 <missing>
537 537
538 538 R content1_missing_content3_content1-tracked
539 539 <missing>
540 540
541 541 R content1_missing_content3_content1-untracked
542 542 content1
543 543
544 544 C content1_missing_content3_content3-tracked
545 545 content3
546 546
547 547 R content1_missing_content3_content3-untracked
548 548 content3
549 549
550 550 M content1_missing_content3_content4-tracked
551 551 content4
552 552
553 553 R content1_missing_content3_content4-untracked
554 554 content4
555 555
556 556 R content1_missing_content3_missing-tracked
557 557 <missing>
558 558
559 559 R content1_missing_content3_missing-untracked
560 560 <missing>
561 561
562 562 R content1_missing_missing_content1-tracked
563 563 <missing>
564 564
565 565 ? content1_missing_missing_content1-untracked
566 566 content1
567 567
568 568 A content1_missing_missing_content4-tracked
569 569 content4
570 570
571 571 ? content1_missing_missing_content4-untracked
572 572 content4
573 573
574 574 R content1_missing_missing_missing-tracked
575 575 <missing>
576 576
577 577 content1_missing_missing_missing-untracked: * (glob)
578 578 <missing>
579 579
580 580 C missing_content2_content2_content2-tracked
581 581 content2
582 582
583 583 M missing_content2_content2_content2-untracked
584 584 content2
585 585
586 586 M missing_content2_content2_content4-tracked
587 587 <<<<<<< working copy: 0447570f1af6 - test: local
588 588 content4
589 589 ||||||| base
590 590 =======
591 591 content2
592 592 >>>>>>> merge rev: 85100b8c675b - test: remote
593 593
594 594 M missing_content2_content2_content4-untracked
595 595 content2
596 596
597 597 M missing_content2_content2_missing-tracked
598 598 content2
599 599
600 600 M missing_content2_content2_missing-untracked
601 601 content2
602 602
603 603 M missing_content2_content3_content2-tracked
604 604 content2
605 605
606 606 M missing_content2_content3_content2-untracked
607 607 content2
608 608
609 609 M missing_content2_content3_content3-tracked
610 610 <<<<<<< working copy: 0447570f1af6 - test: local
611 611 content3
612 612 ||||||| base
613 613 =======
614 614 content2
615 615 >>>>>>> merge rev: 85100b8c675b - test: remote
616 616
617 617 M missing_content2_content3_content3-untracked
618 618 content2
619 619
620 620 M missing_content2_content3_content4-tracked
621 621 <<<<<<< working copy: 0447570f1af6 - test: local
622 622 content4
623 623 ||||||| base
624 624 =======
625 625 content2
626 626 >>>>>>> merge rev: 85100b8c675b - test: remote
627 627
628 628 M missing_content2_content3_content4-untracked
629 629 content2
630 630
631 631 M missing_content2_content3_missing-tracked
632 632 content2
633 633
634 634 M missing_content2_content3_missing-untracked
635 635 content2
636 636
637 637 M missing_content2_missing_content2-tracked
638 638 content2
639 639
640 640 M missing_content2_missing_content2-untracked
641 641 content2
642 642
643 643 M missing_content2_missing_content4-tracked
644 644 <<<<<<< working copy: 0447570f1af6 - test: local
645 645 content4
646 646 ||||||| base
647 647 =======
648 648 content2
649 649 >>>>>>> merge rev: 85100b8c675b - test: remote
650 650
651 651 M missing_content2_missing_content4-untracked
652 652 <<<<<<< working copy: 0447570f1af6 - test: local
653 653 content4
654 654 ||||||| base
655 655 =======
656 656 content2
657 657 >>>>>>> merge rev: 85100b8c675b - test: remote
658 658
659 659 M missing_content2_missing_missing-tracked
660 660 content2
661 661
662 662 M missing_content2_missing_missing-untracked
663 663 content2
664 664
665 665 C missing_missing_content3_content3-tracked
666 666 content3
667 667
668 668 R missing_missing_content3_content3-untracked
669 669 content3
670 670
671 671 M missing_missing_content3_content4-tracked
672 672 content4
673 673
674 674 R missing_missing_content3_content4-untracked
675 675 content4
676 676
677 677 R missing_missing_content3_missing-tracked
678 678 <missing>
679 679
680 680 R missing_missing_content3_missing-untracked
681 681 <missing>
682 682
683 683 A missing_missing_missing_content4-tracked
684 684 content4
685 685
686 686 ? missing_missing_missing_content4-untracked
687 687 content4
688 688
689 689 R missing_missing_missing_missing-tracked
690 690 <missing>
691 691
692 692 missing_missing_missing_missing-untracked: * (glob)
693 693 <missing>
694 694
695 695 $ for f in `"$PYTHON" $TESTDIR/generate-working-copy-states.py filelist 3`
696 696 > do
697 697 > if test -f ${f}.orig
698 698 > then
699 699 > echo ${f}.orig:
700 700 > cat ${f}.orig
701 701 > fi
702 702 > done
703 703 content1_content2_content1_content4-tracked.orig:
704 704 content4
705 705 content1_content2_content2_content4-tracked.orig:
706 706 content4
707 707 content1_content2_content3_content3-tracked.orig:
708 708 content3
709 709 content1_content2_content3_content4-tracked.orig:
710 710 content4
711 711 content1_content2_missing_content4-tracked.orig:
712 712 content4
713 713 missing_content2_content2_content4-tracked.orig:
714 714 content4
715 715 missing_content2_content3_content3-tracked.orig:
716 716 content3
717 717 missing_content2_content3_content4-tracked.orig:
718 718 content4
719 719 missing_content2_missing_content4-tracked.orig:
720 720 content4
721 721 missing_content2_missing_content4-untracked.orig:
722 722 content4
723 723
724 724 Re-resolve and check status
725 725
726 726 $ hg resolve --unmark --all
727 727 $ hg resolve --all --tool :local
728 728 (no more unresolved files)
729 729 $ hg resolve --unmark --all
730 730 $ hg resolve --all --tool internal:merge3
731 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?
733 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
732 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
733 What do you want to do? u
734 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?
736 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
735 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
736 What do you want to do? u
737 737 merging content1_content2_content1_content4-tracked
738 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?
740 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
739 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
740 What do you want to do? u
741 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?
743 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
742 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
743 What do you want to do? u
744 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?
746 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
745 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
746 What do you want to do? u
747 747 merging content1_content2_content2_content1-tracked
748 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?
750 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
749 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
750 What do you want to do? u
751 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?
753 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
752 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
753 What do you want to do? u
754 754 merging content1_content2_content2_content4-tracked
755 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?
757 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
756 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
757 What do you want to do? u
758 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?
760 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
759 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
760 What do you want to do? u
761 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?
763 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
762 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
763 What do you want to do? u
764 764 merging content1_content2_content3_content1-tracked
765 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?
767 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
766 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
767 What do you want to do? u
768 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?
770 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
769 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
770 What do you want to do? u
771 771 merging content1_content2_content3_content3-tracked
772 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?
774 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
773 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
774 What do you want to do? u
775 775 merging content1_content2_content3_content4-tracked
776 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?
778 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
777 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
778 What do you want to do? u
779 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?
781 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
780 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
781 What do you want to do? u
782 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?
784 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
783 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
784 What do you want to do? u
785 785 merging content1_content2_missing_content1-tracked
786 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?
788 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
787 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
788 What do you want to do? u
789 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?
791 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
790 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
791 What do you want to do? u
792 792 merging content1_content2_missing_content4-tracked
793 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?
795 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
794 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
795 What do you want to do? u
796 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?
798 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
797 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
798 What do you want to do? u
799 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?
801 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
800 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
801 What do you want to do? u
802 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?
804 use (c)hanged version, (d)elete, or leave (u)nresolved? u
803 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
804 What do you want to do? u
805 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?
807 use (c)hanged version, (d)elete, or leave (u)nresolved? u
806 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
807 What do you want to do? u
808 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?
810 use (c)hanged version, (d)elete, or leave (u)nresolved? u
809 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
810 What do you want to do? u
811 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?
813 use (c)hanged version, (d)elete, or leave (u)nresolved? u
812 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
813 What do you want to do? u
814 814 merging missing_content2_content2_content4-tracked
815 815 merging missing_content2_content3_content3-tracked
816 816 merging missing_content2_content3_content4-tracked
817 817 merging missing_content2_missing_content4-tracked
818 818 merging missing_content2_missing_content4-untracked
819 819 warning: conflicts while merging content1_content2_content1_content4-tracked! (edit, then use 'hg resolve --mark')
820 820 warning: conflicts while merging content1_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
821 821 warning: conflicts while merging content1_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
822 822 warning: conflicts while merging content1_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
823 823 warning: conflicts while merging content1_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
824 824 warning: conflicts while merging missing_content2_content2_content4-tracked! (edit, then use 'hg resolve --mark')
825 825 warning: conflicts while merging missing_content2_content3_content3-tracked! (edit, then use 'hg resolve --mark')
826 826 warning: conflicts while merging missing_content2_content3_content4-tracked! (edit, then use 'hg resolve --mark')
827 827 warning: conflicts while merging missing_content2_missing_content4-tracked! (edit, then use 'hg resolve --mark')
828 828 warning: conflicts while merging missing_content2_missing_content4-untracked! (edit, then use 'hg resolve --mark')
829 829 [1]
830 830 $ checkstatus > $TESTTMP/status2 2>&1
831 831 $ cmp $TESTTMP/status1 $TESTTMP/status2 || diff -U8 $TESTTMP/status1 $TESTTMP/status2
832 832
833 833 Set up working directory again
834 834
835 835 $ hg -q update --clean 2
836 836 $ hg --config extensions.purge= purge
837 837 $ "$PYTHON" $TESTDIR/generate-working-copy-states.py state 3 wc
838 838 $ hg addremove -q --similarity 0
839 839 $ hg forget *_*_*_*-untracked
840 840 $ rm *_*_*_missing-*
841 841
842 842 Merge with checkunknown = warn, see that behavior is the same as before
843 843 $ hg merge -f --tool internal:merge3 'desc("remote")' --config merge.checkunknown=warn > $TESTTMP/merge-output-2 2>&1
844 844 [1]
845 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 1 $ hg init
2 2
3 3 $ echo foo > foo
4 4 $ echo bar > bar
5 5 $ hg ci -qAm 'add foo bar'
6 6
7 7 $ echo foo2 >> foo
8 8 $ echo bleh > bar
9 9 $ hg ci -m 'change foo bar'
10 10
11 11 $ hg up -qC 0
12 12 $ hg mv foo foo1
13 13 $ echo foo1 > foo1
14 14 $ hg cat foo >> foo1
15 15 $ hg ci -m 'mv foo foo1'
16 16 created new head
17 17
18 18 $ hg merge
19 19 merging foo1 and foo to foo1
20 20 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
21 21 (branch merge, don't forget to commit)
22 22
23 23 $ hg debugstate --no-dates
24 24 m 0 -2 unset bar
25 25 m 0 -2 unset foo1
26 26 copy: foo -> foo1
27 27
28 28 $ hg st -q
29 29 M bar
30 30 M foo1
31 31
32 32
33 33 Removing foo1 and bar:
34 34
35 35 $ cp foo1 F
36 36 $ cp bar B
37 37 $ hg rm -f foo1 bar
38 38
39 39 $ hg debugstate --no-dates
40 40 r 0 -1 set bar
41 41 r 0 -1 set foo1
42 42 copy: foo -> foo1
43 43
44 44 $ hg st -qC
45 45 R bar
46 46 R foo1
47 47
48 48
49 49 Re-adding foo1 and bar:
50 50
51 51 $ cp F foo1
52 52 $ cp B bar
53 53 $ hg add -v foo1 bar
54 54 adding bar
55 55 adding foo1
56 56
57 57 $ hg debugstate --no-dates
58 58 n 0 -2 unset bar
59 59 n 0 -2 unset foo1
60 60 copy: foo -> foo1
61 61
62 62 $ hg st -qC
63 63 M bar
64 64 M foo1
65 65 foo
66 66
67 67
68 68 Reverting foo1 and bar:
69 69
70 70 $ hg revert -vr . foo1 bar
71 71 saving current version of bar as bar.orig
72 72 saving current version of foo1 as foo1.orig
73 73 reverting bar
74 74 reverting foo1
75 75
76 76 $ hg debugstate --no-dates
77 77 n 0 -2 unset bar
78 78 n 0 -2 unset foo1
79 79 copy: foo -> foo1
80 80
81 81 $ hg st -qC
82 82 M bar
83 83 M foo1
84 84 foo
85 85
86 86 $ hg diff
87 87
88 88 Merge should not overwrite local file that is untracked after remove
89 89
90 90 $ rm *
91 91 $ hg up -qC
92 92 $ hg rm bar
93 93 $ hg ci -m 'remove bar'
94 94 $ echo 'memories of buried pirate treasure' > bar
95 95 $ hg merge
96 96 bar: untracked file differs
97 97 abort: untracked files in working directory differ from files in requested revision
98 98 [255]
99 99 $ cat bar
100 100 memories of buried pirate treasure
101 101
102 102 Those who use force will lose
103 103
104 104 $ hg merge -f
105 105 file 'bar' was deleted in local [working copy] but was modified in other [merge rev].
106 What do you want to do?
107 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
106 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
107 What do you want to do? u
108 108 merging foo1 and foo to foo1
109 109 0 files updated, 1 files merged, 0 files removed, 1 files unresolved
110 110 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
111 111 [1]
112 112 $ cat bar
113 113 bleh
114 114 $ hg st
115 115 M bar
116 116 M foo1
@@ -1,141 +1,141 b''
1 1 $ hg init
2 2
3 3 $ echo a > a
4 4 $ hg ci -qAm 'add a'
5 5
6 6 $ hg init subrepo
7 7 $ echo 'subrepo = http://example.net/libfoo' > .hgsub
8 8 $ hg ci -qAm 'added subrepo'
9 9
10 10 $ hg up -qC 0
11 11 $ echo ax > a
12 12 $ hg ci -m 'changed a'
13 13 created new head
14 14
15 15 $ hg up -qC 1
16 16 $ cd subrepo
17 17 $ echo b > b
18 18 $ hg add b
19 19 $ cd ..
20 20
21 21 Should fail, since there are added files to subrepo:
22 22
23 23 $ hg merge
24 24 abort: uncommitted changes in subrepository "subrepo"
25 25 [255]
26 26
27 27 Deleted files trigger a '+' marker in top level repos. Deleted files are also
28 28 noticed by `update --check` in the top level repo.
29 29
30 30 $ hg ci -Sqm 'add b'
31 31 $ echo change > subrepo/b
32 32
33 33 $ hg ci -Sm 'change b'
34 34 committing subrepository subrepo
35 35
36 36 $ rm a
37 37 $ hg id
38 38 9bfe45a197d7+ tip
39 39 $ hg sum
40 40 parent: 4:9bfe45a197d7 tip
41 41 change b
42 42 branch: default
43 43 commit: 1 deleted (clean)
44 44 update: 1 new changesets, 2 branch heads (merge)
45 45 phases: 5 draft
46 46
47 47 $ hg up --check -r '.^'
48 48 abort: uncommitted changes
49 49 [255]
50 50 $ hg st -S
51 51 ! a
52 52 $ hg up -Cq .
53 53
54 54 Test that dirty is consistent through subrepos
55 55
56 56 $ rm subrepo/b
57 57
58 58 A deleted subrepo file is flagged as dirty, like the top level repo
59 59
60 60 $ hg id --config extensions.blackbox= --config blackbox.dirty=True \
61 61 > --config blackbox.track='command commandfinish'
62 62 9bfe45a197d7+ tip
63 63 $ cat .hg/blackbox.log
64 64 * @9bfe45a197d7b0ab09bf287729dd57e9619c9da5+ (*)> serve --cmdserver chgunix * (glob) (chg !)
65 65 * @9bfe45a197d7b0ab09bf287729dd57e9619c9da5+ (*)> id --config *extensions.blackbox=* --config *blackbox.dirty=True* (glob)
66 66 * @9bfe45a197d7b0ab09bf287729dd57e9619c9da5+ (*)> id --config *extensions.blackbox=* --config *blackbox.dirty=True* exited 0 * (glob)
67 67
68 68 TODO: a deleted file should be listed as such, like the top level repo
69 69
70 70 $ hg sum
71 71 parent: 4:9bfe45a197d7 tip
72 72 change b
73 73 branch: default
74 74 commit: (clean)
75 75 update: 1 new changesets, 2 branch heads (merge)
76 76 phases: 5 draft
77 77
78 78 Modified subrepo files are noticed by `update --check` and `summary`
79 79
80 80 $ echo mod > subrepo/b
81 81 $ hg st -S
82 82 M subrepo/b
83 83
84 84 $ hg up -r '.^' --check
85 85 abort: uncommitted changes in subrepository "subrepo"
86 86 [255]
87 87
88 88 $ hg sum
89 89 parent: 4:9bfe45a197d7 tip
90 90 change b
91 91 branch: default
92 92 commit: 1 subrepos
93 93 update: 1 new changesets, 2 branch heads (merge)
94 94 phases: 5 draft
95 95
96 96 TODO: why is -R needed here? If it's because the subrepo is treated as a
97 97 discrete unit, then this should probably warn or something.
98 98 $ hg revert -R subrepo --no-backup subrepo/b -r .
99 99
100 100 $ rm subrepo/b
101 101 $ hg st -S
102 102 ! subrepo/b
103 103
104 104 `hg update --check` notices a subrepo with a missing file, like it notices a
105 105 missing file in the top level repo.
106 106
107 107 $ hg up -r '.^' --check
108 108 abort: uncommitted changes in subrepository "subrepo"
109 109 [255]
110 110
111 111 $ hg up -r '.^' --config ui.interactive=True << EOF
112 112 > d
113 113 > EOF
114 114 file 'b' was deleted in local [working copy] but was modified in other [destination].
115 What do you want to do?
116 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? d
115 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
116 What do you want to do? d
117 117 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
118 118
119 119 XXX: There's a difference between wdir() and '.', so there should be a status.
120 120 `hg files -S` from the top is also missing 'subrepo/b'.
121 121
122 122 $ hg st -S
123 123 $ hg st -R subrepo
124 124 $ hg files -R subrepo
125 125 [1]
126 126 $ hg files -R subrepo -r '.'
127 127 subrepo/b
128 128
129 129 $ hg bookmark -r tip @other
130 130 $ echo xyz > subrepo/c
131 131 $ hg ci -SAm 'add c'
132 132 adding subrepo/c
133 133 committing subrepository subrepo
134 134 created new head
135 135 $ rm subrepo/c
136 136
137 137 Merge sees deleted subrepo files as an uncommitted change
138 138
139 139 $ hg merge @other
140 140 abort: uncommitted changes in subrepository "subrepo"
141 141 [255]
@@ -1,2074 +1,2088 b''
1 1 test merge-tools configuration - mostly exercising filemerge.py
2 2
3 3 $ unset HGMERGE # make sure HGMERGE doesn't interfere with the test
4 4 $ cat >> $HGRCPATH << EOF
5 5 > [ui]
6 6 > merge=
7 7 > EOF
8 8 $ hg init repo
9 9 $ cd repo
10 10
11 11 revision 0
12 12
13 13 $ echo "revision 0" > f
14 14 $ echo "space" >> f
15 15 $ hg commit -Am "revision 0"
16 16 adding f
17 17
18 18 revision 1
19 19
20 20 $ echo "revision 1" > f
21 21 $ echo "space" >> f
22 22 $ hg commit -Am "revision 1"
23 23 $ hg update 0 > /dev/null
24 24
25 25 revision 2
26 26
27 27 $ echo "revision 2" > f
28 28 $ echo "space" >> f
29 29 $ hg commit -Am "revision 2"
30 30 created new head
31 31 $ hg update 0 > /dev/null
32 32
33 33 revision 3 - simple to merge
34 34
35 35 $ echo "revision 3" >> f
36 36 $ hg commit -Am "revision 3"
37 37 created new head
38 38
39 39 revision 4 - hard to merge
40 40
41 41 $ hg update 0 > /dev/null
42 42 $ echo "revision 4" > f
43 43 $ hg commit -Am "revision 4"
44 44 created new head
45 45
46 46 $ echo "[merge-tools]" > .hg/hgrc
47 47
48 48 $ beforemerge() {
49 49 > cat .hg/hgrc
50 50 > echo "# hg update -C 1"
51 51 > hg update -C 1 > /dev/null
52 52 > }
53 53 $ aftermerge() {
54 54 > echo "# cat f"
55 55 > cat f
56 56 > echo "# hg stat"
57 57 > hg stat
58 58 > echo "# hg resolve --list"
59 59 > hg resolve --list
60 60 > rm -f f.orig
61 61 > }
62 62
63 63 Tool selection
64 64
65 65 default is internal merge:
66 66
67 67 $ beforemerge
68 68 [merge-tools]
69 69 # hg update -C 1
70 70
71 71 hg merge -r 2
72 72 override $PATH to ensure hgmerge not visible; use $PYTHON in case we're
73 73 running from a devel copy, not a temp installation
74 74
75 75 $ PATH="$BINDIR:/usr/sbin" "$PYTHON" "$BINDIR"/hg merge -r 2
76 76 merging f
77 77 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
78 78 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
79 79 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
80 80 [1]
81 81 $ aftermerge
82 82 # cat f
83 83 <<<<<<< working copy: ef83787e2614 - test: revision 1
84 84 revision 1
85 85 =======
86 86 revision 2
87 87 >>>>>>> merge rev: 0185f4e0cf02 - test: revision 2
88 88 space
89 89 # hg stat
90 90 M f
91 91 ? f.orig
92 92 # hg resolve --list
93 93 U f
94 94
95 95 simplest hgrc using false for merge:
96 96
97 97 $ echo "false.whatever=" >> .hg/hgrc
98 98 $ beforemerge
99 99 [merge-tools]
100 100 false.whatever=
101 101 # hg update -C 1
102 102 $ hg merge -r 2
103 103 merging f
104 104 merging f failed!
105 105 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
106 106 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
107 107 [1]
108 108 $ aftermerge
109 109 # cat f
110 110 revision 1
111 111 space
112 112 # hg stat
113 113 M f
114 114 ? f.orig
115 115 # hg resolve --list
116 116 U f
117 117
118 118 #if unix-permissions
119 119
120 120 unexecutable file in $PATH shouldn't be found:
121 121
122 122 $ echo "echo fail" > false
123 123 $ hg up -qC 1
124 124 $ PATH="`pwd`:$BINDIR:/usr/sbin" "$PYTHON" "$BINDIR"/hg merge -r 2
125 125 merging f
126 126 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
127 127 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
128 128 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
129 129 [1]
130 130 $ rm false
131 131
132 132 #endif
133 133
134 134 executable directory in $PATH shouldn't be found:
135 135
136 136 $ mkdir false
137 137 $ hg up -qC 1
138 138 $ PATH="`pwd`:$BINDIR:/usr/sbin" "$PYTHON" "$BINDIR"/hg merge -r 2
139 139 merging f
140 140 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
141 141 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
142 142 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
143 143 [1]
144 144 $ rmdir false
145 145
146 146 true with higher .priority gets precedence:
147 147
148 148 $ echo "true.priority=1" >> .hg/hgrc
149 149 $ beforemerge
150 150 [merge-tools]
151 151 false.whatever=
152 152 true.priority=1
153 153 # hg update -C 1
154 154 $ hg merge -r 2
155 155 merging f
156 156 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
157 157 (branch merge, don't forget to commit)
158 158 $ aftermerge
159 159 # cat f
160 160 revision 1
161 161 space
162 162 # hg stat
163 163 M f
164 164 # hg resolve --list
165 165 R f
166 166
167 167 unless lowered on command line:
168 168
169 169 $ beforemerge
170 170 [merge-tools]
171 171 false.whatever=
172 172 true.priority=1
173 173 # hg update -C 1
174 174 $ hg merge -r 2 --config merge-tools.true.priority=-7
175 175 merging f
176 176 merging f failed!
177 177 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
178 178 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
179 179 [1]
180 180 $ aftermerge
181 181 # cat f
182 182 revision 1
183 183 space
184 184 # hg stat
185 185 M f
186 186 ? f.orig
187 187 # hg resolve --list
188 188 U f
189 189
190 190 or false set higher on command line:
191 191
192 192 $ beforemerge
193 193 [merge-tools]
194 194 false.whatever=
195 195 true.priority=1
196 196 # hg update -C 1
197 197 $ hg merge -r 2 --config merge-tools.false.priority=117
198 198 merging f
199 199 merging f failed!
200 200 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
201 201 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
202 202 [1]
203 203 $ aftermerge
204 204 # cat f
205 205 revision 1
206 206 space
207 207 # hg stat
208 208 M f
209 209 ? f.orig
210 210 # hg resolve --list
211 211 U f
212 212
213 213 or true set to disabled:
214 214 $ beforemerge
215 215 [merge-tools]
216 216 false.whatever=
217 217 true.priority=1
218 218 # hg update -C 1
219 219 $ hg merge -r 2 --config merge-tools.true.disabled=yes
220 220 merging f
221 221 merging f failed!
222 222 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
223 223 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
224 224 [1]
225 225 $ aftermerge
226 226 # cat f
227 227 revision 1
228 228 space
229 229 # hg stat
230 230 M f
231 231 ? f.orig
232 232 # hg resolve --list
233 233 U f
234 234
235 235 or true.executable not found in PATH:
236 236
237 237 $ beforemerge
238 238 [merge-tools]
239 239 false.whatever=
240 240 true.priority=1
241 241 # hg update -C 1
242 242 $ hg merge -r 2 --config merge-tools.true.executable=nonexistentmergetool
243 243 merging f
244 244 merging f failed!
245 245 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
246 246 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
247 247 [1]
248 248 $ aftermerge
249 249 # cat f
250 250 revision 1
251 251 space
252 252 # hg stat
253 253 M f
254 254 ? f.orig
255 255 # hg resolve --list
256 256 U f
257 257
258 258 or true.executable with bogus path:
259 259
260 260 $ beforemerge
261 261 [merge-tools]
262 262 false.whatever=
263 263 true.priority=1
264 264 # hg update -C 1
265 265 $ hg merge -r 2 --config merge-tools.true.executable=/nonexistent/mergetool
266 266 merging f
267 267 merging f failed!
268 268 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
269 269 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
270 270 [1]
271 271 $ aftermerge
272 272 # cat f
273 273 revision 1
274 274 space
275 275 # hg stat
276 276 M f
277 277 ? f.orig
278 278 # hg resolve --list
279 279 U f
280 280
281 281 but true.executable set to cat found in PATH works:
282 282
283 283 $ echo "true.executable=cat" >> .hg/hgrc
284 284 $ beforemerge
285 285 [merge-tools]
286 286 false.whatever=
287 287 true.priority=1
288 288 true.executable=cat
289 289 # hg update -C 1
290 290 $ hg merge -r 2
291 291 merging f
292 292 revision 1
293 293 space
294 294 revision 0
295 295 space
296 296 revision 2
297 297 space
298 298 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
299 299 (branch merge, don't forget to commit)
300 300 $ aftermerge
301 301 # cat f
302 302 revision 1
303 303 space
304 304 # hg stat
305 305 M f
306 306 # hg resolve --list
307 307 R f
308 308
309 309 and true.executable set to cat with path works:
310 310
311 311 $ beforemerge
312 312 [merge-tools]
313 313 false.whatever=
314 314 true.priority=1
315 315 true.executable=cat
316 316 # hg update -C 1
317 317 $ hg merge -r 2 --config merge-tools.true.executable=cat
318 318 merging f
319 319 revision 1
320 320 space
321 321 revision 0
322 322 space
323 323 revision 2
324 324 space
325 325 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
326 326 (branch merge, don't forget to commit)
327 327 $ aftermerge
328 328 # cat f
329 329 revision 1
330 330 space
331 331 # hg stat
332 332 M f
333 333 # hg resolve --list
334 334 R f
335 335
336 336 executable set to python script that succeeds:
337 337
338 338 $ cat > "$TESTTMP/myworkingmerge.py" <<EOF
339 339 > def myworkingmergefn(ui, repo, args, **kwargs):
340 340 > return False
341 341 > EOF
342 342 $ beforemerge
343 343 [merge-tools]
344 344 false.whatever=
345 345 true.priority=1
346 346 true.executable=cat
347 347 # hg update -C 1
348 348 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py:myworkingmergefn"
349 349 merging f
350 350 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
351 351 (branch merge, don't forget to commit)
352 352 $ aftermerge
353 353 # cat f
354 354 revision 1
355 355 space
356 356 # hg stat
357 357 M f
358 358 # hg resolve --list
359 359 R f
360 360
361 361 executable set to python script that fails:
362 362
363 363 $ cat > "$TESTTMP/mybrokenmerge.py" <<EOF
364 364 > def mybrokenmergefn(ui, repo, args, **kwargs):
365 365 > ui.write(b"some fail message\n")
366 366 > return True
367 367 > EOF
368 368 $ beforemerge
369 369 [merge-tools]
370 370 false.whatever=
371 371 true.priority=1
372 372 true.executable=cat
373 373 # hg update -C 1
374 374 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/mybrokenmerge.py:mybrokenmergefn"
375 375 merging f
376 376 some fail message
377 377 abort: $TESTTMP/mybrokenmerge.py hook failed
378 378 [255]
379 379 $ aftermerge
380 380 # cat f
381 381 revision 1
382 382 space
383 383 # hg stat
384 384 ? f.orig
385 385 # hg resolve --list
386 386 U f
387 387
388 388 executable set to python script that is missing function:
389 389
390 390 $ beforemerge
391 391 [merge-tools]
392 392 false.whatever=
393 393 true.priority=1
394 394 true.executable=cat
395 395 # hg update -C 1
396 396 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py:missingFunction"
397 397 merging f
398 398 abort: $TESTTMP/myworkingmerge.py does not have function: missingFunction
399 399 [255]
400 400 $ aftermerge
401 401 # cat f
402 402 revision 1
403 403 space
404 404 # hg stat
405 405 ? f.orig
406 406 # hg resolve --list
407 407 U f
408 408
409 409 executable set to missing python script:
410 410
411 411 $ beforemerge
412 412 [merge-tools]
413 413 false.whatever=
414 414 true.priority=1
415 415 true.executable=cat
416 416 # hg update -C 1
417 417 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/missingpythonscript.py:mergefn"
418 418 merging f
419 419 abort: loading python merge script failed: $TESTTMP/missingpythonscript.py
420 420 [255]
421 421 $ aftermerge
422 422 # cat f
423 423 revision 1
424 424 space
425 425 # hg stat
426 426 ? f.orig
427 427 # hg resolve --list
428 428 U f
429 429
430 430 executable set to python script but callable function is missing:
431 431
432 432 $ beforemerge
433 433 [merge-tools]
434 434 false.whatever=
435 435 true.priority=1
436 436 true.executable=cat
437 437 # hg update -C 1
438 438 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py"
439 439 abort: invalid 'python:' syntax: python:$TESTTMP/myworkingmerge.py
440 440 [255]
441 441 $ aftermerge
442 442 # cat f
443 443 revision 1
444 444 space
445 445 # hg stat
446 446 # hg resolve --list
447 447 U f
448 448
449 449 executable set to python script but callable function is empty string:
450 450
451 451 $ beforemerge
452 452 [merge-tools]
453 453 false.whatever=
454 454 true.priority=1
455 455 true.executable=cat
456 456 # hg update -C 1
457 457 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/myworkingmerge.py:"
458 458 abort: invalid 'python:' syntax: python:$TESTTMP/myworkingmerge.py:
459 459 [255]
460 460 $ aftermerge
461 461 # cat f
462 462 revision 1
463 463 space
464 464 # hg stat
465 465 # hg resolve --list
466 466 U f
467 467
468 468 executable set to python script but callable function is missing and path contains colon:
469 469
470 470 $ beforemerge
471 471 [merge-tools]
472 472 false.whatever=
473 473 true.priority=1
474 474 true.executable=cat
475 475 # hg update -C 1
476 476 $ hg merge -r 2 --config merge-tools.true.executable="python:$TESTTMP/some:dir/myworkingmerge.py"
477 477 abort: invalid 'python:' syntax: python:$TESTTMP/some:dir/myworkingmerge.py
478 478 [255]
479 479 $ aftermerge
480 480 # cat f
481 481 revision 1
482 482 space
483 483 # hg stat
484 484 # hg resolve --list
485 485 U f
486 486
487 487 executable set to python script filename that contains spaces:
488 488
489 489 $ mkdir -p "$TESTTMP/my path"
490 490 $ cat > "$TESTTMP/my path/my working merge with spaces in filename.py" <<EOF
491 491 > def myworkingmergefn(ui, repo, args, **kwargs):
492 492 > return False
493 493 > EOF
494 494 $ beforemerge
495 495 [merge-tools]
496 496 false.whatever=
497 497 true.priority=1
498 498 true.executable=cat
499 499 # hg update -C 1
500 500 $ hg merge -r 2 --config "merge-tools.true.executable=python:$TESTTMP/my path/my working merge with spaces in filename.py:myworkingmergefn"
501 501 merging f
502 502 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
503 503 (branch merge, don't forget to commit)
504 504 $ aftermerge
505 505 # cat f
506 506 revision 1
507 507 space
508 508 # hg stat
509 509 M f
510 510 # hg resolve --list
511 511 R f
512 512
513 513 #if unix-permissions
514 514
515 515 environment variables in true.executable are handled:
516 516
517 517 $ echo 'echo "custom merge tool"' > .hg/merge.sh
518 518 $ beforemerge
519 519 [merge-tools]
520 520 false.whatever=
521 521 true.priority=1
522 522 true.executable=cat
523 523 # hg update -C 1
524 524 $ hg --config merge-tools.true.executable='sh' \
525 525 > --config merge-tools.true.args=.hg/merge.sh \
526 526 > merge -r 2
527 527 merging f
528 528 custom merge tool
529 529 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
530 530 (branch merge, don't forget to commit)
531 531 $ aftermerge
532 532 # cat f
533 533 revision 1
534 534 space
535 535 # hg stat
536 536 M f
537 537 # hg resolve --list
538 538 R f
539 539
540 540 #endif
541 541
542 542 Tool selection and merge-patterns
543 543
544 544 merge-patterns specifies new tool false:
545 545
546 546 $ beforemerge
547 547 [merge-tools]
548 548 false.whatever=
549 549 true.priority=1
550 550 true.executable=cat
551 551 # hg update -C 1
552 552 $ hg merge -r 2 --config merge-patterns.f=false
553 553 merging f
554 554 merging f failed!
555 555 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
556 556 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
557 557 [1]
558 558 $ aftermerge
559 559 # cat f
560 560 revision 1
561 561 space
562 562 # hg stat
563 563 M f
564 564 ? f.orig
565 565 # hg resolve --list
566 566 U f
567 567
568 568 merge-patterns specifies executable not found in PATH and gets warning:
569 569
570 570 $ beforemerge
571 571 [merge-tools]
572 572 false.whatever=
573 573 true.priority=1
574 574 true.executable=cat
575 575 # hg update -C 1
576 576 $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=nonexistentmergetool
577 577 couldn't find merge tool true (for pattern f)
578 578 merging f
579 579 couldn't find merge tool true (for pattern f)
580 580 merging f failed!
581 581 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
582 582 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
583 583 [1]
584 584 $ aftermerge
585 585 # cat f
586 586 revision 1
587 587 space
588 588 # hg stat
589 589 M f
590 590 ? f.orig
591 591 # hg resolve --list
592 592 U f
593 593
594 594 merge-patterns specifies executable with bogus path and gets warning:
595 595
596 596 $ beforemerge
597 597 [merge-tools]
598 598 false.whatever=
599 599 true.priority=1
600 600 true.executable=cat
601 601 # hg update -C 1
602 602 $ hg merge -r 2 --config merge-patterns.f=true --config merge-tools.true.executable=/nonexistent/mergetool
603 603 couldn't find merge tool true (for pattern f)
604 604 merging f
605 605 couldn't find merge tool true (for pattern f)
606 606 merging f failed!
607 607 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
608 608 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
609 609 [1]
610 610 $ aftermerge
611 611 # cat f
612 612 revision 1
613 613 space
614 614 # hg stat
615 615 M f
616 616 ? f.orig
617 617 # hg resolve --list
618 618 U f
619 619
620 620 ui.merge overrules priority
621 621
622 622 ui.merge specifies false:
623 623
624 624 $ beforemerge
625 625 [merge-tools]
626 626 false.whatever=
627 627 true.priority=1
628 628 true.executable=cat
629 629 # hg update -C 1
630 630 $ hg merge -r 2 --config ui.merge=false
631 631 merging f
632 632 merging f failed!
633 633 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
634 634 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
635 635 [1]
636 636 $ aftermerge
637 637 # cat f
638 638 revision 1
639 639 space
640 640 # hg stat
641 641 M f
642 642 ? f.orig
643 643 # hg resolve --list
644 644 U f
645 645
646 646 ui.merge specifies internal:fail:
647 647
648 648 $ beforemerge
649 649 [merge-tools]
650 650 false.whatever=
651 651 true.priority=1
652 652 true.executable=cat
653 653 # hg update -C 1
654 654 $ hg merge -r 2 --config ui.merge=internal:fail
655 655 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
656 656 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
657 657 [1]
658 658 $ aftermerge
659 659 # cat f
660 660 revision 1
661 661 space
662 662 # hg stat
663 663 M f
664 664 # hg resolve --list
665 665 U f
666 666
667 667 ui.merge specifies :local (without internal prefix):
668 668
669 669 $ beforemerge
670 670 [merge-tools]
671 671 false.whatever=
672 672 true.priority=1
673 673 true.executable=cat
674 674 # hg update -C 1
675 675 $ hg merge -r 2 --config ui.merge=:local
676 676 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
677 677 (branch merge, don't forget to commit)
678 678 $ aftermerge
679 679 # cat f
680 680 revision 1
681 681 space
682 682 # hg stat
683 683 M f
684 684 # hg resolve --list
685 685 R f
686 686
687 687 ui.merge specifies internal:other:
688 688
689 689 $ beforemerge
690 690 [merge-tools]
691 691 false.whatever=
692 692 true.priority=1
693 693 true.executable=cat
694 694 # hg update -C 1
695 695 $ hg merge -r 2 --config ui.merge=internal:other
696 696 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
697 697 (branch merge, don't forget to commit)
698 698 $ aftermerge
699 699 # cat f
700 700 revision 2
701 701 space
702 702 # hg stat
703 703 M f
704 704 # hg resolve --list
705 705 R f
706 706
707 707 ui.merge specifies internal:prompt:
708 708
709 709 $ beforemerge
710 710 [merge-tools]
711 711 false.whatever=
712 712 true.priority=1
713 713 true.executable=cat
714 714 # hg update -C 1
715 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 719 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
718 720 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
719 721 [1]
720 722 $ aftermerge
721 723 # cat f
722 724 revision 1
723 725 space
724 726 # hg stat
725 727 M f
726 728 # hg resolve --list
727 729 U f
728 730
729 731 ui.merge specifies :prompt, with 'leave unresolved' chosen
730 732
731 733 $ beforemerge
732 734 [merge-tools]
733 735 false.whatever=
734 736 true.priority=1
735 737 true.executable=cat
736 738 # hg update -C 1
737 739 $ hg merge -r 2 --config ui.merge=:prompt --config ui.interactive=True << EOF
738 740 > u
739 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 745 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
742 746 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
743 747 [1]
744 748 $ aftermerge
745 749 # cat f
746 750 revision 1
747 751 space
748 752 # hg stat
749 753 M f
750 754 # hg resolve --list
751 755 U f
752 756
753 757 prompt with EOF
754 758
755 759 $ beforemerge
756 760 [merge-tools]
757 761 false.whatever=
758 762 true.priority=1
759 763 true.executable=cat
760 764 # hg update -C 1
761 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 769 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
764 770 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
765 771 [1]
766 772 $ aftermerge
767 773 # cat f
768 774 revision 1
769 775 space
770 776 # hg stat
771 777 M f
772 778 # hg resolve --list
773 779 U f
774 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 784 [1]
777 785 $ aftermerge
778 786 # cat f
779 787 revision 1
780 788 space
781 789 # hg stat
782 790 M f
783 791 ? f.orig
784 792 # hg resolve --list
785 793 U f
786 794 $ rm f
787 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 799 [1]
790 800 $ aftermerge
791 801 # cat f
792 802 revision 1
793 803 space
794 804 # hg stat
795 805 M f
796 806 # hg resolve --list
797 807 U f
798 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 812 [1]
801 813 $ aftermerge
802 814 # cat f
803 815 revision 1
804 816 space
805 817 # hg stat
806 818 M f
807 819 ? f.orig
808 820 # hg resolve --list
809 821 U f
810 822
811 823 ui.merge specifies internal:dump:
812 824
813 825 $ beforemerge
814 826 [merge-tools]
815 827 false.whatever=
816 828 true.priority=1
817 829 true.executable=cat
818 830 # hg update -C 1
819 831 $ hg merge -r 2 --config ui.merge=internal:dump
820 832 merging f
821 833 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
822 834 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
823 835 [1]
824 836 $ aftermerge
825 837 # cat f
826 838 revision 1
827 839 space
828 840 # hg stat
829 841 M f
830 842 ? f.base
831 843 ? f.local
832 844 ? f.orig
833 845 ? f.other
834 846 # hg resolve --list
835 847 U f
836 848
837 849 f.base:
838 850
839 851 $ cat f.base
840 852 revision 0
841 853 space
842 854
843 855 f.local:
844 856
845 857 $ cat f.local
846 858 revision 1
847 859 space
848 860
849 861 f.other:
850 862
851 863 $ cat f.other
852 864 revision 2
853 865 space
854 866 $ rm f.base f.local f.other
855 867
856 868 check that internal:dump doesn't dump files if premerge runs
857 869 successfully
858 870
859 871 $ beforemerge
860 872 [merge-tools]
861 873 false.whatever=
862 874 true.priority=1
863 875 true.executable=cat
864 876 # hg update -C 1
865 877 $ hg merge -r 3 --config ui.merge=internal:dump
866 878 merging f
867 879 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
868 880 (branch merge, don't forget to commit)
869 881
870 882 $ aftermerge
871 883 # cat f
872 884 revision 1
873 885 space
874 886 revision 3
875 887 # hg stat
876 888 M f
877 889 # hg resolve --list
878 890 R f
879 891
880 892 check that internal:forcedump dumps files, even if local and other can
881 893 be merged easily
882 894
883 895 $ beforemerge
884 896 [merge-tools]
885 897 false.whatever=
886 898 true.priority=1
887 899 true.executable=cat
888 900 # hg update -C 1
889 901 $ hg merge -r 3 --config ui.merge=internal:forcedump
890 902 merging f
891 903 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
892 904 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
893 905 [1]
894 906 $ aftermerge
895 907 # cat f
896 908 revision 1
897 909 space
898 910 # hg stat
899 911 M f
900 912 ? f.base
901 913 ? f.local
902 914 ? f.orig
903 915 ? f.other
904 916 # hg resolve --list
905 917 U f
906 918
907 919 $ cat f.base
908 920 revision 0
909 921 space
910 922
911 923 $ cat f.local
912 924 revision 1
913 925 space
914 926
915 927 $ cat f.other
916 928 revision 0
917 929 space
918 930 revision 3
919 931
920 932 $ rm -f f.base f.local f.other
921 933
922 934 ui.merge specifies internal:other but is overruled by pattern for false:
923 935
924 936 $ beforemerge
925 937 [merge-tools]
926 938 false.whatever=
927 939 true.priority=1
928 940 true.executable=cat
929 941 # hg update -C 1
930 942 $ hg merge -r 2 --config ui.merge=internal:other --config merge-patterns.f=false
931 943 merging f
932 944 merging f failed!
933 945 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
934 946 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
935 947 [1]
936 948 $ aftermerge
937 949 # cat f
938 950 revision 1
939 951 space
940 952 # hg stat
941 953 M f
942 954 ? f.orig
943 955 # hg resolve --list
944 956 U f
945 957
946 958 Premerge
947 959
948 960 ui.merge specifies internal:other but is overruled by --tool=false
949 961
950 962 $ beforemerge
951 963 [merge-tools]
952 964 false.whatever=
953 965 true.priority=1
954 966 true.executable=cat
955 967 # hg update -C 1
956 968 $ hg merge -r 2 --config ui.merge=internal:other --tool=false
957 969 merging f
958 970 merging f failed!
959 971 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
960 972 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
961 973 [1]
962 974 $ aftermerge
963 975 # cat f
964 976 revision 1
965 977 space
966 978 # hg stat
967 979 M f
968 980 ? f.orig
969 981 # hg resolve --list
970 982 U f
971 983
972 984 HGMERGE specifies internal:other but is overruled by --tool=false
973 985
974 986 $ HGMERGE=internal:other ; export HGMERGE
975 987 $ beforemerge
976 988 [merge-tools]
977 989 false.whatever=
978 990 true.priority=1
979 991 true.executable=cat
980 992 # hg update -C 1
981 993 $ hg merge -r 2 --tool=false
982 994 merging f
983 995 merging f failed!
984 996 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
985 997 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
986 998 [1]
987 999 $ aftermerge
988 1000 # cat f
989 1001 revision 1
990 1002 space
991 1003 # hg stat
992 1004 M f
993 1005 ? f.orig
994 1006 # hg resolve --list
995 1007 U f
996 1008
997 1009 $ unset HGMERGE # make sure HGMERGE doesn't interfere with remaining tests
998 1010
999 1011 update is a merge ...
1000 1012
1001 1013 (this also tests that files reverted with '--rev REV' are treated as
1002 1014 "modified", even if none of mode, size and timestamp of them isn't
1003 1015 changed on the filesystem (see also issue4583))
1004 1016
1005 1017 $ cat >> $HGRCPATH <<EOF
1006 1018 > [fakedirstatewritetime]
1007 1019 > # emulate invoking dirstate.write() via repo.status()
1008 1020 > # at 2000-01-01 00:00
1009 1021 > fakenow = 200001010000
1010 1022 > EOF
1011 1023
1012 1024 $ beforemerge
1013 1025 [merge-tools]
1014 1026 false.whatever=
1015 1027 true.priority=1
1016 1028 true.executable=cat
1017 1029 # hg update -C 1
1018 1030 $ hg update -q 0
1019 1031 $ f -s f
1020 1032 f: size=17
1021 1033 $ touch -t 200001010000 f
1022 1034 $ hg debugrebuildstate
1023 1035 $ cat >> $HGRCPATH <<EOF
1024 1036 > [extensions]
1025 1037 > fakedirstatewritetime = $TESTDIR/fakedirstatewritetime.py
1026 1038 > EOF
1027 1039 $ hg revert -q -r 1 .
1028 1040 $ cat >> $HGRCPATH <<EOF
1029 1041 > [extensions]
1030 1042 > fakedirstatewritetime = !
1031 1043 > EOF
1032 1044 $ f -s f
1033 1045 f: size=17
1034 1046 $ touch -t 200001010000 f
1035 1047 $ hg status f
1036 1048 M f
1037 1049 $ hg update -r 2
1038 1050 merging f
1039 1051 revision 1
1040 1052 space
1041 1053 revision 0
1042 1054 space
1043 1055 revision 2
1044 1056 space
1045 1057 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1046 1058 $ aftermerge
1047 1059 # cat f
1048 1060 revision 1
1049 1061 space
1050 1062 # hg stat
1051 1063 M f
1052 1064 # hg resolve --list
1053 1065 R f
1054 1066
1055 1067 update should also have --tool
1056 1068
1057 1069 $ beforemerge
1058 1070 [merge-tools]
1059 1071 false.whatever=
1060 1072 true.priority=1
1061 1073 true.executable=cat
1062 1074 # hg update -C 1
1063 1075 $ hg update -q 0
1064 1076 $ f -s f
1065 1077 f: size=17
1066 1078 $ touch -t 200001010000 f
1067 1079 $ hg debugrebuildstate
1068 1080 $ cat >> $HGRCPATH <<EOF
1069 1081 > [extensions]
1070 1082 > fakedirstatewritetime = $TESTDIR/fakedirstatewritetime.py
1071 1083 > EOF
1072 1084 $ hg revert -q -r 1 .
1073 1085 $ cat >> $HGRCPATH <<EOF
1074 1086 > [extensions]
1075 1087 > fakedirstatewritetime = !
1076 1088 > EOF
1077 1089 $ f -s f
1078 1090 f: size=17
1079 1091 $ touch -t 200001010000 f
1080 1092 $ hg status f
1081 1093 M f
1082 1094 $ hg update -r 2 --tool false
1083 1095 merging f
1084 1096 merging f failed!
1085 1097 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1086 1098 use 'hg resolve' to retry unresolved file merges
1087 1099 [1]
1088 1100 $ aftermerge
1089 1101 # cat f
1090 1102 revision 1
1091 1103 space
1092 1104 # hg stat
1093 1105 M f
1094 1106 ? f.orig
1095 1107 # hg resolve --list
1096 1108 U f
1097 1109
1098 1110 Default is silent simplemerge:
1099 1111
1100 1112 $ beforemerge
1101 1113 [merge-tools]
1102 1114 false.whatever=
1103 1115 true.priority=1
1104 1116 true.executable=cat
1105 1117 # hg update -C 1
1106 1118 $ hg merge -r 3
1107 1119 merging f
1108 1120 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1109 1121 (branch merge, don't forget to commit)
1110 1122 $ aftermerge
1111 1123 # cat f
1112 1124 revision 1
1113 1125 space
1114 1126 revision 3
1115 1127 # hg stat
1116 1128 M f
1117 1129 # hg resolve --list
1118 1130 R f
1119 1131
1120 1132 .premerge=True is same:
1121 1133
1122 1134 $ beforemerge
1123 1135 [merge-tools]
1124 1136 false.whatever=
1125 1137 true.priority=1
1126 1138 true.executable=cat
1127 1139 # hg update -C 1
1128 1140 $ hg merge -r 3 --config merge-tools.true.premerge=True
1129 1141 merging f
1130 1142 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1131 1143 (branch merge, don't forget to commit)
1132 1144 $ aftermerge
1133 1145 # cat f
1134 1146 revision 1
1135 1147 space
1136 1148 revision 3
1137 1149 # hg stat
1138 1150 M f
1139 1151 # hg resolve --list
1140 1152 R f
1141 1153
1142 1154 .premerge=False executes merge-tool:
1143 1155
1144 1156 $ beforemerge
1145 1157 [merge-tools]
1146 1158 false.whatever=
1147 1159 true.priority=1
1148 1160 true.executable=cat
1149 1161 # hg update -C 1
1150 1162 $ hg merge -r 3 --config merge-tools.true.premerge=False
1151 1163 merging f
1152 1164 revision 1
1153 1165 space
1154 1166 revision 0
1155 1167 space
1156 1168 revision 0
1157 1169 space
1158 1170 revision 3
1159 1171 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1160 1172 (branch merge, don't forget to commit)
1161 1173 $ aftermerge
1162 1174 # cat f
1163 1175 revision 1
1164 1176 space
1165 1177 # hg stat
1166 1178 M f
1167 1179 # hg resolve --list
1168 1180 R f
1169 1181
1170 1182 premerge=keep keeps conflict markers in:
1171 1183
1172 1184 $ beforemerge
1173 1185 [merge-tools]
1174 1186 false.whatever=
1175 1187 true.priority=1
1176 1188 true.executable=cat
1177 1189 # hg update -C 1
1178 1190 $ hg merge -r 4 --config merge-tools.true.premerge=keep
1179 1191 merging f
1180 1192 <<<<<<< working copy: ef83787e2614 - test: revision 1
1181 1193 revision 1
1182 1194 space
1183 1195 =======
1184 1196 revision 4
1185 1197 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1186 1198 revision 0
1187 1199 space
1188 1200 revision 4
1189 1201 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1190 1202 (branch merge, don't forget to commit)
1191 1203 $ aftermerge
1192 1204 # cat f
1193 1205 <<<<<<< working copy: ef83787e2614 - test: revision 1
1194 1206 revision 1
1195 1207 space
1196 1208 =======
1197 1209 revision 4
1198 1210 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1199 1211 # hg stat
1200 1212 M f
1201 1213 # hg resolve --list
1202 1214 R f
1203 1215
1204 1216 premerge=keep-merge3 keeps conflict markers with base content:
1205 1217
1206 1218 $ beforemerge
1207 1219 [merge-tools]
1208 1220 false.whatever=
1209 1221 true.priority=1
1210 1222 true.executable=cat
1211 1223 # hg update -C 1
1212 1224 $ hg merge -r 4 --config merge-tools.true.premerge=keep-merge3
1213 1225 merging f
1214 1226 <<<<<<< working copy: ef83787e2614 - test: revision 1
1215 1227 revision 1
1216 1228 space
1217 1229 ||||||| base
1218 1230 revision 0
1219 1231 space
1220 1232 =======
1221 1233 revision 4
1222 1234 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1223 1235 revision 0
1224 1236 space
1225 1237 revision 4
1226 1238 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1227 1239 (branch merge, don't forget to commit)
1228 1240 $ aftermerge
1229 1241 # cat f
1230 1242 <<<<<<< working copy: ef83787e2614 - test: revision 1
1231 1243 revision 1
1232 1244 space
1233 1245 ||||||| base
1234 1246 revision 0
1235 1247 space
1236 1248 =======
1237 1249 revision 4
1238 1250 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1239 1251 # hg stat
1240 1252 M f
1241 1253 # hg resolve --list
1242 1254 R f
1243 1255
1244 1256 premerge=keep respects ui.mergemarkers=basic:
1245 1257
1246 1258 $ beforemerge
1247 1259 [merge-tools]
1248 1260 false.whatever=
1249 1261 true.priority=1
1250 1262 true.executable=cat
1251 1263 # hg update -C 1
1252 1264 $ hg merge -r 4 --config merge-tools.true.premerge=keep --config ui.mergemarkers=basic
1253 1265 merging f
1254 1266 <<<<<<< working copy
1255 1267 revision 1
1256 1268 space
1257 1269 =======
1258 1270 revision 4
1259 1271 >>>>>>> merge rev
1260 1272 revision 0
1261 1273 space
1262 1274 revision 4
1263 1275 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1264 1276 (branch merge, don't forget to commit)
1265 1277 $ aftermerge
1266 1278 # cat f
1267 1279 <<<<<<< working copy
1268 1280 revision 1
1269 1281 space
1270 1282 =======
1271 1283 revision 4
1272 1284 >>>>>>> merge rev
1273 1285 # hg stat
1274 1286 M f
1275 1287 # hg resolve --list
1276 1288 R f
1277 1289
1278 1290 premerge=keep ignores ui.mergemarkers=basic if true.mergemarkers=detailed:
1279 1291
1280 1292 $ beforemerge
1281 1293 [merge-tools]
1282 1294 false.whatever=
1283 1295 true.priority=1
1284 1296 true.executable=cat
1285 1297 # hg update -C 1
1286 1298 $ hg merge -r 4 --config merge-tools.true.premerge=keep \
1287 1299 > --config ui.mergemarkers=basic \
1288 1300 > --config merge-tools.true.mergemarkers=detailed
1289 1301 merging f
1290 1302 <<<<<<< working copy: ef83787e2614 - test: revision 1
1291 1303 revision 1
1292 1304 space
1293 1305 =======
1294 1306 revision 4
1295 1307 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1296 1308 revision 0
1297 1309 space
1298 1310 revision 4
1299 1311 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1300 1312 (branch merge, don't forget to commit)
1301 1313 $ aftermerge
1302 1314 # cat f
1303 1315 <<<<<<< working copy: ef83787e2614 - test: revision 1
1304 1316 revision 1
1305 1317 space
1306 1318 =======
1307 1319 revision 4
1308 1320 >>>>>>> merge rev: 81448d39c9a0 - test: revision 4
1309 1321 # hg stat
1310 1322 M f
1311 1323 # hg resolve --list
1312 1324 R f
1313 1325
1314 1326 premerge=keep respects ui.mergemarkertemplate instead of
1315 1327 true.mergemarkertemplate if true.mergemarkers=basic:
1316 1328
1317 1329 $ beforemerge
1318 1330 [merge-tools]
1319 1331 false.whatever=
1320 1332 true.priority=1
1321 1333 true.executable=cat
1322 1334 # hg update -C 1
1323 1335 $ hg merge -r 4 --config merge-tools.true.premerge=keep \
1324 1336 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1325 1337 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}'
1326 1338 merging f
1327 1339 <<<<<<< working copy: uitmpl 1
1328 1340 revision 1
1329 1341 space
1330 1342 =======
1331 1343 revision 4
1332 1344 >>>>>>> merge rev: uitmpl 4
1333 1345 revision 0
1334 1346 space
1335 1347 revision 4
1336 1348 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1337 1349 (branch merge, don't forget to commit)
1338 1350 $ aftermerge
1339 1351 # cat f
1340 1352 <<<<<<< working copy: uitmpl 1
1341 1353 revision 1
1342 1354 space
1343 1355 =======
1344 1356 revision 4
1345 1357 >>>>>>> merge rev: uitmpl 4
1346 1358 # hg stat
1347 1359 M f
1348 1360 # hg resolve --list
1349 1361 R f
1350 1362
1351 1363 premerge=keep respects true.mergemarkertemplate instead of
1352 1364 true.mergemarkertemplate if true.mergemarkers=detailed:
1353 1365
1354 1366 $ beforemerge
1355 1367 [merge-tools]
1356 1368 false.whatever=
1357 1369 true.priority=1
1358 1370 true.executable=cat
1359 1371 # hg update -C 1
1360 1372 $ hg merge -r 4 --config merge-tools.true.premerge=keep \
1361 1373 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1362 1374 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1363 1375 > --config merge-tools.true.mergemarkers=detailed
1364 1376 merging f
1365 1377 <<<<<<< working copy: tooltmpl ef83787e2614
1366 1378 revision 1
1367 1379 space
1368 1380 =======
1369 1381 revision 4
1370 1382 >>>>>>> merge rev: tooltmpl 81448d39c9a0
1371 1383 revision 0
1372 1384 space
1373 1385 revision 4
1374 1386 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1375 1387 (branch merge, don't forget to commit)
1376 1388 $ aftermerge
1377 1389 # cat f
1378 1390 <<<<<<< working copy: tooltmpl ef83787e2614
1379 1391 revision 1
1380 1392 space
1381 1393 =======
1382 1394 revision 4
1383 1395 >>>>>>> merge rev: tooltmpl 81448d39c9a0
1384 1396 # hg stat
1385 1397 M f
1386 1398 # hg resolve --list
1387 1399 R f
1388 1400
1389 1401 Tool execution
1390 1402
1391 1403 set tools.args explicit to include $base $local $other $output:
1392 1404
1393 1405 $ beforemerge
1394 1406 [merge-tools]
1395 1407 false.whatever=
1396 1408 true.priority=1
1397 1409 true.executable=cat
1398 1410 # hg update -C 1
1399 1411 $ hg merge -r 2 --config merge-tools.true.executable=head --config merge-tools.true.args='$base $local $other $output' \
1400 1412 > | sed 's,==> .* <==,==> ... <==,g'
1401 1413 merging f
1402 1414 ==> ... <==
1403 1415 revision 0
1404 1416 space
1405 1417
1406 1418 ==> ... <==
1407 1419 revision 1
1408 1420 space
1409 1421
1410 1422 ==> ... <==
1411 1423 revision 2
1412 1424 space
1413 1425
1414 1426 ==> ... <==
1415 1427 revision 1
1416 1428 space
1417 1429 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1418 1430 (branch merge, don't forget to commit)
1419 1431 $ aftermerge
1420 1432 # cat f
1421 1433 revision 1
1422 1434 space
1423 1435 # hg stat
1424 1436 M f
1425 1437 # hg resolve --list
1426 1438 R f
1427 1439
1428 1440 Merge with "echo mergeresult > $local":
1429 1441
1430 1442 $ beforemerge
1431 1443 [merge-tools]
1432 1444 false.whatever=
1433 1445 true.priority=1
1434 1446 true.executable=cat
1435 1447 # hg update -C 1
1436 1448 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $local'
1437 1449 merging f
1438 1450 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1439 1451 (branch merge, don't forget to commit)
1440 1452 $ aftermerge
1441 1453 # cat f
1442 1454 mergeresult
1443 1455 # hg stat
1444 1456 M f
1445 1457 # hg resolve --list
1446 1458 R f
1447 1459
1448 1460 - and $local is the file f:
1449 1461
1450 1462 $ beforemerge
1451 1463 [merge-tools]
1452 1464 false.whatever=
1453 1465 true.priority=1
1454 1466 true.executable=cat
1455 1467 # hg update -C 1
1456 1468 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > f'
1457 1469 merging f
1458 1470 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1459 1471 (branch merge, don't forget to commit)
1460 1472 $ aftermerge
1461 1473 # cat f
1462 1474 mergeresult
1463 1475 # hg stat
1464 1476 M f
1465 1477 # hg resolve --list
1466 1478 R f
1467 1479
1468 1480 Merge with "echo mergeresult > $output" - the variable is a bit magic:
1469 1481
1470 1482 $ beforemerge
1471 1483 [merge-tools]
1472 1484 false.whatever=
1473 1485 true.priority=1
1474 1486 true.executable=cat
1475 1487 # hg update -C 1
1476 1488 $ hg merge -r 2 --config merge-tools.true.executable=echo --config merge-tools.true.args='mergeresult > $output'
1477 1489 merging f
1478 1490 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1479 1491 (branch merge, don't forget to commit)
1480 1492 $ aftermerge
1481 1493 # cat f
1482 1494 mergeresult
1483 1495 # hg stat
1484 1496 M f
1485 1497 # hg resolve --list
1486 1498 R f
1487 1499
1488 1500 Merge using tool with a path that must be quoted:
1489 1501
1490 1502 $ beforemerge
1491 1503 [merge-tools]
1492 1504 false.whatever=
1493 1505 true.priority=1
1494 1506 true.executable=cat
1495 1507 # hg update -C 1
1496 1508 $ cat <<EOF > 'my merge tool'
1497 1509 > cat "\$1" "\$2" "\$3" > "\$4"
1498 1510 > EOF
1499 1511 $ hg --config merge-tools.true.executable='sh' \
1500 1512 > --config merge-tools.true.args='"./my merge tool" $base $local $other $output' \
1501 1513 > merge -r 2
1502 1514 merging f
1503 1515 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1504 1516 (branch merge, don't forget to commit)
1505 1517 $ rm -f 'my merge tool'
1506 1518 $ aftermerge
1507 1519 # cat f
1508 1520 revision 0
1509 1521 space
1510 1522 revision 1
1511 1523 space
1512 1524 revision 2
1513 1525 space
1514 1526 # hg stat
1515 1527 M f
1516 1528 # hg resolve --list
1517 1529 R f
1518 1530
1519 1531 Merge using a tool that supports labellocal, labelother, and labelbase, checking
1520 1532 that they're quoted properly as well. This is using the default 'basic'
1521 1533 mergemarkers even though ui.mergemarkers is 'detailed', so it's ignoring both
1522 1534 mergemarkertemplate settings:
1523 1535
1524 1536 $ beforemerge
1525 1537 [merge-tools]
1526 1538 false.whatever=
1527 1539 true.priority=1
1528 1540 true.executable=cat
1529 1541 # hg update -C 1
1530 1542 $ cat <<EOF > printargs_merge_tool
1531 1543 > while test \$# -gt 0; do echo arg: \"\$1\"; shift; done
1532 1544 > EOF
1533 1545 $ hg --config merge-tools.true.executable='sh' \
1534 1546 > --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \
1535 1547 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1536 1548 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1537 1549 > --config ui.mergemarkers=detailed \
1538 1550 > merge -r 2
1539 1551 merging f
1540 1552 arg: "ll:working copy"
1541 1553 arg: "lo:"
1542 1554 arg: "merge rev"
1543 1555 arg: "lb:base: */f~base.*" (glob)
1544 1556 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1545 1557 (branch merge, don't forget to commit)
1546 1558 $ rm -f 'printargs_merge_tool'
1547 1559
1548 1560 Same test with experimental.mergetempdirprefix set:
1549 1561
1550 1562 $ beforemerge
1551 1563 [merge-tools]
1552 1564 false.whatever=
1553 1565 true.priority=1
1554 1566 true.executable=cat
1555 1567 # hg update -C 1
1556 1568 $ cat <<EOF > printargs_merge_tool
1557 1569 > while test \$# -gt 0; do echo arg: \"\$1\"; shift; done
1558 1570 > EOF
1559 1571 $ hg --config experimental.mergetempdirprefix=$TESTTMP/hgmerge. \
1560 1572 > --config merge-tools.true.executable='sh' \
1561 1573 > --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \
1562 1574 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1563 1575 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1564 1576 > --config ui.mergemarkers=detailed \
1565 1577 > merge -r 2
1566 1578 merging f
1567 1579 arg: "ll:working copy"
1568 1580 arg: "lo:"
1569 1581 arg: "merge rev"
1570 1582 arg: "lb:base: */hgmerge.*/f~base" (glob)
1571 1583 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1572 1584 (branch merge, don't forget to commit)
1573 1585 $ rm -f 'printargs_merge_tool'
1574 1586
1575 1587 Merge using a tool that supports labellocal, labelother, and labelbase, checking
1576 1588 that they're quoted properly as well. This is using 'detailed' mergemarkers,
1577 1589 even though ui.mergemarkers is 'basic', and using the tool's
1578 1590 mergemarkertemplate:
1579 1591
1580 1592 $ beforemerge
1581 1593 [merge-tools]
1582 1594 false.whatever=
1583 1595 true.priority=1
1584 1596 true.executable=cat
1585 1597 # hg update -C 1
1586 1598 $ cat <<EOF > printargs_merge_tool
1587 1599 > while test \$# -gt 0; do echo arg: \"\$1\"; shift; done
1588 1600 > EOF
1589 1601 $ hg --config merge-tools.true.executable='sh' \
1590 1602 > --config merge-tools.true.args='./printargs_merge_tool ll:$labellocal lo: $labelother lb:$labelbase": "$base' \
1591 1603 > --config merge-tools.true.mergemarkers=detailed \
1592 1604 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1593 1605 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1594 1606 > --config ui.mergemarkers=basic \
1595 1607 > merge -r 2
1596 1608 merging f
1597 1609 arg: "ll:working copy: tooltmpl ef83787e2614"
1598 1610 arg: "lo:"
1599 1611 arg: "merge rev: tooltmpl 0185f4e0cf02"
1600 1612 arg: "lb:base: */f~base.*" (glob)
1601 1613 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1602 1614 (branch merge, don't forget to commit)
1603 1615 $ rm -f 'printargs_merge_tool'
1604 1616
1605 1617 The merge tool still gets labellocal and labelother as 'basic' even when
1606 1618 premerge=keep is used and has 'detailed' markers:
1607 1619
1608 1620 $ beforemerge
1609 1621 [merge-tools]
1610 1622 false.whatever=
1611 1623 true.priority=1
1612 1624 true.executable=cat
1613 1625 # hg update -C 1
1614 1626 $ cat <<EOF > mytool
1615 1627 > echo labellocal: \"\$1\"
1616 1628 > echo labelother: \"\$2\"
1617 1629 > echo "output (arg)": \"\$3\"
1618 1630 > echo "output (contents)":
1619 1631 > cat "\$3"
1620 1632 > EOF
1621 1633 $ hg --config merge-tools.true.executable='sh' \
1622 1634 > --config merge-tools.true.args='mytool $labellocal $labelother $output' \
1623 1635 > --config merge-tools.true.premerge=keep \
1624 1636 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1625 1637 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1626 1638 > --config ui.mergemarkers=detailed \
1627 1639 > merge -r 2
1628 1640 merging f
1629 1641 labellocal: "working copy"
1630 1642 labelother: "merge rev"
1631 1643 output (arg): "$TESTTMP/repo/f"
1632 1644 output (contents):
1633 1645 <<<<<<< working copy: uitmpl 1
1634 1646 revision 1
1635 1647 =======
1636 1648 revision 2
1637 1649 >>>>>>> merge rev: uitmpl 2
1638 1650 space
1639 1651 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1640 1652 (branch merge, don't forget to commit)
1641 1653 $ rm -f 'mytool'
1642 1654
1643 1655 premerge=keep uses the *tool's* mergemarkertemplate if tool's
1644 1656 mergemarkers=detailed; labellocal and labelother also use the tool's template
1645 1657
1646 1658 $ beforemerge
1647 1659 [merge-tools]
1648 1660 false.whatever=
1649 1661 true.priority=1
1650 1662 true.executable=cat
1651 1663 # hg update -C 1
1652 1664 $ cat <<EOF > mytool
1653 1665 > echo labellocal: \"\$1\"
1654 1666 > echo labelother: \"\$2\"
1655 1667 > echo "output (arg)": \"\$3\"
1656 1668 > echo "output (contents)":
1657 1669 > cat "\$3"
1658 1670 > EOF
1659 1671 $ hg --config merge-tools.true.executable='sh' \
1660 1672 > --config merge-tools.true.args='mytool $labellocal $labelother $output' \
1661 1673 > --config merge-tools.true.premerge=keep \
1662 1674 > --config merge-tools.true.mergemarkers=detailed \
1663 1675 > --config merge-tools.true.mergemarkertemplate='tooltmpl {short(node)}' \
1664 1676 > --config ui.mergemarkertemplate='uitmpl {rev}' \
1665 1677 > --config ui.mergemarkers=detailed \
1666 1678 > merge -r 2
1667 1679 merging f
1668 1680 labellocal: "working copy: tooltmpl ef83787e2614"
1669 1681 labelother: "merge rev: tooltmpl 0185f4e0cf02"
1670 1682 output (arg): "$TESTTMP/repo/f"
1671 1683 output (contents):
1672 1684 <<<<<<< working copy: tooltmpl ef83787e2614
1673 1685 revision 1
1674 1686 =======
1675 1687 revision 2
1676 1688 >>>>>>> merge rev: tooltmpl 0185f4e0cf02
1677 1689 space
1678 1690 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1679 1691 (branch merge, don't forget to commit)
1680 1692 $ rm -f 'mytool'
1681 1693
1682 1694 Issue3581: Merging a filename that needs to be quoted
1683 1695 (This test doesn't work on Windows filesystems even on Linux, so check
1684 1696 for Unix-like permission)
1685 1697
1686 1698 #if unix-permissions
1687 1699 $ beforemerge
1688 1700 [merge-tools]
1689 1701 false.whatever=
1690 1702 true.priority=1
1691 1703 true.executable=cat
1692 1704 # hg update -C 1
1693 1705 $ echo "revision 5" > '"; exit 1; echo "'
1694 1706 $ hg commit -Am "revision 5"
1695 1707 adding "; exit 1; echo "
1696 1708 warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "'
1697 1709 $ hg update -C 1 > /dev/null
1698 1710 $ echo "revision 6" > '"; exit 1; echo "'
1699 1711 $ hg commit -Am "revision 6"
1700 1712 adding "; exit 1; echo "
1701 1713 warning: filename contains '"', which is reserved on Windows: '"; exit 1; echo "'
1702 1714 created new head
1703 1715 $ hg merge --config merge-tools.true.executable="true" -r 5
1704 1716 merging "; exit 1; echo "
1705 1717 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1706 1718 (branch merge, don't forget to commit)
1707 1719 $ hg update -C 1 > /dev/null
1708 1720
1709 1721 #else
1710 1722
1711 1723 Match the non-portable filename commits above for test stability
1712 1724
1713 1725 $ hg import --bypass -q - << EOF
1714 1726 > # HG changeset patch
1715 1727 > revision 5
1716 1728 >
1717 1729 > diff --git a/"; exit 1; echo " b/"; exit 1; echo "
1718 1730 > new file mode 100644
1719 1731 > --- /dev/null
1720 1732 > +++ b/"; exit 1; echo "
1721 1733 > @@ -0,0 +1,1 @@
1722 1734 > +revision 5
1723 1735 > EOF
1724 1736
1725 1737 $ hg import --bypass -q - << EOF
1726 1738 > # HG changeset patch
1727 1739 > revision 6
1728 1740 >
1729 1741 > diff --git a/"; exit 1; echo " b/"; exit 1; echo "
1730 1742 > new file mode 100644
1731 1743 > --- /dev/null
1732 1744 > +++ b/"; exit 1; echo "
1733 1745 > @@ -0,0 +1,1 @@
1734 1746 > +revision 6
1735 1747 > EOF
1736 1748
1737 1749 #endif
1738 1750
1739 1751 Merge post-processing
1740 1752
1741 1753 cat is a bad merge-tool and doesn't change:
1742 1754
1743 1755 $ beforemerge
1744 1756 [merge-tools]
1745 1757 false.whatever=
1746 1758 true.priority=1
1747 1759 true.executable=cat
1748 1760 # hg update -C 1
1749 1761 $ hg merge -y -r 2 --config merge-tools.true.checkchanged=1
1750 1762 merging f
1751 1763 revision 1
1752 1764 space
1753 1765 revision 0
1754 1766 space
1755 1767 revision 2
1756 1768 space
1757 1769 output file f appears unchanged
1758 1770 was merge successful (yn)? n
1759 1771 merging f failed!
1760 1772 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1761 1773 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1762 1774 [1]
1763 1775 $ aftermerge
1764 1776 # cat f
1765 1777 revision 1
1766 1778 space
1767 1779 # hg stat
1768 1780 M f
1769 1781 ? f.orig
1770 1782 # hg resolve --list
1771 1783 U f
1772 1784
1773 1785 missingbinary is a merge-tool that doesn't exist:
1774 1786
1775 1787 $ echo "missingbinary.executable=doesnotexist" >> .hg/hgrc
1776 1788 $ beforemerge
1777 1789 [merge-tools]
1778 1790 false.whatever=
1779 1791 true.priority=1
1780 1792 true.executable=cat
1781 1793 missingbinary.executable=doesnotexist
1782 1794 # hg update -C 1
1783 1795 $ hg merge -y -r 2 --config ui.merge=missingbinary
1784 1796 couldn't find merge tool missingbinary (for pattern f)
1785 1797 merging f
1786 1798 couldn't find merge tool missingbinary (for pattern f)
1787 1799 revision 1
1788 1800 space
1789 1801 revision 0
1790 1802 space
1791 1803 revision 2
1792 1804 space
1793 1805 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1794 1806 (branch merge, don't forget to commit)
1795 1807
1796 1808 $ hg update -q -C 1
1797 1809 $ rm f
1798 1810
1799 1811 internal merge cannot handle symlinks and shouldn't try:
1800 1812
1801 1813 #if symlink
1802 1814
1803 1815 $ ln -s symlink f
1804 1816 $ hg commit -qm 'f is symlink'
1805 1817
1806 1818 #else
1807 1819
1808 1820 $ hg import --bypass -q - << EOF
1809 1821 > # HG changeset patch
1810 1822 > f is symlink
1811 1823 >
1812 1824 > diff --git a/f b/f
1813 1825 > old mode 100644
1814 1826 > new mode 120000
1815 1827 > --- a/f
1816 1828 > +++ b/f
1817 1829 > @@ -1,2 +1,1 @@
1818 1830 > -revision 1
1819 1831 > -space
1820 1832 > +symlink
1821 1833 > \ No newline at end of file
1822 1834 > EOF
1823 1835
1824 1836 Resolve 'other [destination] changed f which local [working copy] deleted' prompt
1825 1837 $ hg up -q -C --config ui.interactive=True << EOF
1826 1838 > c
1827 1839 > EOF
1828 1840
1829 1841 #endif
1830 1842
1831 1843 $ hg merge -r 2 --tool internal:merge
1832 1844 merging f
1833 1845 warning: internal :merge cannot merge symlinks for f
1834 1846 warning: conflicts while merging f! (edit, then use 'hg resolve --mark')
1835 1847 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1836 1848 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1837 1849 [1]
1838 1850
1839 1851 Verify naming of temporary files and that extension is preserved:
1840 1852
1841 1853 $ hg update -q -C 1
1842 1854 $ hg mv f f.txt
1843 1855 $ hg ci -qm "f.txt"
1844 1856 $ hg update -q -C 2
1845 1857 $ hg merge -y -r tip --tool echo --config merge-tools.echo.args='$base $local $other $output'
1846 1858 merging f and f.txt to f.txt
1847 1859 */f~base.* */f~local.*.txt */f~other.*.txt $TESTTMP/repo/f.txt (glob)
1848 1860 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1849 1861 (branch merge, don't forget to commit)
1850 1862
1851 1863 Verify naming of temporary files and that extension is preserved
1852 1864 (experimental.mergetempdirprefix version):
1853 1865
1854 1866 $ hg update -q -C 1
1855 1867 $ hg mv f f.txt
1856 1868 $ hg ci -qm "f.txt"
1857 1869 $ hg update -q -C 2
1858 1870 $ hg merge -y -r tip --tool echo \
1859 1871 > --config merge-tools.echo.args='$base $local $other $output' \
1860 1872 > --config experimental.mergetempdirprefix=$TESTTMP/hgmerge.
1861 1873 merging f and f.txt to f.txt
1862 1874 $TESTTMP/hgmerge.*/f~base $TESTTMP/hgmerge.*/f~local.txt $TESTTMP/hgmerge.*/f~other.txt $TESTTMP/repo/f.txt (glob)
1863 1875 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1864 1876 (branch merge, don't forget to commit)
1865 1877
1866 1878 Binary files capability checking
1867 1879
1868 1880 $ hg update -q -C 0
1869 1881 $ python <<EOF
1870 1882 > with open('b', 'wb') as fp:
1871 1883 > fp.write(b'\x00\x01\x02\x03')
1872 1884 > EOF
1873 1885 $ hg add b
1874 1886 $ hg commit -qm "add binary file (#1)"
1875 1887
1876 1888 $ hg update -q -C 0
1877 1889 $ python <<EOF
1878 1890 > with open('b', 'wb') as fp:
1879 1891 > fp.write(b'\x03\x02\x01\x00')
1880 1892 > EOF
1881 1893 $ hg add b
1882 1894 $ hg commit -qm "add binary file (#2)"
1883 1895
1884 1896 By default, binary files capability of internal merge tools is not
1885 1897 checked strictly.
1886 1898
1887 1899 (for merge-patterns, chosen unintentionally)
1888 1900
1889 1901 $ hg merge 9 \
1890 1902 > --config merge-patterns.b=:merge-other \
1891 1903 > --config merge-patterns.re:[a-z]=:other
1892 1904 warning: check merge-patterns configurations, if ':merge-other' for binary file 'b' is unintentional
1893 1905 (see 'hg help merge-tools' for binary files capability)
1894 1906 merging b
1895 1907 warning: b looks like a binary file.
1896 1908 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1897 1909 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1898 1910 [1]
1899 1911 $ hg merge --abort -q
1900 1912
1901 1913 (for ui.merge, ignored unintentionally)
1902 1914
1903 1915 $ hg merge 9 \
1904 1916 > --config merge-tools.:other.binary=true \
1905 1917 > --config ui.merge=:other
1906 1918 tool :other (for pattern b) can't handle binary
1907 1919 tool true can't handle binary
1908 1920 tool :other can't handle binary
1909 1921 tool false can't handle binary
1910 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 1926 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
1913 1927 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
1914 1928 [1]
1915 1929 $ hg merge --abort -q
1916 1930
1917 1931 With merge.strict-capability-check=true, binary files capability of
1918 1932 internal merge tools is checked strictly.
1919 1933
1920 1934 $ f --hexdump b
1921 1935 b:
1922 1936 0000: 03 02 01 00 |....|
1923 1937
1924 1938 (for merge-patterns)
1925 1939
1926 1940 $ hg merge 9 --config merge.strict-capability-check=true \
1927 1941 > --config merge-tools.:merge-other.binary=true \
1928 1942 > --config merge-patterns.b=:merge-other \
1929 1943 > --config merge-patterns.re:[a-z]=:other
1930 1944 tool :merge-other (for pattern b) can't handle binary
1931 1945 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1932 1946 (branch merge, don't forget to commit)
1933 1947 $ f --hexdump b
1934 1948 b:
1935 1949 0000: 00 01 02 03 |....|
1936 1950 $ hg merge --abort -q
1937 1951
1938 1952 (for ui.merge)
1939 1953
1940 1954 $ hg merge 9 --config merge.strict-capability-check=true \
1941 1955 > --config ui.merge=:other
1942 1956 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1943 1957 (branch merge, don't forget to commit)
1944 1958 $ f --hexdump b
1945 1959 b:
1946 1960 0000: 00 01 02 03 |....|
1947 1961 $ hg merge --abort -q
1948 1962
1949 1963 Check that the extra information is printed correctly
1950 1964
1951 1965 $ hg merge 9 \
1952 1966 > --config merge-tools.testecho.executable='echo' \
1953 1967 > --config merge-tools.testecho.args='merge runs here ...' \
1954 1968 > --config merge-tools.testecho.binary=True \
1955 1969 > --config ui.merge=testecho \
1956 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 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 1972 merging b
1959 1973
1960 1974 Running merge tool for b ("*/bin/echo.exe"): (glob) (windows !)
1961 1975 Running merge tool for b (*/bin/echo): (glob) (no-windows !)
1962 1976 - local (working copy): 10:2d1f533d add binary file (#2) tip default
1963 1977 - base (base): -1:00000000 default
1964 1978 - other (merge rev): 9:1e7ad7d7 add binary file (#1) default
1965 1979 merge runs here ...
1966 1980 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
1967 1981 (branch merge, don't forget to commit)
1968 1982
1969 1983 Check that debugpicktool examines which merge tool is chosen for
1970 1984 specified file as expected
1971 1985
1972 1986 $ beforemerge
1973 1987 [merge-tools]
1974 1988 false.whatever=
1975 1989 true.priority=1
1976 1990 true.executable=cat
1977 1991 missingbinary.executable=doesnotexist
1978 1992 # hg update -C 1
1979 1993
1980 1994 (default behavior: checking files in the working parent context)
1981 1995
1982 1996 $ hg manifest
1983 1997 f
1984 1998 $ hg debugpickmergetool
1985 1999 f = true
1986 2000
1987 2001 (-X/-I and file patterns limmit examination targets)
1988 2002
1989 2003 $ hg debugpickmergetool -X f
1990 2004 $ hg debugpickmergetool unknown
1991 2005 unknown: no such file in rev ef83787e2614
1992 2006
1993 2007 (--changedelete emulates merging change and delete)
1994 2008
1995 2009 $ hg debugpickmergetool --changedelete
1996 2010 f = :prompt
1997 2011
1998 2012 (-r REV causes checking files in specified revision)
1999 2013
2000 2014 $ hg manifest -r 8
2001 2015 f.txt
2002 2016 $ hg debugpickmergetool -r 8
2003 2017 f.txt = true
2004 2018
2005 2019 #if symlink
2006 2020
2007 2021 (symlink causes chosing :prompt)
2008 2022
2009 2023 $ hg debugpickmergetool -r 6d00b3726f6e
2010 2024 f = :prompt
2011 2025
2012 2026 (by default, it is assumed that no internal merge tools has symlinks
2013 2027 capability)
2014 2028
2015 2029 $ hg debugpickmergetool \
2016 2030 > -r 6d00b3726f6e \
2017 2031 > --config merge-tools.:merge-other.symlink=true \
2018 2032 > --config merge-patterns.f=:merge-other \
2019 2033 > --config merge-patterns.re:[f]=:merge-local \
2020 2034 > --config merge-patterns.re:[a-z]=:other
2021 2035 f = :prompt
2022 2036
2023 2037 $ hg debugpickmergetool \
2024 2038 > -r 6d00b3726f6e \
2025 2039 > --config merge-tools.:other.symlink=true \
2026 2040 > --config ui.merge=:other
2027 2041 f = :prompt
2028 2042
2029 2043 (with strict-capability-check=true, actual symlink capabilities are
2030 2044 checked striclty)
2031 2045
2032 2046 $ hg debugpickmergetool --config merge.strict-capability-check=true \
2033 2047 > -r 6d00b3726f6e \
2034 2048 > --config merge-tools.:merge-other.symlink=true \
2035 2049 > --config merge-patterns.f=:merge-other \
2036 2050 > --config merge-patterns.re:[f]=:merge-local \
2037 2051 > --config merge-patterns.re:[a-z]=:other
2038 2052 f = :other
2039 2053
2040 2054 $ hg debugpickmergetool --config merge.strict-capability-check=true \
2041 2055 > -r 6d00b3726f6e \
2042 2056 > --config ui.merge=:other
2043 2057 f = :other
2044 2058
2045 2059 $ hg debugpickmergetool --config merge.strict-capability-check=true \
2046 2060 > -r 6d00b3726f6e \
2047 2061 > --config merge-tools.:merge-other.symlink=true \
2048 2062 > --config ui.merge=:merge-other
2049 2063 f = :prompt
2050 2064
2051 2065 #endif
2052 2066
2053 2067 (--verbose shows some configurations)
2054 2068
2055 2069 $ hg debugpickmergetool --tool foobar -v
2056 2070 with --tool 'foobar'
2057 2071 f = foobar
2058 2072
2059 2073 $ HGMERGE=false hg debugpickmergetool -v
2060 2074 with HGMERGE='false'
2061 2075 f = false
2062 2076
2063 2077 $ hg debugpickmergetool --config ui.merge=false -v
2064 2078 with ui.merge='false'
2065 2079 f = false
2066 2080
2067 2081 (--debug shows errors detected intermediately)
2068 2082
2069 2083 $ hg debugpickmergetool --config merge-patterns.f=true --config merge-tools.true.executable=nonexistentmergetool --debug f
2070 2084 couldn't find merge tool true (for pattern f)
2071 2085 couldn't find merge tool true
2072 2086 f = false
2073 2087
2074 2088 $ cd ..
@@ -1,448 +1,472 b''
1 1 #require symlink execbit
2 2
3 3 $ tellmeabout() {
4 4 > if [ -h $1 ]; then
5 5 > echo $1 is a symlink:
6 6 > $TESTDIR/readlink.py $1
7 7 > elif [ -x $1 ]; then
8 8 > echo $1 is an executable file with content:
9 9 > cat $1
10 10 > else
11 11 > echo $1 is a plain file with content:
12 12 > cat $1
13 13 > fi
14 14 > }
15 15
16 16 $ hg init test1
17 17 $ cd test1
18 18
19 19 $ echo a > a
20 20 $ hg ci -Aqmadd
21 21 $ chmod +x a
22 22 $ hg ci -mexecutable
23 23
24 24 $ hg up -q 0
25 25 $ rm a
26 26 $ ln -s symlink a
27 27 $ hg ci -msymlink
28 28 created new head
29 29
30 30 Symlink is local parent, executable is other:
31 31
32 32 $ hg merge --debug
33 33 resolving manifests
34 34 branchmerge: True, force: False, partial: False
35 35 ancestor: c334dc3be0da, local: 521a1e40188f+, remote: 3574f3e69b1c
36 36 preserving a for resolve of a
37 37 a: versions differ -> m (premerge)
38 38 tool internal:merge (for pattern a) can't handle symlinks
39 39 couldn't find merge tool hgmerge
40 40 no tool found to merge a
41 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 45 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
44 46 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
45 47 [1]
46 48
47 49 $ tellmeabout a
48 50 a is a symlink:
49 51 a -> symlink
50 52 $ hg resolve a --tool internal:other
51 53 (no more unresolved files)
52 54 $ tellmeabout a
53 55 a is an executable file with content:
54 56 a
55 57 $ hg st
56 58 M a
57 59 ? a.orig
58 60
59 61 Symlink is other parent, executable is local:
60 62
61 63 $ hg update -C 1
62 64 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
63 65
64 66 $ hg merge --debug --tool :union
65 67 resolving manifests
66 68 branchmerge: True, force: False, partial: False
67 69 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
68 70 preserving a for resolve of a
69 71 a: versions differ -> m (premerge)
70 72 picked tool ':union' for a (binary False symlink True changedelete False)
71 73 merging a
72 74 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
73 75 warning: internal :union cannot merge symlinks for a
74 76 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
75 77 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
76 78 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
77 79 [1]
78 80
79 81 $ tellmeabout a
80 82 a is an executable file with content:
81 83 a
82 84
83 85 $ hg update -C 1
84 86 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
85 87
86 88 $ hg merge --debug --tool :merge3
87 89 resolving manifests
88 90 branchmerge: True, force: False, partial: False
89 91 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
90 92 preserving a for resolve of a
91 93 a: versions differ -> m (premerge)
92 94 picked tool ':merge3' for a (binary False symlink True changedelete False)
93 95 merging a
94 96 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
95 97 warning: internal :merge3 cannot merge symlinks for a
96 98 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
97 99 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
98 100 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
99 101 [1]
100 102
101 103 $ tellmeabout a
102 104 a is an executable file with content:
103 105 a
104 106
105 107 $ hg update -C 1
106 108 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
107 109
108 110 $ hg merge --debug --tool :merge-local
109 111 resolving manifests
110 112 branchmerge: True, force: False, partial: False
111 113 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
112 114 preserving a for resolve of a
113 115 a: versions differ -> m (premerge)
114 116 picked tool ':merge-local' for a (binary False symlink True changedelete False)
115 117 merging a
116 118 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
117 119 warning: internal :merge-local cannot merge symlinks for a
118 120 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
119 121 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
120 122 [1]
121 123
122 124 $ tellmeabout a
123 125 a is an executable file with content:
124 126 a
125 127
126 128 $ hg update -C 1
127 129 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
128 130
129 131 $ hg merge --debug --tool :merge-other
130 132 resolving manifests
131 133 branchmerge: True, force: False, partial: False
132 134 ancestor: c334dc3be0da, local: 3574f3e69b1c+, remote: 521a1e40188f
133 135 preserving a for resolve of a
134 136 a: versions differ -> m (premerge)
135 137 picked tool ':merge-other' for a (binary False symlink True changedelete False)
136 138 merging a
137 139 my a@3574f3e69b1c+ other a@521a1e40188f ancestor a@c334dc3be0da
138 140 warning: internal :merge-other cannot merge symlinks for a
139 141 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
140 142 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
141 143 [1]
142 144
143 145 $ tellmeabout a
144 146 a is an executable file with content:
145 147 a
146 148
147 149 Update to link without local change should get us a symlink (issue3316):
148 150
149 151 $ hg up -C 0
150 152 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
151 153 $ hg up
152 154 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
153 155 updated to "521a1e40188f: symlink"
154 156 1 other heads for branch "default"
155 157 $ hg st
156 158 ? a.orig
157 159
158 160 Update to link with local change should cause a merge prompt (issue3200):
159 161
160 162 $ hg up -Cq 0
161 163 $ echo data > a
162 164 $ HGMERGE= hg up -y --debug --config ui.merge=
163 165 resolving manifests
164 166 branchmerge: False, force: False, partial: False
165 167 ancestor: c334dc3be0da, local: c334dc3be0da+, remote: 521a1e40188f
166 168 preserving a for resolve of a
167 169 a: versions differ -> m (premerge)
168 170 (couldn't find merge tool hgmerge|tool hgmerge can't handle symlinks) (re)
169 171 no tool found to merge a
170 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 176 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
173 177 use 'hg resolve' to retry unresolved file merges
174 178 updated to "521a1e40188f: symlink"
175 179 1 other heads for branch "default"
176 180 [1]
177 181 $ hg diff --git
178 182 diff --git a/a b/a
179 183 old mode 120000
180 184 new mode 100644
181 185 --- a/a
182 186 +++ b/a
183 187 @@ -1,1 +1,1 @@
184 188 -symlink
185 189 \ No newline at end of file
186 190 +data
187 191
188 192
189 193 Test only 'l' change - happens rarely, except when recovering from situations
190 194 where that was what happened.
191 195
192 196 $ hg init test2
193 197 $ cd test2
194 198 $ printf base > f
195 199 $ hg ci -Aqm0
196 200 $ echo file > f
197 201 $ echo content >> f
198 202 $ hg ci -qm1
199 203 $ hg up -qr0
200 204 $ rm f
201 205 $ ln -s base f
202 206 $ hg ci -qm2
203 207 $ hg merge
204 208 tool internal:merge (for pattern f) can't handle symlinks
205 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 213 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
208 214 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
209 215 [1]
210 216 $ tellmeabout f
211 217 f is a symlink:
212 218 f -> base
213 219
214 220 $ hg up -Cqr1
215 221 $ hg merge
216 222 tool internal:merge (for pattern f) can't handle symlinks
217 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 227 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
220 228 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
221 229 [1]
222 230 $ tellmeabout f
223 231 f is a plain file with content:
224 232 file
225 233 content
226 234
227 235 $ cd ..
228 236
229 237 Test removed 'x' flag merged with change to symlink
230 238
231 239 $ hg init test3
232 240 $ cd test3
233 241 $ echo f > f
234 242 $ chmod +x f
235 243 $ hg ci -Aqm0
236 244 $ chmod -x f
237 245 $ hg ci -qm1
238 246 $ hg up -qr0
239 247 $ rm f
240 248 $ ln -s dangling f
241 249 $ hg ci -qm2
242 250 $ hg merge
243 251 tool internal:merge (for pattern f) can't handle symlinks
244 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 256 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
247 257 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
248 258 [1]
249 259 $ tellmeabout f
250 260 f is a symlink:
251 261 f -> dangling
252 262
253 263 $ hg up -Cqr1
254 264 $ hg merge
255 265 tool internal:merge (for pattern f) can't handle symlinks
256 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 270 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
259 271 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
260 272 [1]
261 273 $ tellmeabout f
262 274 f is a plain file with content:
263 275 f
264 276
265 277 Test removed 'x' flag merged with content change - both ways
266 278
267 279 $ hg up -Cqr0
268 280 $ echo change > f
269 281 $ hg ci -qm3
270 282 $ hg merge -r1
271 283 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
272 284 (branch merge, don't forget to commit)
273 285 $ tellmeabout f
274 286 f is a plain file with content:
275 287 change
276 288
277 289 $ hg up -qCr1
278 290 $ hg merge -r3
279 291 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
280 292 (branch merge, don't forget to commit)
281 293 $ tellmeabout f
282 294 f is a plain file with content:
283 295 change
284 296
285 297 $ cd ..
286 298
287 299 Test merge with no common ancestor:
288 300 a: just different
289 301 b: x vs -, different (cannot calculate x, cannot ask merge tool)
290 302 c: x vs -, same (cannot calculate x, merge tool is no good)
291 303 d: x vs l, different
292 304 e: x vs l, same
293 305 f: - vs l, different
294 306 g: - vs l, same
295 307 h: l vs l, different
296 308 (where same means the filelog entry is shared and there thus is an ancestor!)
297 309
298 310 $ hg init test4
299 311 $ cd test4
300 312 $ echo 0 > 0
301 313 $ hg ci -Aqm0
302 314
303 315 $ echo 1 > a
304 316 $ echo 1 > b
305 317 $ chmod +x b
306 318 $ echo 1 > bx
307 319 $ chmod +x bx
308 320 $ echo x > c
309 321 $ chmod +x c
310 322 $ echo 1 > d
311 323 $ chmod +x d
312 324 $ printf x > e
313 325 $ chmod +x e
314 326 $ echo 1 > f
315 327 $ printf x > g
316 328 $ ln -s 1 h
317 329 $ hg ci -qAm1
318 330
319 331 $ hg up -qr0
320 332 $ echo 2 > a
321 333 $ echo 2 > b
322 334 $ echo 2 > bx
323 335 $ chmod +x bx
324 336 $ echo x > c
325 337 $ ln -s 2 d
326 338 $ ln -s x e
327 339 $ ln -s 2 f
328 340 $ ln -s x g
329 341 $ ln -s 2 h
330 342 $ hg ci -Aqm2
331 343
332 344 $ hg merge
333 345 merging a
334 346 warning: cannot merge flags for b without common ancestor - keeping local flags
335 347 merging b
336 348 merging bx
337 349 warning: cannot merge flags for c without common ancestor - keeping local flags
338 350 tool internal:merge (for pattern d) can't handle symlinks
339 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 355 tool internal:merge (for pattern f) can't handle symlinks
342 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 360 tool internal:merge (for pattern h) can't handle symlinks
345 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 365 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
348 366 warning: conflicts while merging b! (edit, then use 'hg resolve --mark')
349 367 warning: conflicts while merging bx! (edit, then use 'hg resolve --mark')
350 368 3 files updated, 0 files merged, 0 files removed, 6 files unresolved
351 369 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
352 370 [1]
353 371 $ hg resolve -l
354 372 U a
355 373 U b
356 374 U bx
357 375 U d
358 376 U f
359 377 U h
360 378 $ tellmeabout a
361 379 a is a plain file with content:
362 380 <<<<<<< working copy: 0c617753b41b - test: 2
363 381 2
364 382 =======
365 383 1
366 384 >>>>>>> merge rev: 2e60aa20b912 - test: 1
367 385 $ tellmeabout b
368 386 b is a plain file with content:
369 387 <<<<<<< working copy: 0c617753b41b - test: 2
370 388 2
371 389 =======
372 390 1
373 391 >>>>>>> merge rev: 2e60aa20b912 - test: 1
374 392 $ tellmeabout c
375 393 c is a plain file with content:
376 394 x
377 395 $ tellmeabout d
378 396 d is a symlink:
379 397 d -> 2
380 398 $ tellmeabout e
381 399 e is a symlink:
382 400 e -> x
383 401 $ tellmeabout f
384 402 f is a symlink:
385 403 f -> 2
386 404 $ tellmeabout g
387 405 g is a symlink:
388 406 g -> x
389 407 $ tellmeabout h
390 408 h is a symlink:
391 409 h -> 2
392 410
393 411 $ hg up -Cqr1
394 412 $ hg merge
395 413 merging a
396 414 warning: cannot merge flags for b without common ancestor - keeping local flags
397 415 merging b
398 416 merging bx
399 417 warning: cannot merge flags for c without common ancestor - keeping local flags
400 418 tool internal:merge (for pattern d) can't handle symlinks
401 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 423 tool internal:merge (for pattern f) can't handle symlinks
404 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 428 tool internal:merge (for pattern h) can't handle symlinks
407 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 433 warning: conflicts while merging a! (edit, then use 'hg resolve --mark')
410 434 warning: conflicts while merging b! (edit, then use 'hg resolve --mark')
411 435 warning: conflicts while merging bx! (edit, then use 'hg resolve --mark')
412 436 3 files updated, 0 files merged, 0 files removed, 6 files unresolved
413 437 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
414 438 [1]
415 439 $ tellmeabout a
416 440 a is a plain file with content:
417 441 <<<<<<< working copy: 2e60aa20b912 - test: 1
418 442 1
419 443 =======
420 444 2
421 445 >>>>>>> merge rev: 0c617753b41b - test: 2
422 446 $ tellmeabout b
423 447 b is an executable file with content:
424 448 <<<<<<< working copy: 2e60aa20b912 - test: 1
425 449 1
426 450 =======
427 451 2
428 452 >>>>>>> merge rev: 0c617753b41b - test: 2
429 453 $ tellmeabout c
430 454 c is an executable file with content:
431 455 x
432 456 $ tellmeabout d
433 457 d is an executable file with content:
434 458 1
435 459 $ tellmeabout e
436 460 e is an executable file with content:
437 461 x (no-eol)
438 462 $ tellmeabout f
439 463 f is a plain file with content:
440 464 1
441 465 $ tellmeabout g
442 466 g is a plain file with content:
443 467 x (no-eol)
444 468 $ tellmeabout h
445 469 h is a symlink:
446 470 h -> 1
447 471
448 472 $ cd ..
@@ -1,426 +1,426 b''
1 1 $ cat >> $HGRCPATH <<EOF
2 2 > [extensions]
3 3 > rebase=
4 4 > drawdag=$TESTDIR/drawdag.py
5 5 > [alias]
6 6 > tglog = log -G --template "{rev}: {node|short} '{desc}' {branches}\n"
7 7 > EOF
8 8
9 9 $ hg init repo
10 10 $ cd repo
11 11
12 12 $ echo A > a
13 13 $ echo >> a
14 14 $ hg ci -Am A
15 15 adding a
16 16
17 17 $ echo B > a
18 18 $ echo >> a
19 19 $ hg ci -m B
20 20
21 21 $ echo C > a
22 22 $ echo >> a
23 23 $ hg ci -m C
24 24
25 25 $ hg up -q -C 0
26 26
27 27 $ echo D >> a
28 28 $ hg ci -Am AD
29 29 created new head
30 30
31 31 $ hg tglog
32 32 @ 3: 3878212183bd 'AD'
33 33 |
34 34 | o 2: 30ae917c0e4f 'C'
35 35 | |
36 36 | o 1: 0f4f7cb4f549 'B'
37 37 |/
38 38 o 0: 1e635d440a73 'A'
39 39
40 40 $ hg rebase -s 1 -d 3
41 41 rebasing 1:0f4f7cb4f549 "B"
42 42 merging a
43 43 rebasing 2:30ae917c0e4f "C"
44 44 merging a
45 45 saved backup bundle to $TESTTMP/repo/.hg/strip-backup/0f4f7cb4f549-82b3b163-rebase.hg
46 46
47 47 $ hg tglog
48 48 o 3: 25773bc4b4b0 'C'
49 49 |
50 50 o 2: c09015405f75 'B'
51 51 |
52 52 @ 1: 3878212183bd 'AD'
53 53 |
54 54 o 0: 1e635d440a73 'A'
55 55
56 56
57 57 $ cd ..
58 58
59 59
60 60 Test rebasing of merges with ancestors of the rebase destination - a situation
61 61 that often happens when trying to recover from repeated merging with a mainline
62 62 branch.
63 63
64 64 The test case creates a dev branch that contains a couple of merges from the
65 65 default branch. When rebasing to the default branch, these merges would be
66 66 merges with ancestors on the same branch. The merges _could_ contain some
67 67 interesting conflict resolutions or additional changes in the merge commit, but
68 68 that is mixed up with the actual merge stuff and there is in general no way to
69 69 separate them.
70 70
71 71 Note: The dev branch contains _no_ changes to f-default. It might be unclear
72 72 how rebasing of ancestor merges should be handled, but the current behavior
73 73 with spurious prompts for conflicts in files that didn't change seems very
74 74 wrong.
75 75
76 76 $ hg init ancestor-merge
77 77 $ cd ancestor-merge
78 78
79 79 $ touch f-default
80 80 $ hg ci -Aqm 'default: create f-default'
81 81
82 82 $ hg branch -q dev
83 83 $ hg ci -qm 'dev: create branch'
84 84
85 85 $ echo stuff > f-dev
86 86 $ hg ci -Aqm 'dev: f-dev stuff'
87 87
88 88 $ hg up -q default
89 89 $ echo stuff > f-default
90 90 $ hg ci -m 'default: f-default stuff'
91 91
92 92 $ hg up -q dev
93 93 $ hg merge -q default
94 94 $ hg ci -m 'dev: merge default'
95 95
96 96 $ hg up -q default
97 97 $ hg rm f-default
98 98 $ hg ci -m 'default: remove f-default'
99 99
100 100 $ hg up -q dev
101 101 $ hg merge -q default
102 102 $ hg ci -m 'dev: merge default'
103 103
104 104 $ hg up -q default
105 105 $ echo stuff > f-other
106 106 $ hg ci -Aqm 'default: f-other stuff'
107 107
108 108 $ hg tglog
109 109 @ 7: e08089805d82 'default: f-other stuff'
110 110 |
111 111 | o 6: 9455ee510502 'dev: merge default' dev
112 112 |/|
113 113 o | 5: 462860db70a1 'default: remove f-default'
114 114 | |
115 115 | o 4: 4b019212aaf6 'dev: merge default' dev
116 116 |/|
117 117 o | 3: f157ecfd2b6b 'default: f-default stuff'
118 118 | |
119 119 | o 2: ec2c14fb2984 'dev: f-dev stuff' dev
120 120 | |
121 121 | o 1: 1d1a643d390e 'dev: create branch' dev
122 122 |/
123 123 o 0: e90e8eb90b6f 'default: create f-default'
124 124
125 125 $ hg clone -qU . ../ancestor-merge-2
126 126
127 127 Full rebase all the way back from branching point:
128 128
129 129 $ hg rebase -r 'only(dev,default)' -d default --config ui.interactive=True << EOF
130 130 > c
131 131 > EOF
132 132 rebasing 1:1d1a643d390e "dev: create branch"
133 133 note: not rebasing 1:1d1a643d390e "dev: create branch", its destination already has all its changes
134 134 rebasing 2:ec2c14fb2984 "dev: f-dev stuff"
135 135 rebasing 4:4b019212aaf6 "dev: merge default"
136 136 file 'f-default' was deleted in local [dest] but was modified in other [source].
137 What do you want to do?
138 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
137 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
138 What do you want to do? c
139 139 rebasing 6:9455ee510502 "dev: merge default"
140 140 saved backup bundle to $TESTTMP/ancestor-merge/.hg/strip-backup/1d1a643d390e-43e9e04b-rebase.hg
141 141 $ hg tglog
142 142 o 6: fbc098e72227 'dev: merge default'
143 143 |
144 144 o 5: eda7b7f46f5d 'dev: merge default'
145 145 |
146 146 o 4: 3e075b1c0a40 'dev: f-dev stuff'
147 147 |
148 148 @ 3: e08089805d82 'default: f-other stuff'
149 149 |
150 150 o 2: 462860db70a1 'default: remove f-default'
151 151 |
152 152 o 1: f157ecfd2b6b 'default: f-default stuff'
153 153 |
154 154 o 0: e90e8eb90b6f 'default: create f-default'
155 155
156 156 Grafty cherry picking rebasing:
157 157
158 158 $ cd ../ancestor-merge-2
159 159
160 160 $ hg phase -fdr0:
161 161 $ hg rebase -r 'children(only(dev,default))' -d default --config ui.interactive=True << EOF
162 162 > c
163 163 > EOF
164 164 rebasing 2:ec2c14fb2984 "dev: f-dev stuff"
165 165 rebasing 4:4b019212aaf6 "dev: merge default"
166 166 file 'f-default' was deleted in local [dest] but was modified in other [source].
167 What do you want to do?
168 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? c
167 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
168 What do you want to do? c
169 169 rebasing 6:9455ee510502 "dev: merge default"
170 170 saved backup bundle to $TESTTMP/ancestor-merge-2/.hg/strip-backup/ec2c14fb2984-62d0b222-rebase.hg
171 171 $ hg tglog
172 172 o 7: fbc098e72227 'dev: merge default'
173 173 |
174 174 o 6: eda7b7f46f5d 'dev: merge default'
175 175 |
176 176 o 5: 3e075b1c0a40 'dev: f-dev stuff'
177 177 |
178 178 o 4: e08089805d82 'default: f-other stuff'
179 179 |
180 180 o 3: 462860db70a1 'default: remove f-default'
181 181 |
182 182 o 2: f157ecfd2b6b 'default: f-default stuff'
183 183 |
184 184 | o 1: 1d1a643d390e 'dev: create branch' dev
185 185 |/
186 186 o 0: e90e8eb90b6f 'default: create f-default'
187 187
188 188 $ cd ..
189 189
190 190
191 191 Test order of parents of rebased merged with un-rebased changes as p1.
192 192
193 193 $ hg init parentorder
194 194 $ cd parentorder
195 195 $ touch f
196 196 $ hg ci -Aqm common
197 197 $ touch change
198 198 $ hg ci -Aqm change
199 199 $ touch target
200 200 $ hg ci -Aqm target
201 201 $ hg up -qr 0
202 202 $ touch outside
203 203 $ hg ci -Aqm outside
204 204 $ hg merge -qr 1
205 205 $ hg ci -m 'merge p1 3=outside p2 1=ancestor'
206 206 $ hg par
207 207 changeset: 4:6990226659be
208 208 tag: tip
209 209 parent: 3:f59da8fc0fcf
210 210 parent: 1:dd40c13f7a6f
211 211 user: test
212 212 date: Thu Jan 01 00:00:00 1970 +0000
213 213 summary: merge p1 3=outside p2 1=ancestor
214 214
215 215 $ hg up -qr 1
216 216 $ hg merge -qr 3
217 217 $ hg ci -qm 'merge p1 1=ancestor p2 3=outside'
218 218 $ hg par
219 219 changeset: 5:a57575f79074
220 220 tag: tip
221 221 parent: 1:dd40c13f7a6f
222 222 parent: 3:f59da8fc0fcf
223 223 user: test
224 224 date: Thu Jan 01 00:00:00 1970 +0000
225 225 summary: merge p1 1=ancestor p2 3=outside
226 226
227 227 $ hg tglog
228 228 @ 5: a57575f79074 'merge p1 1=ancestor p2 3=outside'
229 229 |\
230 230 +---o 4: 6990226659be 'merge p1 3=outside p2 1=ancestor'
231 231 | |/
232 232 | o 3: f59da8fc0fcf 'outside'
233 233 | |
234 234 +---o 2: a60552eb93fb 'target'
235 235 | |
236 236 o | 1: dd40c13f7a6f 'change'
237 237 |/
238 238 o 0: 02f0f58d5300 'common'
239 239
240 240 $ hg rebase -r 4 -d 2
241 241 rebasing 4:6990226659be "merge p1 3=outside p2 1=ancestor"
242 242 saved backup bundle to $TESTTMP/parentorder/.hg/strip-backup/6990226659be-4d67a0d3-rebase.hg
243 243 $ hg tip
244 244 changeset: 5:cca50676b1c5
245 245 tag: tip
246 246 parent: 2:a60552eb93fb
247 247 parent: 3:f59da8fc0fcf
248 248 user: test
249 249 date: Thu Jan 01 00:00:00 1970 +0000
250 250 summary: merge p1 3=outside p2 1=ancestor
251 251
252 252 $ hg rebase -r 4 -d 2
253 253 rebasing 4:a57575f79074 "merge p1 1=ancestor p2 3=outside"
254 254 saved backup bundle to $TESTTMP/parentorder/.hg/strip-backup/a57575f79074-385426e5-rebase.hg
255 255 $ hg tip
256 256 changeset: 5:f9daf77ffe76
257 257 tag: tip
258 258 parent: 2:a60552eb93fb
259 259 parent: 3:f59da8fc0fcf
260 260 user: test
261 261 date: Thu Jan 01 00:00:00 1970 +0000
262 262 summary: merge p1 1=ancestor p2 3=outside
263 263
264 264 $ hg tglog
265 265 @ 5: f9daf77ffe76 'merge p1 1=ancestor p2 3=outside'
266 266 |\
267 267 +---o 4: cca50676b1c5 'merge p1 3=outside p2 1=ancestor'
268 268 | |/
269 269 | o 3: f59da8fc0fcf 'outside'
270 270 | |
271 271 o | 2: a60552eb93fb 'target'
272 272 | |
273 273 o | 1: dd40c13f7a6f 'change'
274 274 |/
275 275 o 0: 02f0f58d5300 'common'
276 276
277 277 rebase of merge of ancestors
278 278
279 279 $ hg up -qr 2
280 280 $ hg merge -qr 3
281 281 $ echo 'other change while merging future "rebase ancestors"' > other
282 282 $ hg ci -Aqm 'merge rebase ancestors'
283 283 $ hg rebase -d 5 -v
284 284 rebasing 6:4c5f12f25ebe "merge rebase ancestors" (tip)
285 285 resolving manifests
286 286 removing other
287 287 note: merging f9daf77ffe76+ and 4c5f12f25ebe using bids from ancestors a60552eb93fb and f59da8fc0fcf
288 288
289 289 calculating bids for ancestor a60552eb93fb
290 290 resolving manifests
291 291
292 292 calculating bids for ancestor f59da8fc0fcf
293 293 resolving manifests
294 294
295 295 auction for merging merge bids
296 296 other: consensus for g
297 297 end of auction
298 298
299 299 getting other
300 300 committing files:
301 301 other
302 302 committing manifest
303 303 committing changelog
304 304 rebase merging completed
305 305 1 changesets found
306 306 uncompressed size of bundle content:
307 307 199 (changelog)
308 308 216 (manifests)
309 309 182 other
310 310 saved backup bundle to $TESTTMP/parentorder/.hg/strip-backup/4c5f12f25ebe-f46990e5-rebase.hg
311 311 1 changesets found
312 312 uncompressed size of bundle content:
313 313 254 (changelog)
314 314 167 (manifests)
315 315 182 other
316 316 adding branch
317 317 adding changesets
318 318 adding manifests
319 319 adding file changes
320 320 added 1 changesets with 1 changes to 1 files
321 321 rebase completed
322 322 $ hg tglog
323 323 @ 6: 113755df812b 'merge rebase ancestors'
324 324 |
325 325 o 5: f9daf77ffe76 'merge p1 1=ancestor p2 3=outside'
326 326 |\
327 327 +---o 4: cca50676b1c5 'merge p1 3=outside p2 1=ancestor'
328 328 | |/
329 329 | o 3: f59da8fc0fcf 'outside'
330 330 | |
331 331 o | 2: a60552eb93fb 'target'
332 332 | |
333 333 o | 1: dd40c13f7a6f 'change'
334 334 |/
335 335 o 0: 02f0f58d5300 'common'
336 336
337 337 Due to the limitation of 3-way merge algorithm (1 merge base), rebasing a merge
338 338 may include unwanted content:
339 339
340 340 $ hg init $TESTTMP/dual-merge-base1
341 341 $ cd $TESTTMP/dual-merge-base1
342 342 $ hg debugdrawdag <<'EOS'
343 343 > F
344 344 > /|
345 345 > D E
346 346 > | |
347 347 > B C
348 348 > |/
349 349 > A Z
350 350 > |/
351 351 > R
352 352 > EOS
353 353 $ hg rebase -r D+E+F -d Z
354 354 rebasing 5:5f2c926dfecf "D" (D)
355 355 rebasing 6:b296604d9846 "E" (E)
356 356 rebasing 7:caa9781e507d "F" (F tip)
357 357 abort: rebasing 7:caa9781e507d will include unwanted changes from 4:d6003a550c2c or 3:c1e6b162678d
358 358 [255]
359 359
360 360 The warning does not get printed if there is no unwanted change detected:
361 361
362 362 $ hg init $TESTTMP/dual-merge-base2
363 363 $ cd $TESTTMP/dual-merge-base2
364 364 $ hg debugdrawdag <<'EOS'
365 365 > D
366 366 > /|
367 367 > B C
368 368 > |/
369 369 > A Z
370 370 > |/
371 371 > R
372 372 > EOS
373 373 $ hg rebase -r B+C+D -d Z
374 374 rebasing 3:c1e6b162678d "B" (B)
375 375 rebasing 4:d6003a550c2c "C" (C)
376 376 rebasing 5:c8f78076273e "D" (D tip)
377 377 saved backup bundle to $TESTTMP/dual-merge-base2/.hg/strip-backup/d6003a550c2c-6f1424b6-rebase.hg
378 378 $ hg manifest -r 'desc(D)'
379 379 B
380 380 C
381 381 R
382 382 Z
383 383
384 384 The merge base could be different from old p1 (changed parent becomes new p1):
385 385
386 386 $ hg init $TESTTMP/chosen-merge-base1
387 387 $ cd $TESTTMP/chosen-merge-base1
388 388 $ hg debugdrawdag <<'EOS'
389 389 > F
390 390 > /|
391 391 > D E
392 392 > | |
393 393 > B C Z
394 394 > EOS
395 395 $ hg rebase -r D+F -d Z
396 396 rebasing 3:004dc1679908 "D" (D)
397 397 rebasing 5:4be4cbf6f206 "F" (F tip)
398 398 saved backup bundle to $TESTTMP/chosen-merge-base1/.hg/strip-backup/004dc1679908-06a66a3c-rebase.hg
399 399 $ hg manifest -r 'desc(F)'
400 400 C
401 401 D
402 402 E
403 403 Z
404 404 $ hg log -r `hg log -r 'desc(F)' -T '{p1node}'` -T '{desc}\n'
405 405 D
406 406
407 407 $ hg init $TESTTMP/chosen-merge-base2
408 408 $ cd $TESTTMP/chosen-merge-base2
409 409 $ hg debugdrawdag <<'EOS'
410 410 > F
411 411 > /|
412 412 > D E
413 413 > | |
414 414 > B C Z
415 415 > EOS
416 416 $ hg rebase -r E+F -d Z
417 417 rebasing 4:974e4943c210 "E" (E)
418 418 rebasing 5:4be4cbf6f206 "F" (F tip)
419 419 saved backup bundle to $TESTTMP/chosen-merge-base2/.hg/strip-backup/974e4943c210-b2874da5-rebase.hg
420 420 $ hg manifest -r 'desc(F)'
421 421 B
422 422 D
423 423 E
424 424 Z
425 425 $ hg log -r `hg log -r 'desc(F)' -T '{p1node}'` -T '{desc}\n'
426 426 E
@@ -1,1055 +1,1055 b''
1 1
2 2 $ mkdir -p t
3 3 $ cd t
4 4 $ cat <<EOF > merge
5 5 > import sys, os
6 6 > f = open(sys.argv[1], "w")
7 7 > f.write("merge %s %s %s" % (sys.argv[1], sys.argv[2], sys.argv[3]))
8 8 > f.close()
9 9 > EOF
10 10
11 11 perform a test merge with possible renaming
12 12 args:
13 13 $1 = action in local branch
14 14 $2 = action in remote branch
15 15 $3 = action in working dir
16 16 $4 = expected result
17 17
18 18 $ tm()
19 19 > {
20 20 > hg init t
21 21 > cd t
22 22 > echo "[merge]" >> .hg/hgrc
23 23 > echo "followcopies = 1" >> .hg/hgrc
24 24 >
25 25 > # base
26 26 > echo base > a
27 27 > echo base > rev # used to force commits
28 28 > hg add a rev
29 29 > hg ci -m "base"
30 30 >
31 31 > # remote
32 32 > echo remote > rev
33 33 > if [ "$2" != "" ] ; then $2 ; fi
34 34 > hg ci -m "remote"
35 35 >
36 36 > # local
37 37 > hg co -q 0
38 38 > echo local > rev
39 39 > if [ "$1" != "" ] ; then $1 ; fi
40 40 > hg ci -m "local"
41 41 >
42 42 > # working dir
43 43 > echo local > rev
44 44 > if [ "$3" != "" ] ; then $3 ; fi
45 45 >
46 46 > # merge
47 47 > echo "--------------"
48 48 > echo "test L:$1 R:$2 W:$3 - $4"
49 49 > echo "--------------"
50 50 > hg merge -y --debug --traceback --tool="\"$PYTHON\" ../merge"
51 51 >
52 52 > echo "--------------"
53 53 > hg status -camC -X rev
54 54 >
55 55 > hg ci -m "merge"
56 56 >
57 57 > echo "--------------"
58 58 > echo
59 59 >
60 60 > cd ..
61 61 > rm -r t
62 62 > }
63 63 $ up() {
64 64 > cp rev $1
65 65 > hg add $1 2> /dev/null
66 66 > if [ "$2" != "" ] ; then
67 67 > cp rev $2
68 68 > hg add $2 2> /dev/null
69 69 > fi
70 70 > }
71 71 $ um() { up $1; hg mv $1 $2; }
72 72 $ nc() { hg cp $1 $2; } # just copy
73 73 $ nm() { hg mv $1 $2; } # just move
74 74 $ tm "up a " "nc a b" " " "1 get local a to b"
75 75 created new head
76 76 --------------
77 77 test L:up a R:nc a b W: - 1 get local a to b
78 78 --------------
79 79 unmatched files in other:
80 80 b
81 81 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
82 82 src: 'a' -> dst: 'b' *
83 83 checking for directory renames
84 84 resolving manifests
85 85 branchmerge: True, force: False, partial: False
86 86 ancestor: 924404dff337, local: e300d1c794ec+, remote: 4ce40f5aca24
87 87 preserving a for resolve of b
88 88 preserving rev for resolve of rev
89 89 starting 4 threads for background file closing (?)
90 90 b: remote copied from a -> m (premerge)
91 91 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
92 92 merging a and b to b
93 93 my b@e300d1c794ec+ other b@4ce40f5aca24 ancestor a@924404dff337
94 94 premerge successful
95 95 rev: versions differ -> m (premerge)
96 96 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
97 97 merging rev
98 98 my rev@e300d1c794ec+ other rev@4ce40f5aca24 ancestor rev@924404dff337
99 99 rev: versions differ -> m (merge)
100 100 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
101 101 my rev@e300d1c794ec+ other rev@4ce40f5aca24 ancestor rev@924404dff337
102 102 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
103 103 merge tool returned: 0
104 104 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
105 105 (branch merge, don't forget to commit)
106 106 --------------
107 107 M b
108 108 a
109 109 C a
110 110 --------------
111 111
112 112 $ tm "nc a b" "up a " " " "2 get rem change to a and b"
113 113 created new head
114 114 --------------
115 115 test L:nc a b R:up a W: - 2 get rem change to a and b
116 116 --------------
117 117 unmatched files in local:
118 118 b
119 119 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
120 120 src: 'a' -> dst: 'b' *
121 121 checking for directory renames
122 122 resolving manifests
123 123 branchmerge: True, force: False, partial: False
124 124 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: f4db7e329e71
125 125 preserving b for resolve of b
126 126 preserving rev for resolve of rev
127 127 a: remote is newer -> g
128 128 getting a
129 129 b: local copied/moved from a -> m (premerge)
130 130 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
131 131 merging b and a to b
132 132 my b@86a2aa42fc76+ other a@f4db7e329e71 ancestor a@924404dff337
133 133 premerge successful
134 134 rev: versions differ -> m (premerge)
135 135 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
136 136 merging rev
137 137 my rev@86a2aa42fc76+ other rev@f4db7e329e71 ancestor rev@924404dff337
138 138 rev: versions differ -> m (merge)
139 139 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
140 140 my rev@86a2aa42fc76+ other rev@f4db7e329e71 ancestor rev@924404dff337
141 141 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
142 142 merge tool returned: 0
143 143 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
144 144 (branch merge, don't forget to commit)
145 145 --------------
146 146 M a
147 147 M b
148 148 a
149 149 --------------
150 150
151 151 $ tm "up a " "nm a b" " " "3 get local a change to b, remove a"
152 152 created new head
153 153 --------------
154 154 test L:up a R:nm a b W: - 3 get local a change to b, remove a
155 155 --------------
156 156 unmatched files in other:
157 157 b
158 158 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
159 159 src: 'a' -> dst: 'b' *
160 160 checking for directory renames
161 161 resolving manifests
162 162 branchmerge: True, force: False, partial: False
163 163 ancestor: 924404dff337, local: e300d1c794ec+, remote: bdb19105162a
164 164 preserving a for resolve of b
165 165 preserving rev for resolve of rev
166 166 removing a
167 167 starting 4 threads for background file closing (?)
168 168 b: remote moved from a -> m (premerge)
169 169 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
170 170 merging a and b to b
171 171 my b@e300d1c794ec+ other b@bdb19105162a ancestor a@924404dff337
172 172 premerge successful
173 173 rev: versions differ -> m (premerge)
174 174 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
175 175 merging rev
176 176 my rev@e300d1c794ec+ other rev@bdb19105162a ancestor rev@924404dff337
177 177 rev: versions differ -> m (merge)
178 178 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
179 179 my rev@e300d1c794ec+ other rev@bdb19105162a ancestor rev@924404dff337
180 180 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
181 181 merge tool returned: 0
182 182 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
183 183 (branch merge, don't forget to commit)
184 184 --------------
185 185 M b
186 186 a
187 187 --------------
188 188
189 189 $ tm "nm a b" "up a " " " "4 get remote change to b"
190 190 created new head
191 191 --------------
192 192 test L:nm a b R:up a W: - 4 get remote change to b
193 193 --------------
194 194 unmatched files in local:
195 195 b
196 196 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
197 197 src: 'a' -> dst: 'b' *
198 198 checking for directory renames
199 199 resolving manifests
200 200 branchmerge: True, force: False, partial: False
201 201 ancestor: 924404dff337, local: 02963e448370+, remote: f4db7e329e71
202 202 preserving b for resolve of b
203 203 preserving rev for resolve of rev
204 204 starting 4 threads for background file closing (?)
205 205 b: local copied/moved from a -> m (premerge)
206 206 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
207 207 merging b and a to b
208 208 my b@02963e448370+ other a@f4db7e329e71 ancestor a@924404dff337
209 209 premerge successful
210 210 rev: versions differ -> m (premerge)
211 211 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
212 212 merging rev
213 213 my rev@02963e448370+ other rev@f4db7e329e71 ancestor rev@924404dff337
214 214 rev: versions differ -> m (merge)
215 215 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
216 216 my rev@02963e448370+ other rev@f4db7e329e71 ancestor rev@924404dff337
217 217 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
218 218 merge tool returned: 0
219 219 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
220 220 (branch merge, don't forget to commit)
221 221 --------------
222 222 M b
223 223 a
224 224 --------------
225 225
226 226 $ tm " " "nc a b" " " "5 get b"
227 227 created new head
228 228 --------------
229 229 test L: R:nc a b W: - 5 get b
230 230 --------------
231 231 unmatched files in other:
232 232 b
233 233 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
234 234 src: 'a' -> dst: 'b'
235 235 checking for directory renames
236 236 resolving manifests
237 237 branchmerge: True, force: False, partial: False
238 238 ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: 4ce40f5aca24
239 239 preserving rev for resolve of rev
240 240 b: remote created -> g
241 241 getting b
242 242 rev: versions differ -> m (premerge)
243 243 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
244 244 merging rev
245 245 my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
246 246 rev: versions differ -> m (merge)
247 247 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
248 248 my rev@94b33a1b7f2d+ other rev@4ce40f5aca24 ancestor rev@924404dff337
249 249 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
250 250 merge tool returned: 0
251 251 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
252 252 (branch merge, don't forget to commit)
253 253 --------------
254 254 M b
255 255 C a
256 256 --------------
257 257
258 258 $ tm "nc a b" " " " " "6 nothing"
259 259 created new head
260 260 --------------
261 261 test L:nc a b R: W: - 6 nothing
262 262 --------------
263 263 unmatched files in local:
264 264 b
265 265 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
266 266 src: 'a' -> dst: 'b'
267 267 checking for directory renames
268 268 resolving manifests
269 269 branchmerge: True, force: False, partial: False
270 270 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 97c705ade336
271 271 preserving rev for resolve of rev
272 272 starting 4 threads for background file closing (?)
273 273 rev: versions differ -> m (premerge)
274 274 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
275 275 merging rev
276 276 my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
277 277 rev: versions differ -> m (merge)
278 278 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
279 279 my rev@86a2aa42fc76+ other rev@97c705ade336 ancestor rev@924404dff337
280 280 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
281 281 merge tool returned: 0
282 282 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
283 283 (branch merge, don't forget to commit)
284 284 --------------
285 285 C a
286 286 C b
287 287 --------------
288 288
289 289 $ tm " " "nm a b" " " "7 get b"
290 290 created new head
291 291 --------------
292 292 test L: R:nm a b W: - 7 get b
293 293 --------------
294 294 unmatched files in other:
295 295 b
296 296 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
297 297 src: 'a' -> dst: 'b'
298 298 checking for directory renames
299 299 resolving manifests
300 300 branchmerge: True, force: False, partial: False
301 301 ancestor: 924404dff337, local: 94b33a1b7f2d+, remote: bdb19105162a
302 302 preserving rev for resolve of rev
303 303 a: other deleted -> r
304 304 removing a
305 305 b: remote created -> g
306 306 getting b
307 307 rev: versions differ -> m (premerge)
308 308 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
309 309 merging rev
310 310 my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
311 311 rev: versions differ -> m (merge)
312 312 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
313 313 my rev@94b33a1b7f2d+ other rev@bdb19105162a ancestor rev@924404dff337
314 314 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
315 315 merge tool returned: 0
316 316 1 files updated, 1 files merged, 1 files removed, 0 files unresolved
317 317 (branch merge, don't forget to commit)
318 318 --------------
319 319 M b
320 320 --------------
321 321
322 322 $ tm "nm a b" " " " " "8 nothing"
323 323 created new head
324 324 --------------
325 325 test L:nm a b R: W: - 8 nothing
326 326 --------------
327 327 unmatched files in local:
328 328 b
329 329 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
330 330 src: 'a' -> dst: 'b'
331 331 checking for directory renames
332 332 resolving manifests
333 333 branchmerge: True, force: False, partial: False
334 334 ancestor: 924404dff337, local: 02963e448370+, remote: 97c705ade336
335 335 preserving rev for resolve of rev
336 336 starting 4 threads for background file closing (?)
337 337 rev: versions differ -> m (premerge)
338 338 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
339 339 merging rev
340 340 my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
341 341 rev: versions differ -> m (merge)
342 342 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
343 343 my rev@02963e448370+ other rev@97c705ade336 ancestor rev@924404dff337
344 344 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
345 345 merge tool returned: 0
346 346 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
347 347 (branch merge, don't forget to commit)
348 348 --------------
349 349 C b
350 350 --------------
351 351
352 352 $ tm "um a b" "um a b" " " "9 do merge with ancestor in a"
353 353 created new head
354 354 --------------
355 355 test L:um a b R:um a b W: - 9 do merge with ancestor in a
356 356 --------------
357 357 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
358 358 src: 'a' -> dst: 'b' *
359 359 checking for directory renames
360 360 resolving manifests
361 361 branchmerge: True, force: False, partial: False
362 362 ancestor: 924404dff337, local: 62e7bf090eba+, remote: 49b6d8032493
363 363 preserving b for resolve of b
364 364 preserving rev for resolve of rev
365 365 starting 4 threads for background file closing (?)
366 366 b: both renamed from a -> m (premerge)
367 367 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
368 368 merging b
369 369 my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
370 370 rev: versions differ -> m (premerge)
371 371 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
372 372 merging rev
373 373 my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
374 374 b: both renamed from a -> m (merge)
375 375 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
376 376 my b@62e7bf090eba+ other b@49b6d8032493 ancestor a@924404dff337
377 377 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
378 378 merge tool returned: 0
379 379 rev: versions differ -> m (merge)
380 380 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
381 381 my rev@62e7bf090eba+ other rev@49b6d8032493 ancestor rev@924404dff337
382 382 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
383 383 merge tool returned: 0
384 384 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
385 385 (branch merge, don't forget to commit)
386 386 --------------
387 387 M b
388 388 --------------
389 389
390 390
391 391 m "um a c" "um x c" " " "10 do merge with no ancestor"
392 392
393 393 $ tm "nm a b" "nm a c" " " "11 get c, keep b"
394 394 created new head
395 395 --------------
396 396 test L:nm a b R:nm a c W: - 11 get c, keep b
397 397 --------------
398 398 unmatched files in local:
399 399 b
400 400 unmatched files in other:
401 401 c
402 402 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
403 403 src: 'a' -> dst: 'b' !
404 404 src: 'a' -> dst: 'c' !
405 405 checking for directory renames
406 406 resolving manifests
407 407 branchmerge: True, force: False, partial: False
408 408 ancestor: 924404dff337, local: 02963e448370+, remote: fe905ef2c33e
409 409 note: possible conflict - a was renamed multiple times to:
410 410 b
411 411 c
412 412 preserving rev for resolve of rev
413 413 c: remote created -> g
414 414 getting c
415 415 rev: versions differ -> m (premerge)
416 416 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
417 417 merging rev
418 418 my rev@02963e448370+ other rev@fe905ef2c33e ancestor rev@924404dff337
419 419 rev: versions differ -> m (merge)
420 420 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
421 421 my rev@02963e448370+ other rev@fe905ef2c33e ancestor rev@924404dff337
422 422 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
423 423 merge tool returned: 0
424 424 1 files updated, 1 files merged, 0 files removed, 0 files unresolved
425 425 (branch merge, don't forget to commit)
426 426 --------------
427 427 M c
428 428 C b
429 429 --------------
430 430
431 431 $ tm "nc a b" "up b " " " "12 merge b no ancestor"
432 432 created new head
433 433 --------------
434 434 test L:nc a b R:up b W: - 12 merge b no ancestor
435 435 --------------
436 436 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
437 437 src: 'a' -> dst: 'b'
438 438 checking for directory renames
439 439 resolving manifests
440 440 branchmerge: True, force: False, partial: False
441 441 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: af30c7647fc7
442 442 preserving b for resolve of b
443 443 preserving rev for resolve of rev
444 444 starting 4 threads for background file closing (?)
445 445 b: both created -> m (premerge)
446 446 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
447 447 merging b
448 448 my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
449 449 rev: versions differ -> m (premerge)
450 450 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
451 451 merging rev
452 452 my rev@86a2aa42fc76+ other rev@af30c7647fc7 ancestor rev@924404dff337
453 453 b: both created -> m (merge)
454 454 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
455 455 my b@86a2aa42fc76+ other b@af30c7647fc7 ancestor b@000000000000
456 456 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
457 457 merge tool returned: 0
458 458 rev: versions differ -> m (merge)
459 459 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
460 460 my rev@86a2aa42fc76+ other rev@af30c7647fc7 ancestor rev@924404dff337
461 461 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
462 462 merge tool returned: 0
463 463 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
464 464 (branch merge, don't forget to commit)
465 465 --------------
466 466 M b
467 467 C a
468 468 --------------
469 469
470 470 $ tm "up b " "nm a b" " " "13 merge b no ancestor"
471 471 created new head
472 472 --------------
473 473 test L:up b R:nm a b W: - 13 merge b no ancestor
474 474 --------------
475 475 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
476 476 src: 'a' -> dst: 'b'
477 477 checking for directory renames
478 478 resolving manifests
479 479 branchmerge: True, force: False, partial: False
480 480 ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a
481 481 preserving b for resolve of b
482 482 preserving rev for resolve of rev
483 483 a: other deleted -> r
484 484 removing a
485 485 starting 4 threads for background file closing (?)
486 486 b: both created -> m (premerge)
487 487 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
488 488 merging b
489 489 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
490 490 rev: versions differ -> m (premerge)
491 491 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
492 492 merging rev
493 493 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
494 494 b: both created -> m (merge)
495 495 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
496 496 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
497 497 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
498 498 merge tool returned: 0
499 499 rev: versions differ -> m (merge)
500 500 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
501 501 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
502 502 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
503 503 merge tool returned: 0
504 504 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
505 505 (branch merge, don't forget to commit)
506 506 --------------
507 507 M b
508 508 --------------
509 509
510 510 $ tm "nc a b" "up a b" " " "14 merge b no ancestor"
511 511 created new head
512 512 --------------
513 513 test L:nc a b R:up a b W: - 14 merge b no ancestor
514 514 --------------
515 515 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
516 516 src: 'a' -> dst: 'b'
517 517 checking for directory renames
518 518 resolving manifests
519 519 branchmerge: True, force: False, partial: False
520 520 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a
521 521 preserving b for resolve of b
522 522 preserving rev for resolve of rev
523 523 a: remote is newer -> g
524 524 getting a
525 525 b: both created -> m (premerge)
526 526 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
527 527 merging b
528 528 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
529 529 rev: versions differ -> m (premerge)
530 530 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
531 531 merging rev
532 532 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
533 533 b: both created -> m (merge)
534 534 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
535 535 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
536 536 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
537 537 merge tool returned: 0
538 538 rev: versions differ -> m (merge)
539 539 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
540 540 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
541 541 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
542 542 merge tool returned: 0
543 543 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
544 544 (branch merge, don't forget to commit)
545 545 --------------
546 546 M a
547 547 M b
548 548 --------------
549 549
550 550 $ tm "up b " "nm a b" " " "15 merge b no ancestor, remove a"
551 551 created new head
552 552 --------------
553 553 test L:up b R:nm a b W: - 15 merge b no ancestor, remove a
554 554 --------------
555 555 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
556 556 src: 'a' -> dst: 'b'
557 557 checking for directory renames
558 558 resolving manifests
559 559 branchmerge: True, force: False, partial: False
560 560 ancestor: 924404dff337, local: 59318016310c+, remote: bdb19105162a
561 561 preserving b for resolve of b
562 562 preserving rev for resolve of rev
563 563 a: other deleted -> r
564 564 removing a
565 565 starting 4 threads for background file closing (?)
566 566 b: both created -> m (premerge)
567 567 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
568 568 merging b
569 569 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
570 570 rev: versions differ -> m (premerge)
571 571 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
572 572 merging rev
573 573 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
574 574 b: both created -> m (merge)
575 575 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
576 576 my b@59318016310c+ other b@bdb19105162a ancestor b@000000000000
577 577 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
578 578 merge tool returned: 0
579 579 rev: versions differ -> m (merge)
580 580 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
581 581 my rev@59318016310c+ other rev@bdb19105162a ancestor rev@924404dff337
582 582 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
583 583 merge tool returned: 0
584 584 0 files updated, 2 files merged, 1 files removed, 0 files unresolved
585 585 (branch merge, don't forget to commit)
586 586 --------------
587 587 M b
588 588 --------------
589 589
590 590 $ tm "nc a b" "up a b" " " "16 get a, merge b no ancestor"
591 591 created new head
592 592 --------------
593 593 test L:nc a b R:up a b W: - 16 get a, merge b no ancestor
594 594 --------------
595 595 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
596 596 src: 'a' -> dst: 'b'
597 597 checking for directory renames
598 598 resolving manifests
599 599 branchmerge: True, force: False, partial: False
600 600 ancestor: 924404dff337, local: 86a2aa42fc76+, remote: 8dbce441892a
601 601 preserving b for resolve of b
602 602 preserving rev for resolve of rev
603 603 a: remote is newer -> g
604 604 getting a
605 605 b: both created -> m (premerge)
606 606 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
607 607 merging b
608 608 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
609 609 rev: versions differ -> m (premerge)
610 610 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
611 611 merging rev
612 612 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
613 613 b: both created -> m (merge)
614 614 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
615 615 my b@86a2aa42fc76+ other b@8dbce441892a ancestor b@000000000000
616 616 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
617 617 merge tool returned: 0
618 618 rev: versions differ -> m (merge)
619 619 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
620 620 my rev@86a2aa42fc76+ other rev@8dbce441892a ancestor rev@924404dff337
621 621 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
622 622 merge tool returned: 0
623 623 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
624 624 (branch merge, don't forget to commit)
625 625 --------------
626 626 M a
627 627 M b
628 628 --------------
629 629
630 630 $ tm "up a b" "nc a b" " " "17 keep a, merge b no ancestor"
631 631 created new head
632 632 --------------
633 633 test L:up a b R:nc a b W: - 17 keep a, merge b no ancestor
634 634 --------------
635 635 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
636 636 src: 'a' -> dst: 'b'
637 637 checking for directory renames
638 638 resolving manifests
639 639 branchmerge: True, force: False, partial: False
640 640 ancestor: 924404dff337, local: 0b76e65c8289+, remote: 4ce40f5aca24
641 641 preserving b for resolve of b
642 642 preserving rev for resolve of rev
643 643 starting 4 threads for background file closing (?)
644 644 b: both created -> m (premerge)
645 645 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
646 646 merging b
647 647 my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
648 648 rev: versions differ -> m (premerge)
649 649 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
650 650 merging rev
651 651 my rev@0b76e65c8289+ other rev@4ce40f5aca24 ancestor rev@924404dff337
652 652 b: both created -> m (merge)
653 653 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
654 654 my b@0b76e65c8289+ other b@4ce40f5aca24 ancestor b@000000000000
655 655 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
656 656 merge tool returned: 0
657 657 rev: versions differ -> m (merge)
658 658 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
659 659 my rev@0b76e65c8289+ other rev@4ce40f5aca24 ancestor rev@924404dff337
660 660 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
661 661 merge tool returned: 0
662 662 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
663 663 (branch merge, don't forget to commit)
664 664 --------------
665 665 M b
666 666 C a
667 667 --------------
668 668
669 669 $ tm "nm a b" "up a b" " " "18 merge b no ancestor"
670 670 created new head
671 671 --------------
672 672 test L:nm a b R:up a b W: - 18 merge b no ancestor
673 673 --------------
674 674 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
675 675 src: 'a' -> dst: 'b'
676 676 checking for directory renames
677 677 resolving manifests
678 678 branchmerge: True, force: False, partial: False
679 679 ancestor: 924404dff337, local: 02963e448370+, remote: 8dbce441892a
680 680 preserving b for resolve of b
681 681 preserving rev for resolve of rev
682 682 starting 4 threads for background file closing (?)
683 683 a: prompt deleted/changed -> m (premerge)
684 684 picked tool ':prompt' for a (binary False symlink False changedelete True)
685 685 file 'a' was deleted in local [working copy] but was modified in other [merge rev].
686 What do you want to do?
687 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
686 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
687 What do you want to do? u
688 688 b: both created -> m (premerge)
689 689 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
690 690 merging b
691 691 my b@02963e448370+ other b@8dbce441892a ancestor b@000000000000
692 692 rev: versions differ -> m (premerge)
693 693 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
694 694 merging rev
695 695 my rev@02963e448370+ other rev@8dbce441892a ancestor rev@924404dff337
696 696 b: both created -> m (merge)
697 697 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
698 698 my b@02963e448370+ other b@8dbce441892a ancestor b@000000000000
699 699 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
700 700 merge tool returned: 0
701 701 rev: versions differ -> m (merge)
702 702 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
703 703 my rev@02963e448370+ other rev@8dbce441892a ancestor rev@924404dff337
704 704 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
705 705 merge tool returned: 0
706 706 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
707 707 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
708 708 --------------
709 709 M a
710 710 M b
711 711 abort: unresolved merge conflicts (see 'hg help resolve')
712 712 --------------
713 713
714 714 $ tm "up a b" "nm a b" " " "19 merge b no ancestor, prompt remove a"
715 715 created new head
716 716 --------------
717 717 test L:up a b R:nm a b W: - 19 merge b no ancestor, prompt remove a
718 718 --------------
719 719 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
720 720 src: 'a' -> dst: 'b'
721 721 checking for directory renames
722 722 resolving manifests
723 723 branchmerge: True, force: False, partial: False
724 724 ancestor: 924404dff337, local: 0b76e65c8289+, remote: bdb19105162a
725 725 preserving a for resolve of a
726 726 preserving b for resolve of b
727 727 preserving rev for resolve of rev
728 728 starting 4 threads for background file closing (?)
729 729 a: prompt changed/deleted -> m (premerge)
730 730 picked tool ':prompt' for a (binary False symlink False changedelete True)
731 731 file 'a' was deleted in other [merge rev] but was modified in local [working copy].
732 What do you want to do?
733 use (c)hanged version, (d)elete, or leave (u)nresolved? u
732 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
733 What do you want to do? u
734 734 b: both created -> m (premerge)
735 735 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
736 736 merging b
737 737 my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
738 738 rev: versions differ -> m (premerge)
739 739 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
740 740 merging rev
741 741 my rev@0b76e65c8289+ other rev@bdb19105162a ancestor rev@924404dff337
742 742 b: both created -> m (merge)
743 743 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
744 744 my b@0b76e65c8289+ other b@bdb19105162a ancestor b@000000000000
745 745 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
746 746 merge tool returned: 0
747 747 rev: versions differ -> m (merge)
748 748 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
749 749 my rev@0b76e65c8289+ other rev@bdb19105162a ancestor rev@924404dff337
750 750 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
751 751 merge tool returned: 0
752 752 0 files updated, 2 files merged, 0 files removed, 1 files unresolved
753 753 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
754 754 --------------
755 755 M b
756 756 C a
757 757 abort: unresolved merge conflicts (see 'hg help resolve')
758 758 --------------
759 759
760 760 $ tm "up a " "um a b" " " "20 merge a and b to b, remove a"
761 761 created new head
762 762 --------------
763 763 test L:up a R:um a b W: - 20 merge a and b to b, remove a
764 764 --------------
765 765 unmatched files in other:
766 766 b
767 767 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
768 768 src: 'a' -> dst: 'b' *
769 769 checking for directory renames
770 770 resolving manifests
771 771 branchmerge: True, force: False, partial: False
772 772 ancestor: 924404dff337, local: e300d1c794ec+, remote: 49b6d8032493
773 773 preserving a for resolve of b
774 774 preserving rev for resolve of rev
775 775 removing a
776 776 starting 4 threads for background file closing (?)
777 777 b: remote moved from a -> m (premerge)
778 778 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
779 779 merging a and b to b
780 780 my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
781 781 rev: versions differ -> m (premerge)
782 782 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
783 783 merging rev
784 784 my rev@e300d1c794ec+ other rev@49b6d8032493 ancestor rev@924404dff337
785 785 b: remote moved from a -> m (merge)
786 786 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
787 787 my b@e300d1c794ec+ other b@49b6d8032493 ancestor a@924404dff337
788 788 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
789 789 merge tool returned: 0
790 790 rev: versions differ -> m (merge)
791 791 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
792 792 my rev@e300d1c794ec+ other rev@49b6d8032493 ancestor rev@924404dff337
793 793 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
794 794 merge tool returned: 0
795 795 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
796 796 (branch merge, don't forget to commit)
797 797 --------------
798 798 M b
799 799 a
800 800 --------------
801 801
802 802 $ tm "um a b" "up a " " " "21 merge a and b to b"
803 803 created new head
804 804 --------------
805 805 test L:um a b R:up a W: - 21 merge a and b to b
806 806 --------------
807 807 unmatched files in local:
808 808 b
809 809 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
810 810 src: 'a' -> dst: 'b' *
811 811 checking for directory renames
812 812 resolving manifests
813 813 branchmerge: True, force: False, partial: False
814 814 ancestor: 924404dff337, local: 62e7bf090eba+, remote: f4db7e329e71
815 815 preserving b for resolve of b
816 816 preserving rev for resolve of rev
817 817 starting 4 threads for background file closing (?)
818 818 b: local copied/moved from a -> m (premerge)
819 819 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
820 820 merging b and a to b
821 821 my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
822 822 rev: versions differ -> m (premerge)
823 823 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
824 824 merging rev
825 825 my rev@62e7bf090eba+ other rev@f4db7e329e71 ancestor rev@924404dff337
826 826 b: local copied/moved from a -> m (merge)
827 827 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
828 828 my b@62e7bf090eba+ other a@f4db7e329e71 ancestor a@924404dff337
829 829 launching merge tool: * ../merge *$TESTTMP/t/t/b* * * (glob)
830 830 merge tool returned: 0
831 831 rev: versions differ -> m (merge)
832 832 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
833 833 my rev@62e7bf090eba+ other rev@f4db7e329e71 ancestor rev@924404dff337
834 834 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
835 835 merge tool returned: 0
836 836 0 files updated, 2 files merged, 0 files removed, 0 files unresolved
837 837 (branch merge, don't forget to commit)
838 838 --------------
839 839 M b
840 840 a
841 841 --------------
842 842
843 843
844 844 m "nm a b" "um x a" " " "22 get a, keep b"
845 845
846 846 $ tm "nm a b" "up a c" " " "23 get c, keep b"
847 847 created new head
848 848 --------------
849 849 test L:nm a b R:up a c W: - 23 get c, keep b
850 850 --------------
851 851 unmatched files in local:
852 852 b
853 853 unmatched files in other:
854 854 c
855 855 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
856 856 src: 'a' -> dst: 'b' *
857 857 checking for directory renames
858 858 resolving manifests
859 859 branchmerge: True, force: False, partial: False
860 860 ancestor: 924404dff337, local: 02963e448370+, remote: 2b958612230f
861 861 preserving b for resolve of b
862 862 preserving rev for resolve of rev
863 863 c: remote created -> g
864 864 getting c
865 865 b: local copied/moved from a -> m (premerge)
866 866 picked tool '* ../merge' for b (binary False symlink False changedelete False) (glob)
867 867 merging b and a to b
868 868 my b@02963e448370+ other a@2b958612230f ancestor a@924404dff337
869 869 premerge successful
870 870 rev: versions differ -> m (premerge)
871 871 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
872 872 merging rev
873 873 my rev@02963e448370+ other rev@2b958612230f ancestor rev@924404dff337
874 874 rev: versions differ -> m (merge)
875 875 picked tool '* ../merge' for rev (binary False symlink False changedelete False) (glob)
876 876 my rev@02963e448370+ other rev@2b958612230f ancestor rev@924404dff337
877 877 launching merge tool: * ../merge *$TESTTMP/t/t/rev* * * (glob)
878 878 merge tool returned: 0
879 879 1 files updated, 2 files merged, 0 files removed, 0 files unresolved
880 880 (branch merge, don't forget to commit)
881 881 --------------
882 882 M b
883 883 a
884 884 M c
885 885 --------------
886 886
887 887
888 888 $ cd ..
889 889
890 890
891 891 Systematic and terse testing of merge merges and ancestor calculation:
892 892
893 893 Expected result:
894 894
895 895 \ a m1 m2 dst
896 896 0 - f f f "versions differ"
897 897 1 f g g g "versions differ"
898 898 2 f f f f "versions differ"
899 899 3 f f g f+g "remote copied to " + f
900 900 4 f f g g "remote moved to " + f
901 901 5 f g f f+g "local copied to " + f2
902 902 6 f g f g "local moved to " + f2
903 903 7 - (f) f f "remote differs from untracked local"
904 904 8 f (f) f f "remote differs from untracked local"
905 905
906 906 $ hg init ancestortest
907 907 $ cd ancestortest
908 908 $ for x in 1 2 3 4 5 6 8; do mkdir $x; echo a > $x/f; done
909 909 $ hg ci -Aqm "a"
910 910 $ mkdir 0
911 911 $ touch 0/f
912 912 $ hg mv 1/f 1/g
913 913 $ hg cp 5/f 5/g
914 914 $ hg mv 6/f 6/g
915 915 $ hg rm 8/f
916 916 $ for x in */*; do echo m1 > $x; done
917 917 $ hg ci -Aqm "m1"
918 918 $ hg up -qr0
919 919 $ mkdir 0 7
920 920 $ touch 0/f 7/f
921 921 $ hg mv 1/f 1/g
922 922 $ hg cp 3/f 3/g
923 923 $ hg mv 4/f 4/g
924 924 $ for x in */*; do echo m2 > $x; done
925 925 $ hg ci -Aqm "m2"
926 926 $ hg up -qr1
927 927 $ mkdir 7 8
928 928 $ echo m > 7/f
929 929 $ echo m > 8/f
930 930 $ hg merge -f --tool internal:dump -v --debug -r2 | sed '/^resolving manifests/,$d' 2> /dev/null
931 931 unmatched files in local:
932 932 5/g
933 933 6/g
934 934 unmatched files in other:
935 935 3/g
936 936 4/g
937 937 7/f
938 938 all copies found (* = to merge, ! = divergent, % = renamed and deleted):
939 939 src: '1/f' -> dst: '1/g' *
940 940 src: '3/f' -> dst: '3/g' *
941 941 src: '4/f' -> dst: '4/g' *
942 942 src: '5/f' -> dst: '5/g' *
943 943 src: '6/f' -> dst: '6/g' *
944 944 checking for directory renames
945 945 $ hg mani
946 946 0/f
947 947 1/g
948 948 2/f
949 949 3/f
950 950 4/f
951 951 5/f
952 952 5/g
953 953 6/g
954 954 $ for f in */*; do echo $f:; cat $f; done
955 955 0/f:
956 956 m1
957 957 0/f.base:
958 958 0/f.local:
959 959 m1
960 960 0/f.orig:
961 961 m1
962 962 0/f.other:
963 963 m2
964 964 1/g:
965 965 m1
966 966 1/g.base:
967 967 a
968 968 1/g.local:
969 969 m1
970 970 1/g.orig:
971 971 m1
972 972 1/g.other:
973 973 m2
974 974 2/f:
975 975 m1
976 976 2/f.base:
977 977 a
978 978 2/f.local:
979 979 m1
980 980 2/f.orig:
981 981 m1
982 982 2/f.other:
983 983 m2
984 984 3/f:
985 985 m1
986 986 3/f.base:
987 987 a
988 988 3/f.local:
989 989 m1
990 990 3/f.orig:
991 991 m1
992 992 3/f.other:
993 993 m2
994 994 3/g:
995 995 m1
996 996 3/g.base:
997 997 a
998 998 3/g.local:
999 999 m1
1000 1000 3/g.orig:
1001 1001 m1
1002 1002 3/g.other:
1003 1003 m2
1004 1004 4/g:
1005 1005 m1
1006 1006 4/g.base:
1007 1007 a
1008 1008 4/g.local:
1009 1009 m1
1010 1010 4/g.orig:
1011 1011 m1
1012 1012 4/g.other:
1013 1013 m2
1014 1014 5/f:
1015 1015 m1
1016 1016 5/f.base:
1017 1017 a
1018 1018 5/f.local:
1019 1019 m1
1020 1020 5/f.orig:
1021 1021 m1
1022 1022 5/f.other:
1023 1023 m2
1024 1024 5/g:
1025 1025 m1
1026 1026 5/g.base:
1027 1027 a
1028 1028 5/g.local:
1029 1029 m1
1030 1030 5/g.orig:
1031 1031 m1
1032 1032 5/g.other:
1033 1033 m2
1034 1034 6/g:
1035 1035 m1
1036 1036 6/g.base:
1037 1037 a
1038 1038 6/g.local:
1039 1039 m1
1040 1040 6/g.orig:
1041 1041 m1
1042 1042 6/g.other:
1043 1043 m2
1044 1044 7/f:
1045 1045 m
1046 1046 7/f.base:
1047 1047 7/f.local:
1048 1048 m
1049 1049 7/f.orig:
1050 1050 m
1051 1051 7/f.other:
1052 1052 m2
1053 1053 8/f:
1054 1054 m2
1055 1055 $ cd ..
@@ -1,800 +1,800 b''
1 1 test that a commit clears the merge state.
2 2
3 3 $ hg init repo
4 4 $ cd repo
5 5
6 6 $ echo foo > file1
7 7 $ echo foo > file2
8 8 $ hg commit -Am 'add files'
9 9 adding file1
10 10 adding file2
11 11
12 12 $ echo bar >> file1
13 13 $ echo bar >> file2
14 14 $ hg commit -Am 'append bar to files'
15 15
16 16 create a second head with conflicting edits
17 17
18 18 $ hg up -C 0
19 19 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
20 20 $ echo baz >> file1
21 21 $ echo baz >> file2
22 22 $ hg commit -Am 'append baz to files'
23 23 created new head
24 24
25 25 create a third head with no conflicting edits
26 26 $ hg up -qC 0
27 27 $ echo foo > file3
28 28 $ hg commit -Am 'add non-conflicting file'
29 29 adding file3
30 30 created new head
31 31
32 32 failing merge
33 33
34 34 $ hg up -qC 2
35 35 $ hg merge --tool=internal:fail 1
36 36 0 files updated, 0 files merged, 0 files removed, 2 files unresolved
37 37 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
38 38 [1]
39 39
40 40 resolve -l should contain unresolved entries
41 41
42 42 $ hg resolve -l
43 43 U file1
44 44 U file2
45 45
46 46 $ hg resolve -l --no-status
47 47 file1
48 48 file2
49 49
50 50 resolving an unknown path should emit a warning, but not for -l
51 51
52 52 $ hg resolve -m does-not-exist
53 53 arguments do not match paths that need resolving
54 54 $ hg resolve -l does-not-exist
55 55
56 56 tell users how they could have used resolve
57 57
58 58 $ mkdir nested
59 59 $ cd nested
60 60 $ hg resolve -m file1
61 61 arguments do not match paths that need resolving
62 62 (try: hg resolve -m path:file1)
63 63 $ hg resolve -m file1 filez
64 64 arguments do not match paths that need resolving
65 65 (try: hg resolve -m path:file1 path:filez)
66 66 $ hg resolve -m path:file1 path:filez
67 67 $ hg resolve -l
68 68 R file1
69 69 U file2
70 70 $ hg resolve -l --config ui.relative-paths=yes
71 71 R ../file1
72 72 U ../file2
73 73 $ hg resolve --re-merge filez file2
74 74 arguments do not match paths that need resolving
75 75 (try: hg resolve --re-merge path:filez path:file2)
76 76 $ hg resolve -m filez file2
77 77 arguments do not match paths that need resolving
78 78 (try: hg resolve -m path:filez path:file2)
79 79 $ hg resolve -m path:filez path:file2
80 80 (no more unresolved files)
81 81 $ hg resolve -l
82 82 R file1
83 83 R file2
84 84
85 85 cleanup
86 86 $ hg resolve -u
87 87 $ cd ..
88 88 $ rmdir nested
89 89
90 90 don't allow marking or unmarking driver-resolved files
91 91
92 92 $ cat > $TESTTMP/markdriver.py << EOF
93 93 > '''mark and unmark files as driver-resolved'''
94 94 > from mercurial import (
95 95 > merge,
96 96 > pycompat,
97 97 > registrar,
98 98 > scmutil,
99 99 > )
100 100 > cmdtable = {}
101 101 > command = registrar.command(cmdtable)
102 102 > @command(b'markdriver',
103 103 > [(b'u', b'unmark', None, b'')],
104 104 > b'FILE...')
105 105 > def markdriver(ui, repo, *pats, **opts):
106 106 > wlock = repo.wlock()
107 107 > opts = pycompat.byteskwargs(opts)
108 108 > try:
109 109 > ms = merge.mergestate.read(repo)
110 110 > m = scmutil.match(repo[None], pats, opts)
111 111 > for f in ms:
112 112 > if not m(f):
113 113 > continue
114 114 > if not opts[b'unmark']:
115 115 > ms.mark(f, b'd')
116 116 > else:
117 117 > ms.mark(f, b'u')
118 118 > ms.commit()
119 119 > finally:
120 120 > wlock.release()
121 121 > EOF
122 122 $ hg --config extensions.markdriver=$TESTTMP/markdriver.py markdriver file1
123 123 $ hg resolve --list
124 124 D file1
125 125 U file2
126 126 $ hg resolve --mark file1
127 127 not marking file1 as it is driver-resolved
128 128 this should not print out file1
129 129 $ hg resolve --mark --all
130 130 (no more unresolved files -- run "hg resolve --all" to conclude)
131 131 $ hg resolve --mark 'glob:file*'
132 132 (no more unresolved files -- run "hg resolve --all" to conclude)
133 133 $ hg resolve --list
134 134 D file1
135 135 R file2
136 136 $ hg resolve --unmark file1
137 137 not unmarking file1 as it is driver-resolved
138 138 (no more unresolved files -- run "hg resolve --all" to conclude)
139 139 $ hg resolve --unmark --all
140 140 $ hg resolve --list
141 141 D file1
142 142 U file2
143 143 $ hg --config extensions.markdriver=$TESTTMP/markdriver.py markdriver --unmark file1
144 144 $ hg resolve --list
145 145 U file1
146 146 U file2
147 147
148 148 resolve the failure
149 149
150 150 $ echo resolved > file1
151 151 $ hg resolve -m file1
152 152
153 153 resolve -l should show resolved file as resolved
154 154
155 155 $ hg resolve -l
156 156 R file1
157 157 U file2
158 158
159 159 $ hg resolve -l -Tjson
160 160 [
161 161 {
162 162 "mergestatus": "R",
163 163 "path": "file1"
164 164 },
165 165 {
166 166 "mergestatus": "U",
167 167 "path": "file2"
168 168 }
169 169 ]
170 170
171 171 $ hg resolve -l -T '{path} {mergestatus} {status} {p1rev} {p2rev}\n'
172 172 file1 R M 2 1
173 173 file2 U M 2 1
174 174
175 175 resolve -m without paths should mark all resolved
176 176
177 177 $ hg resolve -m
178 178 (no more unresolved files)
179 179 $ hg commit -m 'resolved'
180 180
181 181 resolve -l should be empty after commit
182 182
183 183 $ hg resolve -l
184 184
185 185 $ hg resolve -l -Tjson
186 186 [
187 187 ]
188 188
189 189 resolve --all should abort when no merge in progress
190 190
191 191 $ hg resolve --all
192 192 abort: resolve command not applicable when not merging
193 193 [255]
194 194
195 195 resolve -m should abort when no merge in progress
196 196
197 197 $ hg resolve -m
198 198 abort: resolve command not applicable when not merging
199 199 [255]
200 200
201 201 can not update or merge when there are unresolved conflicts
202 202
203 203 $ hg up -qC 0
204 204 $ echo quux >> file1
205 205 $ hg up 1
206 206 merging file1
207 207 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
208 208 1 files updated, 0 files merged, 0 files removed, 1 files unresolved
209 209 use 'hg resolve' to retry unresolved file merges
210 210 [1]
211 211 $ hg up 0
212 212 abort: outstanding merge conflicts
213 213 [255]
214 214 $ hg merge 2
215 215 abort: outstanding merge conflicts
216 216 [255]
217 217 $ hg merge --force 2
218 218 abort: outstanding merge conflicts
219 219 [255]
220 220
221 221 set up conflict-free merge
222 222
223 223 $ hg up -qC 3
224 224 $ hg merge 1
225 225 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
226 226 (branch merge, don't forget to commit)
227 227
228 228 resolve --all should do nothing in merge without conflicts
229 229 $ hg resolve --all
230 230 (no more unresolved files)
231 231
232 232 resolve -m should do nothing in merge without conflicts
233 233
234 234 $ hg resolve -m
235 235 (no more unresolved files)
236 236
237 237 get back to conflicting state
238 238
239 239 $ hg up -qC 2
240 240 $ hg merge --tool=internal:fail 1
241 241 0 files updated, 0 files merged, 0 files removed, 2 files unresolved
242 242 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
243 243 [1]
244 244
245 245 resolve without arguments should suggest --all
246 246 $ hg resolve
247 247 abort: no files or directories specified
248 248 (use --all to re-merge all unresolved files)
249 249 [255]
250 250
251 251 resolve --all should re-merge all unresolved files
252 252 $ hg resolve --all
253 253 merging file1
254 254 merging file2
255 255 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
256 256 warning: conflicts while merging file2! (edit, then use 'hg resolve --mark')
257 257 [1]
258 258 $ cat file1.orig
259 259 foo
260 260 baz
261 261 $ cat file2.orig
262 262 foo
263 263 baz
264 264
265 265 .orig files should exists where specified
266 266 $ hg resolve --all --verbose --config 'ui.origbackuppath=.hg/origbackups'
267 267 merging file1
268 268 creating directory: $TESTTMP/repo/.hg/origbackups
269 269 merging file2
270 270 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
271 271 warning: conflicts while merging file2! (edit, then use 'hg resolve --mark')
272 272 [1]
273 273 $ ls .hg/origbackups
274 274 file1
275 275 file2
276 276 $ grep '<<<' file1 > /dev/null
277 277 $ grep '<<<' file2 > /dev/null
278 278
279 279 resolve <file> should re-merge file
280 280 $ echo resolved > file1
281 281 $ hg resolve -q file1
282 282 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
283 283 [1]
284 284 $ grep '<<<' file1 > /dev/null
285 285
286 286 test .orig behavior with resolve
287 287
288 288 $ hg resolve -q file1 --tool "sh -c 'f --dump \"$TESTTMP/repo/file1.orig\"'"
289 289 $TESTTMP/repo/file1.orig:
290 290 >>>
291 291 foo
292 292 baz
293 293 <<<
294 294
295 295 resolve <file> should do nothing if 'file' was marked resolved
296 296 $ echo resolved > file1
297 297 $ hg resolve -m file1
298 298 $ hg resolve -q file1
299 299 $ cat file1
300 300 resolved
301 301
302 302 insert unsupported advisory merge record
303 303
304 304 $ hg --config extensions.fakemergerecord=$TESTDIR/fakemergerecord.py fakemergerecord -x
305 305 $ hg debugmergestate
306 306 * version 2 records
307 307 local: 57653b9f834a4493f7240b0681efcb9ae7cab745
308 308 other: dc77451844e37f03f5c559e3b8529b2b48d381d1
309 309 labels:
310 310 local: working copy
311 311 other: merge rev
312 312 unrecognized entry: x advisory record
313 313 file extras: file1 (ancestorlinknode = 99726c03216e233810a2564cbc0adfe395007eac)
314 314 file: file1 (record type "F", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
315 315 local path: file1 (flags "")
316 316 ancestor path: file1 (node 2ed2a3912a0b24502043eae84ee4b279c18b90dd)
317 317 other path: file1 (node 6f4310b00b9a147241b071a60c28a650827fb03d)
318 318 file extras: file2 (ancestorlinknode = 99726c03216e233810a2564cbc0adfe395007eac)
319 319 file: file2 (record type "F", state "u", hash cb99b709a1978bd205ab9dfd4c5aaa1fc91c7523)
320 320 local path: file2 (flags "")
321 321 ancestor path: file2 (node 2ed2a3912a0b24502043eae84ee4b279c18b90dd)
322 322 other path: file2 (node 6f4310b00b9a147241b071a60c28a650827fb03d)
323 323 $ hg resolve -l
324 324 R file1
325 325 U file2
326 326
327 327 insert unsupported mandatory merge record
328 328
329 329 $ hg --config extensions.fakemergerecord=$TESTDIR/fakemergerecord.py fakemergerecord -X
330 330 $ hg debugmergestate
331 331 * version 2 records
332 332 local: 57653b9f834a4493f7240b0681efcb9ae7cab745
333 333 other: dc77451844e37f03f5c559e3b8529b2b48d381d1
334 334 labels:
335 335 local: working copy
336 336 other: merge rev
337 337 file extras: file1 (ancestorlinknode = 99726c03216e233810a2564cbc0adfe395007eac)
338 338 file: file1 (record type "F", state "r", hash 60b27f004e454aca81b0480209cce5081ec52390)
339 339 local path: file1 (flags "")
340 340 ancestor path: file1 (node 2ed2a3912a0b24502043eae84ee4b279c18b90dd)
341 341 other path: file1 (node 6f4310b00b9a147241b071a60c28a650827fb03d)
342 342 file extras: file2 (ancestorlinknode = 99726c03216e233810a2564cbc0adfe395007eac)
343 343 file: file2 (record type "F", state "u", hash cb99b709a1978bd205ab9dfd4c5aaa1fc91c7523)
344 344 local path: file2 (flags "")
345 345 ancestor path: file2 (node 2ed2a3912a0b24502043eae84ee4b279c18b90dd)
346 346 other path: file2 (node 6f4310b00b9a147241b071a60c28a650827fb03d)
347 347 unrecognized entry: X mandatory record
348 348 $ hg resolve -l
349 349 abort: unsupported merge state records: X
350 350 (see https://mercurial-scm.org/wiki/MergeStateRecords for more information)
351 351 [255]
352 352 $ hg resolve -ma
353 353 abort: unsupported merge state records: X
354 354 (see https://mercurial-scm.org/wiki/MergeStateRecords for more information)
355 355 [255]
356 356 $ hg summary
357 357 warning: merge state has unsupported record types: X
358 358 parent: 2:57653b9f834a
359 359 append baz to files
360 360 parent: 1:dc77451844e3
361 361 append bar to files
362 362 branch: default
363 363 commit: 2 modified, 2 unknown (merge)
364 364 update: 2 new changesets (update)
365 365 phases: 5 draft
366 366
367 367 update --clean shouldn't abort on unsupported records
368 368
369 369 $ hg up -qC 1
370 370 $ hg debugmergestate
371 371 no merge state found
372 372
373 373 test crashed merge with empty mergestate
374 374
375 375 $ mkdir .hg/merge
376 376 $ touch .hg/merge/state
377 377
378 378 resolve -l should be empty
379 379
380 380 $ hg resolve -l
381 381
382 382 resolve -m can be configured to look for remaining conflict markers
383 383 $ hg up -qC 2
384 384 $ hg merge -q --tool=internal:merge 1
385 385 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
386 386 warning: conflicts while merging file2! (edit, then use 'hg resolve --mark')
387 387 [1]
388 388 $ hg resolve -l
389 389 U file1
390 390 U file2
391 391 $ echo 'remove markers' > file1
392 392 $ hg --config commands.resolve.mark-check=abort resolve -m
393 393 warning: the following files still have conflict markers:
394 394 file2
395 395 abort: conflict markers detected
396 396 (use --all to mark anyway)
397 397 [255]
398 398 $ hg resolve -l
399 399 U file1
400 400 U file2
401 401 Try with --all from the hint
402 402 $ hg --config commands.resolve.mark-check=abort resolve -m --all
403 403 warning: the following files still have conflict markers:
404 404 file2
405 405 (no more unresolved files)
406 406 $ hg resolve -l
407 407 R file1
408 408 R file2
409 409 Test option value 'warn'
410 410 $ hg resolve --unmark
411 411 $ hg resolve -l
412 412 U file1
413 413 U file2
414 414 $ hg --config commands.resolve.mark-check=warn resolve -m
415 415 warning: the following files still have conflict markers:
416 416 file2
417 417 (no more unresolved files)
418 418 $ hg resolve -l
419 419 R file1
420 420 R file2
421 421 If the file is already marked as resolved, we don't warn about it
422 422 $ hg resolve --unmark file1
423 423 $ hg resolve -l
424 424 U file1
425 425 R file2
426 426 $ hg --config commands.resolve.mark-check=warn resolve -m
427 427 (no more unresolved files)
428 428 $ hg resolve -l
429 429 R file1
430 430 R file2
431 431 If the user passes an invalid value, we treat it as 'none'.
432 432 $ hg resolve --unmark
433 433 $ hg resolve -l
434 434 U file1
435 435 U file2
436 436 $ hg --config commands.resolve.mark-check=nope resolve -m
437 437 (no more unresolved files)
438 438 $ hg resolve -l
439 439 R file1
440 440 R file2
441 441 Test explicitly setting the option to 'none'
442 442 $ hg resolve --unmark
443 443 $ hg resolve -l
444 444 U file1
445 445 U file2
446 446 $ hg --config commands.resolve.mark-check=none resolve -m
447 447 (no more unresolved files)
448 448 $ hg resolve -l
449 449 R file1
450 450 R file2
451 451 Test with marking an explicit file as resolved, this should not abort (since
452 452 there's no --force flag, we have no way of combining --all with a filename)
453 453 $ hg resolve --unmark
454 454 $ hg resolve -l
455 455 U file1
456 456 U file2
457 457 (This downgrades to a warning since an explicit file was specified).
458 458 $ hg --config commands.resolve.mark-check=abort resolve -m file2
459 459 warning: the following files still have conflict markers:
460 460 file2
461 461 $ hg resolve -l
462 462 U file1
463 463 R file2
464 464 Testing the --re-merge flag
465 465 $ hg resolve --unmark file1
466 466 $ hg resolve -l
467 467 U file1
468 468 R file2
469 469 $ hg resolve --mark --re-merge
470 470 abort: too many actions specified
471 471 [255]
472 472 $ hg resolve --re-merge --all
473 473 merging file1
474 474 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
475 475 [1]
476 476 Explicit re-merge
477 477 $ hg resolve --unmark file1
478 478 $ hg resolve --config commands.resolve.explicit-re-merge=1 --all
479 479 abort: no action specified
480 480 (use --mark, --unmark, --list or --re-merge)
481 481 [255]
482 482 $ hg resolve --config commands.resolve.explicit-re-merge=1 --re-merge --all
483 483 merging file1
484 484 warning: conflicts while merging file1! (edit, then use 'hg resolve --mark')
485 485 [1]
486 486
487 487 $ cd ..
488 488
489 489 ======================================================
490 490 Test 'hg resolve' confirm config option functionality |
491 491 ======================================================
492 492 $ cat >> $HGRCPATH << EOF
493 493 > [extensions]
494 494 > rebase=
495 495 > EOF
496 496
497 497 $ hg init repo2
498 498 $ cd repo2
499 499
500 500 $ echo boss > boss
501 501 $ hg ci -Am "add boss"
502 502 adding boss
503 503
504 504 $ for emp in emp1 emp2 emp3; do echo work > $emp; done;
505 505 $ hg ci -Aqm "added emp1 emp2 emp3"
506 506
507 507 $ hg up 0
508 508 0 files updated, 0 files merged, 3 files removed, 0 files unresolved
509 509
510 510 $ for emp in emp1 emp2 emp3; do echo nowork > $emp; done;
511 511 $ hg ci -Aqm "added lazy emp1 emp2 emp3"
512 512
513 513 $ hg log -GT "{rev} {node|short} {firstline(desc)}\n"
514 514 @ 2 0acfd4a49af0 added lazy emp1 emp2 emp3
515 515 |
516 516 | o 1 f30f98a8181f added emp1 emp2 emp3
517 517 |/
518 518 o 0 88660038d466 add boss
519 519
520 520 $ hg rebase -s 1 -d 2
521 521 rebasing 1:f30f98a8181f "added emp1 emp2 emp3"
522 522 merging emp1
523 523 merging emp2
524 524 merging emp3
525 525 warning: conflicts while merging emp1! (edit, then use 'hg resolve --mark')
526 526 warning: conflicts while merging emp2! (edit, then use 'hg resolve --mark')
527 527 warning: conflicts while merging emp3! (edit, then use 'hg resolve --mark')
528 528 unresolved conflicts (see hg resolve, then hg rebase --continue)
529 529 [1]
530 530
531 531 Test when commands.resolve.confirm config option is not set:
532 532 ===========================================================
533 533 $ hg resolve --all
534 534 merging emp1
535 535 merging emp2
536 536 merging emp3
537 537 warning: conflicts while merging emp1! (edit, then use 'hg resolve --mark')
538 538 warning: conflicts while merging emp2! (edit, then use 'hg resolve --mark')
539 539 warning: conflicts while merging emp3! (edit, then use 'hg resolve --mark')
540 540 [1]
541 541
542 542 Test when config option is set:
543 543 ==============================
544 544 $ cat >> .hg/hgrc << EOF
545 545 > [ui]
546 546 > interactive = True
547 547 > [commands]
548 548 > resolve.confirm = True
549 549 > EOF
550 550
551 551 $ hg resolve
552 552 abort: no files or directories specified
553 553 (use --all to re-merge all unresolved files)
554 554 [255]
555 555 $ hg resolve --all << EOF
556 556 > n
557 557 > EOF
558 558 re-merge all unresolved files (yn)? n
559 559 abort: user quit
560 560 [255]
561 561
562 562 $ hg resolve --all << EOF
563 563 > y
564 564 > EOF
565 565 re-merge all unresolved files (yn)? y
566 566 merging emp1
567 567 merging emp2
568 568 merging emp3
569 569 warning: conflicts while merging emp1! (edit, then use 'hg resolve --mark')
570 570 warning: conflicts while merging emp2! (edit, then use 'hg resolve --mark')
571 571 warning: conflicts while merging emp3! (edit, then use 'hg resolve --mark')
572 572 [1]
573 573
574 574 Test that commands.resolve.confirm respect --mark option (only when no patterns args are given):
575 575 ===============================================================================================
576 576
577 577 $ hg resolve -m emp1
578 578 $ hg resolve -l
579 579 R emp1
580 580 U emp2
581 581 U emp3
582 582
583 583 $ hg resolve -m << EOF
584 584 > n
585 585 > EOF
586 586 mark all unresolved files as resolved (yn)? n
587 587 abort: user quit
588 588 [255]
589 589
590 590 $ hg resolve -m << EOF
591 591 > y
592 592 > EOF
593 593 mark all unresolved files as resolved (yn)? y
594 594 (no more unresolved files)
595 595 continue: hg rebase --continue
596 596 $ hg resolve -l
597 597 R emp1
598 598 R emp2
599 599 R emp3
600 600
601 601 Test that commands.resolve.confirm respect --unmark option (only when no patterns args are given):
602 602 =================================================================================================
603 603
604 604 $ hg resolve -u emp1
605 605
606 606 $ hg resolve -l
607 607 U emp1
608 608 R emp2
609 609 R emp3
610 610
611 611 $ hg resolve -u << EOF
612 612 > n
613 613 > EOF
614 614 mark all resolved files as unresolved (yn)? n
615 615 abort: user quit
616 616 [255]
617 617
618 618 $ hg resolve -m << EOF
619 619 > y
620 620 > EOF
621 621 mark all unresolved files as resolved (yn)? y
622 622 (no more unresolved files)
623 623 continue: hg rebase --continue
624 624
625 625 $ hg resolve -l
626 626 R emp1
627 627 R emp2
628 628 R emp3
629 629
630 630 $ hg rebase --abort
631 631 rebase aborted
632 632
633 633 Done with commands.resolve.confirm tests:
634 634 $ cd ..
635 635
636 636 Test that commands.resolve.mark-check works even if there are deleted files:
637 637 $ hg init resolve-deleted
638 638 $ cd resolve-deleted
639 639 $ echo r0 > file1
640 640 $ hg ci -qAm r0
641 641 $ echo r1 > file1
642 642 $ hg ci -qm r1
643 643 $ hg co -qr 0
644 644 $ hg rm file1
645 645 $ hg ci -qm "r2 (delete file1)"
646 646
647 647 (At this point we have r0 creating file1, and sibling commits r1 and r2, which
648 648 modify and delete file1, respectively)
649 649
650 650 $ hg merge -r 1
651 651 file 'file1' was deleted in local [working copy] but was modified in other [merge rev].
652 What do you want to do?
653 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
652 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
653 What do you want to do? u
654 654 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
655 655 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
656 656 [1]
657 657 $ hg resolve --list
658 658 U file1
659 659 Because we left it as 'unresolved' the file should still exist.
660 660 $ [ -f file1 ] || echo "File does not exist?"
661 661 BC behavior: `hg resolve --mark` accepts that the file is still there, and
662 662 doesn't have a problem with this situation.
663 663 $ hg resolve --mark --config commands.resolve.mark-check=abort
664 664 (no more unresolved files)
665 665 $ hg resolve --list
666 666 R file1
667 667 The file is still there:
668 668 $ [ -f file1 ] || echo "File does not exist?"
669 669 Let's check mark-check=warn:
670 670 $ hg resolve --unmark file1
671 671 $ hg resolve --mark --config commands.resolve.mark-check=warn
672 672 (no more unresolved files)
673 673 $ hg resolve --list
674 674 R file1
675 675 The file is still there:
676 676 $ [ -f file1 ] || echo "File does not exist?"
677 677 Let's resolve the issue by deleting the file via `hg resolve`
678 678 $ hg resolve --unmark file1
679 679 $ echo 'd' | hg resolve file1 --config ui.interactive=1
680 680 file 'file1' was deleted in local [working copy] but was modified in other [merge rev].
681 What do you want to do?
682 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? d
681 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
682 What do you want to do? d
683 683 (no more unresolved files)
684 684 $ hg resolve --list
685 685 R file1
686 686 The file is deleted:
687 687 $ [ -f file1 ] && echo "File still exists?" || true
688 688 Doing `hg resolve --mark` doesn't break now that the file is missing:
689 689 $ hg resolve --mark --config commands.resolve.mark-check=abort
690 690 (no more unresolved files)
691 691 $ hg resolve --mark --config commands.resolve.mark-check=warn
692 692 (no more unresolved files)
693 693 Resurrect the file, and delete it outside of hg:
694 694 $ hg resolve --unmark file1
695 695 $ hg resolve file1
696 696 file 'file1' was deleted in local [working copy] but was modified in other [merge rev].
697 What do you want to do?
698 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
697 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
698 What do you want to do? u
699 699 [1]
700 700 $ [ -f file1 ] || echo "File does not exist?"
701 701 $ hg resolve --list
702 702 U file1
703 703 $ rm file1
704 704 $ hg resolve --mark --config commands.resolve.mark-check=abort
705 705 (no more unresolved files)
706 706 $ hg resolve --list
707 707 R file1
708 708 $ hg resolve --unmark file1
709 709 $ hg resolve file1
710 710 file 'file1' was deleted in local [working copy] but was modified in other [merge rev].
711 What do you want to do?
712 use (c)hanged version, leave (d)eleted, or leave (u)nresolved? u
711 You can use (c)hanged version, leave (d)eleted, or leave (u)nresolved.
712 What do you want to do? u
713 713 [1]
714 714 $ [ -f file1 ] || echo "File does not exist?"
715 715 $ hg resolve --list
716 716 U file1
717 717 $ rm file1
718 718 $ hg resolve --mark --config commands.resolve.mark-check=warn
719 719 (no more unresolved files)
720 720 $ hg resolve --list
721 721 R file1
722 722
723 723
724 724 For completeness, let's try that in the opposite direction (merging r2 into r1,
725 725 instead of r1 into r2):
726 726 $ hg update -qCr 1
727 727 $ hg merge -r 2
728 728 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
729 What do you want to do?
730 use (c)hanged version, (d)elete, or leave (u)nresolved? u
729 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
730 What do you want to do? u
731 731 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
732 732 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
733 733 [1]
734 734 $ hg resolve --list
735 735 U file1
736 736 Because we left it as 'unresolved' the file should still exist.
737 737 $ [ -f file1 ] || echo "File does not exist?"
738 738 BC behavior: `hg resolve --mark` accepts that the file is still there, and
739 739 doesn't have a problem with this situation.
740 740 $ hg resolve --mark --config commands.resolve.mark-check=abort
741 741 (no more unresolved files)
742 742 $ hg resolve --list
743 743 R file1
744 744 The file is still there:
745 745 $ [ -f file1 ] || echo "File does not exist?"
746 746 Let's check mark-check=warn:
747 747 $ hg resolve --unmark file1
748 748 $ hg resolve --mark --config commands.resolve.mark-check=warn
749 749 (no more unresolved files)
750 750 $ hg resolve --list
751 751 R file1
752 752 The file is still there:
753 753 $ [ -f file1 ] || echo "File does not exist?"
754 754 Let's resolve the issue by deleting the file via `hg resolve`
755 755 $ hg resolve --unmark file1
756 756 $ echo 'd' | hg resolve file1 --config ui.interactive=1
757 757 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
758 What do you want to do?
759 use (c)hanged version, (d)elete, or leave (u)nresolved? d
758 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
759 What do you want to do? d
760 760 (no more unresolved files)
761 761 $ hg resolve --list
762 762 R file1
763 763 The file is deleted:
764 764 $ [ -f file1 ] && echo "File still exists?" || true
765 765 Doing `hg resolve --mark` doesn't break now that the file is missing:
766 766 $ hg resolve --mark --config commands.resolve.mark-check=abort
767 767 (no more unresolved files)
768 768 $ hg resolve --mark --config commands.resolve.mark-check=warn
769 769 (no more unresolved files)
770 770 Resurrect the file, and delete it outside of hg:
771 771 $ hg resolve --unmark file1
772 772 $ hg resolve file1
773 773 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
774 What do you want to do?
775 use (c)hanged version, (d)elete, or leave (u)nresolved? u
774 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
775 What do you want to do? u
776 776 [1]
777 777 $ [ -f file1 ] || echo "File does not exist?"
778 778 $ hg resolve --list
779 779 U file1
780 780 $ rm file1
781 781 $ hg resolve --mark --config commands.resolve.mark-check=abort
782 782 (no more unresolved files)
783 783 $ hg resolve --list
784 784 R file1
785 785 $ hg resolve --unmark file1
786 786 $ hg resolve file1
787 787 file 'file1' was deleted in other [merge rev] but was modified in local [working copy].
788 What do you want to do?
789 use (c)hanged version, (d)elete, or leave (u)nresolved? u
788 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
789 What do you want to do? u
790 790 [1]
791 791 $ [ -f file1 ] || echo "File does not exist?"
792 792 $ hg resolve --list
793 793 U file1
794 794 $ rm file1
795 795 $ hg resolve --mark --config commands.resolve.mark-check=warn
796 796 (no more unresolved files)
797 797 $ hg resolve --list
798 798 R file1
799 799
800 800 $ cd ..
@@ -1,188 +1,188 b''
1 1 test merging things outside of the sparse checkout
2 2
3 3 $ hg init myrepo
4 4 $ cd myrepo
5 5 $ cat > .hg/hgrc <<EOF
6 6 > [extensions]
7 7 > sparse=
8 8 > EOF
9 9
10 10 $ echo foo > foo
11 11 $ echo bar > bar
12 12 $ hg add foo bar
13 13 $ hg commit -m initial
14 14
15 15 $ hg branch feature
16 16 marked working directory as branch feature
17 17 (branches are permanent and global, did you want a bookmark?)
18 18 $ echo bar2 >> bar
19 19 $ hg commit -m 'feature - bar2'
20 20
21 21 $ hg update -q default
22 22 $ hg debugsparse --exclude 'bar**'
23 23
24 24 $ hg merge feature
25 25 temporarily included 1 file(s) in the sparse checkout for merging
26 26 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
27 27 (branch merge, don't forget to commit)
28 28
29 29 Verify bar was merged temporarily
30 30
31 31 $ ls
32 32 bar
33 33 foo
34 34 $ hg status
35 35 M bar
36 36
37 37 Verify bar disappears automatically when the working copy becomes clean
38 38
39 39 $ hg commit -m "merged"
40 40 cleaned up 1 temporarily added file(s) from the sparse checkout
41 41 $ hg status
42 42 $ ls
43 43 foo
44 44
45 45 $ hg cat -r . bar
46 46 bar
47 47 bar2
48 48
49 49 Test merging things outside of the sparse checkout that are not in the working
50 50 copy
51 51
52 52 $ hg strip -q -r . --config extensions.strip=
53 53 $ hg up -q feature
54 54 $ touch branchonly
55 55 $ hg ci -Aqm 'add branchonly'
56 56
57 57 $ hg up -q default
58 58 $ hg debugsparse -X branchonly
59 59 $ hg merge feature
60 60 temporarily included 2 file(s) in the sparse checkout for merging
61 61 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
62 62 (branch merge, don't forget to commit)
63 63
64 64 $ cd ..
65 65
66 66 Tests merging a file which is modified in one branch and deleted in another and
67 67 file is excluded from sparse checkout
68 68
69 69 $ hg init ytest
70 70 $ cd ytest
71 71 $ echo "syntax: glob" >> .hgignore
72 72 $ echo "*.orig" >> .hgignore
73 73 $ hg ci -Aqm "added .hgignore"
74 74 $ for ch in a d; do echo foo > $ch; hg ci -Aqm "added "$ch; done;
75 75 $ cat >> .hg/hgrc <<EOF
76 76 > [alias]
77 77 > glog = log -GT "{rev}:{node|short} {desc}"
78 78 > [extensions]
79 79 > sparse =
80 80 > EOF
81 81
82 82 $ hg glog
83 83 @ 2:f29feff37cfc added d
84 84 |
85 85 o 1:617125d27d6b added a
86 86 |
87 87 o 0:53f3774ed939 added .hgignore
88 88
89 89 $ hg rm d
90 90 $ hg ci -m "removed d"
91 91
92 92 $ hg up '.^'
93 93 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
94 94 $ hg debugsparse --reset
95 95 $ echo bar >> d
96 96 $ hg ci -Am "added bar to d"
97 97 created new head
98 98
99 99 $ hg glog
100 100 @ 4:6527874a90e4 added bar to d
101 101 |
102 102 | o 3:372c8558de45 removed d
103 103 |/
104 104 o 2:f29feff37cfc added d
105 105 |
106 106 o 1:617125d27d6b added a
107 107 |
108 108 o 0:53f3774ed939 added .hgignore
109 109
110 110 $ hg debugsparse --exclude "d"
111 111 $ ls
112 112 a
113 113
114 114 $ hg merge
115 115 temporarily included 1 file(s) in the sparse checkout for merging
116 116 file 'd' was deleted in other [merge rev] but was modified in local [working copy].
117 What do you want to do?
118 use (c)hanged version, (d)elete, or leave (u)nresolved? u
117 You can use (c)hanged version, (d)elete, or leave (u)nresolved.
118 What do you want to do? u
119 119 0 files updated, 0 files merged, 0 files removed, 1 files unresolved
120 120 use 'hg resolve' to retry unresolved file merges or 'hg merge --abort' to abandon
121 121 [1]
122 122
123 123 $ cd ..
124 124
125 125 Testing merging of a file which is renamed+modified on one side and modified on
126 126 another
127 127
128 128 $ hg init mvtest
129 129 $ cd mvtest
130 130 $ echo "syntax: glob" >> .hgignore
131 131 $ echo "*.orig" >> .hgignore
132 132 $ hg ci -Aqm "added .hgignore"
133 133 $ for ch in a d; do echo foo > $ch; hg ci -Aqm "added "$ch; done;
134 134 $ cat >> .hg/hgrc <<EOF
135 135 > [alias]
136 136 > glog = log -GT "{rev}:{node|short} {desc}"
137 137 > [extensions]
138 138 > sparse =
139 139 > EOF
140 140
141 141 $ hg glog
142 142 @ 2:f29feff37cfc added d
143 143 |
144 144 o 1:617125d27d6b added a
145 145 |
146 146 o 0:53f3774ed939 added .hgignore
147 147
148 148 $ echo babar >> a
149 149 $ hg ci -m "added babar to a"
150 150
151 151 $ hg up '.^'
152 152 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
153 153 $ hg mv a amove
154 154 $ hg ci -m "moved a to amove"
155 155 created new head
156 156
157 157 $ hg up 3
158 158 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
159 159 $ hg glog
160 160 o 4:5d1e85955f6d moved a to amove
161 161 |
162 162 | @ 3:a06e41a6c16c added babar to a
163 163 |/
164 164 o 2:f29feff37cfc added d
165 165 |
166 166 o 1:617125d27d6b added a
167 167 |
168 168 o 0:53f3774ed939 added .hgignore
169 169
170 170 $ hg debugsparse --exclude "a"
171 171 $ ls
172 172 d
173 173
174 174 $ hg merge
175 175 temporarily included 1 file(s) in the sparse checkout for merging
176 176 merging a and amove to amove
177 177 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
178 178 (branch merge, don't forget to commit)
179 179
180 180 $ hg up -C 4
181 181 cleaned up 1 temporarily added file(s) from the sparse checkout
182 182 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
183 183
184 184 $ hg merge
185 185 merging amove and a to amove
186 186 abort: cannot add 'a' - it is outside the sparse checkout
187 187 (include file with `hg debugsparse --include <pattern>` or use `hg add -s <file>` to include file directory while adding)
188 188 [255]
General Comments 0
You need to be logged in to leave comments. Login now