Add "nix add-to-store" command
This commit is contained in:
parent
1c58ad2ffa
commit
970366266b
4 changed files with 67 additions and 4 deletions
|
@ -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
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")
|
.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);
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue