about summary refs log tree commit diff
path: root/third_party/nix/src/nix-copy-closure/nix-copy-closure.cc
#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);