summaryrefslogtreecommitdiffstats
path: root/lib/strings.nix
diff options
context:
space:
mode:
authorSilvan Mosberger <contact@infinisil.com>2020-01-27 23:03:38 +0100
committerSilvan Mosberger <contact@infinisil.com>2020-03-30 01:15:30 +0200
commit4b206ac83ba23e44231088b1d5f23d96adbced05 (patch)
tree28d473e718049da788322588e477c869ce82fc48 /lib/strings.nix
parent5e46d5a7b59d69e7b86239195f58d26277ae0370 (diff)
lib/strings: Add sanitizeDerivationName function
Diffstat (limited to 'lib/strings.nix')
-rw-r--r--lib/strings.nix32
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)
+ ];
+
}