1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-07-05 08:11:47 +02:00

* The policy-free derivate sharing now *almost* works. :-) For any

hash for which no local expansion is available, Nix can execute a
  `substitute' which should produce a path with such a hash.

  This is policy-free since Nix does not in any way specify how the
  substitute should work, i.e., it's an arbitrary (unnormalised)
  fstate expression.  For example, `nix-pull' registers substitutes
  that fetch Nix archives from the network (through `wget') and unpack
  them, but any other method is possible as well.  This is an
  improvement over the old Nix sharing scheme, which had a policy
  (fetching through `wget') built in.

  The sharing scheme doesn't work completely yet because successors
  from fstate rewriting have to be registered on the receiving side.
  Probably the whole successor stuff can be folded up into the
  substitute mechanism; this would be a nice simplification.
This commit is contained in:
Eelco Dolstra 2003-07-10 15:11:48 +00:00
parent d072485d28
commit 1d1c3691d2
13 changed files with 155 additions and 142 deletions

View file

@ -26,6 +26,8 @@ static ArgType argType = atpUnknown;
--add / -A: copy a path to the Nix store
--query / -q: query information
--substitute: register a substitute expression
--dump: dump a path as a Nix archive
--restore: restore a path from a Nix archive
@ -87,12 +89,6 @@ static Hash argToHash(const string & arg)
}
static FState hash2fstate(Hash hash)
{
return ATmake("Include(<str>)", ((string) hash).c_str());
}
/* Realise (or install) paths from the given Nix fstate
expressions. */
static void opInstall(Strings opFlags, Strings opArgs)
@ -187,6 +183,21 @@ static void opQuery(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(); )
{
Hash srcHash = parseHash(*i++);
Hash subHash = parseHash(*i++);
registerSubstitute(srcHash, subHash);
}
}
/* A sink that writes dump output to stdout. */
struct StdoutSink : DumpSink
{
@ -277,6 +288,8 @@ void run(Strings args)
op = opAdd;
else if (arg == "--query" || arg == "-q")
op = opQuery;
else if (arg == "--substitute")
op = opSubstitute;
else if (arg == "--dump")
op = opDump;
else if (arg == "--restore")