about summary refs log blame commit diff
path: root/third_party/nix/src/nix-copy-closure/nix-copy-closure.cc
blob: 2ec6a021368bdbc7eb1019cd6abe45de039d74d4 (plain) (tree)
1
2
3
4
5
6
7
8
                         
 
                    




                       








                                         
 






                                                                               



                                                                           







                                               
                                                                   








                                                               
           
 
                  
 


                                                 
 


                                                                         
 


                                                             
 

                                                                        
 
                                                                        
 

             
 

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