Skip to content

Commit

Permalink
nix run: Allow program name to be set in meta.mainProgram
Browse files Browse the repository at this point in the history
This is useful when the program name doesn't match the package name
(e.g. ripgrep vs rg).

Fixes NixOS#4498.
  • Loading branch information
edolstra committed Feb 17, 2021
1 parent 13897af commit 7bd9898
Showing 1 changed file with 16 additions and 3 deletions.
19 changes: 16 additions & 3 deletions src/nix/app.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,16 @@ App Installable::toApp(EvalState & state)

auto type = cursor->getAttr("type")->getString();

auto checkProgram = [&](const Path & program)
{
if (!state.store->isInStore(program))
throw Error("app program '%s' is not in the Nix store", program);
};

if (type == "app") {
auto [program, context] = cursor->getAttr("program")->getStringWithContext();

if (!state.store->isInStore(program))
throw Error("app program '%s' is not in the Nix store", program);
checkProgram(program);

std::vector<StorePathWithOutputs> context2;
for (auto & [path, name] : context)
Expand All @@ -33,9 +38,17 @@ App Installable::toApp(EvalState & state)
auto outPath = cursor->getAttr(state.sOutPath)->getString();
auto outputName = cursor->getAttr(state.sOutputName)->getString();
auto name = cursor->getAttr(state.sName)->getString();
auto aMeta = cursor->maybeGetAttr("meta");
auto aMainProgram = aMeta ? aMeta->maybeGetAttr("mainProgram") : nullptr;
auto mainProgram =
aMainProgram
? aMainProgram->getString()
: DrvName(name).name;
auto program = outPath + "/bin/" + mainProgram;
checkProgram(program);
return App {
.context = { { drvPath, {outputName} } },
.program = outPath + "/bin/" + DrvName(name).name,
.program = program,
};
}

Expand Down

0 comments on commit 7bd9898

Please sign in to comment.