about summary refs log tree commit diff
path: root/third_party/nix/src/nix-copy-closure/nix-copy-closure.cc
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/nix/src/nix-copy-closure/nix-copy-closure.cc')
-rw-r--r--third_party/nix/src/nix-copy-closure/nix-copy-closure.cc73
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);