mirror of
https://github.com/NixOS/nix
synced 2025-07-03 06:11:46 +02:00
Tagging release 2.28.3
-----BEGIN PGP SIGNATURE----- iQFHBAABCAAxFiEEtUHVUwEnDgvPFcpdgXC0cm1xmN4FAmgRLc8THGVkb2xzdHJh QGdtYWlsLmNvbQAKCRCBcLRybXGY3itzB/0ehHDYPXycvwpdL4MuAcroY5GgQJLz dGkrmv9tMQXERqjnqd86LW6BgKwG3UY12xFMeFgYQyV/TzC6iwZUgI+Kr+baFMhH JoEXgLTXRwnyC54mXUGPrX6P9MwPBoUpAClaG5iH9SCV70Z/PLuXsd4/HoDmLxsi tVCTxoq9kn7o/YAMOQGY3KTfM26LqEPOv2vTco2ETEnNqSXCjUJ/MniMdTGCsTxy rdWqel95EuIb0qsMSRPrVV6xmx/KjamTSzdCcXWQbpAu4xjUyacnjL3XpGWkMUKV HKtbNdXboHwJgtwe66HMCgtfWPB6JCamMRm+h/b6BrTTz46eJWiaG/KW =Exmm -----END PGP SIGNATURE----- Merge tag '2.28.3' into sync-2.28.3 Tagging release 2.28.3
This commit is contained in:
commit
c92cb4c130
29 changed files with 148 additions and 105 deletions
2
.version
2
.version
|
@ -1 +1 @@
|
||||||
2.28.2
|
2.28.3
|
||||||
|
|
34
flake.nix
34
flake.nix
|
@ -142,14 +142,15 @@
|
||||||
# without "polluting" the top level "`pkgs`" attrset.
|
# without "polluting" the top level "`pkgs`" attrset.
|
||||||
# This also has the benefit of providing us with a distinct set of packages
|
# This also has the benefit of providing us with a distinct set of packages
|
||||||
# we can iterate over.
|
# we can iterate over.
|
||||||
nixComponents =
|
# The `2` suffix is here because otherwise it interferes with `nixVersions.latest`, which is used in daemon compat tests.
|
||||||
|
nixComponents2 =
|
||||||
lib.makeScopeWithSplicing'
|
lib.makeScopeWithSplicing'
|
||||||
{
|
{
|
||||||
inherit (final) splicePackages;
|
inherit (final) splicePackages;
|
||||||
inherit (final.nixDependencies) newScope;
|
inherit (final.nixDependencies2) newScope;
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
otherSplices = final.generateSplicesForMkScope "nixComponents";
|
otherSplices = final.generateSplicesForMkScope "nixComponents2";
|
||||||
f = import ./packaging/components.nix {
|
f = import ./packaging/components.nix {
|
||||||
inherit (final) lib;
|
inherit (final) lib;
|
||||||
inherit officialRelease;
|
inherit officialRelease;
|
||||||
|
@ -160,22 +161,23 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
# The dependencies are in their own scope, so that they don't have to be
|
# The dependencies are in their own scope, so that they don't have to be
|
||||||
# in Nixpkgs top level `pkgs` or `nixComponents`.
|
# in Nixpkgs top level `pkgs` or `nixComponents2`.
|
||||||
nixDependencies =
|
# The `2` suffix is here because otherwise it interferes with `nixVersions.latest`, which is used in daemon compat tests.
|
||||||
|
nixDependencies2 =
|
||||||
lib.makeScopeWithSplicing'
|
lib.makeScopeWithSplicing'
|
||||||
{
|
{
|
||||||
inherit (final) splicePackages;
|
inherit (final) splicePackages;
|
||||||
inherit (final) newScope; # layered directly on pkgs, unlike nixComponents above
|
inherit (final) newScope; # layered directly on pkgs, unlike nixComponents2 above
|
||||||
}
|
}
|
||||||
{
|
{
|
||||||
otherSplices = final.generateSplicesForMkScope "nixDependencies";
|
otherSplices = final.generateSplicesForMkScope "nixDependencies2";
|
||||||
f = import ./packaging/dependencies.nix {
|
f = import ./packaging/dependencies.nix {
|
||||||
inherit inputs stdenv;
|
inherit inputs stdenv;
|
||||||
pkgs = final;
|
pkgs = final;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
nix = final.nixComponents.nix-cli;
|
nix = final.nixComponents2.nix-cli;
|
||||||
|
|
||||||
# See https://github.com/NixOS/nixpkgs/pull/214409
|
# See https://github.com/NixOS/nixpkgs/pull/214409
|
||||||
# Remove when fixed in this flake's nixpkgs
|
# Remove when fixed in this flake's nixpkgs
|
||||||
|
@ -275,7 +277,7 @@
|
||||||
# memory leaks with detect_leaks=0.
|
# memory leaks with detect_leaks=0.
|
||||||
"" = rec {
|
"" = rec {
|
||||||
nixpkgs = nixpkgsFor.${system}.native;
|
nixpkgs = nixpkgsFor.${system}.native;
|
||||||
nixComponents = nixpkgs.nixComponents.overrideScope (
|
nixComponents = nixpkgs.nixComponents2.overrideScope (
|
||||||
nixCompFinal: nixCompPrev: {
|
nixCompFinal: nixCompPrev: {
|
||||||
mesonComponentOverrides = _finalAttrs: prevAttrs: {
|
mesonComponentOverrides = _finalAttrs: prevAttrs: {
|
||||||
mesonFlags =
|
mesonFlags =
|
||||||
|
@ -303,7 +305,7 @@
|
||||||
nixpkgsPrefix:
|
nixpkgsPrefix:
|
||||||
{
|
{
|
||||||
nixpkgs,
|
nixpkgs,
|
||||||
nixComponents ? nixpkgs.nixComponents,
|
nixComponents ? nixpkgs.nixComponents2,
|
||||||
}:
|
}:
|
||||||
flatMapAttrs nixComponents (
|
flatMapAttrs nixComponents (
|
||||||
pkgName: pkg:
|
pkgName: pkg:
|
||||||
|
@ -333,9 +335,9 @@
|
||||||
binaryTarball = self.hydraJobs.binaryTarball.${system};
|
binaryTarball = self.hydraJobs.binaryTarball.${system};
|
||||||
# TODO probably should be `nix-cli`
|
# TODO probably should be `nix-cli`
|
||||||
nix = self.packages.${system}.nix-everything;
|
nix = self.packages.${system}.nix-everything;
|
||||||
nix-manual = nixpkgsFor.${system}.native.nixComponents.nix-manual;
|
nix-manual = nixpkgsFor.${system}.native.nixComponents2.nix-manual;
|
||||||
nix-internal-api-docs = nixpkgsFor.${system}.native.nixComponents.nix-internal-api-docs;
|
nix-internal-api-docs = nixpkgsFor.${system}.native.nixComponents2.nix-internal-api-docs;
|
||||||
nix-external-api-docs = nixpkgsFor.${system}.native.nixComponents.nix-external-api-docs;
|
nix-external-api-docs = nixpkgsFor.${system}.native.nixComponents2.nix-external-api-docs;
|
||||||
|
|
||||||
fallbackPathsNix =
|
fallbackPathsNix =
|
||||||
let
|
let
|
||||||
|
@ -421,7 +423,7 @@
|
||||||
}:
|
}:
|
||||||
{
|
{
|
||||||
# These attributes go right into `packages.<system>`.
|
# These attributes go right into `packages.<system>`.
|
||||||
"${pkgName}" = nixpkgsFor.${system}.native.nixComponents.${pkgName};
|
"${pkgName}" = nixpkgsFor.${system}.native.nixComponents2.${pkgName};
|
||||||
}
|
}
|
||||||
// lib.optionalAttrs supportsCross (
|
// lib.optionalAttrs supportsCross (
|
||||||
flatMapAttrs (lib.genAttrs crossSystems (_: { })) (
|
flatMapAttrs (lib.genAttrs crossSystems (_: { })) (
|
||||||
|
@ -429,7 +431,7 @@
|
||||||
{ }:
|
{ }:
|
||||||
{
|
{
|
||||||
# These attributes go right into `packages.<system>`.
|
# These attributes go right into `packages.<system>`.
|
||||||
"${pkgName}-${crossSystem}" = nixpkgsFor.${system}.cross.${crossSystem}.nixComponents.${pkgName};
|
"${pkgName}-${crossSystem}" = nixpkgsFor.${system}.cross.${crossSystem}.nixComponents2.${pkgName};
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
@ -439,7 +441,7 @@
|
||||||
{
|
{
|
||||||
# These attributes go right into `packages.<system>`.
|
# These attributes go right into `packages.<system>`.
|
||||||
"${pkgName}-${stdenvName}" =
|
"${pkgName}-${stdenvName}" =
|
||||||
nixpkgsFor.${system}.nativeForStdenv.${stdenvName}.nixComponents.${pkgName};
|
nixpkgsFor.${system}.nativeForStdenv.${stdenvName}.nixComponents2.${pkgName};
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
@ -172,14 +172,14 @@
|
||||||
''^src/libfetchers/include/nix/fetchers/tarball\.hh$''
|
''^src/libfetchers/include/nix/fetchers/tarball\.hh$''
|
||||||
''^src/libfetchers/git\.cc$''
|
''^src/libfetchers/git\.cc$''
|
||||||
''^src/libfetchers/mercurial\.cc$''
|
''^src/libfetchers/mercurial\.cc$''
|
||||||
''^src/libflake/flake/config\.cc$''
|
''^src/libflake/config\.cc$''
|
||||||
''^src/libflake/flake/flake\.cc$''
|
''^src/libflake/flake\.cc$''
|
||||||
''^src/libflake/include/nix/flake/flake\.hh$''
|
''^src/libflake/include/nix/flake/flake\.hh$''
|
||||||
''^src/libflake/flake/flakeref\.cc$''
|
''^src/libflake/flakeref\.cc$''
|
||||||
''^src/libflake/include/nix/flake/flakeref\.hh$''
|
''^src/libflake/include/nix/flake/flakeref\.hh$''
|
||||||
''^src/libflake/flake/lockfile\.cc$''
|
''^src/libflake/lockfile\.cc$''
|
||||||
''^src/libflake/include/nix/flake/lockfile\.hh$''
|
''^src/libflake/include/nix/flake/lockfile\.hh$''
|
||||||
''^src/libflake/flake/url-name\.cc$''
|
''^src/libflake/url-name\.cc$''
|
||||||
''^src/libmain/common-args\.cc$''
|
''^src/libmain/common-args\.cc$''
|
||||||
''^src/libmain/include/nix/main/common-args\.hh$''
|
''^src/libmain/include/nix/main/common-args\.hh$''
|
||||||
''^src/libmain/loggers\.cc$''
|
''^src/libmain/loggers\.cc$''
|
||||||
|
|
|
@ -5,11 +5,11 @@
|
||||||
|
|
||||||
{ pkgs }:
|
{ pkgs }:
|
||||||
|
|
||||||
pkgs.nixComponents.nix-util.overrideAttrs (
|
pkgs.nixComponents2.nix-util.overrideAttrs (
|
||||||
attrs:
|
attrs:
|
||||||
|
|
||||||
let
|
let
|
||||||
stdenv = pkgs.nixDependencies.stdenv;
|
stdenv = pkgs.nixDependencies2.stdenv;
|
||||||
buildCanExecuteHost = stdenv.buildPlatform.canExecute stdenv.hostPlatform;
|
buildCanExecuteHost = stdenv.buildPlatform.canExecute stdenv.hostPlatform;
|
||||||
modular = devFlake.getSystem stdenv.buildPlatform.system;
|
modular = devFlake.getSystem stdenv.buildPlatform.system;
|
||||||
transformFlag =
|
transformFlag =
|
||||||
|
@ -79,26 +79,26 @@ pkgs.nixComponents.nix-util.overrideAttrs (
|
||||||
};
|
};
|
||||||
|
|
||||||
mesonFlags =
|
mesonFlags =
|
||||||
map (transformFlag "libutil") (ignoreCrossFile pkgs.nixComponents.nix-util.mesonFlags)
|
map (transformFlag "libutil") (ignoreCrossFile pkgs.nixComponents2.nix-util.mesonFlags)
|
||||||
++ map (transformFlag "libstore") (ignoreCrossFile pkgs.nixComponents.nix-store.mesonFlags)
|
++ map (transformFlag "libstore") (ignoreCrossFile pkgs.nixComponents2.nix-store.mesonFlags)
|
||||||
++ map (transformFlag "libfetchers") (ignoreCrossFile pkgs.nixComponents.nix-fetchers.mesonFlags)
|
++ map (transformFlag "libfetchers") (ignoreCrossFile pkgs.nixComponents2.nix-fetchers.mesonFlags)
|
||||||
++ lib.optionals havePerl (
|
++ lib.optionals havePerl (
|
||||||
map (transformFlag "perl") (ignoreCrossFile pkgs.nixComponents.nix-perl-bindings.mesonFlags)
|
map (transformFlag "perl") (ignoreCrossFile pkgs.nixComponents2.nix-perl-bindings.mesonFlags)
|
||||||
)
|
)
|
||||||
++ map (transformFlag "libexpr") (ignoreCrossFile pkgs.nixComponents.nix-expr.mesonFlags)
|
++ map (transformFlag "libexpr") (ignoreCrossFile pkgs.nixComponents2.nix-expr.mesonFlags)
|
||||||
++ map (transformFlag "libcmd") (ignoreCrossFile pkgs.nixComponents.nix-cmd.mesonFlags);
|
++ map (transformFlag "libcmd") (ignoreCrossFile pkgs.nixComponents2.nix-cmd.mesonFlags);
|
||||||
|
|
||||||
nativeBuildInputs =
|
nativeBuildInputs =
|
||||||
attrs.nativeBuildInputs or [ ]
|
attrs.nativeBuildInputs or [ ]
|
||||||
++ pkgs.nixComponents.nix-util.nativeBuildInputs
|
++ pkgs.nixComponents2.nix-util.nativeBuildInputs
|
||||||
++ pkgs.nixComponents.nix-store.nativeBuildInputs
|
++ pkgs.nixComponents2.nix-store.nativeBuildInputs
|
||||||
++ pkgs.nixComponents.nix-fetchers.nativeBuildInputs
|
++ pkgs.nixComponents2.nix-fetchers.nativeBuildInputs
|
||||||
++ pkgs.nixComponents.nix-expr.nativeBuildInputs
|
++ pkgs.nixComponents2.nix-expr.nativeBuildInputs
|
||||||
++ lib.optionals havePerl pkgs.nixComponents.nix-perl-bindings.nativeBuildInputs
|
++ lib.optionals havePerl pkgs.nixComponents2.nix-perl-bindings.nativeBuildInputs
|
||||||
++ lib.optionals buildCanExecuteHost pkgs.nixComponents.nix-manual.externalNativeBuildInputs
|
++ lib.optionals buildCanExecuteHost pkgs.nixComponents2.nix-manual.externalNativeBuildInputs
|
||||||
++ pkgs.nixComponents.nix-internal-api-docs.nativeBuildInputs
|
++ pkgs.nixComponents2.nix-internal-api-docs.nativeBuildInputs
|
||||||
++ pkgs.nixComponents.nix-external-api-docs.nativeBuildInputs
|
++ pkgs.nixComponents2.nix-external-api-docs.nativeBuildInputs
|
||||||
++ pkgs.nixComponents.nix-functional-tests.externalNativeBuildInputs
|
++ pkgs.nixComponents2.nix-functional-tests.externalNativeBuildInputs
|
||||||
++ lib.optional (
|
++ lib.optional (
|
||||||
!buildCanExecuteHost
|
!buildCanExecuteHost
|
||||||
# Hack around https://github.com/nixos/nixpkgs/commit/bf7ad8cfbfa102a90463433e2c5027573b462479
|
# Hack around https://github.com/nixos/nixpkgs/commit/bf7ad8cfbfa102a90463433e2c5027573b462479
|
||||||
|
@ -123,14 +123,14 @@ pkgs.nixComponents.nix-util.overrideAttrs (
|
||||||
|
|
||||||
buildInputs =
|
buildInputs =
|
||||||
attrs.buildInputs or [ ]
|
attrs.buildInputs or [ ]
|
||||||
++ pkgs.nixComponents.nix-util.buildInputs
|
++ pkgs.nixComponents2.nix-util.buildInputs
|
||||||
++ pkgs.nixComponents.nix-store.buildInputs
|
++ pkgs.nixComponents2.nix-store.buildInputs
|
||||||
++ pkgs.nixComponents.nix-store-tests.externalBuildInputs
|
++ pkgs.nixComponents2.nix-store-tests.externalBuildInputs
|
||||||
++ pkgs.nixComponents.nix-fetchers.buildInputs
|
++ pkgs.nixComponents2.nix-fetchers.buildInputs
|
||||||
++ pkgs.nixComponents.nix-expr.buildInputs
|
++ pkgs.nixComponents2.nix-expr.buildInputs
|
||||||
++ pkgs.nixComponents.nix-expr.externalPropagatedBuildInputs
|
++ pkgs.nixComponents2.nix-expr.externalPropagatedBuildInputs
|
||||||
++ pkgs.nixComponents.nix-cmd.buildInputs
|
++ pkgs.nixComponents2.nix-cmd.buildInputs
|
||||||
++ lib.optionals havePerl pkgs.nixComponents.nix-perl-bindings.externalBuildInputs
|
++ lib.optionals havePerl pkgs.nixComponents2.nix-perl-bindings.externalBuildInputs
|
||||||
++ lib.optional havePerl pkgs.perl;
|
++ lib.optional havePerl pkgs.perl;
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
@ -19,14 +19,14 @@ let
|
||||||
|
|
||||||
testNixVersions =
|
testNixVersions =
|
||||||
pkgs: daemon:
|
pkgs: daemon:
|
||||||
pkgs.nixComponents.nix-functional-tests.override {
|
pkgs.nixComponents2.nix-functional-tests.override {
|
||||||
pname = "nix-daemon-compat-tests";
|
pname = "nix-daemon-compat-tests";
|
||||||
version = "${pkgs.nix.version}-with-daemon-${daemon.version}";
|
version = "${pkgs.nix.version}-with-daemon-${daemon.version}";
|
||||||
|
|
||||||
test-daemon = daemon;
|
test-daemon = daemon;
|
||||||
};
|
};
|
||||||
|
|
||||||
# Technically we could just return `pkgs.nixComponents`, but for Hydra it's
|
# Technically we could just return `pkgs.nixComponents2`, but for Hydra it's
|
||||||
# convention to transpose it, and to transpose it efficiently, we need to
|
# convention to transpose it, and to transpose it efficiently, we need to
|
||||||
# enumerate them manually, so that we don't evaluate unnecessary package sets.
|
# enumerate them manually, so that we don't evaluate unnecessary package sets.
|
||||||
# See listingIsComplete below.
|
# See listingIsComplete below.
|
||||||
|
@ -85,7 +85,7 @@ in
|
||||||
} (_: null);
|
} (_: null);
|
||||||
actualPkgs = lib.concatMapAttrs (
|
actualPkgs = lib.concatMapAttrs (
|
||||||
k: v: if lib.strings.hasPrefix "nix-" k then { ${k} = null; } else { }
|
k: v: if lib.strings.hasPrefix "nix-" k then { ${k} = null; } else { }
|
||||||
) nixpkgsFor.${arbitrarySystem}.native.nixComponents;
|
) nixpkgsFor.${arbitrarySystem}.native.nixComponents2;
|
||||||
diff = lib.concatStringsSep "\n" (
|
diff = lib.concatStringsSep "\n" (
|
||||||
lib.concatLists (
|
lib.concatLists (
|
||||||
lib.mapAttrsToList (
|
lib.mapAttrsToList (
|
||||||
|
@ -111,7 +111,7 @@ in
|
||||||
|
|
||||||
# Binary package for various platforms.
|
# Binary package for various platforms.
|
||||||
build = forAllPackages (
|
build = forAllPackages (
|
||||||
pkgName: forAllSystems (system: nixpkgsFor.${system}.native.nixComponents.${pkgName})
|
pkgName: forAllSystems (system: nixpkgsFor.${system}.native.nixComponents2.${pkgName})
|
||||||
);
|
);
|
||||||
|
|
||||||
shellInputs = removeAttrs (forAllSystems (
|
shellInputs = removeAttrs (forAllSystems (
|
||||||
|
@ -119,7 +119,7 @@ in
|
||||||
)) [ "i686-linux" ];
|
)) [ "i686-linux" ];
|
||||||
|
|
||||||
# Perl bindings for various platforms.
|
# Perl bindings for various platforms.
|
||||||
perlBindings = forAllSystems (system: nixpkgsFor.${system}.native.nixComponents.nix-perl-bindings);
|
perlBindings = forAllSystems (system: nixpkgsFor.${system}.native.nixComponents2.nix-perl-bindings);
|
||||||
|
|
||||||
# Binary tarball for various platforms, containing a Nix store
|
# Binary tarball for various platforms, containing a Nix store
|
||||||
# with the closure of 'nix' package, and the second half of
|
# with the closure of 'nix' package, and the second half of
|
||||||
|
@ -145,13 +145,13 @@ in
|
||||||
# };
|
# };
|
||||||
|
|
||||||
# Nix's manual
|
# Nix's manual
|
||||||
manual = nixpkgsFor.x86_64-linux.native.nixComponents.nix-manual;
|
manual = nixpkgsFor.x86_64-linux.native.nixComponents2.nix-manual;
|
||||||
|
|
||||||
# API docs for Nix's unstable internal C++ interfaces.
|
# API docs for Nix's unstable internal C++ interfaces.
|
||||||
internal-api-docs = nixpkgsFor.x86_64-linux.native.nixComponents.nix-internal-api-docs;
|
internal-api-docs = nixpkgsFor.x86_64-linux.native.nixComponents2.nix-internal-api-docs;
|
||||||
|
|
||||||
# API docs for Nix's C bindings.
|
# API docs for Nix's C bindings.
|
||||||
external-api-docs = nixpkgsFor.x86_64-linux.native.nixComponents.nix-external-api-docs;
|
external-api-docs = nixpkgsFor.x86_64-linux.native.nixComponents2.nix-external-api-docs;
|
||||||
|
|
||||||
# System tests.
|
# System tests.
|
||||||
tests =
|
tests =
|
||||||
|
|
|
@ -40,7 +40,7 @@ void completeFlakeInputAttrPath(
|
||||||
std::string_view prefix)
|
std::string_view prefix)
|
||||||
{
|
{
|
||||||
for (auto & flakeRef : flakeRefs) {
|
for (auto & flakeRef : flakeRefs) {
|
||||||
auto flake = flake::getFlake(*evalState, flakeRef, true);
|
auto flake = flake::getFlake(*evalState, flakeRef, fetchers::UseRegistries::All);
|
||||||
for (auto & input : flake.inputs)
|
for (auto & input : flake.inputs)
|
||||||
if (hasPrefix(input.first, prefix))
|
if (hasPrefix(input.first, prefix))
|
||||||
completions.add(input.first);
|
completions.add(input.first);
|
||||||
|
|
|
@ -178,7 +178,7 @@ static void fetchTree(
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!state.settings.pureEval && !input.isDirect())
|
if (!state.settings.pureEval && !input.isDirect())
|
||||||
input = lookupInRegistries(state.store, input).first;
|
input = lookupInRegistries(state.store, input, fetchers::UseRegistries::Limited).first;
|
||||||
|
|
||||||
if (state.settings.pureEval && !input.isLocked()) {
|
if (state.settings.pureEval && !input.isLocked()) {
|
||||||
if (input.getNarHash())
|
if (input.getNarHash())
|
||||||
|
|
|
@ -65,7 +65,11 @@ void overrideRegistry(
|
||||||
const Input & to,
|
const Input & to,
|
||||||
const Attrs & extraAttrs);
|
const Attrs & extraAttrs);
|
||||||
|
|
||||||
using RegistryFilter = std::function<bool(Registry::RegistryType)>;
|
enum class UseRegistries : int {
|
||||||
|
No,
|
||||||
|
All,
|
||||||
|
Limited, // global and flag registry only
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rewrite a flakeref using the registries. If `filter` is set, only
|
* Rewrite a flakeref using the registries. If `filter` is set, only
|
||||||
|
@ -74,6 +78,6 @@ using RegistryFilter = std::function<bool(Registry::RegistryType)>;
|
||||||
std::pair<Input, Attrs> lookupInRegistries(
|
std::pair<Input, Attrs> lookupInRegistries(
|
||||||
ref<Store> store,
|
ref<Store> store,
|
||||||
const Input & input,
|
const Input & input,
|
||||||
const RegistryFilter & filter = {});
|
UseRegistries useRegistries);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,6 +14,8 @@ std::shared_ptr<Registry> Registry::read(
|
||||||
const Settings & settings,
|
const Settings & settings,
|
||||||
const Path & path, RegistryType type)
|
const Path & path, RegistryType type)
|
||||||
{
|
{
|
||||||
|
debug("reading registry '%s'", path);
|
||||||
|
|
||||||
auto registry = std::make_shared<Registry>(settings, type);
|
auto registry = std::make_shared<Registry>(settings, type);
|
||||||
|
|
||||||
if (!pathExists(path))
|
if (!pathExists(path))
|
||||||
|
@ -179,29 +181,36 @@ Registries getRegistries(const Settings & settings, ref<Store> store)
|
||||||
std::pair<Input, Attrs> lookupInRegistries(
|
std::pair<Input, Attrs> lookupInRegistries(
|
||||||
ref<Store> store,
|
ref<Store> store,
|
||||||
const Input & _input,
|
const Input & _input,
|
||||||
const RegistryFilter & filter)
|
UseRegistries useRegistries)
|
||||||
{
|
{
|
||||||
Attrs extraAttrs;
|
Attrs extraAttrs;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
Input input(_input);
|
Input input(_input);
|
||||||
|
|
||||||
|
if (useRegistries == UseRegistries::No)
|
||||||
|
return {input, extraAttrs};
|
||||||
|
|
||||||
restart:
|
restart:
|
||||||
|
|
||||||
n++;
|
n++;
|
||||||
if (n > 100) throw Error("cycle detected in flake registry for '%s'", input.to_string());
|
if (n > 100) throw Error("cycle detected in flake registry for '%s'", input.to_string());
|
||||||
|
|
||||||
for (auto & registry : getRegistries(*input.settings, store)) {
|
for (auto & registry : getRegistries(*input.settings, store)) {
|
||||||
if (filter && !filter(registry->type)) continue;
|
if (useRegistries == UseRegistries::Limited
|
||||||
|
&& !(registry->type == fetchers::Registry::Flag || registry->type == fetchers::Registry::Global))
|
||||||
|
continue;
|
||||||
// FIXME: O(n)
|
// FIXME: O(n)
|
||||||
for (auto & entry : registry->entries) {
|
for (auto & entry : registry->entries) {
|
||||||
if (entry.exact) {
|
if (entry.exact) {
|
||||||
if (entry.from == input) {
|
if (entry.from == input) {
|
||||||
|
debug("resolved flakeref '%s' against registry %d exactly", input.to_string(), registry->type);
|
||||||
input = entry.to;
|
input = entry.to;
|
||||||
extraAttrs = entry.extraAttrs;
|
extraAttrs = entry.extraAttrs;
|
||||||
goto restart;
|
goto restart;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (entry.from.contains(input)) {
|
if (entry.from.contains(input)) {
|
||||||
|
debug("resolved flakeref '%s' against registry %d", input.to_string(), registry->type);
|
||||||
input = entry.to.applyOverrides(
|
input = entry.to.applyOverrides(
|
||||||
!entry.from.getRef() && input.getRef() ? input.getRef() : std::optional<std::string>(),
|
!entry.from.getRef() && input.getRef() ? input.getRef() : std::optional<std::string>(),
|
||||||
!entry.from.getRev() && input.getRev() ? input.getRev() : std::optional<Hash>());
|
!entry.from.getRev() && input.getRev() ? input.getRev() : std::optional<Hash>());
|
||||||
|
|
|
@ -46,7 +46,7 @@ static std::optional<FetchedFlake> lookupInFlakeCache(
|
||||||
static std::tuple<ref<SourceAccessor>, FlakeRef, FlakeRef> fetchOrSubstituteTree(
|
static std::tuple<ref<SourceAccessor>, FlakeRef, FlakeRef> fetchOrSubstituteTree(
|
||||||
EvalState & state,
|
EvalState & state,
|
||||||
const FlakeRef & originalRef,
|
const FlakeRef & originalRef,
|
||||||
bool useRegistries,
|
fetchers::UseRegistries useRegistries,
|
||||||
FlakeCache & flakeCache)
|
FlakeCache & flakeCache)
|
||||||
{
|
{
|
||||||
auto fetched = lookupInFlakeCache(flakeCache, originalRef);
|
auto fetched = lookupInFlakeCache(flakeCache, originalRef);
|
||||||
|
@ -57,14 +57,8 @@ static std::tuple<ref<SourceAccessor>, FlakeRef, FlakeRef> fetchOrSubstituteTree
|
||||||
auto [accessor, lockedRef] = originalRef.lazyFetch(state.store);
|
auto [accessor, lockedRef] = originalRef.lazyFetch(state.store);
|
||||||
fetched.emplace(FetchedFlake{.lockedRef = lockedRef, .accessor = accessor});
|
fetched.emplace(FetchedFlake{.lockedRef = lockedRef, .accessor = accessor});
|
||||||
} else {
|
} else {
|
||||||
if (useRegistries) {
|
if (useRegistries != fetchers::UseRegistries::No) {
|
||||||
resolvedRef = originalRef.resolve(
|
resolvedRef = originalRef.resolve(state.store, useRegistries);
|
||||||
state.store,
|
|
||||||
[](fetchers::Registry::RegistryType type) {
|
|
||||||
/* Only use the global registry and CLI flags
|
|
||||||
to resolve indirect flakerefs. */
|
|
||||||
return type == fetchers::Registry::Flag || type == fetchers::Registry::Global;
|
|
||||||
});
|
|
||||||
fetched = lookupInFlakeCache(flakeCache, originalRef);
|
fetched = lookupInFlakeCache(flakeCache, originalRef);
|
||||||
if (!fetched) {
|
if (!fetched) {
|
||||||
auto [accessor, lockedRef] = resolvedRef.lazyFetch(state.store);
|
auto [accessor, lockedRef] = resolvedRef.lazyFetch(state.store);
|
||||||
|
@ -399,7 +393,7 @@ static FlakeRef applySelfAttrs(
|
||||||
static Flake getFlake(
|
static Flake getFlake(
|
||||||
EvalState & state,
|
EvalState & state,
|
||||||
const FlakeRef & originalRef,
|
const FlakeRef & originalRef,
|
||||||
bool useRegistries,
|
fetchers::UseRegistries useRegistries,
|
||||||
FlakeCache & flakeCache,
|
FlakeCache & flakeCache,
|
||||||
const InputAttrPath & lockRootAttrPath)
|
const InputAttrPath & lockRootAttrPath)
|
||||||
{
|
{
|
||||||
|
@ -418,7 +412,7 @@ static Flake getFlake(
|
||||||
// FIXME: need to remove attrs that are invalidated by the changed input attrs, such as 'narHash'.
|
// FIXME: need to remove attrs that are invalidated by the changed input attrs, such as 'narHash'.
|
||||||
newLockedRef.input.attrs.erase("narHash");
|
newLockedRef.input.attrs.erase("narHash");
|
||||||
auto [accessor2, resolvedRef2, lockedRef2] = fetchOrSubstituteTree(
|
auto [accessor2, resolvedRef2, lockedRef2] = fetchOrSubstituteTree(
|
||||||
state, newLockedRef, false, flakeCache);
|
state, newLockedRef, fetchers::UseRegistries::No, flakeCache);
|
||||||
accessor = accessor2;
|
accessor = accessor2;
|
||||||
lockedRef = lockedRef2;
|
lockedRef = lockedRef2;
|
||||||
}
|
}
|
||||||
|
@ -430,7 +424,7 @@ static Flake getFlake(
|
||||||
return readFlake(state, originalRef, resolvedRef, lockedRef, state.storePath(storePath), lockRootAttrPath);
|
return readFlake(state, originalRef, resolvedRef, lockedRef, state.storePath(storePath), lockRootAttrPath);
|
||||||
}
|
}
|
||||||
|
|
||||||
Flake getFlake(EvalState & state, const FlakeRef & originalRef, bool useRegistries)
|
Flake getFlake(EvalState & state, const FlakeRef & originalRef, fetchers::UseRegistries useRegistries)
|
||||||
{
|
{
|
||||||
FlakeCache flakeCache;
|
FlakeCache flakeCache;
|
||||||
return getFlake(state, originalRef, useRegistries, flakeCache, {});
|
return getFlake(state, originalRef, useRegistries, flakeCache, {});
|
||||||
|
@ -456,8 +450,15 @@ LockedFlake lockFlake(
|
||||||
FlakeCache flakeCache;
|
FlakeCache flakeCache;
|
||||||
|
|
||||||
auto useRegistries = lockFlags.useRegistries.value_or(settings.useRegistries);
|
auto useRegistries = lockFlags.useRegistries.value_or(settings.useRegistries);
|
||||||
|
auto useRegistriesTop = useRegistries ? fetchers::UseRegistries::All : fetchers::UseRegistries::No;
|
||||||
|
auto useRegistriesInputs = useRegistries ? fetchers::UseRegistries::Limited : fetchers::UseRegistries::No;
|
||||||
|
|
||||||
auto flake = getFlake(state, topRef, useRegistries, flakeCache, {});
|
auto flake = getFlake(
|
||||||
|
state,
|
||||||
|
topRef,
|
||||||
|
useRegistriesTop,
|
||||||
|
flakeCache,
|
||||||
|
{});
|
||||||
|
|
||||||
if (lockFlags.applyNixConfig) {
|
if (lockFlags.applyNixConfig) {
|
||||||
flake.config.apply(settings);
|
flake.config.apply(settings);
|
||||||
|
@ -632,7 +633,12 @@ LockedFlake lockFlake(
|
||||||
if (auto resolvedPath = resolveRelativePath()) {
|
if (auto resolvedPath = resolveRelativePath()) {
|
||||||
return readFlake(state, ref, ref, ref, *resolvedPath, inputAttrPath);
|
return readFlake(state, ref, ref, ref, *resolvedPath, inputAttrPath);
|
||||||
} else {
|
} else {
|
||||||
return getFlake(state, ref, useRegistries, flakeCache, inputAttrPath);
|
return getFlake(
|
||||||
|
state,
|
||||||
|
ref,
|
||||||
|
useRegistriesInputs,
|
||||||
|
flakeCache,
|
||||||
|
inputAttrPath);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -806,7 +812,7 @@ LockedFlake lockFlake(
|
||||||
return {*resolvedPath, *input.ref};
|
return {*resolvedPath, *input.ref};
|
||||||
} else {
|
} else {
|
||||||
auto [accessor, resolvedRef, lockedRef] = fetchOrSubstituteTree(
|
auto [accessor, resolvedRef, lockedRef] = fetchOrSubstituteTree(
|
||||||
state, *input.ref, useRegistries, flakeCache);
|
state, *input.ref, useRegistriesInputs, flakeCache);
|
||||||
|
|
||||||
warnRegistry(resolvedRef);
|
warnRegistry(resolvedRef);
|
||||||
|
|
||||||
|
@ -923,7 +929,10 @@ LockedFlake lockFlake(
|
||||||
repo, so we should re-read it. FIXME: we could
|
repo, so we should re-read it. FIXME: we could
|
||||||
also just clear the 'rev' field... */
|
also just clear the 'rev' field... */
|
||||||
auto prevLockedRef = flake.lockedRef;
|
auto prevLockedRef = flake.lockedRef;
|
||||||
flake = getFlake(state, topRef, useRegistries);
|
flake = getFlake(
|
||||||
|
state,
|
||||||
|
topRef,
|
||||||
|
useRegistriesTop);
|
||||||
|
|
||||||
if (lockFlags.commitLockFile &&
|
if (lockFlags.commitLockFile &&
|
||||||
flake.lockedRef.input.getRev() &&
|
flake.lockedRef.input.getRev() &&
|
|
@ -37,9 +37,9 @@ std::ostream & operator << (std::ostream & str, const FlakeRef & flakeRef)
|
||||||
|
|
||||||
FlakeRef FlakeRef::resolve(
|
FlakeRef FlakeRef::resolve(
|
||||||
ref<Store> store,
|
ref<Store> store,
|
||||||
const fetchers::RegistryFilter & filter) const
|
fetchers::UseRegistries useRegistries) const
|
||||||
{
|
{
|
||||||
auto [input2, extraAttrs] = lookupInRegistries(store, input, filter);
|
auto [input2, extraAttrs] = lookupInRegistries(store, input, useRegistries);
|
||||||
return FlakeRef(std::move(input2), fetchers::maybeGetStrAttr(extraAttrs, "dir").value_or(subdir));
|
return FlakeRef(std::move(input2), fetchers::maybeGetStrAttr(extraAttrs, "dir").value_or(subdir));
|
||||||
}
|
}
|
||||||
|
|
|
@ -115,7 +115,7 @@ struct Flake
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Flake getFlake(EvalState & state, const FlakeRef & flakeRef, bool useRegistries);
|
Flake getFlake(EvalState & state, const FlakeRef & flakeRef, fetchers::UseRegistries useRegistries);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fingerprint of a locked flake; used as a cache key.
|
* Fingerprint of a locked flake; used as a cache key.
|
||||||
|
|
|
@ -65,7 +65,7 @@ struct FlakeRef
|
||||||
|
|
||||||
FlakeRef resolve(
|
FlakeRef resolve(
|
||||||
ref<Store> store,
|
ref<Store> store,
|
||||||
const fetchers::RegistryFilter & filter = {}) const;
|
fetchers::UseRegistries useRegistries = fetchers::UseRegistries::All) const;
|
||||||
|
|
||||||
static FlakeRef fromAttrs(
|
static FlakeRef fromAttrs(
|
||||||
const fetchers::Settings & fetchSettings,
|
const fetchers::Settings & fetchSettings,
|
||||||
|
|
|
@ -39,13 +39,13 @@ foreach header : [
|
||||||
endforeach
|
endforeach
|
||||||
|
|
||||||
sources = files(
|
sources = files(
|
||||||
'flake/config.cc',
|
'config.cc',
|
||||||
'flake/flake.cc',
|
'flake.cc',
|
||||||
'flake/flakeref.cc',
|
'flakeref.cc',
|
||||||
'flake/lockfile.cc',
|
'lockfile.cc',
|
||||||
'flake/flake-primops.cc',
|
'flake-primops.cc',
|
||||||
'flake/settings.cc',
|
'settings.cc',
|
||||||
'flake/url-name.cc',
|
'url-name.cc',
|
||||||
)
|
)
|
||||||
|
|
||||||
subdir('include/nix/flake')
|
subdir('include/nix/flake')
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
#include <gmock/gmock.h>
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
#include "nix/util/file-content-address.hh"
|
#include "nix/util/file-content-address.hh"
|
||||||
|
@ -26,8 +27,11 @@ TEST(FileSerialisationMethod, testRoundTripPrintParse_2) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(FileSerialisationMethod, testParseFileSerialisationMethodOptException) {
|
TEST(FileSerialisationMethod, testParseFileSerialisationMethodOptException)
|
||||||
EXPECT_THROW(parseFileSerialisationMethod("narwhal"), UsageError);
|
{
|
||||||
|
EXPECT_THAT(
|
||||||
|
[]() { parseFileSerialisationMethod("narwhal"); },
|
||||||
|
testing::ThrowsMessage<UsageError>(testing::HasSubstr("narwhal")));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------------
|
/* ----------------------------------------------------------------------------
|
||||||
|
@ -54,8 +58,11 @@ TEST(FileIngestionMethod, testRoundTripPrintParse_2) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(FileIngestionMethod, testParseFileIngestionMethodOptException) {
|
TEST(FileIngestionMethod, testParseFileIngestionMethodOptException)
|
||||||
EXPECT_THROW(parseFileIngestionMethod("narwhal"), UsageError);
|
{
|
||||||
|
EXPECT_THAT(
|
||||||
|
[]() { parseFileIngestionMethod("narwhal"); },
|
||||||
|
testing::ThrowsMessage<UsageError>(testing::HasSubstr("narwhal")));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
#include "nix/util/util.hh"
|
#ifndef _WIN32
|
||||||
#include "nix/util/monitor-fd.hh"
|
|
||||||
|
|
||||||
#include <sys/file.h>
|
# include "nix/util/util.hh"
|
||||||
#include <gtest/gtest.h>
|
# include "nix/util/monitor-fd.hh"
|
||||||
|
|
||||||
|
# include <sys/file.h>
|
||||||
|
# include <gtest/gtest.h>
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
TEST(MonitorFdHup, shouldNotBlock)
|
TEST(MonitorFdHup, shouldNotBlock)
|
||||||
|
@ -16,3 +18,5 @@ TEST(MonitorFdHup, shouldNotBlock)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -22,7 +22,7 @@ FileSerialisationMethod parseFileSerialisationMethod(std::string_view input)
|
||||||
if (ret)
|
if (ret)
|
||||||
return *ret;
|
return *ret;
|
||||||
else
|
else
|
||||||
throw UsageError("Unknown file serialiation method '%s', expect `flat` or `nar`");
|
throw UsageError("Unknown file serialiation method '%s', expect `flat` or `nar`", input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ FileIngestionMethod parseFileIngestionMethod(std::string_view input)
|
||||||
if (ret)
|
if (ret)
|
||||||
return static_cast<FileIngestionMethod>(*ret);
|
return static_cast<FileIngestionMethod>(*ret);
|
||||||
else
|
else
|
||||||
throw UsageError("Unknown file ingestion method '%s', expect `flat`, `nar`, or `git`");
|
throw UsageError("Unknown file ingestion method '%s', expect `flat`, `nar`, or `git`", input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -111,7 +111,7 @@ Path canonPath(PathView path, bool resolveSymlinks)
|
||||||
(std::string & result, std::string_view & remaining) {
|
(std::string & result, std::string_view & remaining) {
|
||||||
if (resolveSymlinks && fs::is_symlink(result)) {
|
if (resolveSymlinks && fs::is_symlink(result)) {
|
||||||
if (++followCount >= maxFollow)
|
if (++followCount >= maxFollow)
|
||||||
throw Error("infinite symlink recursion in path '%0%'", remaining);
|
throw Error("infinite symlink recursion in path '%1%'", remaining);
|
||||||
remaining = (temp = concatStrings(readLink(result), remaining));
|
remaining = (temp = concatStrings(readLink(result), remaining));
|
||||||
if (isAbsolute(remaining)) {
|
if (isAbsolute(remaining)) {
|
||||||
/* restart for symlinks pointing to absolute path */
|
/* restart for symlinks pointing to absolute path */
|
||||||
|
|
|
@ -134,7 +134,7 @@ void parseTree(
|
||||||
RawMode rawMode = std::stoi(perms, 0, 8);
|
RawMode rawMode = std::stoi(perms, 0, 8);
|
||||||
auto modeOpt = decodeMode(rawMode);
|
auto modeOpt = decodeMode(rawMode);
|
||||||
if (!modeOpt)
|
if (!modeOpt)
|
||||||
throw Error("Unknown Git permission: %o", perms);
|
throw Error("Unknown Git permission: %o", rawMode);
|
||||||
auto mode = std::move(*modeOpt);
|
auto mode = std::move(*modeOpt);
|
||||||
|
|
||||||
std::string name = getStringUntil(source, '\0');
|
std::string name = getStringUntil(source, '\0');
|
||||||
|
|
|
@ -202,6 +202,7 @@ static int childEntry(void * arg)
|
||||||
|
|
||||||
pid_t startProcess(std::function<void()> fun, const ProcessOptions & options)
|
pid_t startProcess(std::function<void()> fun, const ProcessOptions & options)
|
||||||
{
|
{
|
||||||
|
auto newLogger = makeSimpleLogger();
|
||||||
ChildWrapperFunction wrapper = [&] {
|
ChildWrapperFunction wrapper = [&] {
|
||||||
if (!options.allowVfork) {
|
if (!options.allowVfork) {
|
||||||
/* Set a simple logger, while releasing (not destroying)
|
/* Set a simple logger, while releasing (not destroying)
|
||||||
|
@ -210,7 +211,7 @@ pid_t startProcess(std::function<void()> fun, const ProcessOptions & options)
|
||||||
~ProgressBar() tries to join a thread that doesn't
|
~ProgressBar() tries to join a thread that doesn't
|
||||||
exist. */
|
exist. */
|
||||||
logger.release();
|
logger.release();
|
||||||
logger = makeSimpleLogger();
|
logger = std::move(newLogger);
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
{
|
{
|
||||||
|
stdenv,
|
||||||
lib,
|
lib,
|
||||||
mkMesonExecutable,
|
mkMesonExecutable,
|
||||||
|
|
||||||
|
@ -94,6 +95,11 @@ mkMesonExecutable (finalAttrs: {
|
||||||
mesonFlags = [
|
mesonFlags = [
|
||||||
];
|
];
|
||||||
|
|
||||||
|
postInstall = lib.optionalString stdenv.hostPlatform.isStatic ''
|
||||||
|
mkdir -p $out/nix-support
|
||||||
|
echo "file binary-dist $out/bin/nix" >> $out/nix-support/hydra-build-products
|
||||||
|
'';
|
||||||
|
|
||||||
meta = {
|
meta = {
|
||||||
mainProgram = "nix";
|
mainProgram = "nix";
|
||||||
platforms = lib.platforms.unix ++ lib.platforms.windows;
|
platforms = lib.platforms.unix ++ lib.platforms.windows;
|
||||||
|
|
|
@ -223,7 +223,7 @@ mv "$registry.tmp" "$registry"
|
||||||
# Ensure that locking ignores the user registry.
|
# Ensure that locking ignores the user registry.
|
||||||
mkdir -p "$TEST_HOME/.config/nix"
|
mkdir -p "$TEST_HOME/.config/nix"
|
||||||
ln -sfn "$registry" "$TEST_HOME/.config/nix/registry.json"
|
ln -sfn "$registry" "$TEST_HOME/.config/nix/registry.json"
|
||||||
nix flake metadata flake1
|
nix flake metadata --flake-registry '' flake1
|
||||||
expectStderr 1 nix flake update --flake-registry '' --flake "$flake3Dir" | grepQuiet "cannot find flake 'flake:flake1' in the flake registries"
|
expectStderr 1 nix flake update --flake-registry '' --flake "$flake3Dir" | grepQuiet "cannot find flake 'flake:flake1' in the flake registries"
|
||||||
rm "$TEST_HOME/.config/nix/registry.json"
|
rm "$TEST_HOME/.config/nix/registry.json"
|
||||||
|
|
||||||
|
@ -266,6 +266,7 @@ nix registry add user-flake2 "git+file://$percentEncodedFlake2Dir"
|
||||||
[[ $(nix --flake-registry "" registry list | wc -l) == 2 ]]
|
[[ $(nix --flake-registry "" registry list | wc -l) == 2 ]]
|
||||||
nix --flake-registry "" registry list | grepQuietInverse '^global' # nothing in global registry
|
nix --flake-registry "" registry list | grepQuietInverse '^global' # nothing in global registry
|
||||||
nix --flake-registry "" registry list | grepQuiet '^user'
|
nix --flake-registry "" registry list | grepQuiet '^user'
|
||||||
|
nix flake metadata --flake-registry "" user-flake1 | grepQuiet 'URL:.*flake1.*'
|
||||||
nix registry remove user-flake1
|
nix registry remove user-flake1
|
||||||
nix registry remove user-flake2
|
nix registry remove user-flake2
|
||||||
[[ $(nix registry list | wc -l) == 4 ]]
|
[[ $(nix registry list | wc -l) == 4 ]]
|
||||||
|
|
|
@ -31,7 +31,7 @@ let
|
||||||
nixpkgs.pkgs = nixpkgsFor.${system}.native;
|
nixpkgs.pkgs = nixpkgsFor.${system}.native;
|
||||||
nix.checkAllErrors = false;
|
nix.checkAllErrors = false;
|
||||||
# TODO: decide which packaging stage to use. `nix-cli` is efficient, but not the same as the user-facing `everything.nix` package (`default`). Perhaps a good compromise is `everything.nix` + `noTests` defined above?
|
# TODO: decide which packaging stage to use. `nix-cli` is efficient, but not the same as the user-facing `everything.nix` package (`default`). Perhaps a good compromise is `everything.nix` + `noTests` defined above?
|
||||||
nix.package = nixpkgsFor.${system}.native.nixComponents.nix-cli;
|
nix.package = nixpkgsFor.${system}.native.nixComponents2.nix-cli;
|
||||||
|
|
||||||
# Evaluate VMs faster
|
# Evaluate VMs faster
|
||||||
documentation.enable = false;
|
documentation.enable = false;
|
||||||
|
|
|
@ -49,11 +49,11 @@ in
|
||||||
|
|
||||||
cd ~
|
cd ~
|
||||||
|
|
||||||
cp -r ${pkgs.nixComponents.nix-functional-tests.src} nix
|
cp -r ${pkgs.nixComponents2.nix-functional-tests.src} nix
|
||||||
chmod -R +w nix
|
chmod -R +w nix
|
||||||
|
|
||||||
chmod u+w nix/.version
|
chmod u+w nix/.version
|
||||||
echo ${pkgs.nixComponents.version} > nix/.version
|
echo ${pkgs.nixComponents2.version} > nix/.version
|
||||||
|
|
||||||
export isTestOnNixOS=1
|
export isTestOnNixOS=1
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue