Function: projectile--watch-adopt-directory
projectile--watch-adopt-directory is a byte-compiled function defined
in projectile.el.
Signature
(projectile--watch-adopt-directory PROJECT DIR)
Documentation
Watch DIR, a directory newly created inside PROJECT, and cache its files.
DIR may already have contents - e.g. a populated directory moved into
the project generates a single created event - so its entries are
enumerated: regular files are handed to
projectile--watch-handle-created and subdirectories are adopted
recursively. Ignored directories are skipped entirely. Returns
non-nil when the cached file list was mutated. Throws
projectile--watch-fallback when DIR can't be watched (the watch limit
was reached, or the backend refused).
Source Code
;; Defined in ~/.emacs.d/elpa/projectile-20260820.1509/projectile.el
(defun projectile--watch-adopt-directory (project dir)
"Watch DIR, a directory newly created inside PROJECT, and cache its files.
DIR may already have contents - e.g. a populated directory moved into
the project generates a single `created' event - so its entries are
enumerated: regular files are handed to
`projectile--watch-handle-created' and subdirectories are adopted
recursively. Ignored directories are skipped entirely. Returns
non-nil when the cached file list was mutated. Throws
`projectile--watch-fallback' when DIR can't be watched (the watch limit
was reached, or the backend refused)."
(let* ((dir (file-name-as-directory (expand-file-name dir)))
(relative (file-relative-name dir project))
(watches (gethash project projectile--project-watches)))
(cond
;; Already watched (duplicate or overlapping events): nothing to do.
((rassoc dir watches) nil)
;; Don't descend into ignored directories.
((let ((default-directory project))
(null (projectile-remove-ignored (list relative))))
nil)
((>= (length watches) projectile-watch-directory-limit)
(throw 'projectile--watch-fallback
(format "new directory %s would exceed `projectile-watch-directory-limit'"
relative)))
(t
(let ((descriptor
(condition-case err
(file-notify-add-watch
dir '(change) (projectile--watch-make-callback project))
(error (throw 'projectile--watch-fallback
(error-message-string err))))))
(puthash project (cons (cons descriptor dir) watches)
projectile--project-watches))
(let ((mutated nil))
;; Enumerating the new directory races against whatever is still
;; populating (or already removing) it; an IO error here must not
;; leave the batch half-applied, so convert it into the fallback.
;; A nested `projectile--watch-fallback' throw is not an error
;; condition and passes through untouched.
(condition-case err
(dolist (entry (directory-files
dir t directory-files-no-dot-files-regexp t))
(when (projectile--watch-handle-created project entry)
(setq mutated t)))
(error (throw 'projectile--watch-fallback
(error-message-string err))))
mutated)))))