From e5ba06ff5d13b40cd840afe83ec63e38fa11c3c2 Mon Sep 17 00:00:00 2001
From: Lukas Fleischer <lfleischer@calcurse.org>
Date: Sun, 7 Feb 2016 13:29:17 +0100
Subject: calcurse-caldav: Add hook support

Introduce pre-sync and post-sync hooks which need to be located under
~/.calcurse/caldav/hooks/ and are executed before/after synchronization
with a CalDAV server.

Also, add an example post-sync hook and change the example post-save
hook such that it does not create tiny commits during synchronization.

Signed-off-by: Lukas Fleischer <lfleischer@calcurse.org>
---
 contrib/caldav/calcurse-caldav.py | 18 ++++++++++++++++++
 contrib/caldav/hooks/post-sync    | 12 ++++++++++++
 contrib/hooks/post-save           |  4 ++++
 3 files changed, 34 insertions(+)
 create mode 100755 contrib/caldav/hooks/post-sync

(limited to 'contrib')

diff --git a/contrib/caldav/calcurse-caldav.py b/contrib/caldav/calcurse-caldav.py
index 25a8d1a..c569009 100755
--- a/contrib/caldav/calcurse-caldav.py
+++ b/contrib/caldav/calcurse-caldav.py
@@ -350,6 +350,13 @@ def pull_objects(conn, syncdb, etagdict):
     return (added, deleted)
 
 
+def run_hook(name):
+    hook_path = hookdir + '/' + name
+    if not os.path.exists(hook_path):
+        return
+    subprocess.call(hook_path, shell=True)
+
+
 # Initialize the XML namespace map.
 nsmap = {"D": "DAV:", "C": "urn:ietf:params:xml:ns:caldav"}
 
@@ -357,6 +364,7 @@ nsmap = {"D": "DAV:", "C": "urn:ietf:params:xml:ns:caldav"}
 configfn = os.path.expanduser("~/.calcurse/caldav/config")
 lockfn = os.path.expanduser("~/.calcurse/caldav/lock")
 syncdbfn = os.path.expanduser("~/.calcurse/caldav/sync.db")
+hookdir = os.path.expanduser("~/.calcurse/caldav/hooks/")
 
 # Parse command line arguments.
 parser = argparse.ArgumentParser('calcurse-caldav')
@@ -372,6 +380,9 @@ parser.add_argument('--lockfile', action='store', dest='lockfn',
 parser.add_argument('--syncdb', action='store', dest='syncdbfn',
                     default=syncdbfn,
                     help='path to the calcurse-caldav sync DB')
+parser.add_argument('--hookdir', action='store', dest='hookdir',
+                    default=hookdir,
+                    help='path to the calcurse-caldav hooks directory')
 parser.add_argument('-v', '--verbose', action='store_true', dest='verbose',
                     default=False,
                     help='print status messages to stdout')
@@ -383,6 +394,7 @@ init = args.init is not None
 configfn = args.configfn
 lockfn = args.lockfn
 syncdbfn = args.syncdbfn
+hookdir = args.hookdir
 verbose = args.verbose
 debug = args.debug
 
@@ -449,6 +461,9 @@ elif ver < (4, 0, 0, 96):
     die('Incompatible calcurse binary detected. Version >=4.1.0 is required ' +
         'to synchronize with CalDAV servers.')
 
+# Run the pre-sync hook.
+run_hook('pre-sync')
+
 # Create lock file.
 if os.path.exists(lockfn):
     die('Leftover lock file detected. If there is no other synchronization ' +
@@ -512,6 +527,9 @@ finally:
     # Remove lock file.
     os.remove(lockfn)
 
+# Run the post-sync hook.
+run_hook('post-sync')
+
 # Print a summary to stdout.
 print("{} items imported, {} items removed locally.".
       format(local_new, local_del))
diff --git a/contrib/caldav/hooks/post-sync b/contrib/caldav/hooks/post-sync
new file mode 100755
index 0000000..94b6ed3
--- /dev/null
+++ b/contrib/caldav/hooks/post-sync
@@ -0,0 +1,12 @@
+#!/bin/sh
+#
+# Copy this file into ~/.calcurse/caldav/hooks/ and mark it executable to
+# automatically commit changes after syncing using Git.
+
+cd "$HOME"/.calcurse/
+
+git add *
+if ! git diff-index --quiet --cached HEAD; then
+	git commit -m "Automatic commit by the post-sync hook"
+fi
+
diff --git a/contrib/hooks/post-save b/contrib/hooks/post-save
index d68461a..e75ce1e 100755
--- a/contrib/hooks/post-save
+++ b/contrib/hooks/post-save
@@ -4,6 +4,10 @@
 # automatically commit any changes to the calcurse data files using Git.
 
 cd "$HOME"/.calcurse/
+
+# Do not make commits when synchronizing with a CalDAV server.
+[ -f caldav/lock ] && exit
+
 git add *
 if ! git diff-index --quiet --cached HEAD; then
 	git commit -m "Automatic commit by the post-save hook"
-- 
cgit v1.2.3-70-g09d2