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