diff options
author | Silvan Mosberger <contact@infinisil.com> | 2020-01-27 23:03:38 +0100 |
---|---|---|
committer | Silvan Mosberger <contact@infinisil.com> | 2020-03-30 01:15:30 +0200 |
commit | 4b206ac83ba23e44231088b1d5f23d96adbced05 (patch) | |
tree | 28d473e718049da788322588e477c869ce82fc48 /lib/strings.nix | |
parent | 5e46d5a7b59d69e7b86239195f58d26277ae0370 (diff) |
lib/strings: Add sanitizeDerivationName function
Diffstat (limited to 'lib/strings.nix')
-rw-r--r-- | lib/strings.nix | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/strings.nix b/lib/strings.nix index 6dbb3d3a3e8b..6ba000987548 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) + ]; + } |