Skip to content

Commit

Permalink
Add "nix add-to-store" command
Browse files Browse the repository at this point in the history
  • Loading branch information
edolstra committed Sep 14, 2017
1 parent 1c58ad2 commit 9703662
Show file tree
Hide file tree
Showing 4 changed files with 67 additions and 4 deletions.
7 changes: 4 additions & 3 deletions src/libutil/args.hh
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -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;
}; };
Expand Down
61 changes: 61 additions & 0 deletions src/nix/add-to-store.cc
Original file line number Original file line Diff line number Diff line change
@@ -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>());
1 change: 0 additions & 1 deletion src/nix/build.cc
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -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);


Expand Down
2 changes: 2 additions & 0 deletions src/nix/why-depends.cc
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 9703662

Please sign in to comment.