aboutsummaryrefslogtreecommitdiff
path: root/src/legacy/nix-copy-closure.cc
diff options
context:
space:
mode:
authorjade <lix@jade.fyi>2024-10-09 20:37:58 +0000
committerGerrit Code Review <gerrit@localhost>2024-10-09 20:37:58 +0000
commit9865ebaaa618d82a7b7fdccc636cbaa7dfa42427 (patch)
treeb79db30394a892e7e6b7e0a2f966081b4a366590 /src/legacy/nix-copy-closure.cc
parent7f7a38f2788ba7fa46cf38127f525700cf63e153 (diff)
parentb63d4a0c622fa556695e7666b9b3bde920904920 (diff)
Merge "Remove static initializers for `RegisterLegacyCommand`" into main
Diffstat (limited to 'src/legacy/nix-copy-closure.cc')
-rw-r--r--src/legacy/nix-copy-closure.cc68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/legacy/nix-copy-closure.cc b/src/legacy/nix-copy-closure.cc
new file mode 100644
index 000000000..1e61e3c48
--- /dev/null
+++ b/src/legacy/nix-copy-closure.cc
@@ -0,0 +1,68 @@
+#include "shared.hh"
+#include "store-api.hh"
+#include "legacy.hh"
+#include "nix-copy-closure.hh"
+
+namespace nix {
+
+static int main_nix_copy_closure(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")
+ warn("'%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 = 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);
+
+ RealisedPath::Set storePaths2;
+ for (auto & path : storePaths)
+ storePaths2.insert(from->followLinksToStorePath(path));
+
+ copyClosure(*from, *to, storePaths2, NoRepair, NoCheckSigs, useSubstitutes);
+
+ return 0;
+ }
+}
+
+void registerNixCopyClosure() {
+ LegacyCommands::add("nix-copy-closure", main_nix_copy_closure);
+}
+
+}