simplemerge
104 lines
| 3.0 KiB
| text/plain
|
TextLexer
/ contrib / simplemerge
|
r4363 | #!/usr/bin/env python | ||
|
r33896 | from __future__ import absolute_import | ||
|
r4362 | |||
|
r30576 | import getopt | ||
|
r19378 | import sys | ||
|
r33896 | |||
import hgdemandimport | ||||
hgdemandimport.enable() | ||||
|
r4363 | from mercurial.i18n import _ | ||
|
r33896 | from mercurial import ( | ||
error, | ||||
fancyopts, | ||||
simplemerge, | ||||
ui as uimod, | ||||
util, | ||||
) | ||||
|
r4362 | |||
|
r4364 | 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')), | ||||
|
r22023 | ('', 'no-minimal', None, _('no effect (DEPRECATED)')), | ||
|
r4364 | ('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. | ||||
|
r5081 | |||
|
r4364 | Apply to LOCAL the changes necessary to go from BASE to OTHER. | ||
|
r5081 | |||
|
r4364 | By default, LOCAL is overwritten with the results of this operation. | ||
''') | ||||
|
r6002 | class ParseError(Exception): | ||
"""Exception raised on errors in parsing the command line.""" | ||||
|
r4364 | def showhelp(): | ||
sys.stdout.write(usage) | ||||
sys.stdout.write('\noptions:\n') | ||||
|
r4362 | |||
|
r4364 | 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)) | ||||
|
r33904 | 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) | ||||
|
r6002 | try: | ||
|
r7080 | for fp in (sys.stdin, sys.stdout, sys.stderr): | ||
|
r14233 | util.setbinary(fp) | ||
|
r19022 | |||
|
r6002 | opts = {} | ||
|
r4364 | try: | ||
|
r6002 | args = fancyopts.fancyopts(sys.argv[1:], options, opts) | ||
|
r30576 | except getopt.GetoptError as e: | ||
|
r6002 | raise ParseError(e) | ||
if opts['help']: | ||||
|
r4364 | showhelp() | ||
|
r6002 | sys.exit(0) | ||
if len(args) != 3: | ||||
raise ParseError(_('wrong number of arguments')) | ||||
|
r33904 | local, base, other = args | ||
sys.exit(simplemerge.simplemerge(uimod.ui.load(), | ||||
local, | ||||
base, | ||||
other, | ||||
filebackedctx(local), | ||||
filebackedctx(base), | ||||
filebackedctx(other), | ||||
filtereddata=True, | ||||
**opts)) | ||||
|
r28047 | except ParseError as e: | ||
|
r6002 | sys.stdout.write("%s: %s\n" % (sys.argv[0], e)) | ||
showhelp() | ||||
sys.exit(1) | ||||
|
r28047 | except error.Abort as e: | ||
|
r6002 | sys.stderr.write("abort: %s\n" % e) | ||
sys.exit(255) | ||||
except KeyboardInterrupt: | ||||
sys.exit(255) | ||||