Add "nix add-to-store" command

This commit is contained in:
Eelco Dolstra 2017-09-14 13:22:32 +02:00
parent 1c58ad2ffa
commit 970366266b
No known key found for this signature in database
GPG key ID: 8170B4726D7198DE
4 changed files with 67 additions and 4 deletions

View file

@ -81,15 +81,16 @@ public:
FlagMaker & handler(std::function<void(Strings)> handler) { flag->handler = handler; return *this; }; FlagMaker & handler(std::function<void(Strings)> handler) { flag->handler = handler; return *this; };
FlagMaker & category(const std::string & s) { flag->category = s; return *this; }; FlagMaker & category(const std::string & s) { flag->category = s; return *this; };
FlagMaker & dest(std::string * dest) { template<class T>
assert(flag->arity == 1); FlagMaker & dest(T * dest) {
flag->arity = 1;
flag->handler = [=](Strings ss) { *dest = ss.front(); }; flag->handler = [=](Strings ss) { *dest = ss.front(); };
return *this; return *this;
}; };
template<class T> template<class T>
FlagMaker & set(T * dest, const T & val) { FlagMaker & set(T * dest, const T & val) {
assert(flag->arity == 0); flag->arity = 1;
flag->handler = [=](Strings ss) { *dest = val; }; flag->handler = [=](Strings ss) { *dest = val; };
return *this; return *this;
}; };

61
src/nix/add-to-store.cc Normal file
View file

@ -0,0 +1,61 @@
#include "command.hh"
#include "common-args.hh"
#include "store-api.hh"
#include "archive.hh"
using namespace nix;
struct CmdAddToStore : MixDryRun, StoreCommand
{
Path path;
std::experimental::optional<std::string> namePart;
CmdAddToStore()
{
expectArg("path", &path);
mkFlag()
.longName("name")
.shortName('n')
.description("name component of the store path")
.labels({"name"})
.dest(&namePart);
}
std::string name() override
{
return "add-to-store";
}
std::string description() override
{
return "add a path to the Nix store";
}
Examples examples() override
{
return {
};
}
void run(ref<Store> store) override
{
if (!namePart) namePart = baseNameOf(path);
StringSink sink;
dumpPath(path, sink);
ValidPathInfo info;
info.narHash = hashString(htSHA256, *sink.s);
info.narSize = sink.s->size();
info.path = store->makeFixedOutputPath(true, info.narHash, *namePart);
info.ca = makeFixedOutputCA(true, info.narHash);
if (!dryRun)
store->addToStore(info, sink.s);
std::cout << fmt("%s\n", info.path);
}
};
static RegisterCommand r1(make_ref<CmdAddToStore>());

View file

@ -15,7 +15,6 @@ struct CmdBuild : MixDryRun, InstallablesCommand
.longName("out-link") .longName("out-link")
.shortName('o') .shortName('o')
.description("path of the symlink to the build result") .description("path of the symlink to the build result")
.arity(1)
.labels({"path"}) .labels({"path"})
.dest(&outLink); .dest(&outLink);

View file

@ -233,6 +233,8 @@ struct CmdWhyDepends : SourceExprCommand
} }
}; };
// FIXME: should use scanForReferences().
visitPath(node.path); visitPath(node.path);
for (auto & ref : refs) { for (auto & ref : refs) {