Unverified Commit 6107d48b authored by Matt Sturgeon's avatar Matt Sturgeon
Browse files

lib.options.mkPackageOption: use lib.showAttrPath

Make use of `lib.showAttrPath` instead of manually doing `concatStringsSep "."`.

This means edge-cases such as the attr-path including names that are not
valid nix identifiers will be handled better.

See:
- https://nix.dev/manual/nix/2.26/language/identifiers
- https://nixos.org/manual/nixpkgs/unstable/#function-library-lib.attrsets.showAttrPath
parent 4c26f960
Loading
Loading
Loading
Loading
+6 −4
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ let
  inherit (lib.attrsets)
    attrByPath
    optionalAttrs
    showAttrPath
    ;
  inherit (lib.strings)
    concatMapStrings
@@ -40,6 +41,7 @@ let
    ;
  inherit (lib.lists)
    last
    toList
    ;
  prioritySuggestion = ''
    Use `lib.mkForce value` or `lib.mkDefault value` to change the priority on any of these definitions.
@@ -310,14 +312,14 @@ rec {
    }:
    let
      name' = if isList name then last name else name;
      default' = if isList default then default else [ default ];
      defaultText = concatStringsSep "." default';
      default' = toList default;
      defaultText = showAttrPath default';
      defaultValue = attrByPath default' (throw "${defaultText} cannot be found in ${pkgsText}") pkgs;
      defaults =
        if default != null then
          {
            default = defaultValue;
            defaultText = literalExpression ("${pkgsText}." + defaultText);
            defaultText = literalExpression "${pkgsText}.${defaultText}";
          }
        else
          optionalAttrs nullable {
@@ -333,7 +335,7 @@ rec {
      }
      // optionalAttrs (example != null) {
        example = literalExpression (
          if isList example then "${pkgsText}." + concatStringsSep "." example else example
          if isList example then "${pkgsText}.${showAttrPath example}" else example
        );
      }
    );
+3 −0
Original line number Diff line number Diff line
@@ -332,6 +332,9 @@ checkConfigOutput '^"null or package"$' options.nullablePackage.type.description
checkConfigOutput '^"hello"$' config.nullablePackageWithDefault.pname ./declare-mkPackageOption.nix
checkConfigOutput '^"myPkgs\.hello"$' options.packageWithPkgsText.defaultText.text ./declare-mkPackageOption.nix
checkConfigOutput '^"hello-other"$' options.packageFromOtherSet.default.pname ./declare-mkPackageOption.nix
checkConfigOutput '^"hello"$' config.packageInvalidIdentifier.pname ./declare-mkPackageOption.nix
checkConfigOutput '^"pkgs\.\\"123\\"\.\\"with\\\\\\"quote\\"\.hello"$' options.packageInvalidIdentifier.defaultText.text ./declare-mkPackageOption.nix
checkConfigOutput '^"pkgs\.\\"123\\"\.\\"with\\\\\\"quote\\"\.hello"$' options.packageInvalidIdentifierExample.example.text ./declare-mkPackageOption.nix

# submoduleWith

+14 −0
Original line number Diff line number Diff line
@@ -57,5 +57,19 @@ in
        };
      in
      lib.mkPackageOption myPkgs "hello" { };

    packageInvalidIdentifier =
      let
        myPkgs."123"."with\"quote" = { inherit (pkgs) hello; };
      in
      lib.mkPackageOption myPkgs [ "123" "with\"quote" "hello" ] { };

    packageInvalidIdentifierExample = lib.mkPackageOption pkgs "hello" {
      example = [
        "123"
        "with\"quote"
        "hello"
      ];
    };
  };
}