2016-08-10 17:44:39 +03:00
|
|
|
|
#include "shared.hh"
|
|
|
|
|
#include "store-api.hh"
|
|
|
|
|
|
|
|
|
|
using namespace nix;
|
|
|
|
|
|
|
|
|
|
int main(int argc, char ** argv)
|
|
|
|
|
{
|
|
|
|
|
return handleExceptions(argv[0], [&]() {
|
|
|
|
|
initNix();
|
2017-02-07 21:55:47 +02:00
|
|
|
|
|
2016-08-10 17:44:39 +03:00
|
|
|
|
auto gzip = false;
|
|
|
|
|
auto toMode = true;
|
|
|
|
|
auto includeOutputs = false;
|
|
|
|
|
auto dryRun = false;
|
2017-06-28 19:11:01 +03:00
|
|
|
|
auto useSubstitutes = NoSubstitute;
|
2017-02-07 21:55:47 +02:00
|
|
|
|
std::string sshHost;
|
|
|
|
|
PathSet storePaths;
|
|
|
|
|
|
2016-08-10 17:44:39 +03:00
|
|
|
|
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")
|
2017-06-28 19:11:01 +03:00
|
|
|
|
useSubstitutes = Substitute;
|
2016-08-10 17:44:39 +03:00
|
|
|
|
else if (sshHost.empty())
|
|
|
|
|
sshHost = *arg;
|
|
|
|
|
else
|
|
|
|
|
storePaths.insert(*arg);
|
|
|
|
|
return true;
|
|
|
|
|
});
|
2017-02-07 21:55:47 +02:00
|
|
|
|
|
2016-08-10 17:44:39 +03:00
|
|
|
|
if (sshHost.empty())
|
|
|
|
|
throw UsageError("no host name specified");
|
|
|
|
|
|
2017-03-16 15:19:32 +02:00
|
|
|
|
auto remoteUri = "ssh://" + sshHost + (gzip ? "?compress=true" : "");
|
2016-08-10 17:44:39 +03:00
|
|
|
|
auto to = toMode ? openStore(remoteUri) : openStore();
|
|
|
|
|
auto from = toMode ? openStore() : openStore(remoteUri);
|
2017-02-07 21:55:47 +02:00
|
|
|
|
|
2017-03-16 11:45:45 +02:00
|
|
|
|
PathSet storePaths2;
|
|
|
|
|
for (auto & path : storePaths)
|
|
|
|
|
storePaths2.insert(from->followLinksToStorePath(path));
|
|
|
|
|
|
2017-02-07 21:55:47 +02:00
|
|
|
|
PathSet closure;
|
2017-03-16 11:45:45 +02:00
|
|
|
|
from->computeFSClosure(storePaths2, closure, false, includeOutputs);
|
2017-02-07 21:55:47 +02:00
|
|
|
|
|
2017-06-28 19:11:01 +03:00
|
|
|
|
copyPaths(from, to, closure, NoRepair, NoCheckSigs, useSubstitutes);
|
2016-08-10 17:44:39 +03:00
|
|
|
|
});
|
|
|
|
|
}
|