|
|
#!/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)
|
|
|
|