mirror of
https://github.com/NixOS/nix
synced 2025-06-28 13:41:15 +02:00
Add command flake clone
This commit is contained in:
parent
939bee06cd
commit
b42ba08fc8
5 changed files with 77 additions and 6 deletions
|
@ -146,17 +146,19 @@ std::shared_ptr<FlakeRegistry> getFlagRegistry()
|
|||
return std::make_shared<FlakeRegistry>();
|
||||
}
|
||||
|
||||
const std::vector<std::shared_ptr<FlakeRegistry>> EvalState::getFlakeRegistries()
|
||||
// This always returns a vector with globalReg, userReg, localReg, flakeReg.
|
||||
// If one of them doesn't exist, the registry is left empty but does exist.
|
||||
const Registries EvalState::getFlakeRegistries()
|
||||
{
|
||||
std::vector<std::shared_ptr<FlakeRegistry>> registries;
|
||||
registries.push_back(getGlobalRegistry());
|
||||
Registries registries;
|
||||
registries.push_back(getGlobalRegistry()); // TODO (Nick): Doesn't this break immutability?
|
||||
registries.push_back(getUserRegistry());
|
||||
registries.push_back(std::make_shared<FlakeRegistry>()); // local
|
||||
registries.push_back(getFlagRegistry());
|
||||
return registries;
|
||||
}
|
||||
|
||||
static FlakeRef lookupFlake(EvalState & state, const FlakeRef & flakeRef,
|
||||
const std::vector<std::shared_ptr<FlakeRegistry>> & registries,
|
||||
static FlakeRef lookupFlake(EvalState & state, const FlakeRef & flakeRef, const Registries & registries,
|
||||
std::vector<FlakeRef> pastSearches = {})
|
||||
{
|
||||
if (registries.empty() && !flakeRef.isDirect())
|
||||
|
@ -462,4 +464,35 @@ 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)
|
||||
{
|
||||
FlakeRef flakeRef(flakeUri);
|
||||
flakeRef = lookupFlake(state, flakeRef, registries);
|
||||
|
||||
std::string uri;
|
||||
|
||||
Strings args = {"clone"};
|
||||
|
||||
if (auto refData = std::get_if<FlakeRef::IsGitHub>(&flakeRef.data)) {
|
||||
uri = "git@github.com:" + refData->owner + "/" + refData->repo + ".git";
|
||||
args.push_back(uri);
|
||||
if (flakeRef.ref) {
|
||||
args.push_back("--branch");
|
||||
args.push_back(*flakeRef.ref);
|
||||
}
|
||||
} else if (auto refData = std::get_if<FlakeRef::IsGit>(&flakeRef.data)) {
|
||||
args.push_back(refData->uri);
|
||||
if (flakeRef.ref) {
|
||||
args.push_back("--branch");
|
||||
args.push_back(*flakeRef.ref);
|
||||
}
|
||||
}
|
||||
|
||||
if (endDirectory != "")
|
||||
args.push_back(endDirectory);
|
||||
|
||||
runProgram("git", true, args);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -27,6 +27,8 @@ struct LockFile
|
|||
std::map<FlakeId, FlakeRef> nonFlakeEntries;
|
||||
};
|
||||
|
||||
typedef std::vector<std::shared_ptr<FlakeRegistry>> Registries;
|
||||
|
||||
Path getUserRegistryPath();
|
||||
|
||||
enum RegistryAccess { DisallowRegistry, AllowRegistry, AllowRegistryAtTop };
|
||||
|
@ -86,4 +88,5 @@ Dependencies resolveFlake(EvalState &, const FlakeRef &, RegistryAccess registry
|
|||
|
||||
void updateLockFile(EvalState &, const Path & path);
|
||||
|
||||
void gitCloneFlake (std::string flakeUri, EvalState &, Registries, Path);
|
||||
}
|
||||
|
|
|
@ -67,6 +67,7 @@ namespace nix {
|
|||
https://example.org/my/repo.git
|
||||
https://example.org/my/repo.git?ref=release-1.2.3
|
||||
https://example.org/my/repo.git?rev=e72daba8250068216d79d2aeef40d4d95aff6666
|
||||
git://github.com/edolstra/dwarffs.git\?ref=flake\&rev=2efca4bc9da70fb001b26c3dc858c6397d3c4817
|
||||
|
||||
* /path.git(\?attr(&attr)*)?
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue