Skip to content

Commit 6153986

Browse files
committed
Support manifest runfiles that map to directories.
This is equivalent to the fixes made for bazelbuild/bazel#14336.
1 parent 2ca3fe5 commit 6153986

File tree

2 files changed

+27
-2
lines changed

2 files changed

+27
-2
lines changed

elisp/runfiles/runfiles-test.el

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,17 @@
6363
(should-error (elisp/runfiles/rlocation "__init__.py" runfiles)
6464
:type 'elisp/runfiles/empty)))
6565

66+
(ert-deftest elisp/runfiles/make/manifest/directory ()
67+
"Check that we find runfiles in a mapped directory.
68+
See https://github.com/bazelbuild/bazel/issues/14336 for
69+
context."
70+
(let* ((manifest (elisp/runfiles/rlocation
71+
"phst_rules_elisp/elisp/runfiles/test-manifest"))
72+
(runfiles (elisp/runfiles/make :manifest manifest
73+
:directory "/invalid/")))
74+
(should (equal (elisp/runfiles/rlocation "foo/bar/baz" runfiles)
75+
"/:runfiles/foo/bar/baz"))))
76+
6677
(ert-deftest elisp/runfiles/file-handler ()
6778
(let ((file-name-handler-alist file-name-handler-alist))
6879
(elisp/runfiles/install-handler)

elisp/runfiles/runfiles.el

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -442,8 +442,22 @@ RUNFILES is a runfiles object and FILENAME the name to look up."
442442
(let ((result (gethash filename (oref runfiles manifest))))
443443
(cond
444444
((not result)
445-
(signal 'elisp/runfiles/not-found
446-
(list filename (oref runfiles filename))))
445+
;; Look for ancestor directory mapping. See
446+
;; https://github.com/bazelbuild/bazel/issues/14336.
447+
(let ((continue t)
448+
(candidate filename))
449+
(while continue
450+
(pcase candidate
451+
((rx bos (let prefix (+ anything)) ?/ (+ anything) (? ?/) eos)
452+
(if-let ((dir (gethash prefix (oref runfiles manifest))))
453+
(setq result (concat dir (substring-no-properties
454+
filename (length prefix)))
455+
continue nil)
456+
(setq candidate prefix)))
457+
(_ (setq continue nil)))))
458+
(or result
459+
(signal 'elisp/runfiles/not-found
460+
(list filename (oref runfiles filename)))))
447461
((eq result :empty)
448462
(signal 'elisp/runfiles/empty
449463
(list filename (oref runfiles filename))))

0 commit comments

Comments
 (0)