diff mercurial/hg.py @ 487:2ad41189bee5

Add initial hook support -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Add initial hook support This adds the basic hook code as well as pre and post-commit hooks. Argument passing is by environment variable key/value pairs so that extra data can be passed over time. File lists will generally not be passed to hooks as these can be extremely long (>1M). manifest hash: 45cf9bab432782c391bc9c1c048c84cc75d52740 -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.0 (GNU/Linux) iD8DBQFCwOukywK+sNU5EO8RAsVsAJ9QipR2aKRSSvoRNo+3If6JddUDkwCgkZrM KEmZpUOxhNHqezFVrHDRTjE= =aedm -----END PGP SIGNATURE-----
author mpm@selenic.com
date Mon, 27 Jun 2005 22:18:12 -0800
parents 934279f3ca53
children e94cebc60d96
line wrap: on
line diff
--- a/mercurial/hg.py
+++ b/mercurial/hg.py
@@ -371,6 +371,30 @@ class localrepository:
             if pat.search(f): return True
         return False
 
+    def hook(self, name, **args):
+        s = self.ui.config("hooks", name)
+        if s:
+            self.ui.note("running hook %s: %s\n" % (name, s))
+            old = {}
+            for k, v in args.items():
+                k = k.upper()
+                old[k] = os.environ.get(k, None)
+                os.environ[k] = v
+
+            r = os.system(s)
+
+            for k, v in old.items():
+                if v != None:
+                    os.environ[k] = v
+                else:
+                    del os.environ[k]
+
+            if r:
+                self.ui.warn("abort: %s hook failed with status %d!\n" %
+                             (name, r))
+                return False
+        return True
+
     def tags(self):
         '''return a mapping of tag to node'''
         if not self.tagscache:
@@ -548,6 +572,9 @@ class localrepository:
             self.ui.status("nothing changed\n")
             return
 
+        if not self.hook("precommit"):
+            return 1
+
         p1, p2 = self.dirstate.parents()
         c1 = self.changelog.read(p1)
         c2 = self.changelog.read(p2)
@@ -603,6 +630,10 @@ class localrepository:
             text = edittext
 
         n = self.changelog.add(mn, new, text, tr, p1, p2, user, date)
+
+        if not self.hook("commit", node=hex(n)):
+            return 1
+
         tr.close()
 
         self.dirstate.setparents(n)