Mercurial > hg-stable
view contrib/simplemerge @ 41298:88a7c211b21e stable
narrow: fix crash when restoring backup in legacy repo
Using --addremove when committing in an old repo (before we started
keeping .hg/narrowspec.dirstate) results in a crash. The test
case modified in this patch would crash like this:
abort: $ENOENT$
The issue is that when the dirstateguard is aborted, it tries to
restore the backup of .hg/narrowspec.dirstate. However, since we were
in an old repo, that file did not get created when the dirstateguard
was created. Note that the dirstateguard is not used unless
--addremove is passed.
This patch fixes the bug by making restorewcbackup() not fail if the
backup doesn't exist. I also made clearwcbackup() safe, just in case.
Differential Revision: https://phab.mercurial-scm.org/D5634
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Fri, 18 Jan 2019 23:32:26 -0800 |
parents | d6b7c4e77bb4 |
children | 3c2799cbace4 |
line wrap: on
line source
#!/usr/bin/env python from __future__ import absolute_import import getopt import sys import hgdemandimport hgdemandimport.enable() from mercurial.i18n import _ from mercurial import ( context, error, fancyopts, pycompat, simplemerge, ui as uimod, ) from mercurial.utils import ( procutil, ) options = [(b'L', b'label', [], _(b'labels to use on conflict markers')), (b'a', b'text', None, _(b'treat all files as text')), (b'p', b'print', None, _(b'print results instead of overwriting LOCAL')), (b'', b'no-minimal', None, _(b'no effect (DEPRECATED)')), (b'h', b'help', None, _(b'display help and exit')), (b'q', b'quiet', None, _(b'suppress output'))] usage = _(b'''simplemerge [OPTS] LOCAL BASE OTHER Simple three-way file merge utility with a minimal feature set. Apply to LOCAL the changes necessary to go from BASE to OTHER. By default, LOCAL is overwritten with the results of this operation. ''') class ParseError(Exception): """Exception raised on errors in parsing the command line.""" def showhelp(): pycompat.stdout.write(usage) pycompat.stdout.write(b'\noptions:\n') out_opts = [] for shortopt, longopt, default, desc in options: out_opts.append((b'%2s%s' % (shortopt and b'-%s' % shortopt, longopt and b' --%s' % longopt), b'%s' % desc)) opts_len = max([len(opt[0]) for opt in out_opts]) for first, second in out_opts: pycompat.stdout.write(b' %-*s %s\n' % (opts_len, first, second)) try: for fp in (sys.stdin, pycompat.stdout, sys.stderr): procutil.setbinary(fp) opts = {} try: bargv = [a.encode('utf8') for a in sys.argv[1:]] args = fancyopts.fancyopts(bargv, options, opts) except getopt.GetoptError as e: raise ParseError(e) if opts[b'help']: showhelp() sys.exit(0) if len(args) != 3: raise ParseError(_(b'wrong number of arguments').decode('utf8')) local, base, other = args sys.exit(simplemerge.simplemerge(uimod.ui.load(), context.arbitraryfilectx(local), context.arbitraryfilectx(base), context.arbitraryfilectx(other), **pycompat.strkwargs(opts))) except ParseError as e: if pycompat.ispy3: e = str(e).encode('utf8') pycompat.stdout.write(b"%s: %s\n" % (sys.argv[0].encode('utf8'), e)) showhelp() sys.exit(1) except error.Abort as e: pycompat.stderr.write(b"abort: %s\n" % e) sys.exit(255) except KeyboardInterrupt: sys.exit(255)