diff --git a/output-translations.lisp b/output-translations.lisp index 9ba06ca73002a10aafc4cbbd6caf00e30b7b9329..387865fbb6c67fdb4352a01b413ca44f650a7ec1 100644 --- a/output-translations.lisp +++ b/output-translations.lisp @@ -197,12 +197,10 @@ and the order is by decreasing length of namestring of the source pathname.") ((location-function-p dst) (funcall collect (list trusrc (ensure-function (second dst))))) - ((eq dst t) + ((typep dst 'boolean) (funcall collect (list trusrc t))) (t - (let* ((trudst (if dst - (resolve-location dst :ensure-directory t :wilden t) - trusrc))) + (let* ((trudst (resolve-location dst :ensure-directory t :wilden t))) (funcall collect (list trudst t)) (funcall collect (list trusrc trudst))))))))))) diff --git a/test/asdf-pathname-test.script b/test/asdf-pathname-test.script index c7c9b9b34cc822b529c62585547e4ae16b61d8a6..e7460bcd0b3ac47b1d9e6084b455034f00f0b220 100644 --- a/test/asdf-pathname-test.script +++ b/test/asdf-pathname-test.script @@ -426,13 +426,13 @@ (setf (uiop:getenv "XDG_CONFIG_DIRS") "/foo:prismatic") (multiple-value-bind (ret err) (ignore-errors - (uiop:config-pathnames)) + (uiop:xdg-config-pathnames)) (assert (and (not ret) err))) (setf (uiop:getenv "XDG_CONFIG_DIRS") "/foo:") (setf (uiop:getenv "XDG_CONFIG_HOME") "") (multiple-value-bind (ret err) (ignore-errors - (uiop:config-pathnames)) + (uiop:xdg-config-pathnames)) (assert (not err)) (assert (= (length ret) 2)))) (when old-config diff --git a/uiop/configuration.lisp b/uiop/configuration.lisp index 6599d1e782f808a8b2f96620f9774f70de4943ad..56ee6e5c1a797d703a86b6a61ddd8f3b0bee4544 100644 --- a/uiop/configuration.lisp +++ b/uiop/configuration.lisp @@ -234,10 +234,10 @@ directive.") :do (setf path (if (absolute-pathname-p sub) (resolve-symlinks* sub) sub)) :finally (return path))) - ;;; NOTE: Why is a boolean a location designator? Could we amplify the - ;;; docstring? Possibly just by reference to the ASF manual... (defun location-designator-p (x) "Is X a designator for a location?" + ;; NIL means "skip this entry", or as an output translation, same as translation input. + ;; T means "any input" for a translation, or as output, same as translation input. (flet ((absolute-component-p (c) (typep c '(or string pathname (member :root :home :here :user-cache)))) @@ -248,12 +248,10 @@ directive.") (absolute-component-p x) (and (consp x) (absolute-component-p (first x)) (every #'relative-component-p (rest x)))))) - ;;; NOTE: similarly, what's a location function? (defun location-function-p (x) "Is X the specification of a location function?" - (and - (length=n-p x 2) - (eq (car x) :function))) + ;; Location functions are allowed in output translations, and notably used by ABCL for JAR file support. + (and (length=n-p x 2) (eq (car x) :function))) (defvar *clear-configuration-hook* '()) @@ -289,9 +287,9 @@ this function tries to locate the Windows FOLDER for one of (subpathname* (getenv-absolute-directory "ALLUSERSPROFILE") "Application Data/")))))) ;; Support for the XDG Base Directory Specification - ;;; NOTE: Can we explain what MORE is for here? (defun xdg-data-home (&rest more) - "Returns a pathname for the directory containing user-specific data files." + "Returns an absolute pathname for the directory containing user-specific data files. +MORE may contain specifications for a subpath, as per RESOLVE-LOCATION." (resolve-absolute-location `(,(or (getenv-absolute-directory "XDG_DATA_HOME") (os-cond @@ -300,7 +298,8 @@ this function tries to locate the Windows FOLDER for one of ,more))) (defun xdg-config-home (&rest more) - "Returns a pathname for the directory containing user-specific configuration files." + "Returns a pathname for the directory containing user-specific configuration files. +MORE may contain specifications for a subpath, as per RESOLVE-LOCATION." (resolve-absolute-location `(,(or (getenv-absolute-directory "XDG_CONFIG_HOME") (os-cond @@ -310,7 +309,8 @@ this function tries to locate the Windows FOLDER for one of (defun xdg-data-dirs (&rest more) "The preference-ordered set of additional paths to search for data files. -Returns a list of absolute directory pathnames." +Returns a list of absolute directory pathnames. +MORE may contain specifications for a subpath, as per RESOLVE-LOCATION." (mapcar #'(lambda (d) (resolve-location `(,d ,more))) (or (getenv-absolute-directories "XDG_DATA_DIRS") (os-cond @@ -319,7 +319,8 @@ Returns a list of absolute directory pathnames." (defun xdg-config-dirs (&rest more) "The preference-ordered set of additional base paths to search for configuration files. -Returns a list of absolute directory pathnames." +Returns a list of absolute directory pathnames. +MORE may contain specifications for a subpath, as per RESOLVE-LOCATION." (mapcar #'(lambda (d) (resolve-location `(,d ,more))) (or (getenv-absolute-directories "XDG_CONFIG_DIRS") (os-cond @@ -328,7 +329,8 @@ Returns a list of absolute directory pathnames." (defun xdg-cache-home (&rest more) "The base directory relative to which user specific non-essential data files should be stored. -Returns an absolute directory pathname." +Returns an absolute directory pathname. +MORE may contain specifications for a subpath, as per RESOLVE-LOCATION." (resolve-absolute-location `(,(or (getenv-absolute-directory "XDG_CACHE_HOME") (os-cond @@ -338,7 +340,8 @@ Returns an absolute directory pathname." (defun xdg-runtime-dir (&rest more) "Pathname for user-specific non-essential runtime files and other file objects. -Returns an absolute directory pathname." +Returns an absolute directory pathname. +MORE may contain specifications for a subpath, as per RESOLVE-LOCATION." ;; (such as sockets, named pipes, ...) ;; The XDG spec says that if not provided by the login system, the application should ;; issue a warning and provide a replacement. UIOP is not equipped to do that and returns NIL. @@ -347,7 +350,8 @@ Returns an absolute directory pathname." ;;; NOTE: modified the docstring because "system user configuration ;;; directories" seems self-contradictory. I'm not sure my wording is right. (defun system-config-pathnames (&rest more) - "Return a list of directories where are stored the system's default user configuration information." + "Return a list of directories where are stored the system's default user configuration information. +MORE may contain specifications for a subpath, as per RESOLVE-LOCATION." (os-cond ((os-unix-p) (list (resolve-absolute-location `(,(parse-unix-namestring "/etc/") ,more)))))) @@ -358,13 +362,15 @@ Returns an absolute directory pathname." (defun xdg-data-pathnames (&rest more) "Return a list of absolute pathnames for application data directories. With APP, returns directory for data for that application, without APP, returns the set of directories -for storing all application configurations." +for storing all application configurations. +MORE may contain specifications for a subpath, as per RESOLVE-LOCATION." (filter-pathname-set `(,(xdg-data-home more) ,@(xdg-data-dirs more)))) (defun xdg-config-pathnames (&rest more) - "Return a list of pathnames for application configuration." + "Return a list of pathnames for application configuration. +MORE may contain specifications for a subpath, as per RESOLVE-LOCATION." (filter-pathname-set `(,(xdg-config-home more) ,@(xdg-config-dirs more))))