X-Git-Url: https://git.madduck.net/etc/offlineimap.git/blobdiff_plain/c568707d316118250478115ebd46e88e6b1d59ae..7b77e23a13e40f88fe8048aafc493a867eb03bd3:/.bin/offlineimap?ds=inline diff --git a/.bin/offlineimap b/.bin/offlineimap index f55fee5..7e0e8b9 100755 --- a/.bin/offlineimap +++ b/.bin/offlineimap @@ -1,25 +1,66 @@ #!/bin/sh set -eu -[ "${1:-}" = -q ] && exec >/dev/null - VAR=$HOME/.var/offlineimap -LOCKFILE="$VAR/.cron.lock" -trap "rm -f $LOCKFILE" 0 1 2 3 4 5 6 7 8 10 11 12 13 14 15 -if ! lockfile -0 -r0 -l 3600 "$LOCKFILE" 2>/dev/null; then - echo "E: offlineimap is already running." >&2 + +opts= +accounts= +quiet= +for opt in "$@"; do + case "$opt" in + --quiet) + opts="${opts:+$opts }-uQuiet -l/dev/null" + quiet=1 + ;; + -a) continue;; + -*) opts="${opts:+$opts }$opt";; + *) accounts="${accounts:+$accounts }$opt";; + esac +done + +say() { [ -n "$quiet" ] || echo >&2 "$@"; } +err() { echo >&2 "$@"; } + +if [ -z "$accounts" ]; then + err "E: no account(s) specified…" exit 1 +else + accounts=$(echo "$accounts" | sed -e 's/,/ /g') fi if ! test -t 0; then - echo Renicing because we are not run interactively… >&2 + say "I: Renicing because we are not run interactively…" renice 20 -p $$ >/dev/null ionice -c3 -p $$ fi -ret=0 -/usr/bin/offlineimap -o "$@" || exit $? +getlock() +{ + lockfile="$VAR/.$1.lock" + trapfn() { rm -f "$lockfile"; trap - 0 1 2 3 4 5 6 7 8 10 11 12 13 14 15; } + trap trapfn 1 2 3 4 5 6 7 8 10 11 12 13 14 15 + if [ -d "$VAR" ] && ! lockfile -0 -r0 -l 3600 "$lockfile" 2>/dev/null; then + return 1 + fi + trap trapfn 0 +} -if [ -x "$(command -v notmuch)" ]; then - notmuch new || exit $? +failures=0 +for account in $accounts; do + getlock "$account" || { + err "E: unable to acquire lock for account $account, already running?" + failures=$(($failures + 1)) + continue + } + + eval /usr/bin/offlineimap -a $account -k metadata=$VAR/$account $opts || \ + failures=$(($failures + 1)) + + trapfn +done + +if [ $failures -gt 0 ]; then + exit 1 +else + exit 0 fi