forked from lix-project/lix
Replace a few bool flags with enums
Functions like copyClosure() had 3 bool arguments, which creates a severe risk of mixing up arguments. Also, implement copyClosure() using copyPaths().
This commit is contained in:
parent
90da34e421
commit
fcca702a96
|
@ -201,7 +201,7 @@ connected:
|
||||||
printError("somebody is hogging the upload lock for ‘%s’, continuing...");
|
printError("somebody is hogging the upload lock for ‘%s’, continuing...");
|
||||||
alarm(0);
|
alarm(0);
|
||||||
signal(SIGALRM, old);
|
signal(SIGALRM, old);
|
||||||
copyPaths(store, ref<Store>(sshStore), inputs, false, true);
|
copyPaths(store, ref<Store>(sshStore), inputs, NoRepair, NoCheckSigs);
|
||||||
uploadLock = -1;
|
uploadLock = -1;
|
||||||
|
|
||||||
BasicDerivation drv(readDerivation(drvPath));
|
BasicDerivation drv(readDerivation(drvPath));
|
||||||
|
@ -219,7 +219,7 @@ connected:
|
||||||
|
|
||||||
if (!missing.empty()) {
|
if (!missing.empty()) {
|
||||||
setenv("NIX_HELD_LOCKS", concatStringsSep(" ", missing).c_str(), 1); /* FIXME: ugly */
|
setenv("NIX_HELD_LOCKS", concatStringsSep(" ", missing).c_str(), 1); /* FIXME: ugly */
|
||||||
copyPaths(ref<Store>(sshStore), store, missing, false, true);
|
copyPaths(ref<Store>(sshStore), store, missing, NoRepair, NoCheckSigs);
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -293,6 +293,7 @@ EvalState::EvalState(const Strings & _searchPath, ref<Store> store)
|
||||||
, sWrong(symbols.create("wrong"))
|
, sWrong(symbols.create("wrong"))
|
||||||
, sStructuredAttrs(symbols.create("__structuredAttrs"))
|
, sStructuredAttrs(symbols.create("__structuredAttrs"))
|
||||||
, sBuilder(symbols.create("builder"))
|
, sBuilder(symbols.create("builder"))
|
||||||
|
, repair(NoRepair)
|
||||||
, store(store)
|
, store(store)
|
||||||
, baseEnv(allocEnv(128))
|
, baseEnv(allocEnv(128))
|
||||||
, staticBaseEnv(false, 0)
|
, staticBaseEnv(false, 0)
|
||||||
|
|
|
@ -14,6 +14,7 @@ namespace nix {
|
||||||
|
|
||||||
class Store;
|
class Store;
|
||||||
class EvalState;
|
class EvalState;
|
||||||
|
enum RepairFlag : bool;
|
||||||
|
|
||||||
|
|
||||||
typedef void (* PrimOpFun) (EvalState & state, const Pos & pos, Value * * args, Value & v);
|
typedef void (* PrimOpFun) (EvalState & state, const Pos & pos, Value * * args, Value & v);
|
||||||
|
@ -73,7 +74,7 @@ public:
|
||||||
|
|
||||||
/* If set, force copying files to the Nix store even if they
|
/* If set, force copying files to the Nix store even if they
|
||||||
already exist there. */
|
already exist there. */
|
||||||
bool repair = false;
|
RepairFlag repair;
|
||||||
|
|
||||||
/* If set, don't allow access to files outside of the Nix search
|
/* If set, don't allow access to files outside of the Nix search
|
||||||
path or to environment variables. */
|
path or to environment variables. */
|
||||||
|
|
|
@ -134,7 +134,7 @@ Path BinaryCacheStore::narInfoFileFor(const Path & storePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
void BinaryCacheStore::addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
void BinaryCacheStore::addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
||||||
bool repair, bool dontCheckSigs, std::shared_ptr<FSAccessor> accessor)
|
RepairFlag repair, CheckSigsFlag checkSigs, std::shared_ptr<FSAccessor> accessor)
|
||||||
{
|
{
|
||||||
if (!repair && isValidPath(info.path)) return;
|
if (!repair && isValidPath(info.path)) return;
|
||||||
|
|
||||||
|
@ -328,7 +328,7 @@ void BinaryCacheStore::queryPathInfoUncached(const Path & storePath,
|
||||||
}
|
}
|
||||||
|
|
||||||
Path BinaryCacheStore::addToStore(const string & name, const Path & srcPath,
|
Path BinaryCacheStore::addToStore(const string & name, const Path & srcPath,
|
||||||
bool recursive, HashType hashAlgo, PathFilter & filter, bool repair)
|
bool recursive, HashType hashAlgo, PathFilter & filter, RepairFlag repair)
|
||||||
{
|
{
|
||||||
// FIXME: some cut&paste from LocalStore::addToStore().
|
// FIXME: some cut&paste from LocalStore::addToStore().
|
||||||
|
|
||||||
|
@ -349,13 +349,13 @@ Path BinaryCacheStore::addToStore(const string & name, const Path & srcPath,
|
||||||
ValidPathInfo info;
|
ValidPathInfo info;
|
||||||
info.path = makeFixedOutputPath(recursive, h, name);
|
info.path = makeFixedOutputPath(recursive, h, name);
|
||||||
|
|
||||||
addToStore(info, sink.s, repair, false, 0);
|
addToStore(info, sink.s, repair, CheckSigs, nullptr);
|
||||||
|
|
||||||
return info.path;
|
return info.path;
|
||||||
}
|
}
|
||||||
|
|
||||||
Path BinaryCacheStore::addTextToStore(const string & name, const string & s,
|
Path BinaryCacheStore::addTextToStore(const string & name, const string & s,
|
||||||
const PathSet & references, bool repair)
|
const PathSet & references, RepairFlag repair)
|
||||||
{
|
{
|
||||||
ValidPathInfo info;
|
ValidPathInfo info;
|
||||||
info.path = computeStorePathForText(name, s, references);
|
info.path = computeStorePathForText(name, s, references);
|
||||||
|
@ -364,7 +364,7 @@ Path BinaryCacheStore::addTextToStore(const string & name, const string & s,
|
||||||
if (repair || !isValidPath(info.path)) {
|
if (repair || !isValidPath(info.path)) {
|
||||||
StringSink sink;
|
StringSink sink;
|
||||||
dumpString(s, sink);
|
dumpString(s, sink);
|
||||||
addToStore(info, sink.s, repair, false, 0);
|
addToStore(info, sink.s, repair, CheckSigs, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
return info.path;
|
return info.path;
|
||||||
|
|
|
@ -85,15 +85,15 @@ public:
|
||||||
bool wantMassQuery() override { return wantMassQuery_; }
|
bool wantMassQuery() override { return wantMassQuery_; }
|
||||||
|
|
||||||
void addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
void addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
||||||
bool repair, bool dontCheckSigs,
|
RepairFlag repair, CheckSigsFlag checkSigs,
|
||||||
std::shared_ptr<FSAccessor> accessor) override;
|
std::shared_ptr<FSAccessor> accessor) override;
|
||||||
|
|
||||||
Path addToStore(const string & name, const Path & srcPath,
|
Path addToStore(const string & name, const Path & srcPath,
|
||||||
bool recursive, HashType hashAlgo,
|
bool recursive, HashType hashAlgo,
|
||||||
PathFilter & filter, bool repair) override;
|
PathFilter & filter, RepairFlag repair) override;
|
||||||
|
|
||||||
Path addTextToStore(const string & name, const string & s,
|
Path addTextToStore(const string & name, const string & s,
|
||||||
const PathSet & references, bool repair) override;
|
const PathSet & references, RepairFlag repair) override;
|
||||||
|
|
||||||
void narFromPath(const Path & path, Sink & sink) override;
|
void narFromPath(const Path & path, Sink & sink) override;
|
||||||
|
|
||||||
|
|
|
@ -262,7 +262,7 @@ public:
|
||||||
GoalPtr makeDerivationGoal(const Path & drvPath, const StringSet & wantedOutputs, BuildMode buildMode = bmNormal);
|
GoalPtr makeDerivationGoal(const Path & drvPath, const StringSet & wantedOutputs, BuildMode buildMode = bmNormal);
|
||||||
std::shared_ptr<DerivationGoal> makeBasicDerivationGoal(const Path & drvPath,
|
std::shared_ptr<DerivationGoal> makeBasicDerivationGoal(const Path & drvPath,
|
||||||
const BasicDerivation & drv, BuildMode buildMode = bmNormal);
|
const BasicDerivation & drv, BuildMode buildMode = bmNormal);
|
||||||
GoalPtr makeSubstitutionGoal(const Path & storePath, bool repair = false);
|
GoalPtr makeSubstitutionGoal(const Path & storePath, RepairFlag repair = NoRepair);
|
||||||
|
|
||||||
/* Remove a dead goal. */
|
/* Remove a dead goal. */
|
||||||
void removeGoal(GoalPtr goal);
|
void removeGoal(GoalPtr goal);
|
||||||
|
@ -1087,7 +1087,7 @@ void DerivationGoal::haveDerivation()
|
||||||
them. */
|
them. */
|
||||||
if (settings.useSubstitutes && drv->substitutesAllowed())
|
if (settings.useSubstitutes && drv->substitutesAllowed())
|
||||||
for (auto & i : invalidOutputs)
|
for (auto & i : invalidOutputs)
|
||||||
addWaitee(worker.makeSubstitutionGoal(i, buildMode == bmRepair));
|
addWaitee(worker.makeSubstitutionGoal(i, buildMode == bmRepair ? Repair : NoRepair));
|
||||||
|
|
||||||
if (waitees.empty()) /* to prevent hang (no wake-up event) */
|
if (waitees.empty()) /* to prevent hang (no wake-up event) */
|
||||||
outputsSubstituted();
|
outputsSubstituted();
|
||||||
|
@ -1195,7 +1195,7 @@ void DerivationGoal::repairClosure()
|
||||||
printError(format("found corrupted or missing path ‘%1%’ in the output closure of ‘%2%’") % i % drvPath);
|
printError(format("found corrupted or missing path ‘%1%’ in the output closure of ‘%2%’") % i % drvPath);
|
||||||
Path drvPath2 = outputsToDrv[i];
|
Path drvPath2 = outputsToDrv[i];
|
||||||
if (drvPath2 == "")
|
if (drvPath2 == "")
|
||||||
addWaitee(worker.makeSubstitutionGoal(i, true));
|
addWaitee(worker.makeSubstitutionGoal(i, Repair));
|
||||||
else
|
else
|
||||||
addWaitee(worker.makeDerivationGoal(drvPath2, PathSet(), bmRepair));
|
addWaitee(worker.makeDerivationGoal(drvPath2, PathSet(), bmRepair));
|
||||||
}
|
}
|
||||||
|
@ -3291,7 +3291,7 @@ private:
|
||||||
std::promise<void> promise;
|
std::promise<void> promise;
|
||||||
|
|
||||||
/* Whether to try to repair a valid path. */
|
/* Whether to try to repair a valid path. */
|
||||||
bool repair;
|
RepairFlag repair;
|
||||||
|
|
||||||
/* Location where we're downloading the substitute. Differs from
|
/* Location where we're downloading the substitute. Differs from
|
||||||
storePath when doing a repair. */
|
storePath when doing a repair. */
|
||||||
|
@ -3301,7 +3301,7 @@ private:
|
||||||
GoalState state;
|
GoalState state;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SubstitutionGoal(const Path & storePath, Worker & worker, bool repair = false);
|
SubstitutionGoal(const Path & storePath, Worker & worker, RepairFlag repair = NoRepair);
|
||||||
~SubstitutionGoal();
|
~SubstitutionGoal();
|
||||||
|
|
||||||
void timedOut() override { abort(); };
|
void timedOut() override { abort(); };
|
||||||
|
@ -3337,7 +3337,7 @@ public:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
SubstitutionGoal::SubstitutionGoal(const Path & storePath, Worker & worker, bool repair)
|
SubstitutionGoal::SubstitutionGoal(const Path & storePath, Worker & worker, RepairFlag repair)
|
||||||
: Goal(worker)
|
: Goal(worker)
|
||||||
, hasSubstitute(false)
|
, hasSubstitute(false)
|
||||||
, repair(repair)
|
, repair(repair)
|
||||||
|
@ -3600,7 +3600,7 @@ std::shared_ptr<DerivationGoal> Worker::makeBasicDerivationGoal(const Path & drv
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
GoalPtr Worker::makeSubstitutionGoal(const Path & path, bool repair)
|
GoalPtr Worker::makeSubstitutionGoal(const Path & path, RepairFlag repair)
|
||||||
{
|
{
|
||||||
GoalPtr goal = substitutionGoals[path].lock();
|
GoalPtr goal = substitutionGoals[path].lock();
|
||||||
if (!goal) {
|
if (!goal) {
|
||||||
|
@ -3953,7 +3953,7 @@ void LocalStore::buildPaths(const PathSet & drvPaths, BuildMode buildMode)
|
||||||
if (isDerivation(i2.first))
|
if (isDerivation(i2.first))
|
||||||
goals.insert(worker.makeDerivationGoal(i2.first, i2.second, buildMode));
|
goals.insert(worker.makeDerivationGoal(i2.first, i2.second, buildMode));
|
||||||
else
|
else
|
||||||
goals.insert(worker.makeSubstitutionGoal(i, buildMode));
|
goals.insert(worker.makeSubstitutionGoal(i, buildMode == bmRepair ? Repair : NoRepair));
|
||||||
}
|
}
|
||||||
|
|
||||||
worker.run(goals);
|
worker.run(goals);
|
||||||
|
@ -4011,7 +4011,7 @@ void LocalStore::ensurePath(const Path & path)
|
||||||
void LocalStore::repairPath(const Path & path)
|
void LocalStore::repairPath(const Path & path)
|
||||||
{
|
{
|
||||||
Worker worker(*this);
|
Worker worker(*this);
|
||||||
GoalPtr goal = worker.makeSubstitutionGoal(path, true);
|
GoalPtr goal = worker.makeSubstitutionGoal(path, Repair);
|
||||||
Goals goals = {goal};
|
Goals goals = {goal};
|
||||||
|
|
||||||
worker.run(goals);
|
worker.run(goals);
|
||||||
|
|
|
@ -71,7 +71,7 @@ bool BasicDerivation::canBuildLocally() const
|
||||||
|
|
||||||
|
|
||||||
Path writeDerivation(ref<Store> store,
|
Path writeDerivation(ref<Store> store,
|
||||||
const Derivation & drv, const string & name, bool repair)
|
const Derivation & drv, const string & name, RepairFlag repair)
|
||||||
{
|
{
|
||||||
PathSet references;
|
PathSet references;
|
||||||
references.insert(drv.inputSrcs.begin(), drv.inputSrcs.end());
|
references.insert(drv.inputSrcs.begin(), drv.inputSrcs.end());
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "types.hh"
|
#include "types.hh"
|
||||||
#include "hash.hh"
|
#include "hash.hh"
|
||||||
|
#include "store-api.hh"
|
||||||
|
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
|
@ -85,7 +86,7 @@ class Store;
|
||||||
|
|
||||||
/* Write a derivation to the Nix store, and return its path. */
|
/* Write a derivation to the Nix store, and return its path. */
|
||||||
Path writeDerivation(ref<Store> store,
|
Path writeDerivation(ref<Store> store,
|
||||||
const Derivation & drv, const string & name, bool repair = false);
|
const Derivation & drv, const string & name, RepairFlag repair = NoRepair);
|
||||||
|
|
||||||
/* Read a derivation from a file. */
|
/* Read a derivation from a file. */
|
||||||
Derivation readDerivation(const Path & drvPath);
|
Derivation readDerivation(const Path & drvPath);
|
||||||
|
|
|
@ -631,7 +631,7 @@ Path Downloader::downloadCached(ref<Store> store, const string & url_, bool unpa
|
||||||
info.narHash = hashString(htSHA256, *sink.s);
|
info.narHash = hashString(htSHA256, *sink.s);
|
||||||
info.narSize = sink.s->size();
|
info.narSize = sink.s->size();
|
||||||
info.ca = makeFixedOutputCA(false, hash);
|
info.ca = makeFixedOutputCA(false, hash);
|
||||||
store->addToStore(info, sink.s, false, true);
|
store->addToStore(info, sink.s, NoRepair, NoCheckSigs);
|
||||||
storePath = info.path;
|
storePath = info.path;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -660,7 +660,7 @@ Path Downloader::downloadCached(ref<Store> store, const string & url_, bool unpa
|
||||||
AutoDelete autoDelete(tmpDir, true);
|
AutoDelete autoDelete(tmpDir, true);
|
||||||
// FIXME: this requires GNU tar for decompression.
|
// FIXME: this requires GNU tar for decompression.
|
||||||
runProgram("tar", true, {"xf", storePath, "-C", tmpDir, "--strip-components", "1"});
|
runProgram("tar", true, {"xf", storePath, "-C", tmpDir, "--strip-components", "1"});
|
||||||
unpackedStorePath = store->addToStore(name, tmpDir, true, htSHA256, defaultPathFilter, false);
|
unpackedStorePath = store->addToStore(name, tmpDir, true, htSHA256, defaultPathFilter, NoRepair);
|
||||||
}
|
}
|
||||||
replaceSymlink(unpackedStorePath, unpackedLink);
|
replaceSymlink(unpackedStorePath, unpackedLink);
|
||||||
storePath = unpackedStorePath;
|
storePath = unpackedStorePath;
|
||||||
|
|
|
@ -61,7 +61,7 @@ void Store::exportPath(const Path & path, Sink & sink)
|
||||||
hashAndWriteSink << exportMagic << path << info->references << info->deriver << 0;
|
hashAndWriteSink << exportMagic << path << info->references << info->deriver << 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
Paths Store::importPaths(Source & source, std::shared_ptr<FSAccessor> accessor, bool dontCheckSigs)
|
Paths Store::importPaths(Source & source, std::shared_ptr<FSAccessor> accessor, CheckSigsFlag checkSigs)
|
||||||
{
|
{
|
||||||
Paths res;
|
Paths res;
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -95,7 +95,7 @@ Paths Store::importPaths(Source & source, std::shared_ptr<FSAccessor> accessor,
|
||||||
if (readInt(source) == 1)
|
if (readInt(source) == 1)
|
||||||
readString(source);
|
readString(source);
|
||||||
|
|
||||||
addToStore(info, tee.source.data, false, dontCheckSigs, accessor);
|
addToStore(info, tee.source.data, NoRepair, checkSigs, accessor);
|
||||||
|
|
||||||
res.push_back(info.path);
|
res.push_back(info.path);
|
||||||
}
|
}
|
||||||
|
|
|
@ -113,7 +113,7 @@ struct LegacySSHStore : public Store
|
||||||
}
|
}
|
||||||
|
|
||||||
void addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
void addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
||||||
bool repair, bool dontCheckSigs,
|
RepairFlag repair, CheckSigsFlag checkSigs,
|
||||||
std::shared_ptr<FSAccessor> accessor) override
|
std::shared_ptr<FSAccessor> accessor) override
|
||||||
{
|
{
|
||||||
debug("adding path ‘%s’ to remote host ‘%s’", info.path, host);
|
debug("adding path ‘%s’ to remote host ‘%s’", info.path, host);
|
||||||
|
@ -168,11 +168,11 @@ struct LegacySSHStore : public Store
|
||||||
|
|
||||||
Path addToStore(const string & name, const Path & srcPath,
|
Path addToStore(const string & name, const Path & srcPath,
|
||||||
bool recursive, HashType hashAlgo,
|
bool recursive, HashType hashAlgo,
|
||||||
PathFilter & filter, bool repair) override
|
PathFilter & filter, RepairFlag repair) override
|
||||||
{ unsupported(); }
|
{ unsupported(); }
|
||||||
|
|
||||||
Path addTextToStore(const string & name, const string & s,
|
Path addTextToStore(const string & name, const string & s,
|
||||||
const PathSet & references, bool repair) override
|
const PathSet & references, RepairFlag repair) override
|
||||||
{ unsupported(); }
|
{ unsupported(); }
|
||||||
|
|
||||||
BuildResult buildDerivation(const Path & drvPath, const BasicDerivation & drv,
|
BuildResult buildDerivation(const Path & drvPath, const BasicDerivation & drv,
|
||||||
|
@ -249,7 +249,8 @@ struct LegacySSHStore : public Store
|
||||||
out.insert(res.begin(), res.end());
|
out.insert(res.begin(), res.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
PathSet queryValidPaths(const PathSet & paths, bool maybeSubstitute = false) override
|
PathSet queryValidPaths(const PathSet & paths,
|
||||||
|
SubstituteFlag maybeSubstitute = NoSubstitute) override
|
||||||
{
|
{
|
||||||
auto conn(connections->get());
|
auto conn(connections->get());
|
||||||
|
|
||||||
|
|
|
@ -718,7 +718,7 @@ bool LocalStore::isValidPathUncached(const Path & path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PathSet LocalStore::queryValidPaths(const PathSet & paths, bool maybeSubstitute)
|
PathSet LocalStore::queryValidPaths(const PathSet & paths, SubstituteFlag maybeSubstitute)
|
||||||
{
|
{
|
||||||
PathSet res;
|
PathSet res;
|
||||||
for (auto & i : paths)
|
for (auto & i : paths)
|
||||||
|
@ -961,7 +961,7 @@ void LocalStore::invalidatePath(State & state, const Path & path)
|
||||||
|
|
||||||
|
|
||||||
void LocalStore::addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
void LocalStore::addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
||||||
bool repair, bool dontCheckSigs, std::shared_ptr<FSAccessor> accessor)
|
RepairFlag repair, CheckSigsFlag checkSigs, std::shared_ptr<FSAccessor> accessor)
|
||||||
{
|
{
|
||||||
assert(info.narHash);
|
assert(info.narHash);
|
||||||
|
|
||||||
|
@ -974,7 +974,7 @@ void LocalStore::addToStore(const ValidPathInfo & info, const ref<std::string> &
|
||||||
throw Error("size mismatch importing path ‘%s’; expected %s, got %s",
|
throw Error("size mismatch importing path ‘%s’; expected %s, got %s",
|
||||||
info.path, info.narSize, nar->size());
|
info.path, info.narSize, nar->size());
|
||||||
|
|
||||||
if (requireSigs && !dontCheckSigs && !info.checkSignatures(*this, publicKeys))
|
if (requireSigs && checkSigs && !info.checkSignatures(*this, publicKeys))
|
||||||
throw Error("cannot add path ‘%s’ because it lacks a valid signature", info.path);
|
throw Error("cannot add path ‘%s’ because it lacks a valid signature", info.path);
|
||||||
|
|
||||||
addTempRoot(info.path);
|
addTempRoot(info.path);
|
||||||
|
@ -1012,7 +1012,7 @@ void LocalStore::addToStore(const ValidPathInfo & info, const ref<std::string> &
|
||||||
|
|
||||||
|
|
||||||
Path LocalStore::addToStoreFromDump(const string & dump, const string & name,
|
Path LocalStore::addToStoreFromDump(const string & dump, const string & name,
|
||||||
bool recursive, HashType hashAlgo, bool repair)
|
bool recursive, HashType hashAlgo, RepairFlag repair)
|
||||||
{
|
{
|
||||||
Hash h = hashString(hashAlgo, dump);
|
Hash h = hashString(hashAlgo, dump);
|
||||||
|
|
||||||
|
@ -1070,7 +1070,7 @@ Path LocalStore::addToStoreFromDump(const string & dump, const string & name,
|
||||||
|
|
||||||
|
|
||||||
Path LocalStore::addToStore(const string & name, const Path & _srcPath,
|
Path LocalStore::addToStore(const string & name, const Path & _srcPath,
|
||||||
bool recursive, HashType hashAlgo, PathFilter & filter, bool repair)
|
bool recursive, HashType hashAlgo, PathFilter & filter, RepairFlag repair)
|
||||||
{
|
{
|
||||||
Path srcPath(absPath(_srcPath));
|
Path srcPath(absPath(_srcPath));
|
||||||
|
|
||||||
|
@ -1088,7 +1088,7 @@ Path LocalStore::addToStore(const string & name, const Path & _srcPath,
|
||||||
|
|
||||||
|
|
||||||
Path LocalStore::addTextToStore(const string & name, const string & s,
|
Path LocalStore::addTextToStore(const string & name, const string & s,
|
||||||
const PathSet & references, bool repair)
|
const PathSet & references, RepairFlag repair)
|
||||||
{
|
{
|
||||||
auto hash = hashString(htSHA256, s);
|
auto hash = hashString(htSHA256, s);
|
||||||
auto dstPath = makeTextPath(name, hash, references);
|
auto dstPath = makeTextPath(name, hash, references);
|
||||||
|
@ -1170,7 +1170,7 @@ void LocalStore::invalidatePathChecked(const Path & path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool LocalStore::verifyStore(bool checkContents, bool repair)
|
bool LocalStore::verifyStore(bool checkContents, RepairFlag repair)
|
||||||
{
|
{
|
||||||
printError(format("reading the Nix store..."));
|
printError(format("reading the Nix store..."));
|
||||||
|
|
||||||
|
@ -1255,7 +1255,7 @@ bool LocalStore::verifyStore(bool checkContents, bool repair)
|
||||||
|
|
||||||
|
|
||||||
void LocalStore::verifyPath(const Path & path, const PathSet & store,
|
void LocalStore::verifyPath(const Path & path, const PathSet & store,
|
||||||
PathSet & done, PathSet & validPaths, bool repair, bool & errors)
|
PathSet & done, PathSet & validPaths, RepairFlag repair, bool & errors)
|
||||||
{
|
{
|
||||||
checkInterrupt();
|
checkInterrupt();
|
||||||
|
|
||||||
|
|
|
@ -98,7 +98,8 @@ public:
|
||||||
|
|
||||||
bool isValidPathUncached(const Path & path) override;
|
bool isValidPathUncached(const Path & path) override;
|
||||||
|
|
||||||
PathSet queryValidPaths(const PathSet & paths, bool maybeSubstitute = false) override;
|
PathSet queryValidPaths(const PathSet & paths,
|
||||||
|
SubstituteFlag maybeSubstitute = NoSubstitute) override;
|
||||||
|
|
||||||
PathSet queryAllValidPaths() override;
|
PathSet queryAllValidPaths() override;
|
||||||
|
|
||||||
|
@ -122,22 +123,22 @@ public:
|
||||||
SubstitutablePathInfos & infos) override;
|
SubstitutablePathInfos & infos) override;
|
||||||
|
|
||||||
void addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
void addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
||||||
bool repair, bool dontCheckSigs,
|
RepairFlag repair, CheckSigsFlag checkSigs,
|
||||||
std::shared_ptr<FSAccessor> accessor) override;
|
std::shared_ptr<FSAccessor> accessor) override;
|
||||||
|
|
||||||
Path addToStore(const string & name, const Path & srcPath,
|
Path addToStore(const string & name, const Path & srcPath,
|
||||||
bool recursive, HashType hashAlgo,
|
bool recursive, HashType hashAlgo,
|
||||||
PathFilter & filter, bool repair) override;
|
PathFilter & filter, RepairFlag repair) override;
|
||||||
|
|
||||||
/* Like addToStore(), but the contents of the path are contained
|
/* Like addToStore(), but the contents of the path are contained
|
||||||
in `dump', which is either a NAR serialisation (if recursive ==
|
in `dump', which is either a NAR serialisation (if recursive ==
|
||||||
true) or simply the contents of a regular file (if recursive ==
|
true) or simply the contents of a regular file (if recursive ==
|
||||||
false). */
|
false). */
|
||||||
Path addToStoreFromDump(const string & dump, const string & name,
|
Path addToStoreFromDump(const string & dump, const string & name,
|
||||||
bool recursive = true, HashType hashAlgo = htSHA256, bool repair = false);
|
bool recursive = true, HashType hashAlgo = htSHA256, RepairFlag repair = NoRepair);
|
||||||
|
|
||||||
Path addTextToStore(const string & name, const string & s,
|
Path addTextToStore(const string & name, const string & s,
|
||||||
const PathSet & references, bool repair) override;
|
const PathSet & references, RepairFlag repair) override;
|
||||||
|
|
||||||
void buildPaths(const PathSet & paths, BuildMode buildMode) override;
|
void buildPaths(const PathSet & paths, BuildMode buildMode) override;
|
||||||
|
|
||||||
|
@ -174,7 +175,7 @@ public:
|
||||||
/* Optimise a single store path. */
|
/* Optimise a single store path. */
|
||||||
void optimisePath(const Path & path);
|
void optimisePath(const Path & path);
|
||||||
|
|
||||||
bool verifyStore(bool checkContents, bool repair) override;
|
bool verifyStore(bool checkContents, RepairFlag repair) override;
|
||||||
|
|
||||||
/* Register the validity of a path, i.e., that `path' exists, that
|
/* Register the validity of a path, i.e., that `path' exists, that
|
||||||
the paths referenced by it exists, and in the case of an output
|
the paths referenced by it exists, and in the case of an output
|
||||||
|
@ -212,7 +213,7 @@ private:
|
||||||
void invalidatePathChecked(const Path & path);
|
void invalidatePathChecked(const Path & path);
|
||||||
|
|
||||||
void verifyPath(const Path & path, const PathSet & store,
|
void verifyPath(const Path & path, const PathSet & store,
|
||||||
PathSet & done, PathSet & validPaths, bool repair, bool & errors);
|
PathSet & done, PathSet & validPaths, RepairFlag repair, bool & errors);
|
||||||
|
|
||||||
void updatePathInfo(State & state, const ValidPathInfo & info);
|
void updatePathInfo(State & state, const ValidPathInfo & info);
|
||||||
|
|
||||||
|
|
|
@ -185,7 +185,7 @@ bool RemoteStore::isValidPathUncached(const Path & path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PathSet RemoteStore::queryValidPaths(const PathSet & paths, bool maybeSubstitute)
|
PathSet RemoteStore::queryValidPaths(const PathSet & paths, SubstituteFlag maybeSubstitute)
|
||||||
{
|
{
|
||||||
auto conn(connections->get());
|
auto conn(connections->get());
|
||||||
if (GET_PROTOCOL_MINOR(conn->daemonVersion) < 12) {
|
if (GET_PROTOCOL_MINOR(conn->daemonVersion) < 12) {
|
||||||
|
@ -357,7 +357,7 @@ Path RemoteStore::queryPathFromHashPart(const string & hashPart)
|
||||||
|
|
||||||
|
|
||||||
void RemoteStore::addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
void RemoteStore::addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
||||||
bool repair, bool dontCheckSigs, std::shared_ptr<FSAccessor> accessor)
|
RepairFlag repair, CheckSigsFlag checkSigs, std::shared_ptr<FSAccessor> accessor)
|
||||||
{
|
{
|
||||||
auto conn(connections->get());
|
auto conn(connections->get());
|
||||||
|
|
||||||
|
@ -390,7 +390,7 @@ void RemoteStore::addToStore(const ValidPathInfo & info, const ref<std::string>
|
||||||
<< info.path << info.deriver << printHash(info.narHash)
|
<< info.path << info.deriver << printHash(info.narHash)
|
||||||
<< info.references << info.registrationTime << info.narSize
|
<< info.references << info.registrationTime << info.narSize
|
||||||
<< info.ultimate << info.sigs << info.ca
|
<< info.ultimate << info.sigs << info.ca
|
||||||
<< repair << dontCheckSigs;
|
<< repair << !checkSigs;
|
||||||
conn->to(*nar);
|
conn->to(*nar);
|
||||||
conn->processStderr();
|
conn->processStderr();
|
||||||
}
|
}
|
||||||
|
@ -398,7 +398,7 @@ void RemoteStore::addToStore(const ValidPathInfo & info, const ref<std::string>
|
||||||
|
|
||||||
|
|
||||||
Path RemoteStore::addToStore(const string & name, const Path & _srcPath,
|
Path RemoteStore::addToStore(const string & name, const Path & _srcPath,
|
||||||
bool recursive, HashType hashAlgo, PathFilter & filter, bool repair)
|
bool recursive, HashType hashAlgo, PathFilter & filter, RepairFlag repair)
|
||||||
{
|
{
|
||||||
if (repair) throw Error("repairing is not supported when building through the Nix daemon");
|
if (repair) throw Error("repairing is not supported when building through the Nix daemon");
|
||||||
|
|
||||||
|
@ -434,7 +434,7 @@ Path RemoteStore::addToStore(const string & name, const Path & _srcPath,
|
||||||
|
|
||||||
|
|
||||||
Path RemoteStore::addTextToStore(const string & name, const string & s,
|
Path RemoteStore::addTextToStore(const string & name, const string & s,
|
||||||
const PathSet & references, bool repair)
|
const PathSet & references, RepairFlag repair)
|
||||||
{
|
{
|
||||||
if (repair) throw Error("repairing is not supported when building through the Nix daemon");
|
if (repair) throw Error("repairing is not supported when building through the Nix daemon");
|
||||||
|
|
||||||
|
@ -570,7 +570,7 @@ void RemoteStore::optimiseStore()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool RemoteStore::verifyStore(bool checkContents, bool repair)
|
bool RemoteStore::verifyStore(bool checkContents, RepairFlag repair)
|
||||||
{
|
{
|
||||||
auto conn(connections->get());
|
auto conn(connections->get());
|
||||||
conn->to << wopVerifyStore << checkContents << repair;
|
conn->to << wopVerifyStore << checkContents << repair;
|
||||||
|
|
|
@ -31,7 +31,8 @@ public:
|
||||||
|
|
||||||
bool isValidPathUncached(const Path & path) override;
|
bool isValidPathUncached(const Path & path) override;
|
||||||
|
|
||||||
PathSet queryValidPaths(const PathSet & paths, bool maybeSubstitute = false) override;
|
PathSet queryValidPaths(const PathSet & paths,
|
||||||
|
SubstituteFlag maybeSubstitute = NoSubstitute) override;
|
||||||
|
|
||||||
PathSet queryAllValidPaths() override;
|
PathSet queryAllValidPaths() override;
|
||||||
|
|
||||||
|
@ -55,15 +56,15 @@ public:
|
||||||
SubstitutablePathInfos & infos) override;
|
SubstitutablePathInfos & infos) override;
|
||||||
|
|
||||||
void addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
void addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
||||||
bool repair, bool dontCheckSigs,
|
RepairFlag repair, CheckSigsFlag checkSigs,
|
||||||
std::shared_ptr<FSAccessor> accessor) override;
|
std::shared_ptr<FSAccessor> accessor) override;
|
||||||
|
|
||||||
Path addToStore(const string & name, const Path & srcPath,
|
Path addToStore(const string & name, const Path & srcPath,
|
||||||
bool recursive = true, HashType hashAlgo = htSHA256,
|
bool recursive = true, HashType hashAlgo = htSHA256,
|
||||||
PathFilter & filter = defaultPathFilter, bool repair = false) override;
|
PathFilter & filter = defaultPathFilter, RepairFlag repair = NoRepair) override;
|
||||||
|
|
||||||
Path addTextToStore(const string & name, const string & s,
|
Path addTextToStore(const string & name, const string & s,
|
||||||
const PathSet & references, bool repair = false) override;
|
const PathSet & references, RepairFlag repair) override;
|
||||||
|
|
||||||
void buildPaths(const PathSet & paths, BuildMode buildMode) override;
|
void buildPaths(const PathSet & paths, BuildMode buildMode) override;
|
||||||
|
|
||||||
|
@ -84,7 +85,7 @@ public:
|
||||||
|
|
||||||
void optimiseStore() override;
|
void optimiseStore() override;
|
||||||
|
|
||||||
bool verifyStore(bool checkContents, bool repair) override;
|
bool verifyStore(bool checkContents, RepairFlag repair) override;
|
||||||
|
|
||||||
void addSignatures(const Path & storePath, const StringSet & sigs) override;
|
void addSignatures(const Path & storePath, const StringSet & sigs) override;
|
||||||
|
|
||||||
|
|
|
@ -378,7 +378,7 @@ void Store::queryPathInfo(const Path & storePath,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PathSet Store::queryValidPaths(const PathSet & paths, bool maybeSubstitute)
|
PathSet Store::queryValidPaths(const PathSet & paths, SubstituteFlag maybeSubstitute)
|
||||||
{
|
{
|
||||||
struct State
|
struct State
|
||||||
{
|
{
|
||||||
|
@ -537,14 +537,14 @@ void Store::buildPaths(const PathSet & paths, BuildMode buildMode)
|
||||||
|
|
||||||
|
|
||||||
void copyStorePath(ref<Store> srcStore, ref<Store> dstStore,
|
void copyStorePath(ref<Store> srcStore, ref<Store> dstStore,
|
||||||
const Path & storePath, bool repair, bool dontCheckSigs)
|
const Path & storePath, RepairFlag repair, CheckSigsFlag checkSigs)
|
||||||
{
|
{
|
||||||
auto info = srcStore->queryPathInfo(storePath);
|
auto info = srcStore->queryPathInfo(storePath);
|
||||||
|
|
||||||
StringSink sink;
|
StringSink sink;
|
||||||
srcStore->narFromPath({storePath}, sink);
|
srcStore->narFromPath({storePath}, sink);
|
||||||
|
|
||||||
if (!info->narHash && dontCheckSigs) {
|
if (!info->narHash && !checkSigs) {
|
||||||
auto info2 = make_ref<ValidPathInfo>(*info);
|
auto info2 = make_ref<ValidPathInfo>(*info);
|
||||||
info2->narHash = hashString(htSHA256, *sink.s);
|
info2->narHash = hashString(htSHA256, *sink.s);
|
||||||
if (!info->narSize) info2->narSize = sink.s->size();
|
if (!info->narSize) info2->narSize = sink.s->size();
|
||||||
|
@ -561,33 +561,47 @@ void copyStorePath(ref<Store> srcStore, ref<Store> dstStore,
|
||||||
|
|
||||||
assert(info->narHash);
|
assert(info->narHash);
|
||||||
|
|
||||||
dstStore->addToStore(*info, sink.s, repair, dontCheckSigs);
|
dstStore->addToStore(*info, sink.s, repair, checkSigs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void copyPaths(ref<Store> srcStore, ref<Store> dstStore, const PathSet & storePaths,
|
||||||
|
RepairFlag repair, CheckSigsFlag checkSigs, SubstituteFlag substitute)
|
||||||
|
{
|
||||||
|
PathSet valid = dstStore->queryValidPaths(storePaths, substitute);
|
||||||
|
|
||||||
|
PathSet missing;
|
||||||
|
for (auto & path : storePaths)
|
||||||
|
if (!valid.count(path)) missing.insert(path);
|
||||||
|
|
||||||
|
ThreadPool pool;
|
||||||
|
|
||||||
|
processGraph<Path>(pool,
|
||||||
|
PathSet(missing.begin(), missing.end()),
|
||||||
|
|
||||||
|
[&](const Path & storePath) {
|
||||||
|
if (dstStore->isValidPath(storePath)) return PathSet();
|
||||||
|
return srcStore->queryPathInfo(storePath)->references;
|
||||||
|
},
|
||||||
|
|
||||||
|
[&](const Path & storePath) {
|
||||||
|
checkInterrupt();
|
||||||
|
|
||||||
|
if (!dstStore->isValidPath(storePath)) {
|
||||||
|
printError("copying ‘%s’...", storePath);
|
||||||
|
copyStorePath(srcStore, dstStore, storePath, repair, checkSigs);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void copyClosure(ref<Store> srcStore, ref<Store> dstStore,
|
void copyClosure(ref<Store> srcStore, ref<Store> dstStore,
|
||||||
const PathSet & storePaths, bool repair, bool dontCheckSigs)
|
const PathSet & storePaths, RepairFlag repair, CheckSigsFlag checkSigs,
|
||||||
|
SubstituteFlag substitute)
|
||||||
{
|
{
|
||||||
PathSet closure;
|
PathSet closure;
|
||||||
for (auto & path : storePaths)
|
srcStore->computeFSClosure({storePaths}, closure);
|
||||||
srcStore->computeFSClosure(path, closure);
|
copyPaths(srcStore, dstStore, closure, repair, checkSigs, substitute);
|
||||||
|
|
||||||
// FIXME: use copyStorePaths()
|
|
||||||
|
|
||||||
PathSet valid = dstStore->queryValidPaths(closure);
|
|
||||||
|
|
||||||
if (valid.size() == closure.size()) return;
|
|
||||||
|
|
||||||
Paths sorted = srcStore->topoSortPaths(closure);
|
|
||||||
|
|
||||||
Paths missing;
|
|
||||||
for (auto i = sorted.rbegin(); i != sorted.rend(); ++i)
|
|
||||||
if (!valid.count(*i)) missing.push_back(*i);
|
|
||||||
|
|
||||||
printMsg(lvlDebug, format("copying %1% missing paths") % missing.size());
|
|
||||||
|
|
||||||
for (auto & i : missing)
|
|
||||||
copyStorePath(srcStore, dstStore, i, repair, dontCheckSigs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -812,45 +826,4 @@ std::list<ref<Store>> getDefaultSubstituters()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void copyPaths(ref<Store> from, ref<Store> to, const PathSet & storePaths,
|
|
||||||
bool substitute, bool dontCheckSigs)
|
|
||||||
{
|
|
||||||
PathSet valid = to->queryValidPaths(storePaths, substitute);
|
|
||||||
|
|
||||||
PathSet missing;
|
|
||||||
for (auto & path : storePaths)
|
|
||||||
if (!valid.count(path)) missing.insert(path);
|
|
||||||
|
|
||||||
std::string copiedLabel = "copied";
|
|
||||||
|
|
||||||
//logger->setExpected(copiedLabel, missing.size());
|
|
||||||
|
|
||||||
ThreadPool pool;
|
|
||||||
|
|
||||||
processGraph<Path>(pool,
|
|
||||||
PathSet(missing.begin(), missing.end()),
|
|
||||||
|
|
||||||
[&](const Path & storePath) {
|
|
||||||
if (to->isValidPath(storePath)) return PathSet();
|
|
||||||
return from->queryPathInfo(storePath)->references;
|
|
||||||
},
|
|
||||||
|
|
||||||
[&](const Path & storePath) {
|
|
||||||
checkInterrupt();
|
|
||||||
|
|
||||||
if (!to->isValidPath(storePath)) {
|
|
||||||
//Activity act(*logger, lvlInfo, format("copying ‘%s’...") % storePath);
|
|
||||||
|
|
||||||
copyStorePath(from, to, storePath, false, dontCheckSigs);
|
|
||||||
|
|
||||||
//logger->incProgress(copiedLabel);
|
|
||||||
} else
|
|
||||||
;
|
|
||||||
//logger->incExpected(copiedLabel, -1);
|
|
||||||
});
|
|
||||||
|
|
||||||
pool.process();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,11 @@ class Store;
|
||||||
class JSONPlaceholder;
|
class JSONPlaceholder;
|
||||||
|
|
||||||
|
|
||||||
|
enum RepairFlag : bool { NoRepair = false, Repair = true };
|
||||||
|
enum CheckSigsFlag : bool { NoCheckSigs = false, CheckSigs = true };
|
||||||
|
enum SubstituteFlag : bool { NoSubstitute = false, Substitute = true };
|
||||||
|
|
||||||
|
|
||||||
/* Size of the hash part of store paths, in base-32 characters. */
|
/* Size of the hash part of store paths, in base-32 characters. */
|
||||||
const size_t storePathHashLen = 32; // i.e. 160 bits
|
const size_t storePathHashLen = 32; // i.e. 160 bits
|
||||||
|
|
||||||
|
@ -332,7 +337,7 @@ public:
|
||||||
/* Query which of the given paths is valid. Optionally, try to
|
/* Query which of the given paths is valid. Optionally, try to
|
||||||
substitute missing paths. */
|
substitute missing paths. */
|
||||||
virtual PathSet queryValidPaths(const PathSet & paths,
|
virtual PathSet queryValidPaths(const PathSet & paths,
|
||||||
bool maybeSubstitute = false);
|
SubstituteFlag maybeSubstitute = NoSubstitute);
|
||||||
|
|
||||||
/* Query the set of all valid paths. Note that for some store
|
/* Query the set of all valid paths. Note that for some store
|
||||||
backends, the name part of store paths may be omitted
|
backends, the name part of store paths may be omitted
|
||||||
|
@ -392,7 +397,7 @@ public:
|
||||||
|
|
||||||
/* Import a path into the store. */
|
/* Import a path into the store. */
|
||||||
virtual void addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
virtual void addToStore(const ValidPathInfo & info, const ref<std::string> & nar,
|
||||||
bool repair = false, bool dontCheckSigs = false,
|
RepairFlag repair = NoRepair, CheckSigsFlag checkSigs = CheckSigs,
|
||||||
std::shared_ptr<FSAccessor> accessor = 0) = 0;
|
std::shared_ptr<FSAccessor> accessor = 0) = 0;
|
||||||
|
|
||||||
/* Copy the contents of a path to the store and register the
|
/* Copy the contents of a path to the store and register the
|
||||||
|
@ -401,12 +406,12 @@ public:
|
||||||
libutil/archive.hh). */
|
libutil/archive.hh). */
|
||||||
virtual Path addToStore(const string & name, const Path & srcPath,
|
virtual Path addToStore(const string & name, const Path & srcPath,
|
||||||
bool recursive = true, HashType hashAlgo = htSHA256,
|
bool recursive = true, HashType hashAlgo = htSHA256,
|
||||||
PathFilter & filter = defaultPathFilter, bool repair = false) = 0;
|
PathFilter & filter = defaultPathFilter, RepairFlag repair = NoRepair) = 0;
|
||||||
|
|
||||||
/* Like addToStore, but the contents written to the output path is
|
/* Like addToStore, but the contents written to the output path is
|
||||||
a regular file containing the given string. */
|
a regular file containing the given string. */
|
||||||
virtual Path addTextToStore(const string & name, const string & s,
|
virtual Path addTextToStore(const string & name, const string & s,
|
||||||
const PathSet & references, bool repair = false) = 0;
|
const PathSet & references, RepairFlag repair = NoRepair) = 0;
|
||||||
|
|
||||||
/* Write a NAR dump of a store path. */
|
/* Write a NAR dump of a store path. */
|
||||||
virtual void narFromPath(const Path & path, Sink & sink) = 0;
|
virtual void narFromPath(const Path & path, Sink & sink) = 0;
|
||||||
|
@ -496,7 +501,7 @@ public:
|
||||||
|
|
||||||
/* Check the integrity of the Nix store. Returns true if errors
|
/* Check the integrity of the Nix store. Returns true if errors
|
||||||
remain. */
|
remain. */
|
||||||
virtual bool verifyStore(bool checkContents, bool repair) { return false; };
|
virtual bool verifyStore(bool checkContents, RepairFlag repair = NoRepair) { return false; };
|
||||||
|
|
||||||
/* Return an object to access files in the Nix store. */
|
/* Return an object to access files in the Nix store. */
|
||||||
virtual ref<FSAccessor> getFSAccessor() = 0;
|
virtual ref<FSAccessor> getFSAccessor() = 0;
|
||||||
|
@ -548,7 +553,7 @@ public:
|
||||||
preloaded into the specified FS accessor to speed up subsequent
|
preloaded into the specified FS accessor to speed up subsequent
|
||||||
access. */
|
access. */
|
||||||
Paths importPaths(Source & source, std::shared_ptr<FSAccessor> accessor,
|
Paths importPaths(Source & source, std::shared_ptr<FSAccessor> accessor,
|
||||||
bool dontCheckSigs = false);
|
CheckSigsFlag checkSigs = CheckSigs);
|
||||||
|
|
||||||
struct Stats
|
struct Stats
|
||||||
{
|
{
|
||||||
|
@ -650,12 +655,26 @@ void checkStoreName(const string & name);
|
||||||
|
|
||||||
/* Copy a path from one store to another. */
|
/* Copy a path from one store to another. */
|
||||||
void copyStorePath(ref<Store> srcStore, ref<Store> dstStore,
|
void copyStorePath(ref<Store> srcStore, ref<Store> dstStore,
|
||||||
const Path & storePath, bool repair = false, bool dontCheckSigs = false);
|
const Path & storePath, RepairFlag repair = NoRepair, CheckSigsFlag checkSigs = CheckSigs);
|
||||||
|
|
||||||
|
|
||||||
|
/* Copy store paths from one store to another. The paths may be copied
|
||||||
|
in parallel. They are copied in a topologically sorted order
|
||||||
|
(i.e. if A is a reference of B, then A is copied before B), but
|
||||||
|
the set of store paths is not automatically closed; use
|
||||||
|
copyClosure() for that. */
|
||||||
|
void copyPaths(ref<Store> srcStore, ref<Store> dstStore, const PathSet & storePaths,
|
||||||
|
RepairFlag repair = NoRepair,
|
||||||
|
CheckSigsFlag checkSigs = CheckSigs,
|
||||||
|
SubstituteFlag substitute = NoSubstitute);
|
||||||
|
|
||||||
|
|
||||||
/* Copy the closure of the specified paths from one store to another. */
|
/* Copy the closure of the specified paths from one store to another. */
|
||||||
void copyClosure(ref<Store> srcStore, ref<Store> dstStore,
|
void copyClosure(ref<Store> srcStore, ref<Store> dstStore,
|
||||||
const PathSet & storePaths, bool repair = false, bool dontCheckSigs = false);
|
const PathSet & storePaths,
|
||||||
|
RepairFlag repair = NoRepair,
|
||||||
|
CheckSigsFlag checkSigs = CheckSigs,
|
||||||
|
SubstituteFlag substitute = NoSubstitute);
|
||||||
|
|
||||||
|
|
||||||
/* Remove the temporary roots file for this process. Any temporary
|
/* Remove the temporary roots file for this process. Any temporary
|
||||||
|
@ -694,9 +713,6 @@ ref<Store> openStore(const std::string & uri = getEnv("NIX_REMOTE"),
|
||||||
const Store::Params & extraParams = Store::Params());
|
const Store::Params & extraParams = Store::Params());
|
||||||
|
|
||||||
|
|
||||||
void copyPaths(ref<Store> from, ref<Store> to, const PathSet & storePaths,
|
|
||||||
bool substitute = false, bool dontCheckSigs = false);
|
|
||||||
|
|
||||||
enum StoreType {
|
enum StoreType {
|
||||||
tDaemon,
|
tDaemon,
|
||||||
tLocal,
|
tLocal,
|
||||||
|
|
|
@ -12,7 +12,7 @@ int main(int argc, char ** argv)
|
||||||
auto toMode = true;
|
auto toMode = true;
|
||||||
auto includeOutputs = false;
|
auto includeOutputs = false;
|
||||||
auto dryRun = false;
|
auto dryRun = false;
|
||||||
auto useSubstitutes = false;
|
auto useSubstitutes = NoSubstitute;
|
||||||
std::string sshHost;
|
std::string sshHost;
|
||||||
PathSet storePaths;
|
PathSet storePaths;
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ int main(int argc, char ** argv)
|
||||||
else if (*arg == "--dry-run")
|
else if (*arg == "--dry-run")
|
||||||
dryRun = true;
|
dryRun = true;
|
||||||
else if (*arg == "--use-substitutes" || *arg == "-s")
|
else if (*arg == "--use-substitutes" || *arg == "-s")
|
||||||
useSubstitutes = true;
|
useSubstitutes = Substitute;
|
||||||
else if (sshHost.empty())
|
else if (sshHost.empty())
|
||||||
sshHost = *arg;
|
sshHost = *arg;
|
||||||
else
|
else
|
||||||
|
@ -58,6 +58,6 @@ int main(int argc, char ** argv)
|
||||||
PathSet closure;
|
PathSet closure;
|
||||||
from->computeFSClosure(storePaths2, closure, false, includeOutputs);
|
from->computeFSClosure(storePaths2, closure, false, includeOutputs);
|
||||||
|
|
||||||
copyPaths(from, to, closure, useSubstitutes, true);
|
copyPaths(from, to, closure, NoRepair, NoCheckSigs, useSubstitutes);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,7 +304,7 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
|
||||||
string s = readString(from);
|
string s = readString(from);
|
||||||
PathSet refs = readStorePaths<PathSet>(*store, from);
|
PathSet refs = readStorePaths<PathSet>(*store, from);
|
||||||
startWork();
|
startWork();
|
||||||
Path path = store->addTextToStore(suffix, s, refs, false);
|
Path path = store->addTextToStore(suffix, s, refs, NoRepair);
|
||||||
stopWork();
|
stopWork();
|
||||||
to << path;
|
to << path;
|
||||||
break;
|
break;
|
||||||
|
@ -324,7 +324,8 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
|
||||||
case wopImportPaths: {
|
case wopImportPaths: {
|
||||||
startWork();
|
startWork();
|
||||||
TunnelSource source(from);
|
TunnelSource source(from);
|
||||||
Paths paths = store->importPaths(source, 0, trusted);
|
Paths paths = store->importPaths(source, nullptr,
|
||||||
|
trusted ? NoCheckSigs : CheckSigs);
|
||||||
stopWork();
|
stopWork();
|
||||||
to << paths;
|
to << paths;
|
||||||
break;
|
break;
|
||||||
|
@ -576,7 +577,7 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
|
||||||
startWork();
|
startWork();
|
||||||
if (repair && !trusted)
|
if (repair && !trusted)
|
||||||
throw Error("you are not privileged to repair paths");
|
throw Error("you are not privileged to repair paths");
|
||||||
bool errors = store->verifyStore(checkContents, repair);
|
bool errors = store->verifyStore(checkContents, (RepairFlag) repair);
|
||||||
stopWork();
|
stopWork();
|
||||||
to << errors;
|
to << errors;
|
||||||
break;
|
break;
|
||||||
|
@ -623,7 +624,8 @@ static void performOp(ref<LocalStore> store, bool trusted, unsigned int clientVe
|
||||||
parseDump(tee, tee.source);
|
parseDump(tee, tee.source);
|
||||||
|
|
||||||
startWork();
|
startWork();
|
||||||
store->addToStore(info, tee.source.data, repair, dontCheckSigs, nullptr);
|
store->addToStore(info, tee.source.data, (RepairFlag) repair,
|
||||||
|
dontCheckSigs ? NoCheckSigs : CheckSigs, nullptr);
|
||||||
stopWork();
|
stopWork();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1310,7 +1310,7 @@ int main(int argc, char * * argv)
|
||||||
Strings opFlags, opArgs, searchPath;
|
Strings opFlags, opArgs, searchPath;
|
||||||
std::map<string, string> autoArgs_;
|
std::map<string, string> autoArgs_;
|
||||||
Operation op = 0;
|
Operation op = 0;
|
||||||
bool repair = false;
|
RepairFlag repair = NoRepair;
|
||||||
string file;
|
string file;
|
||||||
|
|
||||||
Globals globals;
|
Globals globals;
|
||||||
|
@ -1372,7 +1372,7 @@ int main(int argc, char * * argv)
|
||||||
else if (*arg == "--prebuilt-only" || *arg == "-b")
|
else if (*arg == "--prebuilt-only" || *arg == "-b")
|
||||||
globals.prebuiltOnly = true;
|
globals.prebuiltOnly = true;
|
||||||
else if (*arg == "--repair")
|
else if (*arg == "--repair")
|
||||||
repair = true;
|
repair = Repair;
|
||||||
else if (*arg != "" && arg->at(0) == '-') {
|
else if (*arg != "" && arg->at(0) == '-') {
|
||||||
opFlags.push_back(*arg);
|
opFlags.push_back(*arg);
|
||||||
/* FIXME: hacky */
|
/* FIXME: hacky */
|
||||||
|
|
|
@ -108,7 +108,7 @@ int main(int argc, char * * argv)
|
||||||
Strings attrPaths;
|
Strings attrPaths;
|
||||||
bool wantsReadWrite = false;
|
bool wantsReadWrite = false;
|
||||||
std::map<string, string> autoArgs_;
|
std::map<string, string> autoArgs_;
|
||||||
bool repair = false;
|
RepairFlag repair = NoRepair;
|
||||||
|
|
||||||
parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) {
|
parseCmdLine(argc, argv, [&](Strings::iterator & arg, const Strings::iterator & end) {
|
||||||
if (*arg == "--help")
|
if (*arg == "--help")
|
||||||
|
@ -146,7 +146,7 @@ int main(int argc, char * * argv)
|
||||||
else if (*arg == "--strict")
|
else if (*arg == "--strict")
|
||||||
strict = true;
|
strict = true;
|
||||||
else if (*arg == "--repair")
|
else if (*arg == "--repair")
|
||||||
repair = true;
|
repair = Repair;
|
||||||
else if (*arg == "--dry-run")
|
else if (*arg == "--dry-run")
|
||||||
settings.readOnlyMode = true;
|
settings.readOnlyMode = true;
|
||||||
else if (*arg != "" && arg->at(0) == '-')
|
else if (*arg != "" && arg->at(0) == '-')
|
||||||
|
|
|
@ -677,7 +677,7 @@ static void opImport(Strings opFlags, Strings opArgs)
|
||||||
if (!opArgs.empty()) throw UsageError("no arguments expected");
|
if (!opArgs.empty()) throw UsageError("no arguments expected");
|
||||||
|
|
||||||
FdSource source(STDIN_FILENO);
|
FdSource source(STDIN_FILENO);
|
||||||
Paths paths = store->importPaths(source, nullptr, true);
|
Paths paths = store->importPaths(source, nullptr, NoCheckSigs);
|
||||||
|
|
||||||
for (auto & i : paths)
|
for (auto & i : paths)
|
||||||
cout << format("%1%\n") % i << std::flush;
|
cout << format("%1%\n") % i << std::flush;
|
||||||
|
@ -702,11 +702,11 @@ static void opVerify(Strings opFlags, Strings opArgs)
|
||||||
throw UsageError("no arguments expected");
|
throw UsageError("no arguments expected");
|
||||||
|
|
||||||
bool checkContents = false;
|
bool checkContents = false;
|
||||||
bool repair = false;
|
RepairFlag repair = NoRepair;
|
||||||
|
|
||||||
for (auto & i : opFlags)
|
for (auto & i : opFlags)
|
||||||
if (i == "--check-contents") checkContents = true;
|
if (i == "--check-contents") checkContents = true;
|
||||||
else if (i == "--repair") repair = true;
|
else if (i == "--repair") repair = Repair;
|
||||||
else throw UsageError(format("unknown flag ‘%1%’") % i);
|
else throw UsageError(format("unknown flag ‘%1%’") % i);
|
||||||
|
|
||||||
if (store->verifyStore(checkContents, repair)) {
|
if (store->verifyStore(checkContents, repair)) {
|
||||||
|
@ -871,7 +871,7 @@ static void opServe(Strings opFlags, Strings opArgs)
|
||||||
|
|
||||||
case cmdImportPaths: {
|
case cmdImportPaths: {
|
||||||
if (!writeAllowed) throw Error("importing paths is not allowed");
|
if (!writeAllowed) throw Error("importing paths is not allowed");
|
||||||
store->importPaths(in, 0, true); // FIXME: should we skip sig checking?
|
store->importPaths(in, nullptr, NoCheckSigs); // FIXME: should we skip sig checking?
|
||||||
out << 1; // indicate success
|
out << 1; // indicate success
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue