Add "nix add-to-store" command
This commit is contained in:
parent
1c58ad2ffa
commit
970366266b
|
@ -81,15 +81,16 @@ public:
|
|||
FlagMaker & handler(std::function<void(Strings)> handler) { flag->handler = handler; return *this; };
|
||||
FlagMaker & category(const std::string & s) { flag->category = s; return *this; };
|
||||
|
||||
FlagMaker & dest(std::string * dest) {
|
||||
assert(flag->arity == 1);
|
||||
template<class T>
|
||||
FlagMaker & dest(T * dest) {
|
||||
flag->arity = 1;
|
||||
flag->handler = [=](Strings ss) { *dest = ss.front(); };
|
||||
return *this;
|
||||
};
|
||||
|
||||
template<class T>
|
||||
FlagMaker & set(T * dest, const T & val) {
|
||||
assert(flag->arity == 0);
|
||||
flag->arity = 1;
|
||||
flag->handler = [=](Strings ss) { *dest = val; };
|
||||
return *this;
|
||||
};
|
||||
|
|
61
src/nix/add-to-store.cc
Normal file
61
src/nix/add-to-store.cc
Normal 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>());
|
|
@ -15,7 +15,6 @@ struct CmdBuild : MixDryRun, InstallablesCommand
|
|||
.longName("out-link")
|
||||
.shortName('o')
|
||||
.description("path of the symlink to the build result")
|
||||
.arity(1)
|
||||
.labels({"path"})
|
||||
.dest(&outLink);
|
||||
|
||||
|
|
|
@ -233,6 +233,8 @@ struct CmdWhyDepends : SourceExprCommand
|
|||
}
|
||||
};
|
||||
|
||||
// FIXME: should use scanForReferences().
|
||||
|
||||
visitPath(node.path);
|
||||
|
||||
for (auto & ref : refs) {
|
||||
|
|
Loading…
Reference in a new issue