439 fco = other file context |
439 fco = other file context |
440 fca = ancestor file context |
440 fca = ancestor file context |
441 fcd = local file context for current/destination file |
441 fcd = local file context for current/destination file |
442 """ |
442 """ |
443 |
443 |
444 def temp(prefix, ctx): |
444 if True: |
445 pre = "%s~%s." % (os.path.basename(ctx.path()), prefix) |
445 def temp(prefix, ctx): |
446 (fd, name) = tempfile.mkstemp(prefix=pre) |
446 pre = "%s~%s." % (os.path.basename(ctx.path()), prefix) |
447 data = repo.wwritedata(ctx.path(), ctx.data()) |
447 (fd, name) = tempfile.mkstemp(prefix=pre) |
448 f = os.fdopen(fd, "wb") |
448 data = repo.wwritedata(ctx.path(), ctx.data()) |
449 f.write(data) |
449 f = os.fdopen(fd, "wb") |
450 f.close() |
450 f.write(data) |
451 return name |
451 f.close() |
452 |
452 return name |
453 if not fco.cmp(fcd): # files identical? |
453 |
454 return None |
454 if not fco.cmp(fcd): # files identical? |
455 |
455 return None |
456 ui = repo.ui |
456 |
457 fd = fcd.path() |
457 ui = repo.ui |
458 binary = fcd.isbinary() or fco.isbinary() or fca.isbinary() |
458 fd = fcd.path() |
459 symlink = 'l' in fcd.flags() + fco.flags() |
459 binary = fcd.isbinary() or fco.isbinary() or fca.isbinary() |
460 tool, toolpath = _picktool(repo, ui, fd, binary, symlink) |
460 symlink = 'l' in fcd.flags() + fco.flags() |
461 ui.debug("picked tool '%s' for %s (binary %s symlink %s)\n" % |
461 tool, toolpath = _picktool(repo, ui, fd, binary, symlink) |
462 (tool, fd, binary, symlink)) |
462 ui.debug("picked tool '%s' for %s (binary %s symlink %s)\n" % |
463 |
463 (tool, fd, binary, symlink)) |
464 if tool in internals: |
464 |
465 func = internals[tool] |
465 if tool in internals: |
466 trymerge = func.trymerge |
466 func = internals[tool] |
467 onfailure = func.onfailure |
467 trymerge = func.trymerge |
468 else: |
468 onfailure = func.onfailure |
469 func = _xmerge |
469 else: |
470 trymerge = True |
470 func = _xmerge |
471 onfailure = _("merging %s failed!\n") |
471 trymerge = True |
472 |
472 onfailure = _("merging %s failed!\n") |
473 toolconf = tool, toolpath, binary, symlink |
473 |
474 |
474 toolconf = tool, toolpath, binary, symlink |
475 if not trymerge: |
475 |
476 return func(repo, mynode, orig, fcd, fco, fca, toolconf) |
476 if not trymerge: |
477 |
477 return func(repo, mynode, orig, fcd, fco, fca, toolconf) |
478 a = repo.wjoin(fd) |
478 |
479 b = temp("base", fca) |
479 a = repo.wjoin(fd) |
480 c = temp("other", fco) |
480 b = temp("base", fca) |
481 back = a + ".orig" |
481 c = temp("other", fco) |
482 util.copyfile(a, back) |
482 back = a + ".orig" |
483 |
483 util.copyfile(a, back) |
484 if orig != fco.path(): |
484 |
485 ui.status(_("merging %s and %s to %s\n") % (orig, fco.path(), fd)) |
485 if orig != fco.path(): |
486 else: |
486 ui.status(_("merging %s and %s to %s\n") % (orig, fco.path(), fd)) |
487 ui.status(_("merging %s\n") % fd) |
487 else: |
488 |
488 ui.status(_("merging %s\n") % fd) |
489 ui.debug("my %s other %s ancestor %s\n" % (fcd, fco, fca)) |
489 |
490 |
490 ui.debug("my %s other %s ancestor %s\n" % (fcd, fco, fca)) |
491 markerstyle = ui.config('ui', 'mergemarkers', 'basic') |
491 |
492 if not labels: |
492 markerstyle = ui.config('ui', 'mergemarkers', 'basic') |
493 labels = _defaultconflictlabels |
493 if not labels: |
494 if markerstyle != 'basic': |
494 labels = _defaultconflictlabels |
495 labels = _formatlabels(repo, fcd, fco, fca, labels) |
495 if markerstyle != 'basic': |
496 |
496 labels = _formatlabels(repo, fcd, fco, fca, labels) |
497 needcheck, r = func(repo, mynode, orig, fcd, fco, fca, toolconf, |
497 |
498 (a, b, c, back), labels=labels) |
498 needcheck, r = func(repo, mynode, orig, fcd, fco, fca, toolconf, |
499 if not needcheck: |
499 (a, b, c, back), labels=labels) |
|
500 if not needcheck: |
|
501 if r: |
|
502 if onfailure: |
|
503 ui.warn(onfailure % fd) |
|
504 else: |
|
505 util.unlink(back) |
|
506 |
|
507 util.unlink(b) |
|
508 util.unlink(c) |
|
509 return r |
|
510 |
|
511 if not r and (_toolbool(ui, tool, "checkconflicts") or |
|
512 'conflicts' in _toollist(ui, tool, "check")): |
|
513 if re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcd.data(), |
|
514 re.MULTILINE): |
|
515 r = 1 |
|
516 |
|
517 checked = False |
|
518 if 'prompt' in _toollist(ui, tool, "check"): |
|
519 checked = True |
|
520 if ui.promptchoice(_("was merge of '%s' successful (yn)?" |
|
521 "$$ &Yes $$ &No") % fd, 1): |
|
522 r = 1 |
|
523 |
|
524 if not r and not checked and (_toolbool(ui, tool, "checkchanged") or |
|
525 'changed' in |
|
526 _toollist(ui, tool, "check")): |
|
527 if filecmp.cmp(a, back): |
|
528 if ui.promptchoice(_(" output file %s appears unchanged\n" |
|
529 "was merge successful (yn)?" |
|
530 "$$ &Yes $$ &No") % fd, 1): |
|
531 r = 1 |
|
532 |
|
533 if _toolbool(ui, tool, "fixeol"): |
|
534 _matcheol(a, back) |
|
535 |
500 if r: |
536 if r: |
501 if onfailure: |
537 if onfailure: |
502 ui.warn(onfailure % fd) |
538 ui.warn(onfailure % fd) |
503 else: |
539 else: |
504 util.unlink(back) |
540 util.unlink(back) |
505 |
541 |
506 util.unlink(b) |
542 util.unlink(b) |
507 util.unlink(c) |
543 util.unlink(c) |
508 return r |
544 return r |
509 |
545 |
510 if not r and (_toolbool(ui, tool, "checkconflicts") or |
|
511 'conflicts' in _toollist(ui, tool, "check")): |
|
512 if re.search("^(<<<<<<< .*|=======|>>>>>>> .*)$", fcd.data(), |
|
513 re.MULTILINE): |
|
514 r = 1 |
|
515 |
|
516 checked = False |
|
517 if 'prompt' in _toollist(ui, tool, "check"): |
|
518 checked = True |
|
519 if ui.promptchoice(_("was merge of '%s' successful (yn)?" |
|
520 "$$ &Yes $$ &No") % fd, 1): |
|
521 r = 1 |
|
522 |
|
523 if not r and not checked and (_toolbool(ui, tool, "checkchanged") or |
|
524 'changed' in _toollist(ui, tool, "check")): |
|
525 if filecmp.cmp(a, back): |
|
526 if ui.promptchoice(_(" output file %s appears unchanged\n" |
|
527 "was merge successful (yn)?" |
|
528 "$$ &Yes $$ &No") % fd, 1): |
|
529 r = 1 |
|
530 |
|
531 if _toolbool(ui, tool, "fixeol"): |
|
532 _matcheol(a, back) |
|
533 |
|
534 if r: |
|
535 if onfailure: |
|
536 ui.warn(onfailure % fd) |
|
537 else: |
|
538 util.unlink(back) |
|
539 |
|
540 util.unlink(b) |
|
541 util.unlink(c) |
|
542 return r |
|
543 |
|
544 # tell hggettext to extract docstrings from these functions: |
546 # tell hggettext to extract docstrings from these functions: |
545 i18nfunctions = internals.values() |
547 i18nfunctions = internals.values() |