aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBozhidar Batsov <bozhidar@batsov.dev>2026-02-15 18:26:35 +0200
committerBozhidar Batsov <bozhidar@batsov.dev>2026-03-05 08:28:22 +0200
commit136a1e6918a4d937e054e3fc06569c989cb013f3 (patch)
tree03ef283d9a0ba0ea47ab73d24d0181ff5ce5c5be
parent0cdd2a93b2def8b432348f183dc583e9ebdbd709 (diff)
Fix compilation-find-file advice for dirs without direct files
Fixes #1923 When compilation output references a file via a relative path, the advice now also checks if the file exists relative to the project root and adds its parent directory to the search path. This handles the edge case where a directory only contains subdirectories (no files directly) and therefore was not included in the file-derived directory list from projectile-current-project-dirs.
-rw-r--r--projectile.el17
1 files changed, 13 insertions, 4 deletions
diff --git a/projectile.el b/projectile.el
index 2dca9ae..16536a5 100644
--- a/projectile.el
+++ b/projectile.el
@@ -5683,16 +5683,25 @@ We enhance its functionality by appending the current project's directories
to its search path. This way when filenames in compilation buffers can't be
found by compilation's normal logic they are searched for in project
directories."
- ; If the file already exists, don't bother running the extra logic as the project directories might be massive (i.e. Unreal-sized).
+ ;; If the file already exists, don't bother running the extra logic as the
+ ;; project directories might be massive (i.e. Unreal-sized).
(if (file-exists-p filename)
(apply orig-fun `(,marker ,filename ,directory ,@formats))
(let* ((root (projectile-project-root))
(compilation-search-path
(if (projectile-project-p)
- (append compilation-search-path (list root)
- (mapcar (lambda (f) (expand-file-name f root))
- (projectile-current-project-dirs)))
+ (let ((dirs (append compilation-search-path (list root)
+ (mapcar (lambda (f) (expand-file-name f root))
+ (projectile-current-project-dirs)))))
+ ;; If the file can be found relative to the project root,
+ ;; add its parent directory to the search path. This
+ ;; handles directories that contain only subdirectories
+ ;; and no files directly.
+ (let ((candidate (expand-file-name filename root)))
+ (when (file-exists-p candidate)
+ (push (file-name-directory candidate) dirs)))
+ dirs)
compilation-search-path)))
(apply orig-fun `(,marker ,filename ,directory ,@formats)))))