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


                                


                    








                                         
 

                                                                               
                                 
                                            
                                           
                                             
                                                                               



                                                                           
                        
                                        
                           
                                      
                          
                                                   
                                  
                                                 
                                                                   
                                           
                          
                                                                   
                                        
                                       
                           
                  
                                    
           
                      
           
 


                                                 
 


                                                                         
 
                        
                                   
                                                             
     
 

                                                                        
 
                                                                        
 

             
 

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