Skip to content

Commit

Permalink
New "indexed" installable syntax: <drvPath>!<outputName>
Browse files Browse the repository at this point in the history
Being conservative and only doing a single output name for now.
  • Loading branch information
Ericson2314 committed Mar 6, 2021
1 parent 5e305ee commit 8d36d96
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 3 deletions.
42 changes: 41 additions & 1 deletion src/libcmd/installables.cc
Original file line number Diff line number Diff line change
Expand Up @@ -342,6 +342,31 @@ struct InstallableStorePath : Installable
}
};

struct InstallableIndexedStorePath : Installable
{
ref<Store> store;
BuildableReqFromDrv req;

InstallableIndexedStorePath(ref<Store> store, BuildableReqFromDrv && req)
: store(store), req(std::move(req))
{ }

std::string what() override
{
return req.to_string(*store);
}

Buildables toBuildables() override
{
std::map<std::string, std::optional<StorePath>> outputs;
for (auto & output : req.outputs)
outputs.insert_or_assign(output, std::nullopt);
return {
Buildable { BuildableFromDrv { req.drvPath, std::move(outputs) } }
};
}
};

Buildables InstallableValue::toBuildables()
{
Buildables res;
Expand Down Expand Up @@ -631,7 +656,22 @@ std::vector<std::shared_ptr<Installable>> SourceExprCommand::parseInstallables(
ex = std::current_exception();
}

if (s.find('/') != std::string::npos) {
auto found = s.rfind('!');
if (found != std::string::npos) {
try {
result.push_back(std::make_shared<InstallableIndexedStorePath>(
store,
BuildableReqFromDrv::parse(*store, s)));
continue;
} catch (BadStorePath &) {
} catch (...) {
if (!ex)
ex = std::current_exception();
}
}

found = s.find('/');
if (found != std::string::npos) {
try {
result.push_back(std::make_shared<InstallableStorePath>(store, store->followLinksToStorePath(s)));
continue;
Expand Down
10 changes: 10 additions & 0 deletions src/nix/nix.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,16 @@ the Nix store. Here are the recognised types of installables:
If you want to operate on the store derivation itself, pass the
`--derivation` flag.

* **Indexed store derivations**: `/nix/store/p7gp6lxdg32h4ka1q398wd9r2zkbbz2v-hello-2.10.drv!out`

Store derivations can be indexed with a specific output name. This
allows finer control versus just specifying a derivation (without
`--derivation`) and getting all the outputs.

This is especially useful for (currently unstable) floating content
addressed derivations, which do not have precomputed output paths that
can be used instead.

* **Nix attributes**: `--file /path/to/nixpkgs hello`

When the `-f` / `--file` *path* option is given, installables are
Expand Down
17 changes: 17 additions & 0 deletions tests/build-explicit-output.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
source common.sh

drv=$(nix eval -f multiple-outputs.nix --raw a.drvPath)
if nix build "$drv!not-an-output" --json; then
fail "'not-an-output' should fail to build"
fi

nix build "$drv!first" --json | jq --exit-status '
(.[0] |
(.drvPath | match(".*multiple-outputs-a.drv")) and
(.outputs |
.first and
(has("second") | not)))
'
# TODO use
# (.first | match(".*multiple-outputs-a-first")) and
# once we make it put the result paths in the buildables.
5 changes: 3 additions & 2 deletions tests/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ expectedJSONRegex='\[\{"drvPath":".*multiple-outputs-a.drv","outputs":\{"first":
nix build -f multiple-outputs.nix --json a.all b.all | jq --exit-status '
(.[0] |
(.drvPath | match(".*multiple-outputs-a.drv")) and
(.outputs.first | match(".*multiple-outputs-a-first")) and
(.outputs.second | match(".*multiple-outputs-a-second")))
(.outputs |
(.first | match(".*multiple-outputs-a-first")) and
(.second | match(".*multiple-outputs-a-second"))))
and (.[1] |
(.drvPath | match(".*multiple-outputs-b.drv")) and
(.outputs.out | match(".*multiple-outputs-b")))
Expand Down
1 change: 1 addition & 0 deletions tests/local.mk
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ nix_tests = \
describe-stores.sh \
flakes.sh \
build.sh \
build-explicit-output.sh \
compute-levels.sh \
ca/build.sh \
ca/nix-copy.sh
Expand Down

0 comments on commit 8d36d96

Please sign in to comment.