diff options
| author | Craig Jennings <c@cjennings.net> | 2026-05-25 19:06:13 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-05-25 19:06:13 -0500 |
| commit | 423ca0e8e502661343a8aa02d5c58c5029e40b03 (patch) | |
| tree | b166d0026243ef57d225a15aa1dae0540be8bfd3 /modules | |
| parent | d09de2adf2c727410743c373230cd466baa9d170 (diff) | |
| download | dotemacs-423ca0e8e502661343a8aa02d5c58c5029e40b03.tar.gz dotemacs-423ca0e8e502661343a8aa02d5c58c5029e40b03.zip | |
refactor(user-constants): move filesystem creation out of module load
(require 'user-constants) created ~8 directories and ~10 org/calendar files at load time, via a top-level dolist for the calendar stubs and a top-level call to cj/initialize-user-directories-and-files. That meant any bare require — tests, byte-compile, batch tools — wrote to disk. It's why a stray sync/org/ tree kept appearing in the repo during test runs.
I removed both top-level forms and folded the gcal/pcal/dcal creation into the initializer. The path defconsts stay exactly as they were, so every consumer that just reads a path is unaffected. init.el now calls the initializer right after requiring the module, guarded by (unless noninteractive), so interactive and daemon startup create everything in the same order as before while a bare require stays side-effect-free.
Added tests/test-user-constants.el: loading the module creates nothing, and the initializer creates the backbone dirs and the configured files. Updated the module header — top-level side effects are now none and it's safe to load in tests.
Diffstat (limited to 'modules')
| -rw-r--r-- | modules/user-constants.el | 35 |
1 files changed, 19 insertions, 16 deletions
diff --git a/modules/user-constants.el b/modules/user-constants.el index 293bc806..02a500d6 100644 --- a/modules/user-constants.el +++ b/modules/user-constants.el @@ -5,15 +5,16 @@ ;; Layer: 1 (Foundation). ;; Category: F. ;; Load shape: eager. -;; Eager reason: defines the path constants referenced across the config and -;; creates the required directories/files before other modules load. -;; Top-level side effects: file writes — creates configured directories and -;; stub files via `cj/initialize-user-directories-and-files' at load. +;; Eager reason: defines the path constants referenced across the config; other +;; modules read them at their own load time. +;; Top-level side effects: none — only path definitions. Filesystem creation +;; lives in `cj/initialize-user-directories-and-files', which init.el calls on +;; real startup (not at module load), so a bare require is side-effect-free. ;; Runtime requires: none. -;; Direct test load: conditional (touches the filesystem on load). +;; Direct test load: yes. ;; ;; This module defines important file and directory paths used throughout the -;; Emacs configuration, and ensures they exist during startup. +;; Emacs configuration, and provides a command to create them on startup. ;; ;; WHY THIS EXISTS: ;; 1. Centralizes all path definitions for easy reference and maintenance @@ -22,7 +23,8 @@ ;; ;; The module first defines constants and variables for directories and files, ;; then provides functions that verify their existence, creating them if needed. -;; This happens automatically when the module loads. +;; init.el calls `cj/initialize-user-directories-and-files' after requiring this +;; module so the paths exist before the modules that depend on them load. ;; ;; The paths are designed with a hierarchical structure, allowing child paths ;; to reference their parents (e.g., roam-dir is inside org-dir) for better @@ -170,12 +172,6 @@ Stored in .emacs.d/data/ so each machine syncs independently from Proton Calenda "The location of the org file containing DeepSat Calendar information. Stored in .emacs.d/data/ so each machine syncs independently from Google Calendar.") -;; Ensure calendar data files exist so org-agenda-list doesn't hang -;; prompting for missing files (calendar-sync populates them on first sync) -(dolist (f (list gcal-file pcal-file dcal-file)) - (unless (file-exists-p f) - (make-empty-file f t))) - (defvar reference-file (expand-file-name "reference.org" org-dir) "The location of the org file containing reference information.") @@ -241,7 +237,12 @@ and portable across different machines." video-recordings-dir audio-recordings-dir org-dir)) - (mapc 'cj/verify-or-create-file (list schedule-file + ;; gcal/pcal/dcal exist so org-agenda-list doesn't hang on missing files + ;; (calendar-sync populates them on first sync). + (mapc 'cj/verify-or-create-file (list gcal-file + pcal-file + dcal-file + schedule-file inbox-file article-archive reading-notes-file @@ -249,8 +250,10 @@ and portable across different machines." webclipped-file reference-file))) -;; Initialize directories and files when this module is loaded -(cj/initialize-user-directories-and-files) +;; Creation is deferred to startup: init.el calls +;; `cj/initialize-user-directories-and-files' after requiring this module, so a +;; bare `(require 'user-constants)' (tests, byte-compile, batch) stays +;; side-effect-free. (provide 'user-constants) ;;; user-constants.el ends here |
