#include #include "libmain/shared.hh" #include "libstore/store-api.hh" #include "nix/legacy.hh" using namespace nix; static int _main(int argc, char** argv) { { auto gzip = false; auto toMode = true; auto includeOutputs = false; auto dryRun = false; auto useSubstitutes = NoSubstitute; std::string sshHost; PathSet storePaths; 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") { LOG(WARNING) << "'" << *arg << "' is not implemented, falling back to gzip"; } 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") { LOG(WARNING) << "'--show-progress' is not implemented"; } else if (*arg == "--dry-run") { dryRun = true; } else if (*arg == "--use-substitutes" || *arg == "-s") { useSubstitutes = Substitute; } 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); PathSet storePaths2; for (auto& path : storePaths) { storePaths2.insert(from->followLinksToStorePath(path)); } PathSet closure; from->computeFSClosure(storePaths2, closure, false, includeOutputs); copyPaths(from, to, closure, NoRepair, NoCheckSigs, useSubstitutes); return 0; } } static RegisterLegacyCommand s1("nix-copy-closure", _main);