Mercurial > public > mercurial-scm > hg
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): |