aboutsummaryrefslogtreecommitdiff
path: root/scripts/agenda-render-cache
blob: b1e4d49083ac7217363c707eee23aa80a802be13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/usr/bin/env bash
# Write the agenda render cache for an external renderer.
#
# Runs a batch Emacs rather than talking to the daemon, because the surface
# that reads the cache has to keep working while Emacs is down -- and
# emacsclient is exactly the thing that cannot. Nothing here touches a running
# Emacs, so it is safe to fire from a timer alongside an active session.
#
# The agenda file list is resolved the same way the editor resolves it, by
# loading the config's own resolver rather than restating the list here. A
# second copy of that list would drift the first time a calendar source is
# added.
#
# Usage: agenda-render-cache
# Env:   EMACS_D              -- config directory (default ~/.emacs.d)
#        EMACS                -- emacs binary (default emacs)
#        AGENDA_RENDER_FILES  -- colon-separated org files to read instead of
#                                the configured agenda list. Lets a caller ask
#                                about a known set, and lets the tests run
#                                against a fixture rather than whatever happens
#                                to be on the machine's real agenda today.

set -euo pipefail

EMACS_D="${EMACS_D:-$HOME/.emacs.d}"
EMACS="${EMACS:-emacs}"

if [ ! -d "$EMACS_D/modules" ]; then
	echo "agenda-render-cache: no modules directory at $EMACS_D/modules" >&2
	exit 1
fi

# -Q keeps the daemon's init out of it: this needs three modules, not a full
# editor. load-prefer-newer stops a stale .elc from answering for changed
# source, which would silently write yesterday's logic.
exec "$EMACS" --batch -Q \
	--eval '(setq load-prefer-newer t)' \
	-L "$EMACS_D/modules" \
	--eval '(progn
                  (require (quote user-constants))
                  (require (quote org-agenda-config))
                  (setq org-todo-keywords cj/org-todo-keywords)
                  (require (quote agenda-query))
                  (setq org-agenda-files
                        (let ((override (getenv "AGENDA_RENDER_FILES")))
                          (if (and override (not (string-empty-p override)))
                              (split-string override ":" t)
                            (cj/--org-agenda-scan-files))))
                  (princ (cj/agenda-render-cache-update))
                  (terpri))'