summaryrefslogtreecommitdiff
path: root/gptel-tools/git_diff.el
diff options
context:
space:
mode:
Diffstat (limited to 'gptel-tools/git_diff.el')
-rw-r--r--gptel-tools/git_diff.el8
1 files changed, 7 insertions, 1 deletions
diff --git a/gptel-tools/git_diff.el b/gptel-tools/git_diff.el
index daccdc20..47db8dae 100644
--- a/gptel-tools/git_diff.el
+++ b/gptel-tools/git_diff.el
@@ -23,11 +23,17 @@
"Validate PATH for a git diff call. Return the expanded path on success.
Same contract as the other git_* validators: under HOME, a directory,
inside a git working tree."
- (let ((full (expand-file-name (or path "~") "~")))
+ (let* ((home (file-name-as-directory (file-truename (expand-file-name "~"))))
+ (full (expand-file-name (or path "~") "~")))
(unless (string-prefix-p (expand-file-name "~") full)
(error "Path must be within home directory: %s" path))
(unless (file-directory-p full)
(error "Not a directory: %s" full))
+ (let ((resolved (file-truename full)))
+ (unless (or (string= resolved (directory-file-name home))
+ (string-prefix-p home resolved))
+ (error "Resolved path must be within home directory: %s" path))
+ (setq full resolved))
(let ((default-directory full))
(unless (zerop (process-file "git" nil nil nil
"rev-parse" "--is-inside-work-tree"))