##// END OF EJS Templates
contrib: make simplemerge script pass context-like objects...
contrib: make simplemerge script pass context-like objects `simplemerge()` will soon require context-like objects to work. Create a simple context-like object that wraps the requested files and can be passed to the new API. Differential Revision: https://phab.mercurial-scm.org/D378

File last commit:

r33904:ed6f6417 default
r33904:ed6f6417 default
Show More
simplemerge
104 lines | 3.0 KiB | text/plain | TextLexer
#!/usr/bin/env python
from __future__ import absolute_import
import getopt
import sys
import hgdemandimport
hgdemandimport.enable()
from mercurial.i18n import _
from mercurial import (
error,
fancyopts,
simplemerge,
ui as uimod,
util,
)
options = [('L', 'label', [], _('labels to use on conflict markers')),
('a', 'text', None, _('treat all files as text')),
('p', 'print', None,
_('print results instead of overwriting LOCAL')),
('', 'no-minimal', None, _('no effect (DEPRECATED)')),
('h', 'help', None, _('display help and exit')),
('q', 'quiet', None, _('suppress output'))]
usage = _('''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():
sys.stdout.write(usage)
sys.stdout.write('\noptions:\n')
out_opts = []
for shortopt, longopt, default, desc in options:
out_opts.append(('%2s%s' % (shortopt and '-%s' % shortopt,
longopt and ' --%s' % longopt),
'%s' % desc))
opts_len = max([len(opt[0]) for opt in out_opts])
for first, second in out_opts:
sys.stdout.write(' %-*s %s\n' % (opts_len, first, second))
class filebackedctx(object):
"""simplemerge requires context-like objects"""
def __init__(self, path):
self._path = path
def decodeddata(self):
with open(self._path, "rb") as f:
return f.read()
def flags(self):
return ''
def path(self):
return self._path
def write(self, data, flags):
assert not flags
with open(self._path, "w") as f:
f.write(data)
try:
for fp in (sys.stdin, sys.stdout, sys.stderr):
util.setbinary(fp)
opts = {}
try:
args = fancyopts.fancyopts(sys.argv[1:], options, opts)
except getopt.GetoptError as e:
raise ParseError(e)
if opts['help']:
showhelp()
sys.exit(0)
if len(args) != 3:
raise ParseError(_('wrong number of arguments'))
local, base, other = args
sys.exit(simplemerge.simplemerge(uimod.ui.load(),
local,
base,
other,
filebackedctx(local),
filebackedctx(base),
filebackedctx(other),
filtereddata=True,
**opts))
except ParseError as e:
sys.stdout.write("%s: %s\n" % (sys.argv[0], e))
showhelp()
sys.exit(1)
except error.Abort as e:
sys.stderr.write("abort: %s\n" % e)
sys.exit(255)
except KeyboardInterrupt:
sys.exit(255)