diff options
Diffstat (limited to 'third_party/nix/src/nix-copy-closure')
-rw-r--r-- | third_party/nix/src/nix-copy-closure/nix-copy-closure.cc | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/third_party/nix/src/nix-copy-closure/nix-copy-closure.cc b/third_party/nix/src/nix-copy-closure/nix-copy-closure.cc new file mode 100644 index 000000000000..3dbe29f2240f --- /dev/null +++ b/third_party/nix/src/nix-copy-closure/nix-copy-closure.cc @@ -0,0 +1,73 @@ +#include <glog/logging.h> + +#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); |