# HG changeset patch # User Vadim Gelfer # Date 1142062476 28800 # Node ID 4e44ca05a86667447c55f6886fae562101d96b1e # Parent b98160cfb2f3901bf6e133bb9e112aaf49bd4a66# Parent 4392ccefe4321d1d061a9f9f9b6f399818462cdd merge with self. diff -r 4392ccefe432 -r 4e44ca05a866 hgmerge --- a/hgmerge Fri Mar 10 23:25:50 2006 -0800 +++ b/hgmerge Fri Mar 10 23:34:36 2006 -0800 @@ -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 diff -r 4392ccefe432 -r 4e44ca05a866 mercurial/localrepo.py --- a/mercurial/localrepo.py Fri Mar 10 23:25:50 2006 -0800 +++ b/mercurial/localrepo.py Fri Mar 10 23:34:36 2006 -0800 @@ -55,7 +55,7 @@ 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 @@ # 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 @@ 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 @@ 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) diff -r 4392ccefe432 -r 4e44ca05a866 mercurial/ui.py --- a/mercurial/ui.py Fri Mar 10 23:25:50 2006 -0800 +++ b/mercurial/ui.py Fri Mar 10 23:34:36 2006 -0800 @@ -209,7 +209,9 @@ 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) diff -r 4392ccefe432 -r 4e44ca05a866 mercurial/util.py --- a/mercurial/util.py Fri Mar 10 23:25:50 2006 -0800 +++ b/mercurial/util.py Fri Mar 10 23:34:36 2006 -0800 @@ -315,19 +315,13 @@ (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 @@ 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: