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-----
--- a/doc/hg.1.txt Mon Jun 27 10:01:46 2005 -0800
+++ b/doc/hg.1.txt Mon Jun 27 22:18:12 2005 -0800
@@ -328,30 +328,48 @@
NAMED REPOSITORIES
------------------
- To give symbolic names to a repository, create a section in .hgrc
- or .hg/hgrc containing assignments of names to paths.
+To give symbolic names to a repository, create a section in .hgrc
+or .hg/hgrc containing assignments of names to paths. Example:
- Example:
-
+-----------------
[paths]
hg = http://selenic.com/hg
tah = http://hg.intevation.org/mercurial-tah/
+-----------------
+
+
+HOOKS
+-----
+
+Mercurial supports a set of 'hook', commands that get automatically
+executed by various actions such as starting or finishing a commit. To
+specify a hook, simply create an hgrc section like the following:
+
+-----------------
+[hooks]
+precommit = echo "this hook gets executed immediately before a commit"
+commit = hg export $NODE | mail -s "new commit $NODE" commit-list
+-----------------
+
NON_TRANSPARENT PROXY SUPPORT
-----------------------------
- To access a Mercurial repository through a proxy,
- create a file $HOME/.hgrc in the following format:
+To access a Mercurial repository through a proxy, create a file
+$HOME/.hgrc in the following format:
+--------------
[http_proxy]
host=myproxy:8080
user=<username>
passwd=<password>
no=<localhost1>,<localhost2>,<localhost3>,...
+--------------
- "user","passwd" fields are used for authenticating proxies,
- "no" is a comma-separated list of local host names
- for which proxy must be bypassed.
+"user","passwd" fields are used for authenticating proxies, "no" is a
+comma-separated list of local host names for which proxy must be
+bypassed.
+
BUGS
----
--- a/mercurial/hg.py Mon Jun 27 10:01:46 2005 -0800
+++ b/mercurial/hg.py Mon Jun 27 22:18:12 2005 -0800
@@ -371,6 +371,30 @@
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 @@
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 @@
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)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-hook Mon Jun 27 22:18:12 2005 -0800
@@ -0,0 +1,9 @@
+#!/bin/sh -x
+
+hg init
+echo "[hooks]" > .hg/hgrc
+echo 'precommit = echo precommit hook' >> .hg/hgrc
+echo 'commit = echo commit hook: $NODE' >> .hg/hgrc
+echo a > a
+hg add a
+hg commit -t "test" -u test -d "0 0"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test-hook.out Mon Jun 27 22:18:12 2005 -0800
@@ -0,0 +1,9 @@
++ hg init
++ echo '[hooks]'
++ echo 'precommit = echo precommit hook'
++ echo 'commit = echo commit hook: $NODE'
++ echo a
++ hg add a
++ hg commit -t test -u test -d '0 0'
+precommit hook
+commit hook: acb14030fe0a21b60322c440ad2d20cf7685a376