merge with self.
--- a/hgmerge
+++ b/hgmerge
@@ -4,6 +4,12 @@
#
# This tries to find a way to do three-way merge on the current system.
# The result ought to end up in $1.
+#
+# Environment variables set by Mercurial:
+# HG_ROOT repo root
+# HG_FILE name of file within repo
+# HG_MY_NODE revision being merged
+# HG_OTHER_NODE revision being merged
set -e # bail out quickly on failure
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -55,7 +55,7 @@ class localrepository(object):
def runhook(name, cmd):
self.ui.note(_("running hook %s: %s\n") % (name, cmd))
env = dict([('HG_' + k.upper(), v) for k, v in args.iteritems()])
- r = util.esystem(cmd, environ=env, cwd=self.root)
+ r = util.system(cmd, environ=env, cwd=self.root)
if r:
desc, r = util.explain_exit(r)
if throw:
@@ -1636,10 +1636,12 @@ class localrepository(object):
# merge the tricky bits
files = merge.keys()
files.sort()
+ xp1 = hex(p1)
+ xp2 = hex(p2)
for f in files:
self.ui.status(_("merging %s\n") % f)
my, other, flag = merge[f]
- ret = self.merge3(f, my, other)
+ ret = self.merge3(f, my, other, xp1, xp2)
if ret:
err = True
util.set_exec(self.wjoin(f), flag)
@@ -1677,7 +1679,7 @@ class localrepository(object):
self.dirstate.setparents(p1, p2)
return err
- def merge3(self, fn, my, other):
+ def merge3(self, fn, my, other, p1, p2):
"""perform a 3-way merge in the working directory"""
def temp(prefix, node):
@@ -1700,7 +1702,14 @@ class localrepository(object):
cmd = (os.environ.get("HGMERGE") or self.ui.config("ui", "merge")
or "hgmerge")
- r = os.system('%s "%s" "%s" "%s"' % (cmd, a, b, c))
+ r = util.system('%s "%s" "%s" "%s"' % (cmd, a, b, c),
+ environ={'HG_ROOT': self.root,
+ 'HG_FILE': fn,
+ 'HG_MY_NODE': p1,
+ 'HG_OTHER_NODE': p2,
+ 'HG_FILE_MY_NODE': hex(my),
+ 'HG_FILE_OTHER_NODE': hex(other),
+ 'HG_FILE_BASE_NODE': hex(base)})
if r:
self.ui.warn(_("merging %s failed!\n") % fn)
--- a/mercurial/ui.py
+++ b/mercurial/ui.py
@@ -209,7 +209,9 @@ class ui(object):
os.environ.get("EDITOR", "vi"))
os.environ["HGUSER"] = self.username()
- util.system("%s \"%s\"" % (editor, name), errprefix=_("edit failed"))
+ util.system("%s \"%s\"" % (editor, name),
+ environ={'HGUSER': self.username()},
+ onerr=util.Abort, errprefix=_("edit failed"))
t = open(name).read()
t = re.sub("(?m)^HG:.*\n", "", t)
--- a/mercurial/util.py
+++ b/mercurial/util.py
@@ -315,19 +315,13 @@ def _matcher(canonroot, cwd, names, inc,
(files and filematch(fn)))),
(inc or exc or (pats and pats != [('glob', '**')])) and True)
-def system(cmd, errprefix=None):
- """execute a shell command that must succeed"""
- rc = os.system(cmd)
- if rc:
- errmsg = "%s %s" % (os.path.basename(cmd.split(None, 1)[0]),
- explain_exit(rc)[0])
- if errprefix:
- errmsg = "%s: %s" % (errprefix, errmsg)
- raise Abort(errmsg)
+def system(cmd, environ={}, cwd=None, onerr=None, errprefix=None):
+ '''enhanced shell command execution.
+ run with environment maybe modified, maybe in different dir.
-def esystem(cmd, environ={}, cwd=None):
- '''enhanced shell command execution.
- run with environment maybe modified, maybe in different dir.'''
+ if command fails and onerr is None, return status. if ui object,
+ print error message and return status, else raise onerr object as
+ exception.'''
oldenv = {}
for k in environ:
oldenv[k] = os.environ.get(k)
@@ -338,7 +332,17 @@ def esystem(cmd, environ={}, cwd=None):
os.environ[k] = str(v)
if cwd is not None and oldcwd != cwd:
os.chdir(cwd)
- return os.system(cmd)
+ rc = os.system(cmd)
+ if rc and onerr:
+ errmsg = '%s %s' % (os.path.basename(cmd.split(None, 1)[0]),
+ explain_exit(rc)[0])
+ if errprefix:
+ errmsg = '%s: %s' % (errprefix, errmsg)
+ try:
+ onerr.warn(errmsg + '\n')
+ except AttributeError:
+ raise onerr(errmsg)
+ return rc
finally:
for k, v in oldenv.iteritems():
if v is None: