##// END OF EJS Templates
fix broken environment save/restore when a hook runs....
Vadim Gelfer -
r1880:05c7d75b default
parent child Browse files
Show More
@@ -7,6 +7,8 b''
7
7
8 set -e # bail out quickly on failure
8 set -e # bail out quickly on failure
9
9
10 echo $1 $2 $3
11
10 LOCAL="$1"
12 LOCAL="$1"
11 BASE="$2"
13 BASE="$2"
12 OTHER="$3"
14 OTHER="$3"
@@ -54,28 +54,8 b' class localrepository(object):'
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:
@@ -231,7 +211,7 b' class localrepository(object):'
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
@@ -325,6 +325,29 b' def system(cmd, errprefix=None):'
325 errmsg = "%s: %s" % (errprefix, errmsg)
325 errmsg = "%s: %s" % (errprefix, errmsg)
326 raise Abort(errmsg)
326 raise Abort(errmsg)
327
327
328 def esystem(cmd, environ={}, cwd=None):
329 '''enhanced shell command execution.
330 run with environment maybe modified, maybe in different dir.'''
331 oldenv = {}
332 for k in environ:
333 oldenv[k] = os.environ.get(k)
334 if cwd is not None:
335 oldcwd = os.getcwd()
336 try:
337 for k, v in environ.iteritems():
338 os.environ[k] = str(v)
339 if cwd is not None and oldcwd != cwd:
340 os.chdir(cwd)
341 return os.system(cmd)
342 finally:
343 for k, v in oldenv.iteritems():
344 if v is None:
345 del os.environ[k]
346 else:
347 os.environ[k] = v
348 if cwd is not None and oldcwd != cwd:
349 os.chdir(oldcwd)
350
328 def rename(src, dst):
351 def rename(src, dst):
329 """forcibly rename a file"""
352 """forcibly rename a file"""
330 try:
353 try:
General Comments 0
You need to be logged in to leave comments. Login now