Put flake-related stuff in its own namespace

This commit is contained in:
Eelco Dolstra 2019-05-29 15:31:07 +02:00
parent c356d034f3
commit 6e4a8c47f4
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
6 changed files with 62 additions and 42 deletions

View file

@ -17,7 +17,10 @@ namespace nix {
class Store;
class EvalState;
enum RepairFlag : bool;
namespace flake {
struct FlakeRegistry;
}
typedef void (* PrimOpFun) (EvalState & state, const Pos & pos, Value * * args, Value & v);
@ -323,12 +326,12 @@ private:
public:
const std::vector<std::shared_ptr<FlakeRegistry>> getFlakeRegistries();
const std::vector<std::shared_ptr<flake::FlakeRegistry>> getFlakeRegistries();
std::shared_ptr<FlakeRegistry> getGlobalFlakeRegistry();
std::shared_ptr<flake::FlakeRegistry> getGlobalFlakeRegistry();
private:
std::shared_ptr<FlakeRegistry> _globalFlakeRegistry;
std::shared_ptr<flake::FlakeRegistry> _globalFlakeRegistry;
std::once_flag _globalFlakeRegistryInit;
};

View file

@ -14,6 +14,10 @@
namespace nix {
using namespace flake;
namespace flake {
/* Read a registry. */
std::shared_ptr<FlakeRegistry> readRegistry(const Path & path)
{
@ -133,24 +137,6 @@ void writeLockFile(const LockFile & lockFile, const Path & path)
writeFile(path, json.dump(4) + "\n"); // '4' = indentation in json file
}
std::shared_ptr<FlakeRegistry> EvalState::getGlobalFlakeRegistry()
{
std::call_once(_globalFlakeRegistryInit, [&]() {
auto path = evalSettings.flakeRegistry;
if (!hasPrefix(path, "/")) {
CachedDownloadRequest request(evalSettings.flakeRegistry);
request.name = "flake-registry.json";
request.gcRoot = true;
path = getDownloader()->downloadCached(store, request).path;
}
_globalFlakeRegistry = readRegistry(path);
});
return _globalFlakeRegistry;
}
Path getUserRegistryPath()
{
return getHome() + "/.config/nix/registry.json";
@ -170,17 +156,6 @@ std::shared_ptr<FlakeRegistry> getFlagRegistry(RegistryOverrides registryOverrid
return flagRegistry;
}
// This always returns a vector with flakeReg, userReg, globalReg.
// If one of them doesn't exist, the registry is left empty but does exist.
const Registries EvalState::getFlakeRegistries()
{
Registries registries;
registries.push_back(getFlagRegistry(registryOverrides));
registries.push_back(getUserRegistry());
registries.push_back(getGlobalFlakeRegistry());
return registries;
}
static FlakeRef lookupFlake(EvalState & state, const FlakeRef & flakeRef, const Registries & registries,
std::vector<FlakeRef> pastSearches = {});
@ -637,3 +612,34 @@ void gitCloneFlake(FlakeRef flakeRef, EvalState & state, Registries registries,
}
}
std::shared_ptr<flake::FlakeRegistry> EvalState::getGlobalFlakeRegistry()
{
std::call_once(_globalFlakeRegistryInit, [&]() {
auto path = evalSettings.flakeRegistry;
if (!hasPrefix(path, "/")) {
CachedDownloadRequest request(evalSettings.flakeRegistry);
request.name = "flake-registry.json";
request.gcRoot = true;
path = getDownloader()->downloadCached(store, request).path;
}
_globalFlakeRegistry = readRegistry(path);
});
return _globalFlakeRegistry;
}
// This always returns a vector with flakeReg, userReg, globalReg.
// If one of them doesn't exist, the registry is left empty but does exist.
const Registries EvalState::getFlakeRegistries()
{
Registries registries;
registries.push_back(getFlagRegistry(registryOverrides));
registries.push_back(getUserRegistry());
registries.push_back(getGlobalFlakeRegistry());
return registries;
}
}

View file

@ -5,13 +5,15 @@
namespace nix {
struct Value;
class EvalState;
namespace flake {
static const size_t FLAG_REGISTRY = 0;
static const size_t USER_REGISTRY = 1;
static const size_t GLOBAL_REGISTRY = 2;
struct Value;
class EvalState;
struct FlakeRegistry
{
std::map<FlakeRef, FlakeRef> entries;
@ -143,3 +145,5 @@ void updateLockFile(EvalState &, const FlakeRef & flakeRef, bool recreateLockFil
void gitCloneFlake(FlakeRef flakeRef, EvalState &, Registries, const Path & destDir);
}
}

View file

@ -12,7 +12,10 @@ struct Value;
class Bindings;
class EvalState;
class Store;
namespace flake {
enum HandleLockFile : unsigned int;
}
/* A command that require a Nix store. */
struct StoreCommand : virtual Command
@ -71,7 +74,7 @@ struct MixFlakeOptions : virtual Args
MixFlakeOptions();
HandleLockFile getLockFileMode();
flake::HandleLockFile getLockFileMode();
};
struct SourceExprCommand : virtual Args, EvalCommand, MixFlakeOptions

View file

@ -10,6 +10,7 @@
#include <iomanip>
using namespace nix;
using namespace nix::flake;
class FlakeCommand : virtual Args, public EvalCommand, public MixFlakeOptions
{
@ -33,12 +34,12 @@ public:
Flake getFlake()
{
auto evalState = getEvalState();
return nix::getFlake(*evalState, getFlakeRef(), useRegistries);
return flake::getFlake(*evalState, getFlakeRef(), useRegistries);
}
ResolvedFlake resolveFlake()
{
return nix::resolveFlake(*getEvalState(), getFlakeRef(), getLockFileMode());
return flake::resolveFlake(*getEvalState(), getFlakeRef(), getLockFileMode());
}
};

View file

@ -32,8 +32,9 @@ MixFlakeOptions::MixFlakeOptions()
.set(&useRegistries, false);
}
HandleLockFile MixFlakeOptions::getLockFileMode()
flake::HandleLockFile MixFlakeOptions::getLockFileMode()
{
using namespace flake;
return
useRegistries
? recreateLockFile
@ -163,18 +164,20 @@ struct InstallableAttrPath : InstallableValue
}
};
void makeFlakeClosureGCRoot(Store & store, const FlakeRef & origFlakeRef, const ResolvedFlake & resFlake)
void makeFlakeClosureGCRoot(Store & store,
const FlakeRef & origFlakeRef,
const flake::ResolvedFlake & resFlake)
{
if (std::get_if<FlakeRef::IsPath>(&origFlakeRef.data)) return;
/* Get the store paths of all non-local flakes. */
PathSet closure;
std::queue<std::reference_wrapper<const ResolvedFlake>> queue;
std::queue<std::reference_wrapper<const flake::ResolvedFlake>> queue;
queue.push(resFlake);
while (!queue.empty()) {
const ResolvedFlake & flake = queue.front();
const flake::ResolvedFlake & flake = queue.front();
queue.pop();
if (!std::get_if<FlakeRef::IsPath>(&flake.flake.sourceInfo.resolvedRef.data))
closure.insert(flake.flake.sourceInfo.storePath);