aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2019-05-16 22:48:16 +0200
committerEelco Dolstra <edolstra@gmail.com>2019-05-22 14:03:28 +0200
commit2468672e305faf672c3901c1a9605ca1cb175908 (patch)
tree1928acc56dd3e6123f004598f7f62625f5f7545a /src
parent8e5c86befcf33786131645f2855de87dd574badc (diff)
Improve FlakeCommand
It now handles commonality like calling getFlake() and resolving relative local flake refs. Fixes #2822.
Diffstat (limited to 'src')
-rw-r--r--src/libexpr/primops/flake.cc11
-rw-r--r--src/libexpr/primops/flake.hh5
-rw-r--r--src/nix/command.hh37
-rw-r--r--src/nix/flake.cc69
-rw-r--r--src/nix/installables.cc2
5 files changed, 65 insertions, 59 deletions
diff --git a/src/libexpr/primops/flake.cc b/src/libexpr/primops/flake.cc
index 6998536ec..c08c30c9c 100644
--- a/src/libexpr/primops/flake.cc
+++ b/src/libexpr/primops/flake.cc
@@ -482,9 +482,8 @@ ResolvedFlake resolveFlake(EvalState & state, const FlakeRef & topRef, HandleLoc
return resFlake;
}
-void updateLockFile(EvalState & state, const FlakeUri & flakeUri, bool recreateLockFile)
+void updateLockFile(EvalState & state, const FlakeRef & flakeRef, bool recreateLockFile)
{
- FlakeRef flakeRef(flakeUri);
resolveFlake(state, flakeRef, recreateLockFile ? RecreateLockFile : UpdateLockFile);
}
@@ -551,10 +550,8 @@ static void prim_getFlake(EvalState & state, const Pos & pos, Value * * args, Va
static RegisterPrimOp r2("getFlake", 1, prim_getFlake);
-void gitCloneFlake (std::string flakeUri, EvalState & state, Registries registries,
- Path endDirectory)
+void gitCloneFlake(FlakeRef flakeRef, EvalState & state, Registries registries, const Path & destDir)
{
- FlakeRef flakeRef(flakeUri);
flakeRef = lookupFlake(state, flakeRef, registries);
std::string uri;
@@ -576,8 +573,8 @@ void gitCloneFlake (std::string flakeUri, EvalState & state, Registries registri
}
}
- if (endDirectory != "")
- args.push_back(endDirectory);
+ if (destDir != "")
+ args.push_back(destDir);
runProgram("git", true, args);
}
diff --git a/src/libexpr/primops/flake.hh b/src/libexpr/primops/flake.hh
index e43b860ee..677cdb7b7 100644
--- a/src/libexpr/primops/flake.hh
+++ b/src/libexpr/primops/flake.hh
@@ -133,7 +133,8 @@ struct ResolvedFlake
ResolvedFlake resolveFlake(EvalState &, const FlakeRef &, HandleLockFile);
-void updateLockFile(EvalState &, const FlakeUri &, bool recreateLockFile);
+void updateLockFile(EvalState &, const FlakeRef & flakeRef, bool recreateLockFile);
+
+void gitCloneFlake(FlakeRef flakeRef, EvalState &, Registries, const Path & destDir);
-void gitCloneFlake (std::string flakeUri, EvalState &, Registries, Path);
}
diff --git a/src/nix/command.hh b/src/nix/command.hh
index 30d869b19..423ac5baa 100644
--- a/src/nix/command.hh
+++ b/src/nix/command.hh
@@ -35,26 +35,6 @@ struct Buildable
typedef std::vector<Buildable> Buildables;
-struct GitRepoCommand : virtual Args
-{
- std::string gitPath = absPath(".");
-
- GitRepoCommand ()
- {
- expectArg("git-path", &gitPath, true);
- }
-};
-
-struct FlakeCommand : virtual Args
-{
- std::string flakeUri;
-
- FlakeCommand()
- {
- expectArg("flake-uri", &flakeUri);
- }
-};
-
struct Installable
{
virtual std::string what() = 0;
@@ -72,7 +52,16 @@ struct Installable
}
};
-struct SourceExprCommand : virtual Args, StoreCommand, MixEvalArgs
+struct EvalCommand : virtual StoreCommand, MixEvalArgs
+{
+ ref<EvalState> getEvalState();
+
+private:
+
+ std::shared_ptr<EvalState> evalState;
+};
+
+struct SourceExprCommand : virtual Args, EvalCommand
{
std::optional<Path> file;
@@ -84,8 +73,6 @@ struct SourceExprCommand : virtual Args, StoreCommand, MixEvalArgs
bool noRegistries = false;
- ref<EvalState> getEvalState();
-
std::vector<std::shared_ptr<Installable>> parseInstallables(
ref<Store> store, std::vector<std::string> ss);
@@ -96,10 +83,6 @@ struct SourceExprCommand : virtual Args, StoreCommand, MixEvalArgs
{
return {"defaultPackage"};
}
-
-private:
-
- std::shared_ptr<EvalState> evalState;
};
enum RealiseMode { Build, NoBuild, DryRun };
diff --git a/src/nix/flake.cc b/src/nix/flake.cc
index bfb3178ad..bc2f1cb5b 100644
--- a/src/nix/flake.cc
+++ b/src/nix/flake.cc
@@ -10,7 +10,33 @@
using namespace nix;
-struct CmdFlakeList : StoreCommand, MixEvalArgs
+class FlakeCommand : virtual Args, public EvalCommand
+{
+ std::string flakeUri = ".";
+
+public:
+
+ FlakeCommand()
+ {
+ expectArg("flake-uri", &flakeUri, true);
+ }
+
+ FlakeRef getFlakeRef()
+ {
+ if (flakeUri.find('/') != std::string::npos || flakeUri == ".")
+ return FlakeRef(flakeUri, true);
+ else
+ return FlakeRef(flakeUri);
+ }
+
+ Flake getFlake()
+ {
+ auto evalState = getEvalState();
+ return nix::getFlake(*evalState, getFlakeRef(), true);
+ }
+};
+
+struct CmdFlakeList : EvalCommand
{
std::string name() override
{
@@ -24,9 +50,7 @@ struct CmdFlakeList : StoreCommand, MixEvalArgs
void run(nix::ref<nix::Store> store) override
{
- auto evalState = std::make_shared<EvalState>(searchPath, store);
-
- auto registries = evalState->getFlakeRegistries();
+ auto registries = getEvalState()->getFlakeRegistries();
stopProgressBar();
@@ -60,7 +84,7 @@ void printFlakeInfo(Flake & flake, bool json) {
std::cout << "URI: " << flake.resolvedRef.to_string() << "\n";
std::cout << "Description: " << flake.description << "\n";
if (flake.resolvedRef.ref)
- std::cout << "Branch: " << *flake.resolvedRef.ref;
+ std::cout << "Branch: " << *flake.resolvedRef.ref << "\n";
if (flake.resolvedRef.rev)
std::cout << "Revision: " << flake.resolvedRef.rev->to_string(Base16, false) << "\n";
if (flake.revCount)
@@ -95,7 +119,7 @@ void printNonFlakeInfo(NonFlake & nonFlake, bool json) {
}
}
-struct CmdFlakeDeps : FlakeCommand, MixJSON, StoreCommand, MixEvalArgs
+struct CmdFlakeDeps : FlakeCommand, MixJSON
{
std::string name() override
{
@@ -109,12 +133,10 @@ struct CmdFlakeDeps : FlakeCommand, MixJSON, StoreCommand, MixEvalArgs
void run(nix::ref<nix::Store> store) override
{
- auto evalState = std::make_shared<EvalState>(searchPath, store);
+ auto evalState = getEvalState();
evalState->addRegistryOverrides(registryOverrides);
- FlakeRef flakeRef(flakeUri);
-
- ResolvedFlake resFlake = resolveFlake(*evalState, flakeRef, UpdateLockFile);
+ ResolvedFlake resFlake = resolveFlake(*evalState, getFlakeRef(), UpdateLockFile);
std::queue<ResolvedFlake> todo;
todo.push(resFlake);
@@ -132,7 +154,7 @@ struct CmdFlakeDeps : FlakeCommand, MixJSON, StoreCommand, MixEvalArgs
}
};
-struct CmdFlakeUpdate : StoreCommand, FlakeCommand, MixEvalArgs
+struct CmdFlakeUpdate : FlakeCommand
{
std::string name() override
{
@@ -146,14 +168,18 @@ struct CmdFlakeUpdate : StoreCommand, FlakeCommand, MixEvalArgs
void run(nix::ref<nix::Store> store) override
{
- auto evalState = std::make_shared<EvalState>(searchPath, store);
+ auto evalState = getEvalState();
+
+ auto flakeRef = getFlakeRef();
- bool recreateLockFile = true;
- updateLockFile(*evalState, flakeUri, recreateLockFile);
+ if (std::get_if<FlakeRef::IsPath>(&flakeRef.data))
+ updateLockFile(*evalState, flakeRef, true);
+ else
+ throw Error("cannot update lockfile of flake '%s'", flakeRef);
}
};
-struct CmdFlakeInfo : FlakeCommand, MixJSON, MixEvalArgs, StoreCommand
+struct CmdFlakeInfo : FlakeCommand, MixJSON
{
std::string name() override
{
@@ -169,8 +195,7 @@ struct CmdFlakeInfo : FlakeCommand, MixJSON, MixEvalArgs, StoreCommand
void run(nix::ref<nix::Store> store) override
{
- auto evalState = std::make_shared<EvalState>(searchPath, store);
- Flake flake = getFlake(*evalState, FlakeRef(flakeUri), true);
+ auto flake = getFlake();
printFlakeInfo(flake, json);
}
};
@@ -235,7 +260,7 @@ struct CmdFlakeRemove : virtual Args, MixEvalArgs, Command
}
};
-struct CmdFlakePin : virtual Args, StoreCommand, MixEvalArgs
+struct CmdFlakePin : virtual Args, EvalCommand
{
FlakeUri alias;
@@ -256,7 +281,7 @@ struct CmdFlakePin : virtual Args, StoreCommand, MixEvalArgs
void run(nix::ref<nix::Store> store) override
{
- auto evalState = std::make_shared<EvalState>(searchPath, store);
+ auto evalState = getEvalState();
Path userRegistryPath = getUserRegistryPath();
FlakeRegistry userRegistry = *readRegistry(userRegistryPath);
@@ -307,7 +332,7 @@ struct CmdFlakeInit : virtual Args, Command
}
};
-struct CmdFlakeClone : StoreCommand, FlakeCommand, MixEvalArgs
+struct CmdFlakeClone : FlakeCommand
{
Path endDirectory = "";
@@ -328,10 +353,10 @@ struct CmdFlakeClone : StoreCommand, FlakeCommand, MixEvalArgs
void run(nix::ref<nix::Store> store) override
{
- auto evalState = std::make_shared<EvalState>(searchPath, store);
+ auto evalState = getEvalState();
Registries registries = evalState->getFlakeRegistries();
- gitCloneFlake(flakeUri, *evalState, registries, endDirectory);
+ gitCloneFlake(getFlakeRef().to_string(), *evalState, registries, endDirectory);
}
};
diff --git a/src/nix/installables.cc b/src/nix/installables.cc
index a2a55d949..85ef2cb56 100644
--- a/src/nix/installables.cc
+++ b/src/nix/installables.cc
@@ -38,7 +38,7 @@ SourceExprCommand::SourceExprCommand()
.set(&noRegistries, true);
}
-ref<EvalState> SourceExprCommand::getEvalState()
+ref<EvalState> EvalCommand::getEvalState()
{
if (!evalState)
evalState = std::make_shared<EvalState>(searchPath, getStore());