summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukas Fleischer <lfleischer@calcurse.org>2016-02-07 13:29:17 +0100
committerLukas Fleischer <lfleischer@calcurse.org>2016-02-07 13:29:44 +0100
commite5ba06ff5d13b40cd840afe83ec63e38fa11c3c2 (patch)
tree125899a60cabd243657834c685ea319feb62bf37
parente40646d30f71bde50ae1d8b6e10262d760efe5de (diff)
downloadcalcurse-e5ba06ff5d13b40cd840afe83ec63e38fa11c3c2.zip
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>
-rwxr-xr-xcontrib/caldav/calcurse-caldav.py18
-rwxr-xr-xcontrib/caldav/hooks/post-sync12
-rwxr-xr-xcontrib/hooks/post-save4
3 files changed, 34 insertions, 0 deletions
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"