From 4b206ac83ba23e44231088b1d5f23d96adbced05 Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Mon, 27 Jan 2020 23:03:38 +0100 Subject: lib/strings: Add sanitizeDerivationName function --- lib/strings.nix | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'lib/strings.nix') diff --git a/lib/strings.nix b/lib/strings.nix index 6dbb3d3a3e8..6ba00098754 100644 --- a/lib/strings.nix +++ b/lib/strings.nix @@ -678,4 +678,36 @@ rec { => "1.0" */ fileContents = file: removeSuffix "\n" (builtins.readFile file); + + + /* Creates a valid derivation name from a potentially invalid one. + + Type: sanitizeDerivationName :: String -> String + + Example: + sanitizeDerivationName "../hello.bar # foo" + => "-hello.bar-foo" + sanitizeDerivationName "" + => "unknown" + sanitizeDerivationName pkgs.hello + => "-nix-store-2g75chlbpxlrqn15zlby2dfh8hr9qwbk-hello-2.10" + */ + sanitizeDerivationName = string: lib.pipe string [ + # Get rid of string context. This is safe under the assumption that the + # resulting string is only used as a derivation name + builtins.unsafeDiscardStringContext + # Strip all leading "." + (x: builtins.elemAt (builtins.match "\\.*(.*)" x) 0) + # Split out all invalid characters + # https://github.com/NixOS/nix/blob/2.3.2/src/libstore/store-api.cc#L85-L112 + # https://github.com/NixOS/nix/blob/2242be83c61788b9c0736a92bb0b5c7bbfc40803/nix-rust/src/store/path.rs#L100-L125 + (builtins.split "[^[:alnum:]+._?=-]+") + # Replace invalid character ranges with a "-" + (concatMapStrings (s: if lib.isList s then "-" else s)) + # Limit to 211 characters (minus 4 chars for ".drv") + (x: substring (lib.max (stringLength x - 207) 0) (-1) x) + # If the result is empty, replace it with "unknown" + (x: if stringLength x == 0 then "unknown" else x) + ]; + } -- cgit 1.4.1