mirror of
https://github.com/NixOS/nix
synced 2025-06-28 09:31:16 +02:00
nix-copy-closure: Implement in C++.
Tests fail currently because the database is not given proper hashes in the VM
This commit is contained in:
parent
8af062f372
commit
bfa41eb671
11 changed files with 100 additions and 115 deletions
60
src/nix-copy-closure/nix-copy-closure.cc
Executable file
60
src/nix-copy-closure/nix-copy-closure.cc
Executable file
|
@ -0,0 +1,60 @@
|
|||
#include "shared.hh"
|
||||
#include "store-api.hh"
|
||||
|
||||
using namespace nix;
|
||||
|
||||
int main(int argc, char ** argv)
|
||||
{
|
||||
return handleExceptions(argv[0], [&]() {
|
||||
initNix();
|
||||
auto gzip = false;
|
||||
auto toMode = true;
|
||||
auto includeOutputs = false;
|
||||
auto dryRun = false;
|
||||
auto useSubstitutes = false;
|
||||
auto sshHost = string{};
|
||||
auto storePaths = PathSet{};
|
||||
parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) {
|
||||
if (*arg == "--help")
|
||||
showManPage("nix-copy-closure");
|
||||
else if (*arg == "--version")
|
||||
printVersion("nix-copy-closure");
|
||||
else if (*arg == "--gzip" || *arg == "--bzip2" || *arg == "--xz") {
|
||||
if (*arg != "--gzip")
|
||||
printMsg(lvlError, format("Warning: ‘%1%’ is not implemented, falling back to gzip") % *arg);
|
||||
gzip = true;
|
||||
} else if (*arg == "--from")
|
||||
toMode = false;
|
||||
else if (*arg == "--to")
|
||||
toMode = true;
|
||||
else if (*arg == "--include-outputs")
|
||||
includeOutputs = true;
|
||||
else if (*arg == "--show-progress")
|
||||
printMsg(lvlError, "Warning: ‘--show-progress’ is not implemented");
|
||||
else if (*arg == "--dry-run")
|
||||
dryRun = true;
|
||||
else if (*arg == "--use-substitutes" || *arg == "-s")
|
||||
useSubstitutes = true;
|
||||
else if (sshHost.empty())
|
||||
sshHost = *arg;
|
||||
else
|
||||
storePaths.insert(*arg);
|
||||
return true;
|
||||
});
|
||||
if (sshHost.empty())
|
||||
throw UsageError("no host name specified");
|
||||
|
||||
auto remoteUri = "ssh://" + sshHost + (gzip ? "?compress=true" : "");
|
||||
auto to = toMode ? openStore(remoteUri) : openStore();
|
||||
auto from = toMode ? openStore() : openStore(remoteUri);
|
||||
if (includeOutputs) {
|
||||
auto newPaths = PathSet{};
|
||||
for (const auto & p : storePaths) {
|
||||
auto outputs = from->queryDerivationOutputs(p);
|
||||
newPaths.insert(outputs.begin(), outputs.end());
|
||||
}
|
||||
storePaths.insert(newPaths.begin(), newPaths.end());
|
||||
}
|
||||
copyPaths(from, to, Paths(storePaths.begin(), storePaths.end()), useSubstitutes);
|
||||
});
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue