From 970366266b8df712f5f9cedb45af183ef5a8357f Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 14 Sep 2017 13:22:32 +0200 Subject: [PATCH] Add "nix add-to-store" command --- src/libutil/args.hh | 7 +++-- src/nix/add-to-store.cc | 61 +++++++++++++++++++++++++++++++++++++++++ src/nix/build.cc | 1 - src/nix/why-depends.cc | 2 ++ 4 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 src/nix/add-to-store.cc diff --git a/src/libutil/args.hh b/src/libutil/args.hh index 7f8ea647c..401bebbab 100644 --- a/src/libutil/args.hh +++ b/src/libutil/args.hh @@ -81,15 +81,16 @@ public: FlagMaker & handler(std::function 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 + FlagMaker & dest(T * dest) { + flag->arity = 1; flag->handler = [=](Strings ss) { *dest = ss.front(); }; return *this; }; template FlagMaker & set(T * dest, const T & val) { - assert(flag->arity == 0); + flag->arity = 1; flag->handler = [=](Strings ss) { *dest = val; }; return *this; }; diff --git a/src/nix/add-to-store.cc b/src/nix/add-to-store.cc new file mode 100644 index 000000000..d0003790d --- /dev/null +++ b/src/nix/add-to-store.cc @@ -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 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) 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()); diff --git a/src/nix/build.cc b/src/nix/build.cc index 915a06649..f7c99f12d 100644 --- a/src/nix/build.cc +++ b/src/nix/build.cc @@ -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); diff --git a/src/nix/why-depends.cc b/src/nix/why-depends.cc index f31469cbc..a90d07ed2 100644 --- a/src/nix/why-depends.cc +++ b/src/nix/why-depends.cc @@ -233,6 +233,8 @@ struct CmdWhyDepends : SourceExprCommand } }; + // FIXME: should use scanForReferences(). + visitPath(node.path); for (auto & ref : refs) {