aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2020-01-22 20:00:58 +0100
committerEelco Dolstra <edolstra@gmail.com>2020-01-22 20:00:58 +0100
commitb5c9dbc84f31a1e9d1e5b6642b1716daa13c18ed (patch)
tree9c064107d9c9a81bb7f4ce821e55b522a2ca048d
parent90d55ed275220962f7239f4869905b0237dd24fb (diff)
Fix --override-flake and add a test
-rw-r--r--src/libexpr/common-eval-args.cc6
-rw-r--r--src/libexpr/common-eval-args.hh2
-rw-r--r--src/libstore/fetchers/registry.cc26
-rw-r--r--src/libstore/fetchers/registry.hh8
-rw-r--r--tests/flakes.sh7
5 files changed, 34 insertions, 15 deletions
diff --git a/src/libexpr/common-eval-args.cc b/src/libexpr/common-eval-args.cc
index 7c0d268bd..e3135b472 100644
--- a/src/libexpr/common-eval-args.cc
+++ b/src/libexpr/common-eval-args.cc
@@ -3,6 +3,8 @@
#include "download.hh"
#include "util.hh"
#include "eval.hh"
+#include "fetchers/registry.hh"
+#include "flake/flakeref.hh"
namespace nix {
@@ -40,7 +42,9 @@ MixEvalArgs::MixEvalArgs()
.description("override a flake registry value")
.arity(2)
.handler([&](std::vector<std::string> ss) {
- registryOverrides.push_back(std::make_pair(ss[0], ss[1]));
+ fetchers::overrideRegistry(
+ parseFlakeRef(ss[0], absPath(".")).input,
+ parseFlakeRef(ss[1], absPath(".")).input);
});
}
diff --git a/src/libexpr/common-eval-args.hh b/src/libexpr/common-eval-args.hh
index 54fb731de..be7fda783 100644
--- a/src/libexpr/common-eval-args.hh
+++ b/src/libexpr/common-eval-args.hh
@@ -16,8 +16,6 @@ struct MixEvalArgs : virtual Args
Strings searchPath;
- std::vector<std::pair<std::string, std::string>> registryOverrides;
-
private:
std::map<std::string, std::string> autoArgs;
diff --git a/src/libstore/fetchers/registry.cc b/src/libstore/fetchers/registry.cc
index dd74e16c1..9c74f118d 100644
--- a/src/libstore/fetchers/registry.cc
+++ b/src/libstore/fetchers/registry.cc
@@ -11,11 +11,10 @@ namespace nix::fetchers {
std::shared_ptr<Registry> Registry::read(
const Path & path, RegistryType type)
{
- auto registry = std::make_shared<Registry>();
- registry->type = type;
+ auto registry = std::make_shared<Registry>(type);
if (!pathExists(path))
- return std::make_shared<Registry>();
+ return std::make_shared<Registry>(type);
auto json = nlohmann::json::parse(readFile(path));
@@ -74,17 +73,20 @@ std::shared_ptr<Registry> getUserRegistry()
return Registry::read(getUserRegistryPath(), Registry::User);
}
-#if 0
-std::shared_ptr<Registry> getFlagRegistry(RegistryOverrides registryOverrides)
+static std::shared_ptr<Registry> flagRegistry =
+ std::make_shared<Registry>(Registry::Flag);
+
+std::shared_ptr<Registry> getFlagRegistry()
{
- auto flagRegistry = std::make_shared<Registry>();
- for (auto const & x : registryOverrides)
- flagRegistry->entries.insert_or_assign(
- parseFlakeRef2(x.first),
- parseFlakeRef2(x.second));
return flagRegistry;
}
-#endif
+
+void overrideRegistry(
+ const std::shared_ptr<const Input> & from,
+ const std::shared_ptr<const Input> & to)
+{
+ flagRegistry->add(from, to);
+}
static std::shared_ptr<Registry> getGlobalRegistry(ref<Store> store)
{
@@ -107,7 +109,7 @@ static std::shared_ptr<Registry> getGlobalRegistry(ref<Store> store)
Registries getRegistries(ref<Store> store)
{
Registries registries;
- //registries.push_back(getFlagRegistry(registryOverrides));
+ registries.push_back(getFlagRegistry());
registries.push_back(getUserRegistry());
registries.push_back(getGlobalRegistry(store));
return registries;
diff --git a/src/libstore/fetchers/registry.hh b/src/libstore/fetchers/registry.hh
index 1757ce323..e29f78486 100644
--- a/src/libstore/fetchers/registry.hh
+++ b/src/libstore/fetchers/registry.hh
@@ -20,6 +20,10 @@ struct Registry
std::vector<std::pair<std::shared_ptr<const Input>, std::shared_ptr<const Input>>> entries;
+ Registry(RegistryType type)
+ : type(type)
+ { }
+
static std::shared_ptr<Registry> read(
const Path & path, RegistryType type);
@@ -40,6 +44,10 @@ Path getUserRegistryPath();
Registries getRegistries(ref<Store> store);
+void overrideRegistry(
+ const std::shared_ptr<const Input> & from,
+ const std::shared_ptr<const Input> & to);
+
std::shared_ptr<const Input> lookupInRegistries(
ref<Store> store,
std::shared_ptr<const Input> input);
diff --git a/tests/flakes.sh b/tests/flakes.sh
index 334f750fb..337645fb4 100644
--- a/tests/flakes.sh
+++ b/tests/flakes.sh
@@ -293,6 +293,13 @@ nix build -o $TEST_ROOT/result --flake-registry $registry flake3#xyzzy flake3#fn
# Test doing multiple `lookupFlake`s
nix build -o $TEST_ROOT/result --flake-registry $registry flake4#xyzzy
+# Test 'nix flake update' and --override-flake.
+nix flake update --flake-registry $registry $flake3Dir
+[[ -z $(git -C $flake3Dir diff master) ]]
+
+nix flake update --flake-registry $registry $flake3Dir --recreate-lock-file --override-flake flake2 nixpkgs
+[[ ! -z $(git -C $flake3Dir diff master) ]]
+
# Make branch "removeXyzzy" where flake3 doesn't have xyzzy anymore
git -C $flake3Dir checkout -b removeXyzzy
rm $flake3Dir/flake.nix