From 2464ea7303601cf5ee1dc4b3439d91ff182001b0 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Fri, 28 Apr 2023 17:16:57 +0300 Subject: [PATCH] fix(nixery): allow references to packages starting with numbers These packages are invalid in Nix, and worked around in nixpkgs with underscores, but the underscores are invalid in the Docker registry protocol. We work around this by detecting this case and adding the underscore to yield the correct package reference. There is no case where this workaround can break something, as there can be no valid package matching the regular expression. This relates to https://github.com/tazjin/nixery/issues/158 Change-Id: I7990cdb534a8e86c2ceee2c589a2636af70a4a03 Reviewed-on: https://cl.tvl.fyi/c/depot/+/8531 Tested-by: BuildkiteCI Autosubmit: tazjin Reviewed-by: flokli --- tools/nixery/prepare-image/prepare-image.nix | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/tools/nixery/prepare-image/prepare-image.nix b/tools/nixery/prepare-image/prepare-image.nix index a48545905..28022fe42 100644 --- a/tools/nixery/prepare-image/prepare-image.nix +++ b/tools/nixery/prepare-image/prepare-image.nix @@ -13,7 +13,7 @@ { # Description of the package set to be used (will be loaded by load-pkgs.nix) srcType ? "nixpkgs" -, srcArgs ? "nixos-20.09" +, srcArgs ? "nixos-unstable" , system ? "x86_64-linux" , importArgs ? { } , # Path to load-pkgs.nix @@ -89,6 +89,19 @@ let in attrByPath path fetchLower s; + # Workaround for a workaround in nixpkgs: Unquoted language + # identifiers can not start with numbers in Nix, but some package + # names start with numbers (such as `1password`). + # + # In nixpkgs convention, these identifiers are prefixed with + # underscores (e.g. `_1password`), however this is not accepted by + # the Docker registry protocol. + # + # To make this work, we detect these kinds of packages and add the + # missing underscore. + needsUnderscore = pkg: (builtins.match "^[0-9].*" pkg) != null; + normalisedPackages = map (p: if needsUnderscore p then "_${p}" else p) (fromJSON packages); + # allContents contains all packages successfully retrieved by name # from the package set, as well as any errors encountered while # attempting to fetch a package. @@ -104,7 +117,7 @@ let then attrs // { errors = attrs.errors ++ [ res ]; } else attrs // { contents = attrs.contents ++ [ res ]; }; init = { contents = [ ]; errors = [ ]; }; - fetched = (map (deepFetch pkgs) (fromJSON packages)); + fetched = (map (deepFetch pkgs) normalisedPackages); in foldl' splitter init fetched;