diff options
| author | Craig Jennings <c@cjennings.net> | 2026-07-20 23:41:11 -0500 |
|---|---|---|
| committer | Craig Jennings <c@cjennings.net> | 2026-07-20 23:41:11 -0500 |
| commit | 448e55048cc8780c205247455754ca4571991bcc (patch) | |
| tree | e2f34e464ced329b574442a1bc030181f8da280d /modules/host-environment.el | |
| parent | fabdc8f395e8186c389bafaf23dcef9fec92b974 (diff) | |
| download | dotemacs-448e55048cc8780c205247455754ca4571991bcc.tar.gz dotemacs-448e55048cc8780c205247455754ca4571991bcc.zip | |
perf(host-env): try cheap timezone methods before the zoneinfo scan
The content-comparison scan reads hundreds of zoneinfo files and ran first on every call. TZ, /etc/timezone, and the symlink target are O(1) and answer on almost every system; the scan is now the last resort for a copied /etc/localtime. Verified the symlink and scan agree on this machine.
Diffstat (limited to 'modules/host-environment.el')
| -rw-r--r-- | modules/host-environment.el | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/modules/host-environment.el b/modules/host-environment.el index 0afb39cb..1c33e342 100644 --- a/modules/host-environment.el +++ b/modules/host-environment.el @@ -138,15 +138,13 @@ find /usr/share/zoneinfo -type f ! -name `posixrules' \\ (defun cj/detect-system-timezone () "Detect the system timezone in IANA format (e.g., `America/Los_Angeles'). -Tries multiple methods in order of reliability: -1. File comparison of /etc/localtime with zoneinfo database -2. Environment variable TZ -3. /etc/timezone file contents -4. /etc/localtime symlink target" +Tries the cheap methods first and the exhaustive scan last: +1. Environment variable TZ (most explicit if set) +2. /etc/timezone file contents (Debian/Ubuntu) +3. /etc/localtime symlink target (O(1) on symlinked systems) +4. File comparison of /etc/localtime against the zoneinfo database + (reads hundreds of files; only needed when localtime is a copy)" (or - ;; Compare file contents (reliable on Arch/modern systems) - (cj/match-localtime-to-zoneinfo) - ;; Environment variable (most explicit if set) (getenv "TZ") @@ -156,12 +154,15 @@ Tries multiple methods in order of reliability: (insert-file-contents "/etc/timezone") (string-trim (buffer-string)))) - ;; Method 4: Parse symlink (fallback for older systems) + ;; Parse the symlink -- O(1), answers on any symlinked /etc/localtime (when (file-symlink-p "/etc/localtime") (let ((target (file-truename "/etc/localtime"))) (when (string-match ".*/zoneinfo/\\(.+\\)" target) (match-string 1 target)))) + ;; Compare file contents -- the last resort for a copied /etc/localtime + (cj/match-localtime-to-zoneinfo) + ;; Default to nil if detection fails nil)) |
