(let ((directory (file-name-as-directory
(expand-file-name
(car directories)))))
- (if (file-directory-p directory)
+ (if (paths-file-readable-directory-p directory)
(let ((raw-entries
(if (equal 0 max-depth)
'()
- (directory-files directory nil "^[^.-]")))
+ (directory-files directory nil "^[^.-]")))
(reverse-dirs '()))
-
(while raw-entries
(if (null (string-match exclude-regexp (car raw-entries)))
(setq reverse-dirs
(setq directories (cdr directories)))
path))
+(defun paths-file-readable-directory-p (filename)
+ "Check if filename is a readable directory."
+ (and (file-directory-p filename)
+ (file-readable-p filename)))
+
(defun paths-find-recursive-load-path (directories &optional max-depth)
"Construct a recursive load path underneath DIRECTORIES."
(paths-find-recursive-path directories
"Check if DIRECTORY is a plausible installation root for XEmacs."
(or
;; installed
- (file-directory-p (paths-construct-path (list directory
- "lib"
- emacs-program-name)))
+ (paths-file-readable-directory-p (paths-construct-path (list directory
+ "lib"
+ emacs-program-name)))
;; in-place or windows-nt
- (and
- (file-directory-p (paths-construct-path (list directory "lisp")))
- (file-directory-p (paths-construct-path (list directory "etc"))))))
+ (and
+ (paths-file-readable-directory-p (paths-construct-path (list directory "lisp")))
+ (paths-file-readable-directory-p (paths-construct-path (list directory "etc"))))))
+
+(defun paths-root-in-place-p (root)
+ "Check if ROOT is an in-place installation root for XEmacs."
+ (paths-file-readable-directory-p (paths-construct-path (list root "lisp"))))
(defun paths-chase-symlink (file-name)
"Chase a symlink until the bitter end."
(defun paths-construct-emacs-directory (root suffix base)
"Construct a directory name within the XEmacs hierarchy."
(file-name-as-directory
- (expand-file-name
+ (expand-file-name
(concat
(file-name-as-directory root)
suffix
base))))
(defun paths-find-emacs-directory (roots suffix base
- &optional envvar default keep-suffix)
+ &optional envvar default keep-suffix
+ in-place-external)
"Find a directory in the XEmacs hierarchy.
ROOTS must be a list of installation roots.
SUFFIX is the subdirectory from there.
specify the directory.
DEFAULT is the preferred value.
If KEEP-SUFFIX is non-nil, the suffix must be respected in searching
-the directory."
+the directory.
+If IN-PLACE-EXTERNAL is non-nil, the directory might be found outside
+an in-place root-hierarchy."
(let ((preferred-value (or (and envvar (getenv envvar))
default)))
(if (and preferred-value
- (file-directory-p preferred-value))
+ (paths-file-readable-directory-p preferred-value))
(file-name-as-directory preferred-value)
(catch 'gotcha
(while roots
- (let* ((root (car roots))
- ;; installed
- (path (paths-construct-emacs-directory root suffix base)))
- (if (file-directory-p path)
- (throw 'gotcha path)
- ;; in-place
- (if (null keep-suffix)
- (let ((path (paths-construct-emacs-directory root "" base)))
- (if (file-directory-p path)
- (throw 'gotcha path))))))
+ (let ((root (car roots)))
+ ;; installed
+ (let ((path (paths-construct-emacs-directory root suffix base)))
+ (if (paths-file-readable-directory-p path)
+ (throw 'gotcha path)))
+ ;; in-place
+ (if (null keep-suffix)
+ (let ((path (paths-construct-emacs-directory root "" base)))
+ (if (paths-file-readable-directory-p path)
+ (throw 'gotcha path))))
+ (if (and in-place-external
+ (paths-root-in-place-p root))
+ (let ((path (paths-construct-emacs-directory
+ (paths-construct-path '("..") root)
+ "" base)))
+ (if (paths-file-readable-directory-p path)
+ (throw 'gotcha path)))))
(setq roots (cdr roots)))
nil))))
-(defun paths-find-site-directory (roots base &optional envvar default)
- "Find a site-specific directory in the XEmacs hierarchy."
+(defun paths-find-site-directory (roots base &optional envvar default in-place-external)
+ "Find a site-specific directory in the XEmacs hierarchy.
+If IN-PLACE-EXTERNAL is non-nil, the directory might be found outside
+an in-place root-hierarchy."
(paths-find-emacs-directory roots
(file-name-as-directory
(paths-construct-path (list
"lib"
emacs-program-name)))
base
- envvar default))
+ envvar default
+ nil
+ in-place-external))
(defun paths-find-version-directory (roots base
&optional envvar default enforce-version)
;; from more to less specific
(paths-find-version-directory roots
(concat base system-configuration)
- envvar)
+ envvar default)
(paths-find-version-directory roots
base
envvar)
(paths-find-version-directory roots
system-configuration
- envvar default)))
+ envvar)))
(defun construct-emacs-version-name ()
"Construct the raw XEmacs version number."
"Return the directories among DIRECTORIES."
(let ((reverse-directories '()))
(while directories
- (if (file-directory-p (car directories))
- (setq reverse-directories
+ (if (paths-file-readable-directory-p (car directories))
+ (setq reverse-directories
(cons (car directories)
reverse-directories)))
(setq directories (cdr directories)))
(defun paths-decode-directory-path (string &optional drop-empties)
"Split STRING at path separators into a directory list.
-Non-\"\" comonents are converted into directory form.
+Non-\"\" components are converted into directory form.
If DROP-EMPTIES is non-NIL, \"\" components are dropped from the output.
Otherwise, they are left alone."
(let* ((components (split-path string))