* 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:
parent
bafb2357d1
commit
112ee89501
10 changed files with 444 additions and 108 deletions
|
|
@ -9,6 +9,29 @@
|
|||
using namespace std;
|
||||
|
||||
|
||||
/* A substitute is a program invocation that constructs some store
|
||||
path (typically by fetching it from somewhere, e.g., from the
|
||||
network). */
|
||||
struct Substitute
|
||||
{
|
||||
/* Store expression to be normalised and realised in order to
|
||||
obtain `program'. */
|
||||
Path storeExpr;
|
||||
|
||||
/* Program to be executed to create the store path. Must be in
|
||||
the output path of `storeExpr'. */
|
||||
Path program;
|
||||
|
||||
/* Extra arguments to be passed to the program (the first argument
|
||||
is the store path to be substituted). */
|
||||
Strings args;
|
||||
|
||||
bool operator == (const Substitute & sub);
|
||||
};
|
||||
|
||||
typedef list<Substitute> Substitutes;
|
||||
|
||||
|
||||
/* Open the database environment. */
|
||||
void openDB();
|
||||
|
||||
|
|
@ -40,10 +63,11 @@ bool querySuccessor(const Path & srcPath, Path & sucPath);
|
|||
Paths queryPredecessors(const Path & sucPath);
|
||||
|
||||
/* Register a substitute. */
|
||||
void registerSubstitute(const Path & srcPath, const Path & subPath);
|
||||
void registerSubstitute(const Path & srcPath,
|
||||
const Substitute & sub);
|
||||
|
||||
/* Return the substitutes expression for the given path. */
|
||||
Paths querySubstitutes(const Path & srcPath);
|
||||
Substitutes querySubstitutes(const Path & srcPath);
|
||||
|
||||
/* Register the validity of a path. */
|
||||
void registerValidPath(const Transaction & txn, const Path & path);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue