changeset 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
files mercurial/localrepo.py
diffstat 1 files changed, 18 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/localrepo.py	Tue Feb 14 15:10:45 2006 -0800
+++ b/mercurial/localrepo.py	Tue Feb 14 15:28:06 2006 -0800
@@ -48,7 +48,7 @@
         except IOError:
             pass
 
-    def hook(self, name, **args):
+    def hook(self, name, throw=False, **args):
         def runhook(name, cmd):
             self.ui.note(_("running hook %s: %s\n") % (name, cmd))
             old = {}
@@ -57,21 +57,25 @@
                 old[k] = os.environ.get(k, None)
                 os.environ[k] = v
 
-            # Hooks run in the repository root
-            olddir = os.getcwd()
-            os.chdir(self.root)
-            r = os.system(cmd)
-            os.chdir(olddir)
+            try:
+                # Hooks run in the repository root
+                olddir = os.getcwd()
+                os.chdir(self.root)
+                r = os.system(cmd)
+            finally:
+                for k, v in old.items():
+                    if v != None:
+                        os.environ[k] = v
+                    else:
+                        del os.environ[k]
 
-            for k, v in old.items():
-                if v != None:
-                    os.environ[k] = v
-                else:
-                    del os.environ[k]
+                os.chdir(olddir)
 
             if r:
-                self.ui.warn(_("abort: %s hook failed with status %d!\n") %
-                             (name, r))
+                desc, r = util.explain_exit(r)
+                if throw:
+                    raise util.Abort(_('%s hook %s') % (name, desc))
+                self.ui.warn(_('error: %s hook %s\n') % (name, desc))
                 return False
             return True
 
@@ -372,8 +376,7 @@
             self.ui.status(_("nothing changed\n"))
             return None
 
-        if not self.hook("precommit"):
-            return None
+        self.hook("precommit", throw=True)
 
         if not wlock:
             wlock = self.wlock()