Function: projectile--project-relative-name
projectile--project-relative-name is a byte-compiled function defined
in projectile.el.
Signature
(projectile--project-relative-name PATH ROOT)
Documentation
Return PATH spelled relative to project ROOT.
ROOT must be spelled as projectile-project-root(var)/projectile-project-root(fun) returns it (absolute,
symlink-resolved, trailing slash) and PATH must share that spelling
(e.g. already run through file-truename / expand-file-name the same
way). When the two spellings diverge - PATH reached through a symlink
or abbreviation the root wasn't - the result gains leading ../
segments; callers that cache the result should reject a value starting
with ".." rather than store a bogus entry.
This is a thin wrapper around file-relative-name whose sole purpose is
to give that boundary a single, documented owner.
Source Code
;; Defined in ~/.emacs.d/elpa/projectile-20260820.1509/projectile.el
;;; Project path spelling helpers
;;
;; A "project root" string is spelled in exactly two canonical ways across
;; the code base, and mixing them up is a recurring source of subtle cache
;; bugs (a root looked up in one spelling never matching a key stored in the
;; other). The two spellings are:
;;
;; - The *cache-key* spelling: what `projectile-project-root' returns, i.e.
;; an absolute, symlink-resolved (its search starts from `file-truename'),
;; directory name ending in a slash. This is what every per-project cache
;; table (`projectile-projects-cache', the frecency table, the watch
;; registry, ...) is keyed by. Never re-abbreviate or re-expand such a
;; value before using it as a key - it is already canonical.
;;
;; - The *known-projects* spelling: the abbreviated form persisted in
;; `projectile-known-projects' and shown to the user. Produce it only via
;; `projectile--known-project-root' so every entry is spelled identically
;; (abbreviated, trailing slash), which is what removal and membership
;; checks rely on.
;;
;; `projectile--project-relative-name' owns the third boundary: turning an
;; absolute path into a root-relative one.
(defun projectile--project-relative-name (path root)
"Return PATH spelled relative to project ROOT.
ROOT must be spelled as `projectile-project-root' returns it (absolute,
symlink-resolved, trailing slash) and PATH must share that spelling
\(e.g. already run through `file-truename' / `expand-file-name' the same
way). When the two spellings diverge - PATH reached through a symlink
or abbreviation the root wasn't - the result gains leading `../'
segments; callers that cache the result should reject a value starting
with \"..\" rather than store a bogus entry.
This is a thin wrapper around `file-relative-name' whose sole purpose is
to give that boundary a single, documented owner."
(file-relative-name path root))