branch: elpa/aidermacs
commit 6d0c41d1cfd24821fb32933edf8c0c2a9bb8c847
Author: skittishdev <[email protected]>
Commit: Matthew Zeng <[email protected]>
Improve tramp support.
Also add support for per-workspace cache variables.
Fixes: https://github.com/MatthewZMD/aidermacs/issues/175
---
aidermacs.el | 85 +++++++++++++++++++++++++++++++++++++++---------------------
1 file changed, 56 insertions(+), 29 deletions(-)
diff --git a/aidermacs.el b/aidermacs.el
index 54c541fef93..29a536566e9 100644
--- a/aidermacs.el
+++ b/aidermacs.el
@@ -52,19 +52,36 @@
If it is a list, Aidermacs will try each program in order."
:type '(choice string (repeat :tag "Program fallbacks" string)))
-(defvar aidermacs--resolved-program nil
- "Cached path to the resolved Aider program.")
+(defvar aidermacs--resolved-programs (make-hash-table :test 'equal)
+ "Hash table of cached resolved Aider program paths keyed by workspace.")
+
+(defvar aidermacs--cached-versions (make-hash-table :test 'equal)
+ "Hash table of cached aider versions keyed by workspace.")
+
+(defun aidermacs--get-cache-key ()
+ "Generate a unique cache key based on current workspace context.
+Returns a string combining the remote connection (if any) and project root."
+ (let ((remote-prefix (file-remote-p default-directory))
+ (root (aidermacs-project-root)))
+ (concat (or remote-prefix "local") "::" root)))
+
(defun aidermacs-get-program ()
"Resolve and return the path to the Aider program.
-The value is cached in `aidermacs--resolved-program`.
+The value is cached per-workspace in `aidermacs--resolved-programs`.
It respects `aidermacs-program` which can be a string or a list of strings."
- (or aidermacs--resolved-program
- (let* ((programs (if (listp aidermacs-program) aidermacs-program (list
aidermacs-program)))
- (program (cl-some #'executable-find programs)))
- (unless program
- (error "Aider executable not found. Checked: %s" programs))
- (setq aidermacs--resolved-program program))))
+ (let* ((key (aidermacs--get-cache-key))
+ (cached (gethash key aidermacs--resolved-programs)))
+ (or cached
+ (let* ((programs (if (listp aidermacs-program) aidermacs-program (list
aidermacs-program)))
+ (finder-fn (if (file-remote-p default-directory)
+ (lambda (prog) (executable-find prog t))
+ #'executable-find))
+ (program (cl-some finder-fn programs)))
+ (unless program
+ (error "Aider executable not found. Checked: %s" programs))
+ (puthash key program aidermacs--resolved-programs)
+ program))))
(defvar-local aidermacs--current-mode nil
"Buffer-local variable to track the current aidermacs mode.
@@ -180,27 +197,37 @@ These will be available for selection when using
aidermacs commands."
(defun aidermacs-aider-version ()
"Check the installed aider version.
Returns a version string like \"0.77.0\" or nil if version can't be determined.
-Uses cached version if available to avoid repeated process calls."
+Uses cached version per-workspace if available to avoid repeated process
calls."
(interactive)
- (let ((path exec-path))
- (or aidermacs--cached-version
- (setq aidermacs--cached-version
- (with-temp-buffer
- (setq-local exec-path path)
- (when (= 0 (process-file (aidermacs-get-program) nil t nil
"--version"))
- (goto-char (point-min))
- (when (re-search-forward
- "\\([0-9]+\\.[0-9]+\\.[0-9]+\\)" nil t)
- (match-string 0)))))))
- (message "Aider version %s" aidermacs--cached-version)
- aidermacs--cached-version)
-
-(defun aidermacs-clear-aider-version-cache ()
+ (let* ((path exec-path)
+ (key (aidermacs--get-cache-key))
+ (cached (gethash key aidermacs--cached-versions)))
+ (unless cached
+ (let ((version
+ (with-temp-buffer
+ (setq-local exec-path path)
+ (when (= 0 (process-file (aidermacs-get-program) nil t nil
"--version"))
+ (goto-char (point-min))
+ (when (re-search-forward
+ "\\([0-9]+\\.[0-9]+\\.[0-9]+\\)" nil t)
+ (match-string 0))))))
+ (puthash key version aidermacs--cached-versions)
+ (setq cached version)))
+ (message "Aider version %s" (or cached "unknown"))
+ cached))
+
+(defun aidermacs-clear-aider-version-cache (&optional all)
"Clear the cached aider version.
+With prefix argument ALL (C-u), clear all cached versions.
+Without prefix, clear only the cache for the current workspace.
Call this after upgrading aider to ensure the correct version is detected."
- (interactive)
- (setq aidermacs--cached-version nil)
- (message "Aider version cache cleared."))
+ (interactive "P")
+ (if all
+ (progn
+ (clrhash aidermacs--cached-versions)
+ (message "Aider version cache cleared for all workspaces."))
+ (remhash (aidermacs--get-cache-key) aidermacs--cached-versions)
+ (message "Aider version cache cleared for current workspace.")))
(defun aidermacs-project-root ()
"Get the project root using VC-git, or fallback to file directory.
@@ -438,8 +465,8 @@ set `aidermacs-default-chat-mode' to 'architect' instead."
(when aidermacs-weak-model
(list "--weak-model" aidermacs-weak-model))
;; Aider-CE Only Option
- (when (and aidermacs--resolved-program
- (string-match-p "aider-ce"
aidermacs--resolved-program))
+ (when (let ((prog (gethash (aidermacs--get-cache-key)
aidermacs--resolved-programs)))
+ (and prog (string-match-p "aider-ce" prog)))
'("--linear-output"))
(when aidermacs-global-read-only-files
(apply #'append