Treat plain derivation paths in context as normal paths.

Previously, plain derivation paths in the string context (e.g. those
that arose from builtins.storePath on a drv file, not those that arose
from accessing .drvPath of a derivation) were treated somewhat like
derivaiton paths derived from .drvPath, except their dependencies
weren't recursively added to the input set. With this change, such
plain derivation paths are simply treated as paths and added to the
source inputs set accordingly, simplifying context handling code and
removing the inconsistency. If drvPath-like behavior is desired, the
.drv file can be imported and then .drvPath can be accessed.

This is a backwards-incompatibility, but storePath is never used on
drv files within nixpkgs and almost never used elsewhere.
This commit is contained in:
Shea Levy 2019-01-13 10:33:15 -05:00
parent 4ae6e84901
commit 087be7281a
No known key found for this signature in database
GPG key ID: 5C0BD6957D86FE27
2 changed files with 6 additions and 17 deletions

3
.gitignore vendored
View file

@ -81,6 +81,9 @@ perl/Makefile.config
/tests/common.sh /tests/common.sh
/tests/dummy /tests/dummy
/tests/result* /tests/result*
/tests/restricted-innocent
/tests/shell
/tests/shell.drv
# /tests/lang/ # /tests/lang/
/tests/lang/*.out /tests/lang/*.out

View file

@ -687,21 +687,12 @@ static void prim_derivationStrict(EvalState & state, const Pos & pos, Value * *
} }
} }
/* See prim_unsafeDiscardOutputDependency. */
else if (path.at(0) == '~')
drv.inputSrcs.insert(string(path, 1));
/* Handle derivation outputs of the form !<name>!<path>. */ /* Handle derivation outputs of the form !<name>!<path>. */
else if (path.at(0) == '!') { else if (path.at(0) == '!') {
std::pair<string, string> ctx = decodeContext(path); std::pair<string, string> ctx = decodeContext(path);
drv.inputDrvs[ctx.first].insert(ctx.second); drv.inputDrvs[ctx.first].insert(ctx.second);
} }
/* Handle derivation contexts returned by
builtins.storePath. */
else if (isDerivation(path))
drv.inputDrvs[path] = state.store->queryDerivationOutputNames(path);
/* Otherwise it's a source file. */ /* Otherwise it's a source file. */
else else
drv.inputSrcs.insert(path); drv.inputSrcs.insert(path);
@ -1004,13 +995,8 @@ static void prim_toFile(EvalState & state, const Pos & pos, Value * * args, Valu
PathSet refs; PathSet refs;
for (auto path : context) { for (auto path : context) {
if (path.at(0) == '=') path = string(path, 1); if (path.at(0) != '/')
if (isDerivation(path)) { throw EvalError(format("in 'toFile': the file '%1%' cannot refer to derivation outputs, at %2%") % name % pos);
/* See prim_unsafeDiscardOutputDependency. */
if (path.at(0) != '~')
throw EvalError(format("in 'toFile': the file '%1%' cannot refer to derivation outputs, at %2%") % name % pos);
path = string(path, 1);
}
refs.insert(path); refs.insert(path);
} }
@ -1823,7 +1809,7 @@ static void prim_unsafeDiscardOutputDependency(EvalState & state, const Pos & po
PathSet context2; PathSet context2;
for (auto & p : context) for (auto & p : context)
context2.insert(p.at(0) == '=' ? "~" + string(p, 1) : p); context2.insert(p.at(0) == '=' ? string(p, 1) : p);
mkString(v, s, context2); mkString(v, s, context2);
} }