comparison mercurial/localrepo.py @ 1880:05c7d75be925

fix broken environment save/restore when a hook runs. move "run commend with different env/cwd" code out to function in util. new function is called esystem.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Fri, 10 Mar 2006 22:24:19 -0800
parents 5ac811b720de
children c0320567931f
comparison
equal deleted inserted replaced
1879:9ef0850b9b68 1880:05c7d75be925
52 pass 52 pass
53 53
54 def hook(self, name, throw=False, **args): 54 def hook(self, name, throw=False, **args):
55 def runhook(name, cmd): 55 def runhook(name, cmd):
56 self.ui.note(_("running hook %s: %s\n") % (name, cmd)) 56 self.ui.note(_("running hook %s: %s\n") % (name, cmd))
57 old = {} 57 env = dict([('HG_' + k.upper(), v) for k, v in args.iteritems()])
58 for k, v in args.items(): 58 r = util.esystem(cmd, environ=env, cwd=self.root)
59 k = k.upper()
60 old['HG_' + k] = os.environ.get(k, None)
61 old[k] = os.environ.get(k, None)
62 os.environ['HG_' + k] = str(v)
63 os.environ[k] = str(v)
64
65 try:
66 # Hooks run in the repository root
67 olddir = os.getcwd()
68 os.chdir(self.root)
69 r = os.system(cmd)
70 finally:
71 for k, v in old.items():
72 if v is not None:
73 os.environ[k] = v
74 else:
75 del os.environ[k]
76
77 os.chdir(olddir)
78
79 if r: 59 if r:
80 desc, r = util.explain_exit(r) 60 desc, r = util.explain_exit(r)
81 if throw: 61 if throw:
82 raise util.Abort(_('%s hook %s') % (name, desc)) 62 raise util.Abort(_('%s hook %s') % (name, desc))
83 self.ui.warn(_('error: %s hook %s\n') % (name, desc)) 63 self.ui.warn(_('error: %s hook %s\n') % (name, desc))
229 except IOError: 209 except IOError:
230 ds = "" 210 ds = ""
231 self.opener("journal.dirstate", "w").write(ds) 211 self.opener("journal.dirstate", "w").write(ds)
232 212
233 tr = transaction.transaction(self.ui.warn, self.opener, 213 tr = transaction.transaction(self.ui.warn, self.opener,
234 self.join("journal"), 214 self.join("journal"),
235 aftertrans(self.path)) 215 aftertrans(self.path))
236 self.transhandle = tr 216 self.transhandle = tr
237 return tr 217 return tr
238 218
239 def recover(self): 219 def recover(self):