Author: danielsh
Date: Fri Sep 7 08:31:27 2012
New Revision: 1381933
URL: http://svn.apache.org/viewvc?rev=1381933&view=rev
Log:
[in tools/server-side/svnpubsub]
Teach svnwcsub to run a post-update hook.
* example.conf
([DEFAULT].hook): New config value.
* svnwcsub.py
(BigDoEverythingClasss.__init__): Parse 'hook' from the config,
pass it to BackgroundWorker.__init__().
(BigDoEverythingClasss.wc_ready): Use OP_BOOT instead of OP_UPDATE.
(OP_BOOT): New op.
(BackgroundWorker.__init__): Grow 'hook' parameter.
(BackgroundWorker.run): Recognize OP_BOOT.
(BackgroundWorker._update): Grow 'boot' parameter. Run the hook
(in both OP_UPDATE and OP_BOOT).
Modified:
subversion/trunk/tools/server-side/svnpubsub/example.conf
subversion/trunk/tools/server-side/svnpubsub/svnwcsub.py
Modified: subversion/trunk/tools/server-side/svnpubsub/example.conf
URL:
http://svn.apache.org/viewvc/subversion/trunk/tools/server-side/svnpubsub/example.conf?rev=1381933&r1=1381932&r2=1381933&view=diff
==============================================================================
--- subversion/trunk/tools/server-side/svnpubsub/example.conf (original)
+++ subversion/trunk/tools/server-side/svnpubsub/example.conf Fri Sep 7
08:31:27 2012
@@ -3,6 +3,7 @@
[DEFAULT]
svnbin: /usr/local/bin/svn
streams: http://svn.example.org:2069/commits/xml
+hook: /usr/bin/true
## The values below are used by ConfigParser's interpolation syntax.
## See http://docs.python.org/library/configparser
Modified: subversion/trunk/tools/server-side/svnpubsub/svnwcsub.py
URL:
http://svn.apache.org/viewvc/subversion/trunk/tools/server-side/svnpubsub/svnwcsub.py?rev=1381933&r1=1381932&r2=1381933&view=diff
==============================================================================
--- subversion/trunk/tools/server-side/svnpubsub/svnwcsub.py (original)
+++ subversion/trunk/tools/server-side/svnpubsub/svnwcsub.py Fri Sep 7
08:31:27 2012
@@ -149,7 +149,8 @@ class BigDoEverythingClasss(object):
self.svnbin = config.get_value('svnbin')
self.env = config.get_env()
self.tracking = config.get_track()
- self.worker = BackgroundWorker(self.svnbin, self.env)
+ self.hook = config.get_value('hook')
+ self.worker = BackgroundWorker(self.svnbin, self.env, self.hook)
self.watch = [ ]
self.hostports = [ ]
@@ -168,7 +169,7 @@ class BigDoEverythingClasss(object):
# Add it to our watchers, and trigger an svn update.
logging.info("Watching WC at %s <-> %s" % (wc.path, wc.url))
self.watch.append(wc)
- self.worker.add_work(OP_UPDATE, wc)
+ self.worker.add_work(OP_BOOT, wc)
def _normalize_path(self, path):
if path[0] != '/':
@@ -200,11 +201,12 @@ class BigDoEverythingClasss(object):
# Start logging warnings if the work backlog reaches this many items
BACKLOG_TOO_HIGH = 20
+OP_BOOT = 'boot'
OP_UPDATE = 'update'
OP_CLEANUP = 'cleanup'
class BackgroundWorker(threading.Thread):
- def __init__(self, svnbin, env):
+ def __init__(self, svnbin, env, hook):
threading.Thread.__init__(self)
# The main thread/process should not wait for this thread to exit.
@@ -213,6 +215,7 @@ class BackgroundWorker(threading.Thread)
self.svnbin = svnbin
self.env = env
+ self.hook = hook
self.q = Queue.Queue()
self.has_started = False
@@ -227,6 +230,8 @@ class BackgroundWorker(threading.Thread)
try:
if operation == OP_UPDATE:
self._update(wc)
+ if operation == OP_BOOT:
+ self._update(wc, boot=True)
elif operation == OP_CLEANUP:
self._cleanup(wc)
else:
@@ -246,7 +251,7 @@ class BackgroundWorker(threading.Thread)
self.q.put((operation, wc))
- def _update(self, wc):
+ def _update(self, wc, boot=False):
"Update the specified working copy."
# For giggles, let's clean up the working copy in case something
@@ -280,6 +285,12 @@ class BackgroundWorker(threading.Thread)
raise
open(dotrevision, 'w').write(info['Revision'])
+ ## Run the hook
+ if self.hook:
+ args = [self.hook, ['post-update', 'boot'][boot],
+ wc.path, info['Revision'], wc.url]
+ subprocess.check_call(args, env=self.env)
+
def _cleanup(self, wc):
"Run a cleanup on the specified working copy."