types.*pathname: normalize slashes

This commit is contained in:
tv 2017-03-31 15:08:16 +02:00
parent a059f2fc99
commit a673125fbb

View File

@ -5,7 +5,7 @@ let
all any concatMapStringsSep concatStringsSep const filter flip genid all any concatMapStringsSep concatStringsSep const filter flip genid
hasSuffix head isInt isString length match mergeOneOption mkOption hasSuffix head isInt isString length match mergeOneOption mkOption
mkOptionType optional optionalAttrs optionals range splitString mkOptionType optional optionalAttrs optionals range splitString
stringLength tail typeOf; stringLength substring typeOf;
inherit (lib.types) inherit (lib.types)
attrsOf bool either enum int listOf nullOr path str string submodule; attrsOf bool either enum int listOf nullOr path str string submodule;
in in
@ -430,23 +430,23 @@ rec {
}; };
# POSIX.12013, 3.2 Absolute Pathname # POSIX.12013, 3.2 Absolute Pathname
# TODO normalize slashes
# TODO two slashes
absolute-pathname = mkOptionType { absolute-pathname = mkOptionType {
name = "POSIX absolute pathname"; name = "POSIX absolute pathname";
check = x: let xs = splitString "/" x; xa = head xs; in check = x: isString x && substring 0 1 x == "/" && pathname.check x;
isString x
&& stringLength x > 0
&& (xa == "/" || (xa == "" && all filename.check (tail xs)));
merge = mergeOneOption; merge = mergeOneOption;
}; };
# POSIX.12013, 3.267 Pathname # POSIX.12013, 3.267 Pathname
# TODO normalize slashes
pathname = mkOptionType { pathname = mkOptionType {
name = "POSIX pathname"; name = "POSIX pathname";
check = x: let xs = splitString "/" x; in check = x:
isString x && all filename.check (if head xs == "" then tail xs else xs); let
# The filter is used to normalize paths, i.e. to remove duplicated and
# trailing slashes. It also removes leading slashes, thus we have to
# check for "/" explicitly below.
xs = filter (s: stringLength s > 0) (splitString "/" x);
in
isString x && (x == "/" || (length xs > 0 && all filename.check xs));
merge = mergeOneOption; merge = mergeOneOption;
}; };