comparison mercurial/localrepo.py @ 1718:c1996b84d4f5

make hook code nicer. pre hooks can raise exception if fail. tidy up better if exception raised (like KeyboardInterrupt) when running hook program.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Tue, 14 Feb 2006 15:28:06 -0800
parents 7a4a16a7d21f
children 98072468ffde
comparison
equal deleted inserted replaced
1717:7a4a16a7d21f 1718:c1996b84d4f5
46 try: 46 try:
47 self.ui.readconfig(self.join("hgrc")) 47 self.ui.readconfig(self.join("hgrc"))
48 except IOError: 48 except IOError:
49 pass 49 pass
50 50
51 def hook(self, name, **args): 51 def hook(self, name, throw=False, **args):
52 def runhook(name, cmd): 52 def runhook(name, cmd):
53 self.ui.note(_("running hook %s: %s\n") % (name, cmd)) 53 self.ui.note(_("running hook %s: %s\n") % (name, cmd))
54 old = {} 54 old = {}
55 for k, v in args.items(): 55 for k, v in args.items():
56 k = k.upper() 56 k = k.upper()
57 old[k] = os.environ.get(k, None) 57 old[k] = os.environ.get(k, None)
58 os.environ[k] = v 58 os.environ[k] = v
59 59
60 # Hooks run in the repository root 60 try:
61 olddir = os.getcwd() 61 # Hooks run in the repository root
62 os.chdir(self.root) 62 olddir = os.getcwd()
63 r = os.system(cmd) 63 os.chdir(self.root)
64 os.chdir(olddir) 64 r = os.system(cmd)
65 65 finally:
66 for k, v in old.items(): 66 for k, v in old.items():
67 if v != None: 67 if v != None:
68 os.environ[k] = v 68 os.environ[k] = v
69 else: 69 else:
70 del os.environ[k] 70 del os.environ[k]
71
72 os.chdir(olddir)
71 73
72 if r: 74 if r:
73 self.ui.warn(_("abort: %s hook failed with status %d!\n") % 75 desc, r = util.explain_exit(r)
74 (name, r)) 76 if throw:
77 raise util.Abort(_('%s hook %s') % (name, desc))
78 self.ui.warn(_('error: %s hook %s\n') % (name, desc))
75 return False 79 return False
76 return True 80 return True
77 81
78 r = True 82 r = True
79 for hname, cmd in self.ui.configitems("hooks"): 83 for hname, cmd in self.ui.configitems("hooks"):
370 374
371 if not commit and not remove and not force and p2 == nullid: 375 if not commit and not remove and not force and p2 == nullid:
372 self.ui.status(_("nothing changed\n")) 376 self.ui.status(_("nothing changed\n"))
373 return None 377 return None
374 378
375 if not self.hook("precommit"): 379 self.hook("precommit", throw=True)
376 return None
377 380
378 if not wlock: 381 if not wlock:
379 wlock = self.wlock() 382 wlock = self.wlock()
380 lock = self.lock() 383 lock = self.lock()
381 tr = self.transaction() 384 tr = self.transaction()