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>
This commit is contained in:
Lukas Fleischer 2016-02-07 13:29:17 +01:00
parent e40646d30f
commit e5ba06ff5d
3 changed files with 34 additions and 0 deletions

View File

@ -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))

12
contrib/caldav/hooks/post-sync Executable file
View File

@ -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

View File

@ -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"