1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-07-04 15:31:47 +02:00

* Re-enable support for substitutes in the normaliser.

* A better substitute mechanism.

  Instead of generating a store expression for each store path for
  which we have a substitute, we can have a single store expression
  that builds a generic program that is invoked to build the desired
  store path, which is passed as an argument.

  This means that operations like `nix-pull' only produce O(1) files
  instead of O(N) files in the store when registering N substitutes.
  (It consumes O(N) database storage, of course, but that's not a
  performance problem).

* Added a test for the substitute mechanism.
  
* `nix-store --substitute' reads the substitutes from standard input,
  instead of from the command line.  This prevents us from running
  into the kernel's limit on command line length.
This commit is contained in:
Eelco Dolstra 2004-06-20 19:17:54 +00:00
parent bafb2357d1
commit 112ee89501
10 changed files with 444 additions and 108 deletions

View file

@ -18,12 +18,6 @@ void printHelp()
}
static Path checkPath(const Path & arg)
{
return arg; /* !!! check that arg is in the store */
}
/* Realise paths from the given store expressions. */
static void opRealise(Strings opFlags, Strings opArgs)
{
@ -32,7 +26,7 @@ static void opRealise(Strings opFlags, Strings opArgs)
for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); i++)
{
Path nfPath = normaliseStoreExpr(checkPath(*i));
Path nfPath = normaliseStoreExpr(*i);
realiseClosure(nfPath);
cout << format("%1%\n") % (string) nfPath;
}
@ -46,7 +40,7 @@ static void opDelete(Strings opFlags, Strings opArgs)
for (Strings::iterator it = opArgs.begin();
it != opArgs.end(); it++)
deleteFromStore(checkPath(*it));
deleteFromStore(*it);
}
@ -101,7 +95,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
i != opArgs.end(); i++)
{
StringSet paths = storeExprRoots(
maybeNormalise(checkPath(*i), normalise, realise));
maybeNormalise(*i, normalise, realise));
for (StringSet::iterator j = paths.begin();
j != paths.end(); j++)
cout << format("%s\n") % *j;
@ -115,7 +109,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
i != opArgs.end(); i++)
{
StringSet paths2 = storeExprRequisites(
maybeNormalise(checkPath(*i), normalise, realise),
maybeNormalise(*i, normalise, realise),
includeExprs, includeSuccessors);
paths.insert(paths2.begin(), paths2.end());
}
@ -129,7 +123,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); i++)
{
Paths preds = queryPredecessors(checkPath(*i));
Paths preds = queryPredecessors(*i);
for (Paths::iterator j = preds.begin();
j != preds.end(); j++)
cout << format("%s\n") % *j;
@ -141,7 +135,7 @@ static void opQuery(Strings opFlags, Strings opArgs)
PathSet roots;
for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); i++)
roots.insert(maybeNormalise(checkPath(*i), normalise, realise));
roots.insert(maybeNormalise(*i, normalise, realise));
printDotGraph(roots);
break;
}
@ -162,8 +156,8 @@ static void opSuccessor(Strings opFlags, Strings opArgs)
for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); )
{
Path path1 = checkPath(*i++);
Path path2 = checkPath(*i++);
Path path1 = *i++;
Path path2 = *i++;
registerSuccessor(txn, path1, path2);
}
txn.commit();
@ -173,14 +167,28 @@ static void opSuccessor(Strings opFlags, Strings opArgs)
static void opSubstitute(Strings opFlags, Strings opArgs)
{
if (!opFlags.empty()) throw UsageError("unknown flag");
if (opArgs.size() % 2) throw UsageError("expecting even number of arguments");
for (Strings::iterator i = opArgs.begin();
i != opArgs.end(); )
{
Path src = checkPath(*i++);
Path sub = checkPath(*i++);
registerSubstitute(src, sub);
if (!opArgs.empty())
throw UsageError("no arguments expected");
while (1) {
Path srcPath;
Substitute sub;
getline(cin, srcPath);
if (cin.eof()) break;
getline(cin, sub.storeExpr);
getline(cin, sub.program);
string s;
getline(cin, s);
istringstream st(s);
int n;
st >> n;
if (!st) throw Error("number expected");
while (n--) {
getline(cin, s);
sub.args.push_back(s);
}
if (!cin || cin.eof()) throw Error("missing input");
registerSubstitute(srcPath, sub);
}
}
@ -260,7 +268,7 @@ static void opInit(Strings opFlags, Strings opArgs)
{
if (!opFlags.empty()) throw UsageError("unknown flag");
if (!opArgs.empty())
throw UsageError("--init does not have arguments");
throw UsageError("no arguments expected");
initDB();
}