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 "legacy.hh"
#include "shared.hh"
#include "store-api.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;
        });

    initPlugins();

    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);