mirror of
https://github.com/NixOS/nix
synced 2025-06-27 16:51:15 +02:00
Replace Unicode quotes in user-facing strings by ASCII
Relevant RFC: NixOS/rfcs#4 $ ag -l | xargs sed -i -e "/\"/s/’/'/g;/\"/s/‘/'/g"
This commit is contained in:
parent
c7654bc491
commit
2fd8f8bb99
86 changed files with 662 additions and 662 deletions
|
@ -39,7 +39,7 @@ struct BinaryCacheStoreAccessor : public FSAccessor
|
|||
std::string restPath = std::string(path, storePath.size());
|
||||
|
||||
if (!store->isValidPath(storePath))
|
||||
throw InvalidPath(format("path ‘%1%’ is not a valid store path") % storePath);
|
||||
throw InvalidPath(format("path '%1%' is not a valid store path") % storePath);
|
||||
|
||||
auto i = nars.find(storePath);
|
||||
if (i != nars.end()) return {i->second, restPath};
|
||||
|
@ -103,7 +103,7 @@ void BinaryCacheStore::init()
|
|||
auto value = trim(line.substr(colon + 1, std::string::npos));
|
||||
if (name == "StoreDir") {
|
||||
if (value != storeDir)
|
||||
throw Error(format("binary cache ‘%s’ is for Nix stores with prefix ‘%s’, not ‘%s’")
|
||||
throw Error(format("binary cache '%s' is for Nix stores with prefix '%s', not '%s'")
|
||||
% getUri() % value % storeDir);
|
||||
} else if (name == "WantMassQuery") {
|
||||
wantMassQuery_ = value == "1";
|
||||
|
@ -145,7 +145,7 @@ void BinaryCacheStore::addToStore(const ValidPathInfo & info, const ref<std::str
|
|||
if (ref != info.path)
|
||||
queryPathInfo(ref);
|
||||
} catch (InvalidPath &) {
|
||||
throw Error(format("cannot add ‘%s’ to the binary cache because the reference ‘%s’ is not valid")
|
||||
throw Error(format("cannot add '%s' to the binary cache because the reference '%s' is not valid")
|
||||
% info.path % ref);
|
||||
}
|
||||
|
||||
|
@ -159,7 +159,7 @@ void BinaryCacheStore::addToStore(const ValidPathInfo & info, const ref<std::str
|
|||
narInfo->narHash = hashString(htSHA256, *nar);
|
||||
|
||||
if (info.narHash && info.narHash != narInfo->narHash)
|
||||
throw Error(format("refusing to copy corrupted path ‘%1%’ to binary cache") % info.path);
|
||||
throw Error(format("refusing to copy corrupted path '%1%' to binary cache") % info.path);
|
||||
|
||||
auto accessor_ = std::dynamic_pointer_cast<BinaryCacheStoreAccessor>(accessor);
|
||||
|
||||
|
@ -233,7 +233,7 @@ void BinaryCacheStore::addToStore(const ValidPathInfo & info, const ref<std::str
|
|||
narInfo->fileSize = narCompressed->size();
|
||||
|
||||
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now2 - now1).count();
|
||||
printMsg(lvlTalkative, format("copying path ‘%1%’ (%2% bytes, compressed %3$.1f%% in %4% ms) to binary cache")
|
||||
printMsg(lvlTalkative, format("copying path '%1%' (%2% bytes, compressed %3$.1f%% in %4% ms) to binary cache")
|
||||
% narInfo->path % narInfo->narSize
|
||||
% ((1.0 - (double) narCompressed->size() / nar->size()) * 100.0)
|
||||
% duration);
|
||||
|
@ -286,7 +286,7 @@ void BinaryCacheStore::narFromPath(const Path & storePath, Sink & sink)
|
|||
|
||||
auto nar = getFile(info->url);
|
||||
|
||||
if (!nar) throw Error(format("file ‘%s’ missing from binary cache") % info->url);
|
||||
if (!nar) throw Error(format("file '%s' missing from binary cache") % info->url);
|
||||
|
||||
stats.narRead++;
|
||||
stats.narReadCompressedBytes += nar->size();
|
||||
|
@ -296,13 +296,13 @@ void BinaryCacheStore::narFromPath(const Path & storePath, Sink & sink)
|
|||
try {
|
||||
nar = decompress(info->compression, *nar);
|
||||
} catch (UnknownCompressionMethod &) {
|
||||
throw Error(format("binary cache path ‘%s’ uses unknown compression method ‘%s’")
|
||||
throw Error(format("binary cache path '%s' uses unknown compression method '%s'")
|
||||
% storePath % info->compression);
|
||||
}
|
||||
|
||||
stats.narReadBytes += nar->size();
|
||||
|
||||
printMsg(lvlTalkative, format("exporting path ‘%1%’ (%2% bytes)") % storePath % nar->size());
|
||||
printMsg(lvlTalkative, format("exporting path '%1%' (%2% bytes)") % storePath % nar->size());
|
||||
|
||||
assert(nar->size() % 8 == 0);
|
||||
|
||||
|
@ -394,7 +394,7 @@ std::shared_ptr<std::string> BinaryCacheStore::getBuildLog(const Path & path)
|
|||
|
||||
auto logPath = "log/" + baseNameOf(drvPath);
|
||||
|
||||
debug("fetching build log from binary cache ‘%s/%s’", getUri(), logPath);
|
||||
debug("fetching build log from binary cache '%s/%s'", getUri(), logPath);
|
||||
|
||||
return getFile(logPath);
|
||||
}
|
||||
|
|
|
@ -341,7 +341,7 @@ void Goal::waiteeDone(GoalPtr waitee, ExitCode result)
|
|||
assert(waitees.find(waitee) != waitees.end());
|
||||
waitees.erase(waitee);
|
||||
|
||||
trace(format("waitee ‘%1%’ done; %2% left") %
|
||||
trace(format("waitee '%1%' done; %2% left") %
|
||||
waitee->name % waitees.size());
|
||||
|
||||
if (result == ecFailed || result == ecNoSubstituters || result == ecIncompleteClosure) ++nrFailed;
|
||||
|
@ -415,7 +415,7 @@ static void commonChildInit(Pipe & logPipe)
|
|||
/* Reroute stdin to /dev/null. */
|
||||
int fdDevNull = open(pathNullDevice.c_str(), O_RDWR);
|
||||
if (fdDevNull == -1)
|
||||
throw SysError(format("cannot open ‘%1%’") % pathNullDevice);
|
||||
throw SysError(format("cannot open '%1%'") % pathNullDevice);
|
||||
if (dup2(fdDevNull, STDIN_FILENO) == -1)
|
||||
throw SysError("cannot dup null device into stdin");
|
||||
close(fdDevNull);
|
||||
|
@ -468,29 +468,29 @@ UserLock::UserLock()
|
|||
/* Get the members of the build-users-group. */
|
||||
struct group * gr = getgrnam(settings.buildUsersGroup.get().c_str());
|
||||
if (!gr)
|
||||
throw Error(format("the group ‘%1%’ specified in ‘build-users-group’ does not exist")
|
||||
throw Error(format("the group '%1%' specified in 'build-users-group' does not exist")
|
||||
% settings.buildUsersGroup);
|
||||
gid = gr->gr_gid;
|
||||
|
||||
/* Copy the result of getgrnam. */
|
||||
Strings users;
|
||||
for (char * * p = gr->gr_mem; *p; ++p) {
|
||||
debug(format("found build user ‘%1%’") % *p);
|
||||
debug(format("found build user '%1%'") % *p);
|
||||
users.push_back(*p);
|
||||
}
|
||||
|
||||
if (users.empty())
|
||||
throw Error(format("the build users group ‘%1%’ has no members")
|
||||
throw Error(format("the build users group '%1%' has no members")
|
||||
% settings.buildUsersGroup);
|
||||
|
||||
/* Find a user account that isn't currently in use for another
|
||||
build. */
|
||||
for (auto & i : users) {
|
||||
debug(format("trying user ‘%1%’") % i);
|
||||
debug(format("trying user '%1%'") % i);
|
||||
|
||||
struct passwd * pw = getpwnam(i.c_str());
|
||||
if (!pw)
|
||||
throw Error(format("the user ‘%1%’ in the group ‘%2%’ does not exist")
|
||||
throw Error(format("the user '%1%' in the group '%2%' does not exist")
|
||||
% i % settings.buildUsersGroup);
|
||||
|
||||
createDirs(settings.nixStateDir + "/userpool");
|
||||
|
@ -509,7 +509,7 @@ UserLock::UserLock()
|
|||
|
||||
AutoCloseFD fd = open(fnUserLock.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600);
|
||||
if (!fd)
|
||||
throw SysError(format("opening user lock ‘%1%’") % fnUserLock);
|
||||
throw SysError(format("opening user lock '%1%'") % fnUserLock);
|
||||
|
||||
if (lockFile(fd.get(), ltWrite, false)) {
|
||||
fdUserLock = std::move(fd);
|
||||
|
@ -518,7 +518,7 @@ UserLock::UserLock()
|
|||
|
||||
/* Sanity check... */
|
||||
if (uid == getuid() || uid == geteuid())
|
||||
throw Error(format("the Nix user should not be a member of ‘%1%’")
|
||||
throw Error(format("the Nix user should not be a member of '%1%'")
|
||||
% settings.buildUsersGroup);
|
||||
|
||||
#if __linux__
|
||||
|
@ -529,7 +529,7 @@ UserLock::UserLock()
|
|||
int err = getgrouplist(pw->pw_name, pw->pw_gid,
|
||||
supplementaryGIDs.data(), &ngroups);
|
||||
if (err == -1)
|
||||
throw Error(format("failed to get list of supplementary groups for ‘%1%’") % pw->pw_name);
|
||||
throw Error(format("failed to get list of supplementary groups for '%1%'") % pw->pw_name);
|
||||
|
||||
supplementaryGIDs.resize(ngroups);
|
||||
#endif
|
||||
|
@ -543,7 +543,7 @@ UserLock::UserLock()
|
|||
}
|
||||
|
||||
throw Error(format("all build users are currently in use; "
|
||||
"consider creating additional users and adding them to the ‘%1%’ group")
|
||||
"consider creating additional users and adding them to the '%1%' group")
|
||||
% settings.buildUsersGroup);
|
||||
}
|
||||
|
||||
|
@ -587,7 +587,7 @@ struct HookInstance
|
|||
|
||||
HookInstance::HookInstance()
|
||||
{
|
||||
debug("starting build hook ‘%s’", settings.buildHook);
|
||||
debug("starting build hook '%s'", settings.buildHook);
|
||||
|
||||
/* Create a pipe to get the output of the child. */
|
||||
fromHook.create();
|
||||
|
@ -624,7 +624,7 @@ HookInstance::HookInstance()
|
|||
|
||||
execv(settings.buildHook.get().c_str(), stringsToCharPtrs(args).data());
|
||||
|
||||
throw SysError("executing ‘%s’", settings.buildHook);
|
||||
throw SysError("executing '%s'", settings.buildHook);
|
||||
});
|
||||
|
||||
pid.setSeparatePG(true);
|
||||
|
@ -927,7 +927,7 @@ DerivationGoal::DerivationGoal(const Path & drvPath, const StringSet & wantedOut
|
|||
, buildMode(buildMode)
|
||||
{
|
||||
state = &DerivationGoal::getDerivation;
|
||||
name = (format("building of ‘%1%’") % drvPath).str();
|
||||
name = (format("building of '%1%'") % drvPath).str();
|
||||
trace("created");
|
||||
|
||||
logger->event(evBuildCreated, act, drvPath);
|
||||
|
@ -1042,7 +1042,7 @@ void DerivationGoal::loadDerivation()
|
|||
trace("loading derivation");
|
||||
|
||||
if (nrFailed != 0) {
|
||||
printError(format("cannot build missing derivation ‘%1%’") % drvPath);
|
||||
printError(format("cannot build missing derivation '%1%'") % drvPath);
|
||||
done(BuildResult::MiscFailure);
|
||||
return;
|
||||
}
|
||||
|
@ -1080,7 +1080,7 @@ void DerivationGoal::haveDerivation()
|
|||
/* Reject doing a hash build of anything other than a fixed-output
|
||||
derivation. */
|
||||
if (buildMode == bmHash && !drv->isFixedOutput())
|
||||
throw Error("cannot do a hash build of non-fixed-output derivation ‘%1%’", drvPath);
|
||||
throw Error("cannot do a hash build of non-fixed-output derivation '%1%'", drvPath);
|
||||
|
||||
/* We are first going to try to create the invalid output paths
|
||||
through substitutes. If that doesn't work, we'll build
|
||||
|
@ -1101,7 +1101,7 @@ void DerivationGoal::outputsSubstituted()
|
|||
trace("all outputs substituted (maybe)");
|
||||
|
||||
if (nrFailed > 0 && nrFailed > nrNoSubstituters + nrIncompleteClosure && !settings.tryFallback) {
|
||||
done(BuildResult::TransientFailure, (format("some substitutes for the outputs of derivation ‘%1%’ failed (usually happens due to networking issues); try ‘--fallback’ to build derivation from source ") % drvPath).str());
|
||||
done(BuildResult::TransientFailure, (format("some substitutes for the outputs of derivation '%1%' failed (usually happens due to networking issues); try '--fallback' to build derivation from source ") % drvPath).str());
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1128,7 +1128,7 @@ void DerivationGoal::outputsSubstituted()
|
|||
return;
|
||||
}
|
||||
if (buildMode == bmCheck && nrInvalid > 0)
|
||||
throw Error(format("some outputs of ‘%1%’ are not valid, so checking is not possible") % drvPath);
|
||||
throw Error(format("some outputs of '%1%' are not valid, so checking is not possible") % drvPath);
|
||||
|
||||
/* Otherwise, at least one of the output paths could not be
|
||||
produced using a substitute. So we have to build instead. */
|
||||
|
@ -1145,7 +1145,7 @@ void DerivationGoal::outputsSubstituted()
|
|||
for (auto & i : drv->inputSrcs) {
|
||||
if (worker.store.isValidPath(i)) continue;
|
||||
if (!settings.useSubstitutes)
|
||||
throw Error(format("dependency of ‘%1%’ of ‘%2%’ does not exist, and substitution is disabled")
|
||||
throw Error(format("dependency of '%1%' of '%2%' does not exist, and substitution is disabled")
|
||||
% i % drvPath);
|
||||
addWaitee(worker.makeSubstitutionGoal(i));
|
||||
}
|
||||
|
@ -1192,7 +1192,7 @@ void DerivationGoal::repairClosure()
|
|||
PathSet broken;
|
||||
for (auto & i : outputClosure) {
|
||||
if (worker.pathContentsGood(i)) continue;
|
||||
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];
|
||||
if (drvPath2 == "")
|
||||
addWaitee(worker.makeSubstitutionGoal(i, Repair));
|
||||
|
@ -1213,7 +1213,7 @@ void DerivationGoal::closureRepaired()
|
|||
{
|
||||
trace("closure repaired");
|
||||
if (nrFailed > 0)
|
||||
throw Error(format("some paths in the output closure of derivation ‘%1%’ could not be repaired") % drvPath);
|
||||
throw Error(format("some paths in the output closure of derivation '%1%' could not be repaired") % drvPath);
|
||||
done(BuildResult::AlreadyValid);
|
||||
}
|
||||
|
||||
|
@ -1224,9 +1224,9 @@ void DerivationGoal::inputsRealised()
|
|||
|
||||
if (nrFailed != 0) {
|
||||
if (!useDerivation)
|
||||
throw Error(format("some dependencies of ‘%1%’ are missing") % drvPath);
|
||||
throw Error(format("some dependencies of '%1%' are missing") % drvPath);
|
||||
printError(
|
||||
format("cannot build derivation ‘%1%’: %2% dependencies couldn't be built")
|
||||
format("cannot build derivation '%1%': %2% dependencies couldn't be built")
|
||||
% drvPath % nrFailed);
|
||||
done(BuildResult::DependencyFailed);
|
||||
return;
|
||||
|
@ -1242,7 +1242,7 @@ void DerivationGoal::inputsRealised()
|
|||
|
||||
/* The outputs are referenceable paths. */
|
||||
for (auto & i : drv->outputs) {
|
||||
debug(format("building path ‘%1%’") % i.second.path);
|
||||
debug(format("building path '%1%'") % i.second.path);
|
||||
allPaths.insert(i.second.path);
|
||||
}
|
||||
|
||||
|
@ -1261,7 +1261,7 @@ void DerivationGoal::inputsRealised()
|
|||
worker.store.computeFSClosure(inDrv.outputs[j].path, inputPaths);
|
||||
else
|
||||
throw Error(
|
||||
format("derivation ‘%1%’ requires non-existent output ‘%2%’ from input derivation ‘%3%’")
|
||||
format("derivation '%1%' requires non-existent output '%2%' from input derivation '%3%'")
|
||||
% drvPath % j % i.first);
|
||||
}
|
||||
|
||||
|
@ -1302,7 +1302,7 @@ void DerivationGoal::tryToBuild()
|
|||
goal to sleep until another goal finishes, then try again. */
|
||||
for (auto & i : drv->outputs)
|
||||
if (pathIsLockedByMe(worker.store.toRealPath(i.second.path))) {
|
||||
debug(format("putting derivation ‘%1%’ to sleep because ‘%2%’ is locked by another goal")
|
||||
debug(format("putting derivation '%1%' to sleep because '%2%' is locked by another goal")
|
||||
% drvPath % i.second.path);
|
||||
worker.waitForAnyGoal(shared_from_this());
|
||||
return;
|
||||
|
@ -1331,7 +1331,7 @@ void DerivationGoal::tryToBuild()
|
|||
build this derivation, so no further checks are necessary. */
|
||||
validPaths = checkPathValidity(true, buildMode == bmRepair);
|
||||
if (buildMode != bmCheck && validPaths.size() == drv->outputs.size()) {
|
||||
debug(format("skipping build of derivation ‘%1%’, someone beat us to it") % drvPath);
|
||||
debug(format("skipping build of derivation '%1%', someone beat us to it") % drvPath);
|
||||
outputLocks.setDeletion(true);
|
||||
done(BuildResult::AlreadyValid);
|
||||
return;
|
||||
|
@ -1346,7 +1346,7 @@ void DerivationGoal::tryToBuild()
|
|||
for (auto & i : drv->outputs) {
|
||||
Path path = i.second.path;
|
||||
if (worker.store.isValidPath(path)) continue;
|
||||
debug(format("removing invalid path ‘%1%’") % path);
|
||||
debug(format("removing invalid path '%1%'") % path);
|
||||
deletePath(worker.store.toRealPath(path));
|
||||
}
|
||||
|
||||
|
@ -1416,7 +1416,7 @@ void replaceValidPath(const Path & storePath, const Path tmpPath)
|
|||
if (pathExists(storePath))
|
||||
rename(storePath.c_str(), oldPath.c_str());
|
||||
if (rename(tmpPath.c_str(), storePath.c_str()) == -1)
|
||||
throw SysError(format("moving ‘%1%’ to ‘%2%’") % tmpPath % storePath);
|
||||
throw SysError(format("moving '%1%' to '%2%'") % tmpPath % storePath);
|
||||
deletePath(oldPath);
|
||||
}
|
||||
|
||||
|
@ -1439,7 +1439,7 @@ void DerivationGoal::buildDone()
|
|||
kill it. */
|
||||
int status = hook ? hook->pid.kill() : pid.kill();
|
||||
|
||||
debug(format("builder process for ‘%1%’ finished") % drvPath);
|
||||
debug(format("builder process for '%1%' finished") % drvPath);
|
||||
|
||||
result.timesBuilt++;
|
||||
result.stopTime = time(0);
|
||||
|
@ -1496,7 +1496,7 @@ void DerivationGoal::buildDone()
|
|||
if (pathExists(chrootRootDir + i))
|
||||
rename((chrootRootDir + i).c_str(), i.c_str());
|
||||
|
||||
std::string msg = (format("builder for ‘%1%’ %2%")
|
||||
std::string msg = (format("builder for '%1%' %2%")
|
||||
% drvPath % statusToString(status)).str();
|
||||
|
||||
if (!settings.verboseBuild && !logTail.empty()) {
|
||||
|
@ -1606,7 +1606,7 @@ HookReply DerivationGoal::tryBuildHook()
|
|||
writeToStderr(s);
|
||||
}
|
||||
|
||||
debug(format("hook reply is ‘%1%’") % reply);
|
||||
debug(format("hook reply is '%1%'") % reply);
|
||||
|
||||
if (reply == "decline")
|
||||
return rpDecline;
|
||||
|
@ -1618,7 +1618,7 @@ HookReply DerivationGoal::tryBuildHook()
|
|||
else if (reply == "postpone")
|
||||
return rpPostpone;
|
||||
else if (reply != "accept")
|
||||
throw Error(format("bad hook reply ‘%1%’") % reply);
|
||||
throw Error(format("bad hook reply '%1%'") % reply);
|
||||
|
||||
} catch (SysError & e) {
|
||||
if (e.errNo == EPIPE) {
|
||||
|
@ -1659,7 +1659,7 @@ HookReply DerivationGoal::tryBuildHook()
|
|||
void chmod_(const Path & path, mode_t mode)
|
||||
{
|
||||
if (chmod(path.c_str(), mode) == -1)
|
||||
throw SysError(format("setting permissions on ‘%1%’") % path);
|
||||
throw SysError(format("setting permissions on '%1%'") % path);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1683,7 +1683,7 @@ void DerivationGoal::startBuilder()
|
|||
/* Right platform? */
|
||||
if (!drv->canBuildLocally()) {
|
||||
throw Error(
|
||||
format("a ‘%1%’ is required to build ‘%3%’, but I am a ‘%2%’")
|
||||
format("a '%1%' is required to build '%3%', but I am a '%2%'")
|
||||
% drv->platform % settings.thisSystem % drvPath);
|
||||
}
|
||||
|
||||
|
@ -1695,12 +1695,12 @@ void DerivationGoal::startBuilder()
|
|||
{
|
||||
if (settings.sandboxMode == smEnabled) {
|
||||
if (get(drv->env, "__noChroot") == "1")
|
||||
throw Error(format("derivation ‘%1%’ has ‘__noChroot’ set, "
|
||||
"but that's not allowed when ‘build-use-sandbox’ is ‘true’") % drvPath);
|
||||
throw Error(format("derivation '%1%' has '__noChroot' set, "
|
||||
"but that's not allowed when 'build-use-sandbox' is 'true'") % drvPath);
|
||||
#if __APPLE__
|
||||
if (additionalSandboxProfile != "")
|
||||
throw Error(format("derivation ‘%1%’ specifies a sandbox profile, "
|
||||
"but this is only allowed when ‘build-use-sandbox’ is ‘relaxed’") % drvPath);
|
||||
throw Error(format("derivation '%1%' specifies a sandbox profile, "
|
||||
"but this is only allowed when 'build-use-sandbox' is 'relaxed'") % drvPath);
|
||||
#endif
|
||||
useChroot = true;
|
||||
}
|
||||
|
@ -1788,7 +1788,7 @@ void DerivationGoal::startBuilder()
|
|||
worker.store.computeFSClosure(worker.store.toStorePath(i.second.source), closure);
|
||||
} catch (InvalidPath & e) {
|
||||
} catch (Error & e) {
|
||||
throw Error(format("while processing ‘build-sandbox-paths’: %s") % e.what());
|
||||
throw Error(format("while processing 'build-sandbox-paths': %s") % e.what());
|
||||
}
|
||||
for (auto & i : closure)
|
||||
dirsInChroot[i] = i;
|
||||
|
@ -1813,7 +1813,7 @@ void DerivationGoal::startBuilder()
|
|||
}
|
||||
}
|
||||
if (!found)
|
||||
throw Error(format("derivation ‘%1%’ requested impure path ‘%2%’, but it was not in allowed-impure-host-deps") % drvPath % i);
|
||||
throw Error(format("derivation '%1%' requested impure path '%2%', but it was not in allowed-impure-host-deps") % drvPath % i);
|
||||
|
||||
dirsInChroot[i] = i;
|
||||
}
|
||||
|
@ -1829,13 +1829,13 @@ void DerivationGoal::startBuilder()
|
|||
/* Clean up the chroot directory automatically. */
|
||||
autoDelChroot = std::make_shared<AutoDelete>(chrootRootDir);
|
||||
|
||||
printMsg(lvlChatty, format("setting up chroot environment in ‘%1%’") % chrootRootDir);
|
||||
printMsg(lvlChatty, format("setting up chroot environment in '%1%'") % chrootRootDir);
|
||||
|
||||
if (mkdir(chrootRootDir.c_str(), 0750) == -1)
|
||||
throw SysError(format("cannot create ‘%1%’") % chrootRootDir);
|
||||
throw SysError(format("cannot create '%1%'") % chrootRootDir);
|
||||
|
||||
if (buildUser && chown(chrootRootDir.c_str(), 0, buildUser->getGID()) == -1)
|
||||
throw SysError(format("cannot change ownership of ‘%1%’") % chrootRootDir);
|
||||
throw SysError(format("cannot change ownership of '%1%'") % chrootRootDir);
|
||||
|
||||
/* Create a writable /tmp in the chroot. Many builders need
|
||||
this. (Of course they should really respect $TMPDIR
|
||||
|
@ -1879,25 +1879,25 @@ void DerivationGoal::startBuilder()
|
|||
chmod_(chrootStoreDir, 01775);
|
||||
|
||||
if (buildUser && chown(chrootStoreDir.c_str(), 0, buildUser->getGID()) == -1)
|
||||
throw SysError(format("cannot change ownership of ‘%1%’") % chrootStoreDir);
|
||||
throw SysError(format("cannot change ownership of '%1%'") % chrootStoreDir);
|
||||
|
||||
for (auto & i : inputPaths) {
|
||||
Path r = worker.store.toRealPath(i);
|
||||
struct stat st;
|
||||
if (lstat(r.c_str(), &st))
|
||||
throw SysError(format("getting attributes of path ‘%1%’") % i);
|
||||
throw SysError(format("getting attributes of path '%1%'") % i);
|
||||
if (S_ISDIR(st.st_mode))
|
||||
dirsInChroot[i] = r;
|
||||
else {
|
||||
Path p = chrootRootDir + i;
|
||||
debug("linking ‘%1%’ to ‘%2%’", p, r);
|
||||
debug("linking '%1%' to '%2%'", p, r);
|
||||
if (link(r.c_str(), p.c_str()) == -1) {
|
||||
/* Hard-linking fails if we exceed the maximum
|
||||
link count on a file (e.g. 32000 of ext3),
|
||||
which is quite possible after a `nix-store
|
||||
--optimise'. */
|
||||
if (errno != EMLINK)
|
||||
throw SysError(format("linking ‘%1%’ to ‘%2%’") % p % i);
|
||||
throw SysError(format("linking '%1%' to '%2%'") % p % i);
|
||||
StringSink sink;
|
||||
dumpPath(r, sink);
|
||||
StringSource source(*sink.s);
|
||||
|
@ -1925,7 +1925,7 @@ void DerivationGoal::startBuilder()
|
|||
else {
|
||||
|
||||
if (pathExists(homeDir))
|
||||
throw Error(format("directory ‘%1%’ exists; please remove it") % homeDir);
|
||||
throw Error(format("directory '%1%' exists; please remove it") % homeDir);
|
||||
|
||||
/* We're not doing a chroot build, but we have some valid
|
||||
output paths. Since we can't just overwrite or delete
|
||||
|
@ -1951,7 +1951,7 @@ void DerivationGoal::startBuilder()
|
|||
}
|
||||
|
||||
if (useChroot && settings.preBuildHook != "" && dynamic_cast<Derivation *>(drv.get())) {
|
||||
printMsg(lvlChatty, format("executing pre-build hook ‘%1%’")
|
||||
printMsg(lvlChatty, format("executing pre-build hook '%1%'")
|
||||
% settings.preBuildHook);
|
||||
auto args = useChroot ? Strings({drvPath, chrootRootDir}) :
|
||||
Strings({ drvPath });
|
||||
|
@ -1970,7 +1970,7 @@ void DerivationGoal::startBuilder()
|
|||
if (line == "extra-sandbox-paths" || line == "extra-chroot-dirs") {
|
||||
state = stExtraChrootDirs;
|
||||
} else {
|
||||
throw Error(format("unknown pre-build hook command ‘%1%’")
|
||||
throw Error(format("unknown pre-build hook command '%1%'")
|
||||
% line);
|
||||
}
|
||||
} else if (state == stExtraChrootDirs) {
|
||||
|
@ -1988,7 +1988,7 @@ void DerivationGoal::startBuilder()
|
|||
}
|
||||
|
||||
/* Run the builder. */
|
||||
printMsg(lvlChatty, format("executing builder ‘%1%’") % drv->builder);
|
||||
printMsg(lvlChatty, format("executing builder '%1%'") % drv->builder);
|
||||
|
||||
/* Create the log file. */
|
||||
Path logFile = openLogFile();
|
||||
|
@ -2232,7 +2232,7 @@ void DerivationGoal::chownToBuilder(const Path & path)
|
|||
{
|
||||
if (!buildUser) return;
|
||||
if (chown(path.c_str(), buildUser->getUID(), buildUser->getGID()) == -1)
|
||||
throw SysError(format("cannot change ownership of ‘%1%’") % path);
|
||||
throw SysError(format("cannot change ownership of '%1%'") % path);
|
||||
}
|
||||
|
||||
|
||||
|
@ -2248,7 +2248,7 @@ void DerivationGoal::doExportReferencesGraph()
|
|||
string s = get(drv->env, "exportReferencesGraph");
|
||||
Strings ss = tokenizeString<Strings>(s);
|
||||
if (ss.size() % 2 != 0)
|
||||
throw BuildError(format("odd number of tokens in ‘exportReferencesGraph’: ‘%1%’") % s);
|
||||
throw BuildError(format("odd number of tokens in 'exportReferencesGraph': '%1%'") % s);
|
||||
for (Strings::iterator i = ss.begin(); i != ss.end(); ) {
|
||||
string fileName = *i++;
|
||||
checkStoreName(fileName); /* !!! abuse of this function */
|
||||
|
@ -2256,11 +2256,11 @@ void DerivationGoal::doExportReferencesGraph()
|
|||
/* Check that the store path is valid. */
|
||||
Path storePath = *i++;
|
||||
if (!worker.store.isInStore(storePath))
|
||||
throw BuildError(format("‘exportReferencesGraph’ contains a non-store path ‘%1%’")
|
||||
throw BuildError(format("'exportReferencesGraph' contains a non-store path '%1%'")
|
||||
% storePath);
|
||||
storePath = worker.store.toStorePath(storePath);
|
||||
if (!worker.store.isValidPath(storePath))
|
||||
throw BuildError(format("‘exportReferencesGraph’ contains an invalid path ‘%1%’")
|
||||
throw BuildError(format("'exportReferencesGraph' contains an invalid path '%1%'")
|
||||
% storePath);
|
||||
|
||||
/* If there are derivations in the graph, then include their
|
||||
|
@ -2418,13 +2418,13 @@ void DerivationGoal::runChild()
|
|||
local to the namespace, though, so setting MS_PRIVATE
|
||||
does not affect the outside world. */
|
||||
if (mount(0, "/", 0, MS_REC|MS_PRIVATE, 0) == -1) {
|
||||
throw SysError("unable to make ‘/’ private mount");
|
||||
throw SysError("unable to make '/' private mount");
|
||||
}
|
||||
|
||||
/* Bind-mount chroot directory to itself, to treat it as a
|
||||
different filesystem from /, as needed for pivot_root. */
|
||||
if (mount(chrootRootDir.c_str(), chrootRootDir.c_str(), 0, MS_BIND, 0) == -1)
|
||||
throw SysError(format("unable to bind mount ‘%1%’") % chrootRootDir);
|
||||
throw SysError(format("unable to bind mount '%1%'") % chrootRootDir);
|
||||
|
||||
/* Set up a nearly empty /dev, unless the user asked to
|
||||
bind-mount the host /dev. */
|
||||
|
@ -2464,13 +2464,13 @@ void DerivationGoal::runChild()
|
|||
filesystem that we want in the chroot
|
||||
environment. */
|
||||
auto doBind = [&](const Path & source, const Path & target, bool optional = false) {
|
||||
debug(format("bind mounting ‘%1%’ to ‘%2%’") % source % target);
|
||||
debug(format("bind mounting '%1%' to '%2%'") % source % target);
|
||||
struct stat st;
|
||||
if (stat(source.c_str(), &st) == -1) {
|
||||
if (optional && errno == ENOENT)
|
||||
return;
|
||||
else
|
||||
throw SysError("getting attributes of path ‘%1%’", source);
|
||||
throw SysError("getting attributes of path '%1%'", source);
|
||||
}
|
||||
if (S_ISDIR(st.st_mode))
|
||||
createDirs(target);
|
||||
|
@ -2479,7 +2479,7 @@ void DerivationGoal::runChild()
|
|||
writeFile(target, "");
|
||||
}
|
||||
if (mount(source.c_str(), target.c_str(), "", MS_BIND | MS_REC, 0) == -1)
|
||||
throw SysError("bind mount from ‘%1%’ to ‘%2%’ failed", source, target);
|
||||
throw SysError("bind mount from '%1%' to '%2%' failed", source, target);
|
||||
};
|
||||
|
||||
for (auto & i : dirsInChroot) {
|
||||
|
@ -2523,16 +2523,16 @@ void DerivationGoal::runChild()
|
|||
|
||||
/* Do the chroot(). */
|
||||
if (chdir(chrootRootDir.c_str()) == -1)
|
||||
throw SysError(format("cannot change directory to ‘%1%’") % chrootRootDir);
|
||||
throw SysError(format("cannot change directory to '%1%'") % chrootRootDir);
|
||||
|
||||
if (mkdir("real-root", 0) == -1)
|
||||
throw SysError("cannot create real-root directory");
|
||||
|
||||
if (pivot_root(".", "real-root") == -1)
|
||||
throw SysError(format("cannot pivot old root directory onto ‘%1%’") % (chrootRootDir + "/real-root"));
|
||||
throw SysError(format("cannot pivot old root directory onto '%1%'") % (chrootRootDir + "/real-root"));
|
||||
|
||||
if (chroot(".") == -1)
|
||||
throw SysError(format("cannot change root directory to ‘%1%’") % chrootRootDir);
|
||||
throw SysError(format("cannot change root directory to '%1%'") % chrootRootDir);
|
||||
|
||||
if (umount2("real-root", MNT_DETACH) == -1)
|
||||
throw SysError("cannot unmount real root filesystem");
|
||||
|
@ -2553,7 +2553,7 @@ void DerivationGoal::runChild()
|
|||
#endif
|
||||
|
||||
if (chdir(tmpDirInSandbox.c_str()) == -1)
|
||||
throw SysError(format("changing into ‘%1%’") % tmpDir);
|
||||
throw SysError(format("changing into '%1%'") % tmpDir);
|
||||
|
||||
/* Close all other file descriptors. */
|
||||
closeMostFDs(set<int>());
|
||||
|
@ -2699,7 +2699,7 @@ void DerivationGoal::runChild()
|
|||
if (lstat(path.c_str(), &st)) {
|
||||
if (i.second.optional && errno == ENOENT)
|
||||
continue;
|
||||
throw SysError(format("getting attributes of path ‘%1%’") % path);
|
||||
throw SysError(format("getting attributes of path '%1%'") % path);
|
||||
}
|
||||
if (S_ISDIR(st.st_mode))
|
||||
sandboxProfile += (format("\t(subpath \"%1%\")\n") % path).str();
|
||||
|
@ -2762,7 +2762,7 @@ void DerivationGoal::runChild()
|
|||
if (drv->builder == "builtin:fetchurl")
|
||||
builtinFetchurl(*drv, netrcData);
|
||||
else
|
||||
throw Error(format("unsupported builtin function ‘%1%’") % string(drv->builder, 8));
|
||||
throw Error(format("unsupported builtin function '%1%'") % string(drv->builder, 8));
|
||||
_exit(0);
|
||||
} catch (std::exception & e) {
|
||||
writeFull(STDERR_FILENO, "error: " + string(e.what()) + "\n");
|
||||
|
@ -2772,7 +2772,7 @@ void DerivationGoal::runChild()
|
|||
|
||||
execve(builder, stringsToCharPtrs(args).data(), stringsToCharPtrs(envStrs).data());
|
||||
|
||||
throw SysError(format("executing ‘%1%’") % drv->builder);
|
||||
throw SysError(format("executing '%1%'") % drv->builder);
|
||||
|
||||
} catch (std::exception & e) {
|
||||
writeFull(STDERR_FILENO, "\1while setting up the build environment: " + string(e.what()) + "\n");
|
||||
|
@ -2794,7 +2794,7 @@ PathSet parseReferenceSpecifiers(Store & store, const BasicDerivation & drv, str
|
|||
else if (drv.outputs.find(i) != drv.outputs.end())
|
||||
result.insert(drv.outputs.find(i)->second.path);
|
||||
else throw BuildError(
|
||||
format("derivation contains an illegal reference specifier ‘%1%’") % i);
|
||||
format("derivation contains an illegal reference specifier '%1%'") % i);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@ -2841,7 +2841,7 @@ void DerivationGoal::registerOutputs()
|
|||
replaceValidPath(path, actualPath);
|
||||
else
|
||||
if (buildMode != bmCheck && rename(actualPath.c_str(), worker.store.toRealPath(path).c_str()) == -1)
|
||||
throw SysError(format("moving build output ‘%1%’ from the sandbox to the Nix store") % path);
|
||||
throw SysError(format("moving build output '%1%' from the sandbox to the Nix store") % path);
|
||||
}
|
||||
if (buildMode != bmCheck) actualPath = worker.store.toRealPath(path);
|
||||
} else {
|
||||
|
@ -2858,9 +2858,9 @@ void DerivationGoal::registerOutputs()
|
|||
if (lstat(actualPath.c_str(), &st) == -1) {
|
||||
if (errno == ENOENT)
|
||||
throw BuildError(
|
||||
format("builder for ‘%1%’ failed to produce output path ‘%2%’")
|
||||
format("builder for '%1%' failed to produce output path '%2%'")
|
||||
% drvPath % path);
|
||||
throw SysError(format("getting attributes of path ‘%1%’") % actualPath);
|
||||
throw SysError(format("getting attributes of path '%1%'") % actualPath);
|
||||
}
|
||||
|
||||
#ifndef __CYGWIN__
|
||||
|
@ -2870,13 +2870,13 @@ void DerivationGoal::registerOutputs()
|
|||
user. */
|
||||
if ((!S_ISLNK(st.st_mode) && (st.st_mode & (S_IWGRP | S_IWOTH))) ||
|
||||
(buildUser && st.st_uid != buildUser->getUID()))
|
||||
throw BuildError(format("suspicious ownership or permission on ‘%1%’; rejecting this build output") % path);
|
||||
throw BuildError(format("suspicious ownership or permission on '%1%'; rejecting this build output") % path);
|
||||
#endif
|
||||
|
||||
/* Apply hash rewriting if necessary. */
|
||||
bool rewritten = false;
|
||||
if (!outputRewrites.empty()) {
|
||||
printError(format("warning: rewriting hashes in ‘%1%’; cross fingers") % path);
|
||||
printError(format("warning: rewriting hashes in '%1%'; cross fingers") % path);
|
||||
|
||||
/* Canonicalise first. This ensures that the path we're
|
||||
rewriting doesn't contain a hard link to /etc/shadow or
|
||||
|
@ -2907,7 +2907,7 @@ void DerivationGoal::registerOutputs()
|
|||
execute permission. */
|
||||
if (!S_ISREG(st.st_mode) || (st.st_mode & S_IXUSR) != 0)
|
||||
throw BuildError(
|
||||
format("output path ‘%1%’ should be a non-executable regular file") % path);
|
||||
format("output path '%1%' should be a non-executable regular file") % path);
|
||||
}
|
||||
|
||||
/* Check the hash. In hash mode, move the path produced by
|
||||
|
@ -2915,7 +2915,7 @@ void DerivationGoal::registerOutputs()
|
|||
Hash h2 = recursive ? hashPath(h.type, actualPath).first : hashFile(h.type, actualPath);
|
||||
if (buildMode == bmHash) {
|
||||
Path dest = worker.store.makeFixedOutputPath(recursive, h2, drv->env["name"]);
|
||||
printError(format("build produced path ‘%1%’ with %2% hash ‘%3%’")
|
||||
printError(format("build produced path '%1%' with %2% hash '%3%'")
|
||||
% dest % printHashType(h.type) % printHash16or32(h2));
|
||||
if (worker.store.isValidPath(dest))
|
||||
return;
|
||||
|
@ -2924,14 +2924,14 @@ void DerivationGoal::registerOutputs()
|
|||
PathLocks outputLocks({actualDest});
|
||||
deletePath(actualDest);
|
||||
if (rename(actualPath.c_str(), actualDest.c_str()) == -1)
|
||||
throw SysError(format("moving ‘%1%’ to ‘%2%’") % actualPath % dest);
|
||||
throw SysError(format("moving '%1%' to '%2%'") % actualPath % dest);
|
||||
}
|
||||
path = dest;
|
||||
actualPath = actualDest;
|
||||
} else {
|
||||
if (h != h2)
|
||||
throw BuildError(
|
||||
format("output path ‘%1%’ has %2% hash ‘%3%’ when ‘%4%’ was expected")
|
||||
format("output path '%1%' has %2% hash '%3%' when '%4%' was expected")
|
||||
% path % i.second.hashAlgo % printHash16or32(h2) % printHash16or32(h));
|
||||
}
|
||||
|
||||
|
@ -2947,7 +2947,7 @@ void DerivationGoal::registerOutputs()
|
|||
contained in it. Compute the SHA-256 NAR hash at the same
|
||||
time. The hash is stored in the database so that we can
|
||||
verify later on whether nobody has messed with the store. */
|
||||
debug("scanning for references inside ‘%1%’", path);
|
||||
debug("scanning for references inside '%1%'", path);
|
||||
HashResult hash;
|
||||
PathSet references = scanForReferences(actualPath, allPaths, hash);
|
||||
|
||||
|
@ -2959,11 +2959,11 @@ void DerivationGoal::registerOutputs()
|
|||
Path dst = worker.store.toRealPath(path + checkSuffix);
|
||||
deletePath(dst);
|
||||
if (rename(actualPath.c_str(), dst.c_str()))
|
||||
throw SysError(format("renaming ‘%1%’ to ‘%2%’") % actualPath % dst);
|
||||
throw Error(format("derivation ‘%1%’ may not be deterministic: output ‘%2%’ differs from ‘%3%’")
|
||||
throw SysError(format("renaming '%1%' to '%2%'") % actualPath % dst);
|
||||
throw Error(format("derivation '%1%' may not be deterministic: output '%2%' differs from '%3%'")
|
||||
% drvPath % path % dst);
|
||||
} else
|
||||
throw Error(format("derivation ‘%1%’ may not be deterministic: output ‘%2%’ differs")
|
||||
throw Error(format("derivation '%1%' may not be deterministic: output '%2%' differs")
|
||||
% drvPath % path);
|
||||
}
|
||||
|
||||
|
@ -2983,9 +2983,9 @@ void DerivationGoal::registerOutputs()
|
|||
for (auto & i : inputPaths) {
|
||||
PathSet::iterator j = references.find(i);
|
||||
if (j == references.end())
|
||||
debug(format("unreferenced input: ‘%1%’") % i);
|
||||
debug(format("unreferenced input: '%1%'") % i);
|
||||
else
|
||||
debug(format("referenced input: ‘%1%’") % i);
|
||||
debug(format("referenced input: '%1%'") % i);
|
||||
}
|
||||
|
||||
/* Enforce `allowedReferences' and friends. */
|
||||
|
@ -3021,7 +3021,7 @@ void DerivationGoal::registerOutputs()
|
|||
badPathsStr += "\n\t";
|
||||
badPathsStr += i;
|
||||
}
|
||||
throw BuildError(format("output ‘%1%’ is not allowed to refer to the following paths:%2%") % actualPath % badPathsStr);
|
||||
throw BuildError(format("output '%1%' is not allowed to refer to the following paths:%2%") % actualPath % badPathsStr);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -3058,8 +3058,8 @@ void DerivationGoal::registerOutputs()
|
|||
Path prev = i->path + checkSuffix;
|
||||
bool prevExists = keepPreviousRound && pathExists(prev);
|
||||
auto msg = prevExists
|
||||
? fmt("output ‘%1%’ of ‘%2%’ differs from ‘%3%’ from previous round", i->path, drvPath, prev)
|
||||
: fmt("output ‘%1%’ of ‘%2%’ differs from previous round", i->path, drvPath);
|
||||
? fmt("output '%1%' of '%2%' differs from '%3%' from previous round", i->path, drvPath, prev)
|
||||
: fmt("output '%1%' of '%2%' differs from previous round", i->path, drvPath);
|
||||
|
||||
auto diffHook = settings.diffHook;
|
||||
if (prevExists && diffHook != "" && runDiffHook) {
|
||||
|
@ -3088,7 +3088,7 @@ void DerivationGoal::registerOutputs()
|
|||
deletePath(prev);
|
||||
Path dst = i.second.path + checkSuffix;
|
||||
if (rename(i.second.path.c_str(), dst.c_str()))
|
||||
throw SysError(format("renaming ‘%1%’ to ‘%2%’") % i.second.path % dst);
|
||||
throw SysError(format("renaming '%1%' to '%2%'") % i.second.path % dst);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -3129,7 +3129,7 @@ Path DerivationGoal::openLogFile()
|
|||
settings.compressLog ? ".bz2" : "");
|
||||
|
||||
fdLogFile = open(logFileName.c_str(), O_CREAT | O_WRONLY | O_TRUNC | O_CLOEXEC, 0666);
|
||||
if (!fdLogFile) throw SysError(format("creating log file ‘%1%’") % logFileName);
|
||||
if (!fdLogFile) throw SysError(format("creating log file '%1%'") % logFileName);
|
||||
|
||||
logFileSink = std::make_shared<FdSink>(fdLogFile.get());
|
||||
|
||||
|
@ -3159,7 +3159,7 @@ void DerivationGoal::deleteTmpDir(bool force)
|
|||
might have privileged stuff (like a copy of netrc). */
|
||||
if (settings.keepFailed && !force && !drv->isBuiltin()) {
|
||||
printError(
|
||||
format("note: keeping build directory ‘%2%’")
|
||||
format("note: keeping build directory '%2%'")
|
||||
% drvPath % tmpDir);
|
||||
chmod(tmpDir.c_str(), 0755);
|
||||
}
|
||||
|
@ -3351,7 +3351,7 @@ SubstitutionGoal::SubstitutionGoal(const Path & storePath, Worker & worker, Repa
|
|||
{
|
||||
this->storePath = storePath;
|
||||
state = &SubstitutionGoal::init;
|
||||
name = (format("substitution of ‘%1%’") % storePath).str();
|
||||
name = (format("substitution of '%1%'") % storePath).str();
|
||||
trace("created");
|
||||
logger->event(evSubstitutionCreated, act, storePath);
|
||||
}
|
||||
|
@ -3390,7 +3390,7 @@ void SubstitutionGoal::init()
|
|||
}
|
||||
|
||||
if (settings.readOnlyMode)
|
||||
throw Error(format("cannot substitute path ‘%1%’ - no write access to the Nix store") % storePath);
|
||||
throw Error(format("cannot substitute path '%1%' - no write access to the Nix store") % storePath);
|
||||
|
||||
subs = settings.useSubstitutes ? getDefaultSubstituters() : std::list<ref<Store>>();
|
||||
|
||||
|
@ -3405,7 +3405,7 @@ void SubstitutionGoal::tryNext()
|
|||
if (subs.size() == 0) {
|
||||
/* None left. Terminate this goal and let someone else deal
|
||||
with it. */
|
||||
debug(format("path ‘%1%’ is required, but there is no substituter that can build it") % storePath);
|
||||
debug(format("path '%1%' is required, but there is no substituter that can build it") % storePath);
|
||||
|
||||
/* Hack: don't indicate failure if there were no substituters.
|
||||
In that case the calling derivation should just do a
|
||||
|
@ -3436,7 +3436,7 @@ void SubstitutionGoal::tryNext()
|
|||
signature. LocalStore::addToStore() also checks for this, but
|
||||
only after we've downloaded the path. */
|
||||
if (worker.store.requireSigs && !info->checkSignatures(worker.store, worker.store.publicKeys)) {
|
||||
printInfo(format("warning: substituter ‘%s’ does not have a valid signature for path ‘%s’")
|
||||
printInfo(format("warning: substituter '%s' does not have a valid signature for path '%s'")
|
||||
% sub->getUri() % storePath);
|
||||
tryNext();
|
||||
return;
|
||||
|
@ -3460,7 +3460,7 @@ void SubstitutionGoal::referencesValid()
|
|||
trace("all references realised");
|
||||
|
||||
if (nrFailed > 0) {
|
||||
debug(format("some references of path ‘%1%’ could not be realised") % storePath);
|
||||
debug(format("some references of path '%1%' could not be realised") % storePath);
|
||||
amDone(nrNoSubstituters > 0 || nrIncompleteClosure > 0 ? ecIncompleteClosure : ecFailed);
|
||||
return;
|
||||
}
|
||||
|
@ -3487,7 +3487,7 @@ void SubstitutionGoal::tryToRun()
|
|||
return;
|
||||
}
|
||||
|
||||
printInfo(format("fetching path ‘%1%’...") % storePath);
|
||||
printInfo(format("fetching path '%1%'...") % storePath);
|
||||
|
||||
logger->event(evSubstitutionStarted, act);
|
||||
|
||||
|
@ -3536,7 +3536,7 @@ void SubstitutionGoal::finished()
|
|||
worker.markContentsGood(storePath);
|
||||
|
||||
printMsg(lvlChatty,
|
||||
format("substitution of path ‘%1%’ succeeded") % storePath);
|
||||
format("substitution of path '%1%' succeeded") % storePath);
|
||||
|
||||
amDone(ecSuccess);
|
||||
}
|
||||
|
@ -3766,7 +3766,7 @@ void Worker::run(const Goals & _topGoals)
|
|||
waitForInput();
|
||||
else {
|
||||
if (awake.empty() && 0 == settings.maxBuildJobs) throw Error(
|
||||
"unable to start any build; either increase ‘--max-jobs’ "
|
||||
"unable to start any build; either increase '--max-jobs' "
|
||||
"or enable distributed builds");
|
||||
assert(!awake.empty());
|
||||
}
|
||||
|
@ -3927,7 +3927,7 @@ bool Worker::pathContentsGood(const Path & path)
|
|||
{
|
||||
std::map<Path, bool>::iterator i = pathContentsGoodCache.find(path);
|
||||
if (i != pathContentsGoodCache.end()) return i->second;
|
||||
printInfo(format("checking path ‘%1%’...") % path);
|
||||
printInfo(format("checking path '%1%'...") % path);
|
||||
auto info = store.queryPathInfo(path);
|
||||
bool res;
|
||||
if (!pathExists(path))
|
||||
|
@ -3938,7 +3938,7 @@ bool Worker::pathContentsGood(const Path & path)
|
|||
res = info->narHash == nullHash || info->narHash == current.first;
|
||||
}
|
||||
pathContentsGoodCache[path] = res;
|
||||
if (!res) printError(format("path ‘%1%’ is corrupted or missing!") % path);
|
||||
if (!res) printError(format("path '%1%' is corrupted or missing!") % path);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -4013,7 +4013,7 @@ void LocalStore::ensurePath(const Path & path)
|
|||
worker.run(goals);
|
||||
|
||||
if (goal->getExitCode() != Goal::ecSuccess)
|
||||
throw Error(worker.exitStatus(), "path ‘%s’ does not exist and cannot be created", path);
|
||||
throw Error(worker.exitStatus(), "path '%s' does not exist and cannot be created", path);
|
||||
}
|
||||
|
||||
|
||||
|
@ -4034,7 +4034,7 @@ void LocalStore::repairPath(const Path & path)
|
|||
goals.insert(worker.makeDerivationGoal(deriver, StringSet(), bmRepair));
|
||||
worker.run(goals);
|
||||
} else
|
||||
throw Error(worker.exitStatus(), "cannot repair path ‘%s’", path);
|
||||
throw Error(worker.exitStatus(), "cannot repair path '%s'", path);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ void builtinFetchurl(const BasicDerivation & drv, const std::string & netrcData)
|
|||
|
||||
auto getAttr = [&](const string & name) {
|
||||
auto i = drv.env.find(name);
|
||||
if (i == drv.env.end()) throw Error(format("attribute ‘%s’ missing") % name);
|
||||
if (i == drv.env.end()) throw Error(format("attribute '%s' missing") % name);
|
||||
return i->second;
|
||||
};
|
||||
|
||||
|
@ -65,7 +65,7 @@ void builtinFetchurl(const BasicDerivation & drv, const std::string & netrcData)
|
|||
auto executable = drv.env.find("executable");
|
||||
if (executable != drv.env.end() && executable->second == "1") {
|
||||
if (chmod(storePath.c_str(), 0755) == -1)
|
||||
throw SysError(format("making ‘%1%’ executable") % storePath);
|
||||
throw SysError(format("making '%1%' executable") % storePath);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -21,7 +21,7 @@ void DerivationOutput::parseHashInfo(bool & recursive, Hash & hash) const
|
|||
|
||||
HashType hashType = parseHashType(algo);
|
||||
if (hashType == htUnknown)
|
||||
throw Error(format("unknown hash algorithm ‘%1%’") % algo);
|
||||
throw Error(format("unknown hash algorithm '%1%'") % algo);
|
||||
|
||||
hash = Hash(this->hash, hashType);
|
||||
}
|
||||
|
@ -31,7 +31,7 @@ Path BasicDerivation::findOutput(const string & id) const
|
|||
{
|
||||
auto i = outputs.find(id);
|
||||
if (i == outputs.end())
|
||||
throw Error(format("derivation has no output ‘%1%’") % id);
|
||||
throw Error(format("derivation has no output '%1%'") % id);
|
||||
return i->second.path;
|
||||
}
|
||||
|
||||
|
@ -94,7 +94,7 @@ static void expect(std::istream & str, const string & s)
|
|||
char s2[s.size()];
|
||||
str.read(s2, s.size());
|
||||
if (string(s2, s.size()) != s)
|
||||
throw FormatError(format("expected string ‘%1%’") % s);
|
||||
throw FormatError(format("expected string '%1%'") % s);
|
||||
}
|
||||
|
||||
|
||||
|
@ -121,7 +121,7 @@ static Path parsePath(std::istream & str)
|
|||
{
|
||||
string s = parseString(str);
|
||||
if (s.size() == 0 || s[0] != '/')
|
||||
throw FormatError(format("bad path ‘%1%’ in derivation") % s);
|
||||
throw FormatError(format("bad path '%1%' in derivation") % s);
|
||||
return s;
|
||||
}
|
||||
|
||||
|
@ -204,7 +204,7 @@ Derivation readDerivation(const Path & drvPath)
|
|||
try {
|
||||
return parseDerivation(readFile(drvPath));
|
||||
} catch (FormatError & e) {
|
||||
throw Error(format("error parsing derivation ‘%1%’: %2%") % drvPath % e.msg());
|
||||
throw Error(format("error parsing derivation '%1%': %2%") % drvPath % e.msg());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -217,7 +217,7 @@ Derivation Store::derivationFromPath(const Path & drvPath)
|
|||
try {
|
||||
return parseDerivation(accessor->readFile(drvPath));
|
||||
} catch (FormatError & e) {
|
||||
throw Error(format("error parsing derivation ‘%1%’: %2%") % drvPath % e.msg());
|
||||
throw Error(format("error parsing derivation '%1%': %2%") % drvPath % e.msg());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@ ref<std::string> decodeContent(const std::string & encoding, ref<std::string> da
|
|||
else if (encoding == "br")
|
||||
return decompress(encoding, *data);
|
||||
else
|
||||
throw Error("unsupported Content-Encoding ‘%s’", encoding);
|
||||
throw Error("unsupported Content-Encoding '%s'", encoding);
|
||||
}
|
||||
|
||||
struct CurlDownloader : public Downloader
|
||||
|
@ -101,7 +101,7 @@ struct CurlDownloader : public Downloader
|
|||
if (requestHeaders) curl_slist_free_all(requestHeaders);
|
||||
try {
|
||||
if (!done)
|
||||
fail(DownloadError(Interrupted, format("download of ‘%s’ was interrupted") % request.uri));
|
||||
fail(DownloadError(Interrupted, format("download of '%s' was interrupted") % request.uri));
|
||||
} catch (...) {
|
||||
ignoreException();
|
||||
}
|
||||
|
@ -132,7 +132,7 @@ struct CurlDownloader : public Downloader
|
|||
{
|
||||
size_t realSize = size * nmemb;
|
||||
std::string line((char *) contents, realSize);
|
||||
printMsg(lvlVomit, format("got header for ‘%s’: %s") % request.uri % trim(line));
|
||||
printMsg(lvlVomit, format("got header for '%s': %s") % request.uri % trim(line));
|
||||
if (line.compare(0, 5, "HTTP/") == 0) { // new response starts
|
||||
result.etag = "";
|
||||
auto ss = tokenizeString<vector<string>>(line, " ");
|
||||
|
@ -250,7 +250,7 @@ struct CurlDownloader : public Downloader
|
|||
if (effectiveUrlCStr)
|
||||
result.effectiveUrl = effectiveUrlCStr;
|
||||
|
||||
debug(format("finished download of ‘%s’; curl status = %d, HTTP status = %d, body = %d bytes")
|
||||
debug(format("finished download of '%s'; curl status = %d, HTTP status = %d, body = %d bytes")
|
||||
% request.uri % code % httpStatus % (result.data ? result.data->size() : 0));
|
||||
|
||||
if (code == CURLE_WRITE_ERROR && result.etag == request.expectedETag) {
|
||||
|
@ -298,10 +298,10 @@ struct CurlDownloader : public Downloader
|
|||
|
||||
auto exc =
|
||||
code == CURLE_ABORTED_BY_CALLBACK && _isInterrupted
|
||||
? DownloadError(Interrupted, format("download of ‘%s’ was interrupted") % request.uri)
|
||||
? DownloadError(Interrupted, format("download of '%s' was interrupted") % request.uri)
|
||||
: httpStatus != 0
|
||||
? DownloadError(err, format("unable to download ‘%s’: HTTP error %d (curl error: %s)") % request.uri % httpStatus % curl_easy_strerror(code))
|
||||
: DownloadError(err, format("unable to download ‘%s’: %s (%d)") % request.uri % curl_easy_strerror(code) % code);
|
||||
? DownloadError(err, format("unable to download '%s': HTTP error %d (curl error: %s)") % request.uri % httpStatus % curl_easy_strerror(code))
|
||||
: DownloadError(err, format("unable to download '%s': %s (%d)") % request.uri % curl_easy_strerror(code) % code);
|
||||
|
||||
/* If this is a transient error, then maybe retry the
|
||||
download after a while. */
|
||||
|
@ -512,18 +512,18 @@ struct CurlDownloader : public Downloader
|
|||
S3Helper s3Helper(Aws::Region::US_EAST_1); // FIXME: make configurable
|
||||
auto slash = request.uri.find('/', 5);
|
||||
if (slash == std::string::npos)
|
||||
throw nix::Error("bad S3 URI ‘%s’", request.uri);
|
||||
throw nix::Error("bad S3 URI '%s'", request.uri);
|
||||
std::string bucketName(request.uri, 5, slash - 5);
|
||||
std::string key(request.uri, slash + 1);
|
||||
// FIXME: implement ETag
|
||||
auto s3Res = s3Helper.getObject(bucketName, key);
|
||||
DownloadResult res;
|
||||
if (!s3Res.data)
|
||||
throw DownloadError(NotFound, fmt("S3 object ‘%s’ does not exist", request.uri));
|
||||
throw DownloadError(NotFound, fmt("S3 object '%s' does not exist", request.uri));
|
||||
res.data = s3Res.data;
|
||||
return res;
|
||||
#else
|
||||
throw nix::Error("cannot download ‘%s’ because Nix is not built with S3 support", request.uri);
|
||||
throw nix::Error("cannot download '%s' because Nix is not built with S3 support", request.uri);
|
||||
#endif
|
||||
});
|
||||
return;
|
||||
|
@ -587,7 +587,7 @@ Path Downloader::downloadCached(ref<Store> store, const string & url_, bool unpa
|
|||
Path dataFile = cacheDir + "/" + urlHash + ".info";
|
||||
Path fileLink = cacheDir + "/" + urlHash + "-file";
|
||||
|
||||
PathLocks lock({fileLink}, fmt("waiting for lock on ‘%1%’...", fileLink));
|
||||
PathLocks lock({fileLink}, fmt("waiting for lock on '%1%'...", fileLink));
|
||||
|
||||
Path storePath;
|
||||
|
||||
|
@ -608,7 +608,7 @@ Path Downloader::downloadCached(ref<Store> store, const string & url_, bool unpa
|
|||
if (effectiveUrl)
|
||||
*effectiveUrl = url_;
|
||||
} else if (!ss[1].empty()) {
|
||||
debug(format("verifying previous ETag ‘%1%’") % ss[1]);
|
||||
debug(format("verifying previous ETag '%1%'") % ss[1]);
|
||||
expectedETag = ss[1];
|
||||
}
|
||||
}
|
||||
|
@ -650,7 +650,7 @@ Path Downloader::downloadCached(ref<Store> store, const string & url_, bool unpa
|
|||
|
||||
if (unpack) {
|
||||
Path unpackedLink = cacheDir + "/" + baseNameOf(storePath) + "-unpacked";
|
||||
PathLocks lock2({unpackedLink}, fmt("waiting for lock on ‘%1%’...", unpackedLink));
|
||||
PathLocks lock2({unpackedLink}, fmt("waiting for lock on '%1%'...", unpackedLink));
|
||||
Path unpackedStorePath;
|
||||
if (pathExists(unpackedLink)) {
|
||||
unpackedStorePath = readLink(unpackedLink);
|
||||
|
@ -659,7 +659,7 @@ Path Downloader::downloadCached(ref<Store> store, const string & url_, bool unpa
|
|||
unpackedStorePath = "";
|
||||
}
|
||||
if (unpackedStorePath.empty()) {
|
||||
printInfo(format("unpacking ‘%1%’...") % url);
|
||||
printInfo(format("unpacking '%1%'...") % url);
|
||||
Path tmpDir = createTempDir();
|
||||
AutoDelete autoDelete(tmpDir, true);
|
||||
// FIXME: this requires GNU tar for decompression.
|
||||
|
@ -671,7 +671,7 @@ Path Downloader::downloadCached(ref<Store> store, const string & url_, bool unpa
|
|||
}
|
||||
|
||||
if (expectedStorePath != "" && storePath != expectedStorePath)
|
||||
throw nix::Error("store path mismatch in file downloaded from ‘%s’", url);
|
||||
throw nix::Error("store path mismatch in file downloaded from '%s'", url);
|
||||
|
||||
return storePath;
|
||||
}
|
||||
|
|
|
@ -33,7 +33,7 @@ void Store::exportPaths(const Paths & paths, Sink & sink)
|
|||
//logger->incExpected(doneLabel, sorted.size());
|
||||
|
||||
for (auto & path : sorted) {
|
||||
//Activity act(*logger, lvlInfo, format("exporting path ‘%s’") % path);
|
||||
//Activity act(*logger, lvlInfo, format("exporting path '%s'") % path);
|
||||
sink << 1;
|
||||
exportPath(path, sink);
|
||||
//logger->incProgress(doneLabel);
|
||||
|
@ -55,7 +55,7 @@ void Store::exportPath(const Path & path, Sink & sink)
|
|||
Don't complain if the stored hash is zero (unknown). */
|
||||
Hash hash = hashAndWriteSink.currentHash();
|
||||
if (hash != info->narHash && info->narHash != Hash(info->narHash.type))
|
||||
throw Error(format("hash of path ‘%1%’ has changed from ‘%2%’ to ‘%3%’!") % path
|
||||
throw Error(format("hash of path '%1%' has changed from '%2%' to '%3%'!") % path
|
||||
% info->narHash.to_string() % hash.to_string());
|
||||
|
||||
hashAndWriteSink << exportMagic << path << info->references << info->deriver << 0;
|
||||
|
@ -67,7 +67,7 @@ Paths Store::importPaths(Source & source, std::shared_ptr<FSAccessor> accessor,
|
|||
while (true) {
|
||||
auto n = readNum<uint64_t>(source);
|
||||
if (n == 0) break;
|
||||
if (n != 1) throw Error("input doesn't look like something created by ‘nix-store --export’");
|
||||
if (n != 1) throw Error("input doesn't look like something created by 'nix-store --export'");
|
||||
|
||||
/* Extract the NAR from the source. */
|
||||
TeeSink tee(source);
|
||||
|
@ -81,7 +81,7 @@ Paths Store::importPaths(Source & source, std::shared_ptr<FSAccessor> accessor,
|
|||
|
||||
info.path = readStorePath(*this, source);
|
||||
|
||||
//Activity act(*logger, lvlInfo, format("importing path ‘%s’") % info.path);
|
||||
//Activity act(*logger, lvlInfo, format("importing path '%s'") % info.path);
|
||||
|
||||
info.references = readStorePaths<PathSet>(*this, source);
|
||||
|
||||
|
|
|
@ -32,11 +32,11 @@ int LocalStore::openGCLock(LockType lockType)
|
|||
Path fnGCLock = (format("%1%/%2%")
|
||||
% stateDir % gcLockName).str();
|
||||
|
||||
debug(format("acquiring global GC lock ‘%1%’") % fnGCLock);
|
||||
debug(format("acquiring global GC lock '%1%'") % fnGCLock);
|
||||
|
||||
AutoCloseFD fdGCLock = open(fnGCLock.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600);
|
||||
if (!fdGCLock)
|
||||
throw SysError(format("opening global GC lock ‘%1%’") % fnGCLock);
|
||||
throw SysError(format("opening global GC lock '%1%'") % fnGCLock);
|
||||
|
||||
if (!lockFile(fdGCLock.get(), lockType, false)) {
|
||||
printError(format("waiting for the big garbage collector lock..."));
|
||||
|
@ -63,7 +63,7 @@ static void makeSymlink(const Path & link, const Path & target)
|
|||
|
||||
/* Atomically replace the old one. */
|
||||
if (rename(tempLink.c_str(), link.c_str()) == -1)
|
||||
throw SysError(format("cannot rename ‘%1%’ to ‘%2%’")
|
||||
throw SysError(format("cannot rename '%1%' to '%2%'")
|
||||
% tempLink % link);
|
||||
}
|
||||
|
||||
|
@ -99,7 +99,7 @@ Path LocalFSStore::addPermRoot(const Path & _storePath,
|
|||
/* Don't clobber the link if it already exists and doesn't
|
||||
point to the Nix store. */
|
||||
if (pathExists(gcRoot) && (!isLink(gcRoot) || !isInStore(readLink(gcRoot))))
|
||||
throw Error(format("cannot create symlink ‘%1%’; already exists") % gcRoot);
|
||||
throw Error(format("cannot create symlink '%1%'; already exists") % gcRoot);
|
||||
makeSymlink(gcRoot, storePath);
|
||||
addIndirectRoot(gcRoot);
|
||||
}
|
||||
|
@ -110,8 +110,8 @@ Path LocalFSStore::addPermRoot(const Path & _storePath,
|
|||
|
||||
if (string(gcRoot, 0, rootsDir.size() + 1) != rootsDir + "/")
|
||||
throw Error(format(
|
||||
"path ‘%1%’ is not a valid garbage collector root; "
|
||||
"it's not in the directory ‘%2%’")
|
||||
"path '%1%' is not a valid garbage collector root; "
|
||||
"it's not in the directory '%2%'")
|
||||
% gcRoot % rootsDir);
|
||||
}
|
||||
|
||||
|
@ -131,8 +131,8 @@ Path LocalFSStore::addPermRoot(const Path & _storePath,
|
|||
if (roots.find(gcRoot) == roots.end())
|
||||
printError(
|
||||
format(
|
||||
"warning: ‘%1%’ is not in a directory where the garbage collector looks for roots; "
|
||||
"therefore, ‘%2%’ might be removed by the garbage collector")
|
||||
"warning: '%1%' is not in a directory where the garbage collector looks for roots; "
|
||||
"therefore, '%2%' might be removed by the garbage collector")
|
||||
% gcRoot % storePath);
|
||||
}
|
||||
|
||||
|
@ -169,14 +169,14 @@ void LocalStore::addTempRoot(const Path & path)
|
|||
|
||||
fdGCLock = -1;
|
||||
|
||||
debug(format("acquiring read lock on ‘%1%’") % state->fnTempRoots);
|
||||
debug(format("acquiring read lock on '%1%'") % state->fnTempRoots);
|
||||
lockFile(state->fdTempRoots.get(), ltRead, true);
|
||||
|
||||
/* Check whether the garbage collector didn't get in our
|
||||
way. */
|
||||
struct stat st;
|
||||
if (fstat(state->fdTempRoots.get(), &st) == -1)
|
||||
throw SysError(format("statting ‘%1%’") % state->fnTempRoots);
|
||||
throw SysError(format("statting '%1%'") % state->fnTempRoots);
|
||||
if (st.st_size == 0) break;
|
||||
|
||||
/* The garbage collector deleted this file before we could
|
||||
|
@ -188,14 +188,14 @@ void LocalStore::addTempRoot(const Path & path)
|
|||
|
||||
/* Upgrade the lock to a write lock. This will cause us to block
|
||||
if the garbage collector is holding our lock. */
|
||||
debug(format("acquiring write lock on ‘%1%’") % state->fnTempRoots);
|
||||
debug(format("acquiring write lock on '%1%'") % state->fnTempRoots);
|
||||
lockFile(state->fdTempRoots.get(), ltWrite, true);
|
||||
|
||||
string s = path + '\0';
|
||||
writeFull(state->fdTempRoots.get(), s);
|
||||
|
||||
/* Downgrade to a read lock. */
|
||||
debug(format("downgrading to read lock on ‘%1%’") % state->fnTempRoots);
|
||||
debug(format("downgrading to read lock on '%1%'") % state->fnTempRoots);
|
||||
lockFile(state->fdTempRoots.get(), ltRead, true);
|
||||
}
|
||||
|
||||
|
@ -210,12 +210,12 @@ void LocalStore::readTempRoots(PathSet & tempRoots, FDs & fds)
|
|||
for (auto & i : tempRootFiles) {
|
||||
Path path = (format("%1%/%2%/%3%") % stateDir % tempRootsDir % i.name).str();
|
||||
|
||||
debug(format("reading temporary root file ‘%1%’") % path);
|
||||
debug(format("reading temporary root file '%1%'") % path);
|
||||
FDPtr fd(new AutoCloseFD(open(path.c_str(), O_CLOEXEC | O_RDWR, 0666)));
|
||||
if (!*fd) {
|
||||
/* It's okay if the file has disappeared. */
|
||||
if (errno == ENOENT) continue;
|
||||
throw SysError(format("opening temporary roots file ‘%1%’") % path);
|
||||
throw SysError(format("opening temporary roots file '%1%'") % path);
|
||||
}
|
||||
|
||||
/* This should work, but doesn't, for some reason. */
|
||||
|
@ -226,7 +226,7 @@ void LocalStore::readTempRoots(PathSet & tempRoots, FDs & fds)
|
|||
only succeed if the owning process has died. In that case
|
||||
we don't care about its temporary roots. */
|
||||
if (lockFile(fd->get(), ltWrite, false)) {
|
||||
printError(format("removing stale temporary roots file ‘%1%’") % path);
|
||||
printError(format("removing stale temporary roots file '%1%'") % path);
|
||||
unlink(path.c_str());
|
||||
writeFull(fd->get(), "d");
|
||||
continue;
|
||||
|
@ -235,7 +235,7 @@ void LocalStore::readTempRoots(PathSet & tempRoots, FDs & fds)
|
|||
/* Acquire a read lock. This will prevent the owning process
|
||||
from upgrading to a write lock, therefore it will block in
|
||||
addTempRoot(). */
|
||||
debug(format("waiting for read lock on ‘%1%’") % path);
|
||||
debug(format("waiting for read lock on '%1%'") % path);
|
||||
lockFile(fd->get(), ltRead, true);
|
||||
|
||||
/* Read the entire file. */
|
||||
|
@ -246,7 +246,7 @@ void LocalStore::readTempRoots(PathSet & tempRoots, FDs & fds)
|
|||
|
||||
while ((end = contents.find((char) 0, pos)) != string::npos) {
|
||||
Path root(contents, pos, end - pos);
|
||||
debug(format("got temporary root ‘%1%’") % root);
|
||||
debug(format("got temporary root '%1%'") % root);
|
||||
assertStorePath(root);
|
||||
tempRoots.insert(root);
|
||||
pos = end + 1;
|
||||
|
@ -264,7 +264,7 @@ void LocalStore::findRoots(const Path & path, unsigned char type, Roots & roots)
|
|||
if (isStorePath(storePath) && isValidPath(storePath))
|
||||
roots[path] = storePath;
|
||||
else
|
||||
printInfo(format("skipping invalid root from ‘%1%’ to ‘%2%’") % path % storePath);
|
||||
printInfo(format("skipping invalid root from '%1%' to '%2%'") % path % storePath);
|
||||
};
|
||||
|
||||
try {
|
||||
|
@ -287,7 +287,7 @@ void LocalStore::findRoots(const Path & path, unsigned char type, Roots & roots)
|
|||
target = absPath(target, dirOf(path));
|
||||
if (!pathExists(target)) {
|
||||
if (isInDir(path, stateDir + "/" + gcRootsDir + "/auto")) {
|
||||
printInfo(format("removing stale link from ‘%1%’ to ‘%2%’") % path % target);
|
||||
printInfo(format("removing stale link from '%1%' to '%2%'") % path % target);
|
||||
unlink(path.c_str());
|
||||
}
|
||||
} else {
|
||||
|
@ -310,7 +310,7 @@ void LocalStore::findRoots(const Path & path, unsigned char type, Roots & roots)
|
|||
catch (SysError & e) {
|
||||
/* We only ignore permanent failures. */
|
||||
if (e.errNo == EACCES || e.errNo == ENOENT || e.errNo == ENOTDIR)
|
||||
printInfo(format("cannot read potential root ‘%1%’") % path);
|
||||
printInfo(format("cannot read potential root '%1%'") % path);
|
||||
else
|
||||
throw;
|
||||
}
|
||||
|
@ -451,7 +451,7 @@ void LocalStore::findRuntimeRoots(PathSet & roots)
|
|||
if (isInStore(i)) {
|
||||
Path path = toStorePath(i);
|
||||
if (roots.find(path) == roots.end() && isStorePath(path) && isValidPath(path)) {
|
||||
debug(format("got additional root ‘%1%’") % path);
|
||||
debug(format("got additional root '%1%'") % path);
|
||||
roots.insert(path);
|
||||
}
|
||||
}
|
||||
|
@ -517,7 +517,7 @@ void LocalStore::deletePathRecursive(GCState & state, const Path & path)
|
|||
throw SysError(format("getting status of %1%") % realPath);
|
||||
}
|
||||
|
||||
printInfo(format("deleting ‘%1%’") % path);
|
||||
printInfo(format("deleting '%1%'") % path);
|
||||
|
||||
state.results.paths.insert(path);
|
||||
|
||||
|
@ -532,14 +532,14 @@ void LocalStore::deletePathRecursive(GCState & state, const Path & path)
|
|||
// size.
|
||||
try {
|
||||
if (chmod(realPath.c_str(), st.st_mode | S_IWUSR) == -1)
|
||||
throw SysError(format("making ‘%1%’ writable") % realPath);
|
||||
throw SysError(format("making '%1%' writable") % realPath);
|
||||
Path tmp = trashDir + "/" + baseNameOf(path);
|
||||
if (rename(realPath.c_str(), tmp.c_str()))
|
||||
throw SysError(format("unable to rename ‘%1%’ to ‘%2%’") % realPath % tmp);
|
||||
throw SysError(format("unable to rename '%1%' to '%2%'") % realPath % tmp);
|
||||
state.bytesInvalidated += size;
|
||||
} catch (SysError & e) {
|
||||
if (e.errNo == ENOSPC) {
|
||||
printInfo(format("note: can't create move ‘%1%’: %2%") % realPath % e.msg());
|
||||
printInfo(format("note: can't create move '%1%': %2%") % realPath % e.msg());
|
||||
deleteGarbage(state, realPath);
|
||||
}
|
||||
}
|
||||
|
@ -566,7 +566,7 @@ bool LocalStore::canReachRoot(GCState & state, PathSet & visited, const Path & p
|
|||
}
|
||||
|
||||
if (state.roots.find(path) != state.roots.end()) {
|
||||
debug(format("cannot delete ‘%1%’ because it's a root") % path);
|
||||
debug(format("cannot delete '%1%' because it's a root") % path);
|
||||
state.alive.insert(path);
|
||||
return true;
|
||||
}
|
||||
|
@ -615,7 +615,7 @@ void LocalStore::tryToDelete(GCState & state, const Path & path)
|
|||
auto realPath = realStoreDir + "/" + baseNameOf(path);
|
||||
if (realPath == linksDir || realPath == trashDir) return;
|
||||
|
||||
//Activity act(*logger, lvlDebug, format("considering whether to delete ‘%1%’") % path);
|
||||
//Activity act(*logger, lvlDebug, format("considering whether to delete '%1%'") % path);
|
||||
|
||||
if (!isStorePath(path) || !isValidPath(path)) {
|
||||
/* A lock file belonging to a path that we're building right
|
||||
|
@ -635,7 +635,7 @@ void LocalStore::tryToDelete(GCState & state, const Path & path)
|
|||
PathSet visited;
|
||||
|
||||
if (canReachRoot(state, visited, path)) {
|
||||
debug(format("cannot delete ‘%1%’ because it's still reachable") % path);
|
||||
debug(format("cannot delete '%1%' because it's still reachable") % path);
|
||||
} else {
|
||||
/* No path we visited was a root, so everything is garbage.
|
||||
But we only delete ‘path’ and its referrers here so that
|
||||
|
@ -656,7 +656,7 @@ void LocalStore::tryToDelete(GCState & state, const Path & path)
|
|||
void LocalStore::removeUnusedLinks(const GCState & state)
|
||||
{
|
||||
AutoCloseDir dir(opendir(linksDir.c_str()));
|
||||
if (!dir) throw SysError(format("opening directory ‘%1%’") % linksDir);
|
||||
if (!dir) throw SysError(format("opening directory '%1%'") % linksDir);
|
||||
|
||||
long long actualSize = 0, unsharedSize = 0;
|
||||
|
||||
|
@ -669,7 +669,7 @@ void LocalStore::removeUnusedLinks(const GCState & state)
|
|||
|
||||
struct stat st;
|
||||
if (lstat(path.c_str(), &st) == -1)
|
||||
throw SysError(format("statting ‘%1%’") % path);
|
||||
throw SysError(format("statting '%1%'") % path);
|
||||
|
||||
if (st.st_nlink != 1) {
|
||||
unsigned long long size = st.st_blocks * 512ULL;
|
||||
|
@ -678,17 +678,17 @@ void LocalStore::removeUnusedLinks(const GCState & state)
|
|||
continue;
|
||||
}
|
||||
|
||||
printMsg(lvlTalkative, format("deleting unused link ‘%1%’") % path);
|
||||
printMsg(lvlTalkative, format("deleting unused link '%1%'") % path);
|
||||
|
||||
if (unlink(path.c_str()) == -1)
|
||||
throw SysError(format("deleting ‘%1%’") % path);
|
||||
throw SysError(format("deleting '%1%'") % path);
|
||||
|
||||
state.results.bytesFreed += st.st_blocks * 512ULL;
|
||||
}
|
||||
|
||||
struct stat st;
|
||||
if (stat(linksDir.c_str(), &st) == -1)
|
||||
throw SysError(format("statting ‘%1%’") % linksDir);
|
||||
throw SysError(format("statting '%1%'") % linksDir);
|
||||
long long overhead = st.st_blocks * 512ULL;
|
||||
|
||||
printInfo(format("note: currently hard linking saves %.2f MiB")
|
||||
|
@ -768,7 +768,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
|
|||
assertStorePath(i);
|
||||
tryToDelete(state, i);
|
||||
if (state.dead.find(i) == state.dead.end())
|
||||
throw Error(format("cannot delete path ‘%1%’ since it is still alive") % i);
|
||||
throw Error(format("cannot delete path '%1%' since it is still alive") % i);
|
||||
}
|
||||
|
||||
} else if (options.maxFreed > 0) {
|
||||
|
@ -781,7 +781,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
|
|||
try {
|
||||
|
||||
AutoCloseDir dir(opendir(realStoreDir.c_str()));
|
||||
if (!dir) throw SysError(format("opening directory ‘%1%’") % realStoreDir);
|
||||
if (!dir) throw SysError(format("opening directory '%1%'") % realStoreDir);
|
||||
|
||||
/* Read the store and immediately delete all paths that
|
||||
aren't valid. When using --max-freed etc., deleting
|
||||
|
@ -834,7 +834,7 @@ void LocalStore::collectGarbage(const GCOptions & options, GCResults & results)
|
|||
fds.clear();
|
||||
|
||||
/* Delete the trash directory. */
|
||||
printInfo(format("deleting ‘%1%’") % trashDir);
|
||||
printInfo(format("deleting '%1%'") % trashDir);
|
||||
deleteGarbage(state, trashDir);
|
||||
|
||||
/* Clean up the links directory. */
|
||||
|
|
|
@ -129,7 +129,7 @@ void MaxBuildJobsSetting::set(const std::string & str)
|
|||
{
|
||||
if (str == "auto") value = std::max(1U, std::thread::hardware_concurrency());
|
||||
else if (!string2Int(str, value))
|
||||
throw UsageError("configuration setting ‘%s’ should be ‘auto’ or an integer", name);
|
||||
throw UsageError("configuration setting '%s' should be 'auto' or an integer", name);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -38,7 +38,7 @@ public:
|
|||
try {
|
||||
BinaryCacheStore::init();
|
||||
} catch (UploadToHTTP &) {
|
||||
throw Error(format("‘%s’ does not appear to be a binary cache") % cacheUri);
|
||||
throw Error(format("'%s' does not appear to be a binary cache") % cacheUri);
|
||||
}
|
||||
diskCache->createCache(cacheUri, storeDir, wantMassQuery_, priority);
|
||||
}
|
||||
|
|
|
@ -65,13 +65,13 @@ struct LegacySSHStore : public Store
|
|||
|
||||
unsigned int magic = readInt(conn->from);
|
||||
if (magic != SERVE_MAGIC_2)
|
||||
throw Error("protocol mismatch with ‘nix-store --serve’ on ‘%s’", host);
|
||||
throw Error("protocol mismatch with 'nix-store --serve' on '%s'", host);
|
||||
conn->remoteVersion = readInt(conn->from);
|
||||
if (GET_PROTOCOL_MAJOR(conn->remoteVersion) != 0x200)
|
||||
throw Error("unsupported ‘nix-store --serve’ protocol version on ‘%s’", host);
|
||||
throw Error("unsupported 'nix-store --serve' protocol version on '%s'", host);
|
||||
|
||||
} catch (EndOfFile & e) {
|
||||
throw Error("cannot connect to ‘%1%’", host);
|
||||
throw Error("cannot connect to '%1%'", host);
|
||||
}
|
||||
|
||||
return conn;
|
||||
|
@ -89,7 +89,7 @@ struct LegacySSHStore : public Store
|
|||
sync2async<std::shared_ptr<ValidPathInfo>>(success, failure, [&]() -> std::shared_ptr<ValidPathInfo> {
|
||||
auto conn(connections->get());
|
||||
|
||||
debug("querying remote host ‘%s’ for info on ‘%s’", host, path);
|
||||
debug("querying remote host '%s' for info on '%s'", host, path);
|
||||
|
||||
conn->to << cmdQueryPathInfos << PathSet{path};
|
||||
conn->to.flush();
|
||||
|
@ -116,7 +116,7 @@ struct LegacySSHStore : public Store
|
|||
RepairFlag repair, CheckSigsFlag checkSigs,
|
||||
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);
|
||||
|
||||
auto conn(connections->get());
|
||||
|
||||
|
@ -134,7 +134,7 @@ struct LegacySSHStore : public Store
|
|||
conn->to.flush();
|
||||
|
||||
if (readInt(conn->from) != 1)
|
||||
throw Error("failed to add path ‘%s’ to remote host ‘%s’, info.path, host");
|
||||
throw Error("failed to add path '%s' to remote host '%s', info.path, host");
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -76,7 +76,7 @@ static void atomicWrite(const Path & path, const std::string & s)
|
|||
AutoDelete del(tmp, false);
|
||||
writeFile(tmp, s);
|
||||
if (rename(tmp.c_str(), path.c_str()))
|
||||
throw SysError(format("renaming ‘%1%’ to ‘%2%’") % tmp % path);
|
||||
throw SysError(format("renaming '%1%' to '%2%'") % tmp % path);
|
||||
del.cancel();
|
||||
}
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@ struct LocalStoreAccessor : public FSAccessor
|
|||
{
|
||||
Path storePath = store->toStorePath(path);
|
||||
if (!store->isValidPath(storePath))
|
||||
throw InvalidPath(format("path ‘%1%’ is not a valid store path") % storePath);
|
||||
throw InvalidPath(format("path '%1%' is not a valid store path") % storePath);
|
||||
return store->getRealStoreDir() + std::string(path, store->storeDir.size());
|
||||
}
|
||||
|
||||
|
@ -33,11 +33,11 @@ struct LocalStoreAccessor : public FSAccessor
|
|||
struct stat st;
|
||||
if (lstat(realPath.c_str(), &st)) {
|
||||
if (errno == ENOENT || errno == ENOTDIR) return {Type::tMissing, 0, false};
|
||||
throw SysError(format("getting status of ‘%1%’") % path);
|
||||
throw SysError(format("getting status of '%1%'") % path);
|
||||
}
|
||||
|
||||
if (!S_ISREG(st.st_mode) && !S_ISDIR(st.st_mode) && !S_ISLNK(st.st_mode))
|
||||
throw Error(format("file ‘%1%’ has unsupported type") % path);
|
||||
throw Error(format("file '%1%' has unsupported type") % path);
|
||||
|
||||
return {
|
||||
S_ISREG(st.st_mode) ? Type::tRegular :
|
||||
|
@ -80,7 +80,7 @@ ref<FSAccessor> LocalFSStore::getFSAccessor()
|
|||
void LocalFSStore::narFromPath(const Path & path, Sink & sink)
|
||||
{
|
||||
if (!isValidPath(path))
|
||||
throw Error(format("path ‘%s’ is not valid") % path);
|
||||
throw Error(format("path '%s' is not valid") % path);
|
||||
dumpPath(getRealStoreDir() + std::string(path, storeDir.size()), sink);
|
||||
}
|
||||
|
||||
|
|
|
@ -76,24 +76,24 @@ LocalStore::LocalStore(const Params & params)
|
|||
Path perUserDir = profilesDir + "/per-user";
|
||||
createDirs(perUserDir);
|
||||
if (chmod(perUserDir.c_str(), 01777) == -1)
|
||||
throw SysError(format("could not set permissions on ‘%1%’ to 1777") % perUserDir);
|
||||
throw SysError(format("could not set permissions on '%1%' to 1777") % perUserDir);
|
||||
|
||||
mode_t perm = 01775;
|
||||
|
||||
struct group * gr = getgrnam(settings.buildUsersGroup.get().c_str());
|
||||
if (!gr)
|
||||
printError(format("warning: the group ‘%1%’ specified in ‘build-users-group’ does not exist")
|
||||
printError(format("warning: the group '%1%' specified in 'build-users-group' does not exist")
|
||||
% settings.buildUsersGroup);
|
||||
else {
|
||||
struct stat st;
|
||||
if (stat(realStoreDir.c_str(), &st))
|
||||
throw SysError(format("getting attributes of path ‘%1%’") % realStoreDir);
|
||||
throw SysError(format("getting attributes of path '%1%'") % realStoreDir);
|
||||
|
||||
if (st.st_uid != 0 || st.st_gid != gr->gr_gid || (st.st_mode & ~S_IFMT) != perm) {
|
||||
if (chown(realStoreDir.c_str(), 0, gr->gr_gid) == -1)
|
||||
throw SysError(format("changing ownership of path ‘%1%’") % realStoreDir);
|
||||
throw SysError(format("changing ownership of path '%1%'") % realStoreDir);
|
||||
if (chmod(realStoreDir.c_str(), perm) == -1)
|
||||
throw SysError(format("changing permissions on path ‘%1%’") % realStoreDir);
|
||||
throw SysError(format("changing permissions on path '%1%'") % realStoreDir);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -104,10 +104,10 @@ LocalStore::LocalStore(const Params & params)
|
|||
struct stat st;
|
||||
while (path != "/") {
|
||||
if (lstat(path.c_str(), &st))
|
||||
throw SysError(format("getting status of ‘%1%’") % path);
|
||||
throw SysError(format("getting status of '%1%'") % path);
|
||||
if (S_ISLNK(st.st_mode))
|
||||
throw Error(format(
|
||||
"the path ‘%1%’ is a symlink; "
|
||||
"the path '%1%' is a symlink; "
|
||||
"this is not allowed for the Nix store and its parent directories")
|
||||
% path);
|
||||
path = dirOf(path);
|
||||
|
@ -267,7 +267,7 @@ int LocalStore::getSchema()
|
|||
if (pathExists(schemaPath)) {
|
||||
string s = readFile(schemaPath);
|
||||
if (!string2Int(s, curSchema))
|
||||
throw Error(format("‘%1%’ is corrupt") % schemaPath);
|
||||
throw Error(format("'%1%' is corrupt") % schemaPath);
|
||||
}
|
||||
return curSchema;
|
||||
}
|
||||
|
@ -276,14 +276,14 @@ int LocalStore::getSchema()
|
|||
void LocalStore::openDB(State & state, bool create)
|
||||
{
|
||||
if (access(dbDir.c_str(), R_OK | W_OK))
|
||||
throw SysError(format("Nix database directory ‘%1%’ is not writable") % dbDir);
|
||||
throw SysError(format("Nix database directory '%1%' is not writable") % dbDir);
|
||||
|
||||
/* Open the Nix database. */
|
||||
string dbPath = dbDir + "/db.sqlite";
|
||||
auto & db(state.db);
|
||||
if (sqlite3_open_v2(dbPath.c_str(), &db.db,
|
||||
SQLITE_OPEN_READWRITE | (create ? SQLITE_OPEN_CREATE : 0), 0) != SQLITE_OK)
|
||||
throw Error(format("cannot open Nix database ‘%1%’") % dbPath);
|
||||
throw Error(format("cannot open Nix database '%1%'") % dbPath);
|
||||
|
||||
#ifdef __CYGWIN__
|
||||
/* The cygwin version of sqlite3 has a patch which calls
|
||||
|
@ -378,7 +378,7 @@ static void canonicaliseTimestampAndPermissions(const Path & path, const struct
|
|||
| 0444
|
||||
| (st.st_mode & S_IXUSR ? 0111 : 0);
|
||||
if (chmod(path.c_str(), mode) == -1)
|
||||
throw SysError(format("changing mode of ‘%1%’ to %2$o") % path % mode);
|
||||
throw SysError(format("changing mode of '%1%' to %2$o") % path % mode);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -396,7 +396,7 @@ static void canonicaliseTimestampAndPermissions(const Path & path, const struct
|
|||
#else
|
||||
if (!S_ISLNK(st.st_mode) && utimes(path.c_str(), times) == -1)
|
||||
#endif
|
||||
throw SysError(format("changing modification time of ‘%1%’") % path);
|
||||
throw SysError(format("changing modification time of '%1%'") % path);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -405,7 +405,7 @@ void canonicaliseTimestampAndPermissions(const Path & path)
|
|||
{
|
||||
struct stat st;
|
||||
if (lstat(path.c_str(), &st))
|
||||
throw SysError(format("getting attributes of path ‘%1%’") % path);
|
||||
throw SysError(format("getting attributes of path '%1%'") % path);
|
||||
canonicaliseTimestampAndPermissions(path, st);
|
||||
}
|
||||
|
||||
|
@ -420,17 +420,17 @@ static void canonicalisePathMetaData_(const Path & path, uid_t fromUid, InodesSe
|
|||
setattrlist() to remove other attributes as well. */
|
||||
if (lchflags(path.c_str(), 0)) {
|
||||
if (errno != ENOTSUP)
|
||||
throw SysError(format("clearing flags of path ‘%1%’") % path);
|
||||
throw SysError(format("clearing flags of path '%1%'") % path);
|
||||
}
|
||||
#endif
|
||||
|
||||
struct stat st;
|
||||
if (lstat(path.c_str(), &st))
|
||||
throw SysError(format("getting attributes of path ‘%1%’") % path);
|
||||
throw SysError(format("getting attributes of path '%1%'") % path);
|
||||
|
||||
/* Really make sure that the path is of a supported type. */
|
||||
if (!(S_ISREG(st.st_mode) || S_ISDIR(st.st_mode) || S_ISLNK(st.st_mode)))
|
||||
throw Error(format("file ‘%1%’ has an unsupported type") % path);
|
||||
throw Error(format("file '%1%' has an unsupported type") % path);
|
||||
|
||||
#if __linux__
|
||||
/* Remove extended attributes / ACLs. */
|
||||
|
@ -438,19 +438,19 @@ static void canonicalisePathMetaData_(const Path & path, uid_t fromUid, InodesSe
|
|||
|
||||
if (eaSize < 0) {
|
||||
if (errno != ENOTSUP)
|
||||
throw SysError("querying extended attributes of ‘%s’", path);
|
||||
throw SysError("querying extended attributes of '%s'", path);
|
||||
} else if (eaSize > 0) {
|
||||
std::vector<char> eaBuf(eaSize);
|
||||
|
||||
if ((eaSize = llistxattr(path.c_str(), eaBuf.data(), eaBuf.size())) < 0)
|
||||
throw SysError("querying extended attributes of ‘%s’", path);
|
||||
throw SysError("querying extended attributes of '%s'", path);
|
||||
|
||||
for (auto & eaName: tokenizeString<Strings>(std::string(eaBuf.data(), eaSize), std::string("\000", 1))) {
|
||||
/* Ignore SELinux security labels since these cannot be
|
||||
removed even by root. */
|
||||
if (eaName == "security.selinux") continue;
|
||||
if (lremovexattr(path.c_str(), eaName.c_str()) == -1)
|
||||
throw SysError("removing extended attribute ‘%s’ from ‘%s’", eaName, path);
|
||||
throw SysError("removing extended attribute '%s' from '%s'", eaName, path);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -464,7 +464,7 @@ static void canonicalisePathMetaData_(const Path & path, uid_t fromUid, InodesSe
|
|||
if (fromUid != (uid_t) -1 && st.st_uid != fromUid) {
|
||||
assert(!S_ISDIR(st.st_mode));
|
||||
if (inodesSeen.find(Inode(st.st_dev, st.st_ino)) == inodesSeen.end())
|
||||
throw BuildError(format("invalid ownership on file ‘%1%’") % path);
|
||||
throw BuildError(format("invalid ownership on file '%1%'") % path);
|
||||
mode_t mode = st.st_mode & ~S_IFMT;
|
||||
assert(S_ISLNK(st.st_mode) || (st.st_uid == geteuid() && (mode == 0444 || mode == 0555) && st.st_mtime == mtimeStore));
|
||||
return;
|
||||
|
@ -488,7 +488,7 @@ static void canonicalisePathMetaData_(const Path & path, uid_t fromUid, InodesSe
|
|||
if (!S_ISLNK(st.st_mode) &&
|
||||
chown(path.c_str(), geteuid(), getegid()) == -1)
|
||||
#endif
|
||||
throw SysError(format("changing owner of ‘%1%’ to %2%")
|
||||
throw SysError(format("changing owner of '%1%' to %2%")
|
||||
% path % geteuid());
|
||||
}
|
||||
|
||||
|
@ -508,11 +508,11 @@ void canonicalisePathMetaData(const Path & path, uid_t fromUid, InodesSeen & ino
|
|||
be a symlink, since we can't change its ownership. */
|
||||
struct stat st;
|
||||
if (lstat(path.c_str(), &st))
|
||||
throw SysError(format("getting attributes of path ‘%1%’") % path);
|
||||
throw SysError(format("getting attributes of path '%1%'") % path);
|
||||
|
||||
if (st.st_uid != geteuid()) {
|
||||
assert(S_ISLNK(st.st_mode));
|
||||
throw Error(format("wrong ownership of top-level store path ‘%1%’") % path);
|
||||
throw Error(format("wrong ownership of top-level store path '%1%'") % path);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -533,7 +533,7 @@ void LocalStore::checkDerivationOutputs(const Path & drvPath, const Derivation &
|
|||
if (drv.isFixedOutput()) {
|
||||
DerivationOutputs::const_iterator out = drv.outputs.find("out");
|
||||
if (out == drv.outputs.end())
|
||||
throw Error(format("derivation ‘%1%’ does not have an output named ‘out’") % drvPath);
|
||||
throw Error(format("derivation '%1%' does not have an output named 'out'") % drvPath);
|
||||
|
||||
bool recursive; Hash h;
|
||||
out->second.parseHashInfo(recursive, h);
|
||||
|
@ -541,7 +541,7 @@ void LocalStore::checkDerivationOutputs(const Path & drvPath, const Derivation &
|
|||
|
||||
StringPairs::const_iterator j = drv.env.find("out");
|
||||
if (out->second.path != outPath || j == drv.env.end() || j->second != outPath)
|
||||
throw Error(format("derivation ‘%1%’ has incorrect output ‘%2%’, should be ‘%3%’")
|
||||
throw Error(format("derivation '%1%' has incorrect output '%2%', should be '%3%'")
|
||||
% drvPath % out->second.path % outPath);
|
||||
}
|
||||
|
||||
|
@ -558,7 +558,7 @@ void LocalStore::checkDerivationOutputs(const Path & drvPath, const Derivation &
|
|||
Path outPath = makeOutputPath(i.first, h, drvName);
|
||||
StringPairs::const_iterator j = drv.env.find(i.first);
|
||||
if (i.second.path != outPath || j == drv.env.end() || j->second != outPath)
|
||||
throw Error(format("derivation ‘%1%’ has incorrect output ‘%2%’, should be ‘%3%’")
|
||||
throw Error(format("derivation '%1%' has incorrect output '%2%', should be '%3%'")
|
||||
% drvPath % i.second.path % outPath);
|
||||
}
|
||||
}
|
||||
|
@ -639,7 +639,7 @@ void LocalStore::queryPathInfoUncached(const Path & path,
|
|||
try {
|
||||
info->narHash = Hash(useQueryPathInfo.getStr(1));
|
||||
} catch (BadHash & e) {
|
||||
throw Error("in valid-path entry for ‘%s’: %s", path, e.what());
|
||||
throw Error("in valid-path entry for '%s': %s", path, e.what());
|
||||
}
|
||||
|
||||
info->registrationTime = useQueryPathInfo.getInt(2);
|
||||
|
@ -688,7 +688,7 @@ uint64_t LocalStore::queryValidPathId(State & state, const Path & path)
|
|||
{
|
||||
auto use(state.stmtQueryPathInfo.use()(path));
|
||||
if (!use.next())
|
||||
throw Error(format("path ‘%1%’ is not valid") % path);
|
||||
throw Error(format("path '%1%' is not valid") % path);
|
||||
return use.getInt(0);
|
||||
}
|
||||
|
||||
|
@ -855,7 +855,7 @@ void LocalStore::querySubstitutablePathInfos(const PathSet & paths,
|
|||
if (sub->storeDir != storeDir) continue;
|
||||
for (auto & path : paths) {
|
||||
if (infos.count(path)) continue;
|
||||
debug(format("checking substituter ‘%s’ for path ‘%s’")
|
||||
debug(format("checking substituter '%s' for path '%s'")
|
||||
% sub->getUri() % path);
|
||||
try {
|
||||
auto info = sub->queryPathInfo(path);
|
||||
|
@ -936,7 +936,7 @@ void LocalStore::registerValidPaths(const ValidPathInfos & infos)
|
|||
there are no referrers. */
|
||||
void LocalStore::invalidatePath(State & state, const Path & path)
|
||||
{
|
||||
debug(format("invalidating path ‘%1%’") % path);
|
||||
debug(format("invalidating path '%1%'") % path);
|
||||
|
||||
state.stmtInvalidatePath.use()(path).exec();
|
||||
|
||||
|
@ -957,15 +957,15 @@ void LocalStore::addToStore(const ValidPathInfo & info, const ref<std::string> &
|
|||
|
||||
Hash h = hashString(htSHA256, *nar);
|
||||
if (h != info.narHash)
|
||||
throw Error("hash mismatch importing path ‘%s’; expected hash ‘%s’, got ‘%s’",
|
||||
throw Error("hash mismatch importing path '%s'; expected hash '%s', got '%s'",
|
||||
info.path, info.narHash.to_string(), h.to_string());
|
||||
|
||||
if (nar->size() != info.narSize)
|
||||
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());
|
||||
|
||||
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);
|
||||
|
||||
|
@ -1150,7 +1150,7 @@ void LocalStore::invalidatePathChecked(const Path & path)
|
|||
PathSet referrers; queryReferrers(*state, path, referrers);
|
||||
referrers.erase(path); /* ignore self-references */
|
||||
if (!referrers.empty())
|
||||
throw PathInUse(format("cannot delete path ‘%1%’ because it is in use by %2%")
|
||||
throw PathInUse(format("cannot delete path '%1%' because it is in use by %2%")
|
||||
% path % showPaths(referrers));
|
||||
invalidatePath(*state, path);
|
||||
}
|
||||
|
@ -1195,12 +1195,12 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair)
|
|||
auto info = std::const_pointer_cast<ValidPathInfo>(std::shared_ptr<const ValidPathInfo>(queryPathInfo(i)));
|
||||
|
||||
/* Check the content hash (optionally - slow). */
|
||||
printMsg(lvlTalkative, format("checking contents of ‘%1%’") % i);
|
||||
printMsg(lvlTalkative, format("checking contents of '%1%'") % i);
|
||||
HashResult current = hashPath(info->narHash.type, i);
|
||||
|
||||
if (info->narHash != nullHash && info->narHash != current.first) {
|
||||
printError(format("path ‘%1%’ was modified! "
|
||||
"expected hash ‘%2%’, got ‘%3%’")
|
||||
printError(format("path '%1%' was modified! "
|
||||
"expected hash '%2%', got '%3%'")
|
||||
% i % info->narHash.to_string() % current.first.to_string());
|
||||
if (repair) repairPath(i); else errors = true;
|
||||
} else {
|
||||
|
@ -1209,14 +1209,14 @@ bool LocalStore::verifyStore(bool checkContents, RepairFlag repair)
|
|||
|
||||
/* Fill in missing hashes. */
|
||||
if (info->narHash == nullHash) {
|
||||
printError(format("fixing missing hash on ‘%1%’") % i);
|
||||
printError(format("fixing missing hash on '%1%'") % i);
|
||||
info->narHash = current.first;
|
||||
update = true;
|
||||
}
|
||||
|
||||
/* Fill in missing narSize fields (from old stores). */
|
||||
if (info->narSize == 0) {
|
||||
printError(format("updating size field on ‘%1%’ to %2%") % i % current.second);
|
||||
printError(format("updating size field on '%1%' to %2%") % i % current.second);
|
||||
info->narSize = current.second;
|
||||
update = true;
|
||||
}
|
||||
|
@ -1253,7 +1253,7 @@ void LocalStore::verifyPath(const Path & path, const PathSet & store,
|
|||
done.insert(path);
|
||||
|
||||
if (!isStorePath(path)) {
|
||||
printError(format("path ‘%1%’ is not in the Nix store") % path);
|
||||
printError(format("path '%1%' is not in the Nix store") % path);
|
||||
auto state(_state.lock());
|
||||
invalidatePath(*state, path);
|
||||
return;
|
||||
|
@ -1272,11 +1272,11 @@ void LocalStore::verifyPath(const Path & path, const PathSet & store,
|
|||
}
|
||||
|
||||
if (canInvalidate) {
|
||||
printError(format("path ‘%1%’ disappeared, removing from database...") % path);
|
||||
printError(format("path '%1%' disappeared, removing from database...") % path);
|
||||
auto state(_state.lock());
|
||||
invalidatePath(*state, path);
|
||||
} else {
|
||||
printError(format("path ‘%1%’ disappeared, but it still has valid referrers!") % path);
|
||||
printError(format("path '%1%' disappeared, but it still has valid referrers!") % path);
|
||||
if (repair)
|
||||
try {
|
||||
repairPath(path);
|
||||
|
@ -1315,7 +1315,7 @@ static void makeMutable(const Path & path)
|
|||
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_NOFOLLOW | O_CLOEXEC);
|
||||
if (fd == -1) {
|
||||
if (errno == ELOOP) return; // it's a symlink
|
||||
throw SysError(format("opening file ‘%1%’") % path);
|
||||
throw SysError(format("opening file '%1%'") % path);
|
||||
}
|
||||
|
||||
unsigned int flags = 0, old;
|
||||
|
|
|
@ -53,7 +53,7 @@ void parseMachines(const std::string & s, Machines & machines)
|
|||
auto tokens = tokenizeString<std::vector<string>>(line);
|
||||
auto sz = tokens.size();
|
||||
if (sz < 1)
|
||||
throw FormatError("bad machine specification ‘%s’", line);
|
||||
throw FormatError("bad machine specification '%s'", line);
|
||||
|
||||
auto isSet = [&](size_t n) {
|
||||
return tokens.size() > n && tokens[n] != "" && tokens[n] != "-";
|
||||
|
|
|
@ -245,7 +245,7 @@ Paths Store::topoSortPaths(const PathSet & paths)
|
|||
|
||||
dfsVisit = [&](const Path & path, const Path * parent) {
|
||||
if (parents.find(path) != parents.end())
|
||||
throw BuildError(format("cycle detected in the references of ‘%1%’ from ‘%2%’") % path % *parent);
|
||||
throw BuildError(format("cycle detected in the references of '%1%' from '%2%'") % path % *parent);
|
||||
|
||||
if (visited.find(path) != visited.end()) return;
|
||||
visited.insert(path);
|
||||
|
|
|
@ -46,7 +46,7 @@ struct NarIndexer : ParseSink, StringSource
|
|||
parents.push(&root);
|
||||
} else {
|
||||
if(parents.top()->type != FSAccessor::Type::tDirectory) {
|
||||
throw Error(format("NAR file missing parent directory of path ‘%1%’") % path);
|
||||
throw Error(format("NAR file missing parent directory of path '%1%'") % path);
|
||||
}
|
||||
auto result = parents.top()->children.emplace(baseNameOf(path), std::move(member));
|
||||
parents.push(&result.first->second);
|
||||
|
@ -120,7 +120,7 @@ struct NarIndexer : ParseSink, StringSource
|
|||
NarMember& at(const Path & path) {
|
||||
auto result = find(path);
|
||||
if(result == nullptr) {
|
||||
throw Error(format("NAR file does not contain path ‘%1%’") % path);
|
||||
throw Error(format("NAR file does not contain path '%1%'") % path);
|
||||
}
|
||||
return *result;
|
||||
}
|
||||
|
@ -149,7 +149,7 @@ struct NarAccessor : public FSAccessor
|
|||
auto i = indexer.at(path);
|
||||
|
||||
if (i.type != FSAccessor::Type::tDirectory)
|
||||
throw Error(format("path ‘%1%’ inside NAR file is not a directory") % path);
|
||||
throw Error(format("path '%1%' inside NAR file is not a directory") % path);
|
||||
|
||||
StringSet res;
|
||||
for(auto&& child : i.children) {
|
||||
|
@ -163,7 +163,7 @@ struct NarAccessor : public FSAccessor
|
|||
{
|
||||
auto i = indexer.at(path);
|
||||
if (i.type != FSAccessor::Type::tRegular)
|
||||
throw Error(format("path ‘%1%’ inside NAR file is not a regular file") % path);
|
||||
throw Error(format("path '%1%' inside NAR file is not a regular file") % path);
|
||||
return std::string(*nar, i.start, i.size);
|
||||
}
|
||||
|
||||
|
@ -171,7 +171,7 @@ struct NarAccessor : public FSAccessor
|
|||
{
|
||||
auto i = indexer.at(path);
|
||||
if (i.type != FSAccessor::Type::tSymlink)
|
||||
throw Error(format("path ‘%1%’ inside NAR file is not a symlink") % path);
|
||||
throw Error(format("path '%1%' inside NAR file is not a symlink") % path);
|
||||
return i.target;
|
||||
}
|
||||
};
|
||||
|
|
|
@ -6,7 +6,7 @@ namespace nix {
|
|||
NarInfo::NarInfo(const Store & store, const std::string & s, const std::string & whence)
|
||||
{
|
||||
auto corrupt = [&]() {
|
||||
throw Error(format("NAR info file ‘%1%’ is corrupt") % whence);
|
||||
throw Error(format("NAR info file '%1%' is corrupt") % whence);
|
||||
};
|
||||
|
||||
auto parseHashField = [&](const string & s) {
|
||||
|
|
|
@ -19,9 +19,9 @@ static void makeWritable(const Path & path)
|
|||
{
|
||||
struct stat st;
|
||||
if (lstat(path.c_str(), &st))
|
||||
throw SysError(format("getting attributes of path ‘%1%’") % path);
|
||||
throw SysError(format("getting attributes of path '%1%'") % path);
|
||||
if (chmod(path.c_str(), st.st_mode | S_IWUSR) == -1)
|
||||
throw SysError(format("changing writability of ‘%1%’") % path);
|
||||
throw SysError(format("changing writability of '%1%'") % path);
|
||||
}
|
||||
|
||||
|
||||
|
@ -47,7 +47,7 @@ LocalStore::InodeHash LocalStore::loadInodeHash()
|
|||
InodeHash inodeHash;
|
||||
|
||||
AutoCloseDir dir(opendir(linksDir.c_str()));
|
||||
if (!dir) throw SysError(format("opening directory ‘%1%’") % linksDir);
|
||||
if (!dir) throw SysError(format("opening directory '%1%'") % linksDir);
|
||||
|
||||
struct dirent * dirent;
|
||||
while (errno = 0, dirent = readdir(dir.get())) { /* sic */
|
||||
|
@ -55,7 +55,7 @@ LocalStore::InodeHash LocalStore::loadInodeHash()
|
|||
// We don't care if we hit non-hash files, anything goes
|
||||
inodeHash.insert(dirent->d_ino);
|
||||
}
|
||||
if (errno) throw SysError(format("reading directory ‘%1%’") % linksDir);
|
||||
if (errno) throw SysError(format("reading directory '%1%'") % linksDir);
|
||||
|
||||
printMsg(lvlTalkative, format("loaded %1% hash inodes") % inodeHash.size());
|
||||
|
||||
|
@ -68,14 +68,14 @@ Strings LocalStore::readDirectoryIgnoringInodes(const Path & path, const InodeHa
|
|||
Strings names;
|
||||
|
||||
AutoCloseDir dir(opendir(path.c_str()));
|
||||
if (!dir) throw SysError(format("opening directory ‘%1%’") % path);
|
||||
if (!dir) throw SysError(format("opening directory '%1%'") % path);
|
||||
|
||||
struct dirent * dirent;
|
||||
while (errno = 0, dirent = readdir(dir.get())) { /* sic */
|
||||
checkInterrupt();
|
||||
|
||||
if (inodeHash.count(dirent->d_ino)) {
|
||||
debug(format("‘%1%’ is already linked") % dirent->d_name);
|
||||
debug(format("'%1%' is already linked") % dirent->d_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -83,7 +83,7 @@ Strings LocalStore::readDirectoryIgnoringInodes(const Path & path, const InodeHa
|
|||
if (name == "." || name == "..") continue;
|
||||
names.push_back(name);
|
||||
}
|
||||
if (errno) throw SysError(format("reading directory ‘%1%’") % path);
|
||||
if (errno) throw SysError(format("reading directory '%1%'") % path);
|
||||
|
||||
return names;
|
||||
}
|
||||
|
@ -95,7 +95,7 @@ void LocalStore::optimisePath_(OptimiseStats & stats, const Path & path, InodeHa
|
|||
|
||||
struct stat st;
|
||||
if (lstat(path.c_str(), &st))
|
||||
throw SysError(format("getting attributes of path ‘%1%’") % path);
|
||||
throw SysError(format("getting attributes of path '%1%'") % path);
|
||||
|
||||
#if __APPLE__
|
||||
/* HFS/OS X has some undocumented security feature disabling hardlinking for
|
||||
|
@ -105,7 +105,7 @@ void LocalStore::optimisePath_(OptimiseStats & stats, const Path & path, InodeHa
|
|||
|
||||
if (std::regex_search(path, std::regex("\\.app/Contents/PkgInfo$")) ||
|
||||
std::regex_search(path, std::regex("\\.app/Contents/Resources/.+\\.lproj$"))) {
|
||||
debug(format("‘%1%’ is not allowed to be linked in OS X") % path);
|
||||
debug(format("'%1%' is not allowed to be linked in OS X") % path);
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
@ -129,13 +129,13 @@ void LocalStore::optimisePath_(OptimiseStats & stats, const Path & path, InodeHa
|
|||
NixOS (example: $fontconfig/var/cache being modified). Skip
|
||||
those files. FIXME: check the modification time. */
|
||||
if (S_ISREG(st.st_mode) && (st.st_mode & S_IWUSR)) {
|
||||
printError(format("skipping suspicious writable file ‘%1%’") % path);
|
||||
printError(format("skipping suspicious writable file '%1%'") % path);
|
||||
return;
|
||||
}
|
||||
|
||||
/* This can still happen on top-level files. */
|
||||
if (st.st_nlink > 1 && inodeHash.count(st.st_ino)) {
|
||||
debug(format("‘%1%’ is already linked, with %2% other file(s)") % path % (st.st_nlink - 2));
|
||||
debug(format("'%1%' is already linked, with %2% other file(s)") % path % (st.st_nlink - 2));
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -149,7 +149,7 @@ void LocalStore::optimisePath_(OptimiseStats & stats, const Path & path, InodeHa
|
|||
contents of the symlink (i.e. the result of readlink()), not
|
||||
the contents of the target (which may not even exist). */
|
||||
Hash hash = hashPath(htSHA256, path).first;
|
||||
debug(format("‘%1%’ has hash ‘%2%’") % path % hash.to_string());
|
||||
debug(format("'%1%' has hash '%2%'") % path % hash.to_string());
|
||||
|
||||
/* Check if this is a known hash. */
|
||||
Path linkPath = linksDir + "/" + hash.to_string(Base32, false);
|
||||
|
@ -173,11 +173,11 @@ void LocalStore::optimisePath_(OptimiseStats & stats, const Path & path, InodeHa
|
|||
full. When that happens, it's fine to ignore it: we
|
||||
just effectively disable deduplication of this
|
||||
file. */
|
||||
printInfo("cannot link ‘%s’ to ‘%s’: %s", linkPath, path, strerror(errno));
|
||||
printInfo("cannot link '%s' to '%s': %s", linkPath, path, strerror(errno));
|
||||
return;
|
||||
|
||||
default:
|
||||
throw SysError("cannot link ‘%1%’ to ‘%2%’", linkPath, path);
|
||||
throw SysError("cannot link '%1%' to '%2%'", linkPath, path);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -185,20 +185,20 @@ void LocalStore::optimisePath_(OptimiseStats & stats, const Path & path, InodeHa
|
|||
current file with a hard link to that file. */
|
||||
struct stat stLink;
|
||||
if (lstat(linkPath.c_str(), &stLink))
|
||||
throw SysError(format("getting attributes of path ‘%1%’") % linkPath);
|
||||
throw SysError(format("getting attributes of path '%1%'") % linkPath);
|
||||
|
||||
if (st.st_ino == stLink.st_ino) {
|
||||
debug(format("‘%1%’ is already linked to ‘%2%’") % path % linkPath);
|
||||
debug(format("'%1%' is already linked to '%2%'") % path % linkPath);
|
||||
return;
|
||||
}
|
||||
|
||||
if (st.st_size != stLink.st_size) {
|
||||
printError(format("removing corrupted link ‘%1%’") % linkPath);
|
||||
printError(format("removing corrupted link '%1%'") % linkPath);
|
||||
unlink(linkPath.c_str());
|
||||
goto retry;
|
||||
}
|
||||
|
||||
printMsg(lvlTalkative, format("linking ‘%1%’ to ‘%2%’") % path % linkPath);
|
||||
printMsg(lvlTalkative, format("linking '%1%' to '%2%'") % path % linkPath);
|
||||
|
||||
/* Make the containing directory writable, but only if it's not
|
||||
the store itself (we don't want or need to mess with its
|
||||
|
@ -219,25 +219,25 @@ void LocalStore::optimisePath_(OptimiseStats & stats, const Path & path, InodeHa
|
|||
systems). This is likely to happen with empty files.
|
||||
Just shrug and ignore. */
|
||||
if (st.st_size)
|
||||
printInfo(format("‘%1%’ has maximum number of links") % linkPath);
|
||||
printInfo(format("'%1%' has maximum number of links") % linkPath);
|
||||
return;
|
||||
}
|
||||
throw SysError("cannot link ‘%1%’ to ‘%2%’", tempLink, linkPath);
|
||||
throw SysError("cannot link '%1%' to '%2%'", tempLink, linkPath);
|
||||
}
|
||||
|
||||
/* Atomically replace the old file with the new hard link. */
|
||||
if (rename(tempLink.c_str(), path.c_str()) == -1) {
|
||||
if (unlink(tempLink.c_str()) == -1)
|
||||
printError(format("unable to unlink ‘%1%’") % tempLink);
|
||||
printError(format("unable to unlink '%1%'") % tempLink);
|
||||
if (errno == EMLINK) {
|
||||
/* Some filesystems generate too many links on the rename,
|
||||
rather than on the original link. (Probably it
|
||||
temporarily increases the st_nlink field before
|
||||
decreasing it again.) */
|
||||
debug("‘%s’ has reached maximum number of links", linkPath);
|
||||
debug("'%s' has reached maximum number of links", linkPath);
|
||||
return;
|
||||
}
|
||||
throw SysError(format("cannot rename ‘%1%’ to ‘%2%’") % tempLink % path);
|
||||
throw SysError(format("cannot rename '%1%' to '%2%'") % tempLink % path);
|
||||
}
|
||||
|
||||
stats.filesLinked++;
|
||||
|
@ -254,7 +254,7 @@ void LocalStore::optimiseStore(OptimiseStats & stats)
|
|||
for (auto & i : paths) {
|
||||
addTempRoot(i);
|
||||
if (!isValidPath(i)) continue; /* path was GC'ed, probably */
|
||||
//Activity act(*logger, lvlChatty, format("hashing files in ‘%1%’") % i);
|
||||
//Activity act(*logger, lvlChatty, format("hashing files in '%1%'") % i);
|
||||
optimisePath_(stats, realStoreDir + "/" + baseNameOf(i), inodeHash);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ AutoCloseFD openLockFile(const Path & path, bool create)
|
|||
|
||||
fd = open(path.c_str(), O_CLOEXEC | O_RDWR | (create ? O_CREAT : 0), 0600);
|
||||
if (!fd && (create || errno != ENOENT))
|
||||
throw SysError(format("opening lock file ‘%1%’") % path);
|
||||
throw SysError(format("opening lock file '%1%'") % path);
|
||||
|
||||
return fd;
|
||||
}
|
||||
|
@ -109,12 +109,12 @@ bool PathLocks::lockPaths(const PathSet & _paths,
|
|||
checkInterrupt();
|
||||
Path lockPath = path + ".lock";
|
||||
|
||||
debug(format("locking path ‘%1%’") % path);
|
||||
debug(format("locking path '%1%'") % path);
|
||||
|
||||
{
|
||||
auto lockedPaths(lockedPaths_.lock());
|
||||
if (lockedPaths->count(lockPath))
|
||||
throw Error("deadlock: trying to re-acquire self-held lock ‘%s’", lockPath);
|
||||
throw Error("deadlock: trying to re-acquire self-held lock '%s'", lockPath);
|
||||
lockedPaths->insert(lockPath);
|
||||
}
|
||||
|
||||
|
@ -141,19 +141,19 @@ bool PathLocks::lockPaths(const PathSet & _paths,
|
|||
}
|
||||
}
|
||||
|
||||
debug(format("lock acquired on ‘%1%’") % lockPath);
|
||||
debug(format("lock acquired on '%1%'") % lockPath);
|
||||
|
||||
/* Check that the lock file hasn't become stale (i.e.,
|
||||
hasn't been unlinked). */
|
||||
struct stat st;
|
||||
if (fstat(fd.get(), &st) == -1)
|
||||
throw SysError(format("statting lock file ‘%1%’") % lockPath);
|
||||
throw SysError(format("statting lock file '%1%'") % lockPath);
|
||||
if (st.st_size != 0)
|
||||
/* This lock file has been unlinked, so we're holding
|
||||
a lock on a deleted file. This means that other
|
||||
processes may create and acquire a lock on
|
||||
`lockPath', and proceed. So we must retry. */
|
||||
debug(format("open lock file ‘%1%’ has become stale") % lockPath);
|
||||
debug(format("open lock file '%1%' has become stale") % lockPath);
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
@ -191,9 +191,9 @@ void PathLocks::unlock()
|
|||
|
||||
if (close(i.first) == -1)
|
||||
printError(
|
||||
format("error (ignored): cannot close lock file on ‘%1%’") % i.second);
|
||||
format("error (ignored): cannot close lock file on '%1%'") % i.second);
|
||||
|
||||
debug(format("lock released on ‘%1%’") % i.second);
|
||||
debug(format("lock released on '%1%'") % i.second);
|
||||
}
|
||||
|
||||
fds.clear();
|
||||
|
|
|
@ -50,7 +50,7 @@ Generations findGenerations(Path profile, int & curGen)
|
|||
gen.number = n;
|
||||
struct stat st;
|
||||
if (lstat(gen.path.c_str(), &st) != 0)
|
||||
throw SysError(format("statting ‘%1%’") % gen.path);
|
||||
throw SysError(format("statting '%1%'") % gen.path);
|
||||
gen.creationTime = st.st_mtime;
|
||||
gens.push_back(gen);
|
||||
}
|
||||
|
@ -117,7 +117,7 @@ Path createGeneration(ref<LocalFSStore> store, Path profile, Path outPath)
|
|||
static void removeFile(const Path & path)
|
||||
{
|
||||
if (remove(path.c_str()) == -1)
|
||||
throw SysError(format("cannot unlink ‘%1%’") % path);
|
||||
throw SysError(format("cannot unlink '%1%'") % path);
|
||||
}
|
||||
|
||||
|
||||
|
@ -149,7 +149,7 @@ void deleteGenerations(const Path & profile, const std::set<unsigned int> & gens
|
|||
Generations gens = findGenerations(profile, curGen);
|
||||
|
||||
if (gensToDelete.find(curGen) != gensToDelete.end())
|
||||
throw Error(format("cannot delete current generation of profile %1%’") % profile);
|
||||
throw Error(format("cannot delete current generation of profile %1%'") % profile);
|
||||
|
||||
for (auto & i : gens) {
|
||||
if (gensToDelete.find(i.number) == gensToDelete.end()) continue;
|
||||
|
@ -203,7 +203,7 @@ void deleteGenerationsOlderThan(const Path & profile, const string & timeSpec, b
|
|||
int days;
|
||||
|
||||
if (!string2Int(strDays, days) || days < 1)
|
||||
throw Error(format("invalid number of days specifier ‘%1%’") % timeSpec);
|
||||
throw Error(format("invalid number of days specifier '%1%'") % timeSpec);
|
||||
|
||||
time_t oldTime = curTime - days * 24 * 3600;
|
||||
|
||||
|
@ -222,7 +222,7 @@ void switchLink(Path link, Path target)
|
|||
|
||||
void lockProfile(PathLocks & lock, const Path & profile)
|
||||
{
|
||||
lock.lockPaths({profile}, (format("waiting for lock on profile ‘%1%’") % profile).str());
|
||||
lock.lockPaths({profile}, (format("waiting for lock on profile '%1%'") % profile).str());
|
||||
lock.setDeletion(true);
|
||||
}
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ static void search(const unsigned char * s, unsigned int len,
|
|||
if (!match) continue;
|
||||
string ref((const char *) s + i, refLength);
|
||||
if (hashes.find(ref) != hashes.end()) {
|
||||
debug(format("found reference to ‘%1%’ at offset ‘%2%’")
|
||||
debug(format("found reference to '%1%' at offset '%2%'")
|
||||
% ref % i);
|
||||
seen.insert(ref);
|
||||
hashes.erase(ref);
|
||||
|
@ -93,7 +93,7 @@ PathSet scanForReferences(const string & path,
|
|||
string baseName = baseNameOf(i);
|
||||
string::size_type pos = baseName.find('-');
|
||||
if (pos == string::npos)
|
||||
throw Error(format("bad reference ‘%1%’") % i);
|
||||
throw Error(format("bad reference '%1%'") % i);
|
||||
string s = string(baseName, 0, pos);
|
||||
assert(s.size() == refLength);
|
||||
assert(backMap.find(s) == backMap.end());
|
||||
|
|
|
@ -17,7 +17,7 @@ std::pair<ref<FSAccessor>, Path> RemoteFSAccessor::fetch(const Path & path_)
|
|||
std::string restPath = std::string(path, storePath.size());
|
||||
|
||||
if (!store->isValidPath(storePath))
|
||||
throw InvalidPath(format("path ‘%1%’ is not a valid store path") % storePath);
|
||||
throw InvalidPath(format("path '%1%' is not a valid store path") % storePath);
|
||||
|
||||
auto i = nars.find(storePath);
|
||||
if (i != nars.end()) return {i->second, restPath};
|
||||
|
|
|
@ -54,7 +54,7 @@ RemoteStore::RemoteStore(const Params & params)
|
|||
ref<RemoteStore::Connection> RemoteStore::openConnectionWrapper()
|
||||
{
|
||||
if (failed)
|
||||
throw Error("opening a connection to remote store ‘%s’ previously failed", getUri());
|
||||
throw Error("opening a connection to remote store '%s' previously failed", getUri());
|
||||
try {
|
||||
return openConnection();
|
||||
} catch (...) {
|
||||
|
@ -97,11 +97,11 @@ ref<RemoteStore::Connection> UDSRemoteStore::openConnection()
|
|||
struct sockaddr_un addr;
|
||||
addr.sun_family = AF_UNIX;
|
||||
if (socketPath.size() + 1 >= sizeof(addr.sun_path))
|
||||
throw Error(format("socket path ‘%1%’ is too long") % socketPath);
|
||||
throw Error(format("socket path '%1%' is too long") % socketPath);
|
||||
strcpy(addr.sun_path, socketPath.c_str());
|
||||
|
||||
if (::connect(conn->fd.get(), (struct sockaddr *) &addr, sizeof(addr)) == -1)
|
||||
throw SysError(format("cannot connect to daemon at ‘%1%’") % socketPath);
|
||||
throw SysError(format("cannot connect to daemon at '%1%'") % socketPath);
|
||||
|
||||
conn->from.fd = conn->fd.get();
|
||||
conn->to.fd = conn->fd.get();
|
||||
|
@ -142,7 +142,7 @@ void RemoteStore::initConnection(Connection & conn)
|
|||
conn.processStderr();
|
||||
}
|
||||
catch (Error & e) {
|
||||
throw Error("cannot open connection to remote store ‘%s’: %s", getUri(), e.what());
|
||||
throw Error("cannot open connection to remote store '%s': %s", getUri(), e.what());
|
||||
}
|
||||
|
||||
setOptions(conn);
|
||||
|
@ -288,7 +288,7 @@ void RemoteStore::queryPathInfoUncached(const Path & path,
|
|||
}
|
||||
if (GET_PROTOCOL_MINOR(conn->daemonVersion) >= 17) {
|
||||
bool valid; conn->from >> valid;
|
||||
if (!valid) throw InvalidPath(format("path ‘%s’ is not valid") % path);
|
||||
if (!valid) throw InvalidPath(format("path '%s' is not valid") % path);
|
||||
}
|
||||
auto info = std::make_shared<ValidPathInfo>();
|
||||
info->path = path;
|
||||
|
|
|
@ -110,7 +110,7 @@ ref<Aws::Client::ClientConfiguration> S3Helper::makeConfig(const string & region
|
|||
S3Helper::DownloadResult S3Helper::getObject(
|
||||
const std::string & bucketName, const std::string & key)
|
||||
{
|
||||
debug("fetching ‘s3://%s/%s’...", bucketName, key);
|
||||
debug("fetching 's3://%s/%s'...", bucketName, key);
|
||||
|
||||
auto request =
|
||||
Aws::S3::Model::GetObjectRequest()
|
||||
|
@ -127,7 +127,7 @@ S3Helper::DownloadResult S3Helper::getObject(
|
|||
|
||||
try {
|
||||
|
||||
auto result = checkAws(fmt("AWS error fetching ‘%s’", key),
|
||||
auto result = checkAws(fmt("AWS error fetching '%s'", key),
|
||||
client->GetObject(request));
|
||||
|
||||
res.data = decodeContent(
|
||||
|
@ -185,9 +185,9 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
|||
|
||||
if (!res.IsSuccess()) {
|
||||
if (res.GetError().GetErrorType() != Aws::S3::S3Errors::NO_SUCH_BUCKET)
|
||||
throw Error(format("AWS error checking bucket ‘%s’: %s") % bucketName % res.GetError().GetMessage());
|
||||
throw Error(format("AWS error checking bucket '%s': %s") % bucketName % res.GetError().GetMessage());
|
||||
|
||||
printInfo("creating S3 bucket ‘%s’...", bucketName);
|
||||
printInfo("creating S3 bucket '%s'...", bucketName);
|
||||
|
||||
// Stupid S3 bucket locations.
|
||||
auto bucketConfig = Aws::S3::Model::CreateBucketConfiguration();
|
||||
|
@ -196,7 +196,7 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
|||
Aws::S3::Model::BucketLocationConstraintMapper::GetBucketLocationConstraintForName(
|
||||
s3Helper.config->region));
|
||||
|
||||
checkAws(format("AWS error creating bucket ‘%s’") % bucketName,
|
||||
checkAws(format("AWS error creating bucket '%s'") % bucketName,
|
||||
s3Helper.client->CreateBucket(
|
||||
Aws::S3::Model::CreateBucketRequest()
|
||||
.WithBucket(bucketName)
|
||||
|
@ -244,7 +244,7 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
|||
|| (error.GetErrorType() == Aws::S3::S3Errors::UNKNOWN // FIXME
|
||||
&& error.GetMessage().find("404") != std::string::npos))
|
||||
return false;
|
||||
throw Error(format("AWS error fetching ‘%s’: %s") % path % error.GetMessage());
|
||||
throw Error(format("AWS error fetching '%s': %s") % path % error.GetMessage());
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -273,14 +273,14 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
|||
|
||||
auto now1 = std::chrono::steady_clock::now();
|
||||
|
||||
auto result = checkAws(format("AWS error uploading ‘%s’") % path,
|
||||
auto result = checkAws(format("AWS error uploading '%s'") % path,
|
||||
s3Helper.client->PutObject(request));
|
||||
|
||||
auto now2 = std::chrono::steady_clock::now();
|
||||
|
||||
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(now2 - now1).count();
|
||||
|
||||
printInfo(format("uploaded ‘s3://%1%/%2%’ (%3% bytes) in %4% ms")
|
||||
printInfo(format("uploaded 's3://%1%/%2%' (%3% bytes) in %4% ms")
|
||||
% bucketName % path % data.size() % duration);
|
||||
|
||||
stats.putTimeMs += duration;
|
||||
|
@ -312,7 +312,7 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
|||
stats.getTimeMs += res.durationMs;
|
||||
|
||||
if (res.data)
|
||||
printTalkative("downloaded ‘s3://%s/%s’ (%d bytes) in %d ms",
|
||||
printTalkative("downloaded 's3://%s/%s' (%d bytes) in %d ms",
|
||||
bucketName, path, res.data->size(), res.durationMs);
|
||||
|
||||
return res.data;
|
||||
|
@ -325,9 +325,9 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
|||
std::string marker;
|
||||
|
||||
do {
|
||||
debug(format("listing bucket ‘s3://%s’ from key ‘%s’...") % bucketName % marker);
|
||||
debug(format("listing bucket 's3://%s' from key '%s'...") % bucketName % marker);
|
||||
|
||||
auto res = checkAws(format("AWS error listing bucket ‘%s’") % bucketName,
|
||||
auto res = checkAws(format("AWS error listing bucket '%s'") % bucketName,
|
||||
s3Helper.client->ListObjects(
|
||||
Aws::S3::Model::ListObjectsRequest()
|
||||
.WithBucket(bucketName)
|
||||
|
@ -336,7 +336,7 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore
|
|||
|
||||
auto & contents = res.GetContents();
|
||||
|
||||
debug(format("got %d keys, next marker ‘%s’")
|
||||
debug(format("got %d keys, next marker '%s'")
|
||||
% contents.size() % res.GetNextMarker());
|
||||
|
||||
for (auto object : contents) {
|
||||
|
|
|
@ -17,18 +17,18 @@ namespace nix {
|
|||
if (err == SQLITE_BUSY || err == SQLITE_PROTOCOL) {
|
||||
throw SQLiteBusy(
|
||||
err == SQLITE_PROTOCOL
|
||||
? fmt("SQLite database ‘%s’ is busy (SQLITE_PROTOCOL)", path)
|
||||
: fmt("SQLite database ‘%s’ is busy", path));
|
||||
? fmt("SQLite database '%s' is busy (SQLITE_PROTOCOL)", path)
|
||||
: fmt("SQLite database '%s' is busy", path));
|
||||
}
|
||||
else
|
||||
throw SQLiteError("%s: %s (in ‘%s’)", f.str(), sqlite3_errstr(err), path);
|
||||
throw SQLiteError("%s: %s (in '%s')", f.str(), sqlite3_errstr(err), path);
|
||||
}
|
||||
|
||||
SQLite::SQLite(const Path & path)
|
||||
{
|
||||
if (sqlite3_open_v2(path.c_str(), &db,
|
||||
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, 0) != SQLITE_OK)
|
||||
throw Error(format("cannot open SQLite database ‘%s’") % path);
|
||||
throw Error(format("cannot open SQLite database '%s'") % path);
|
||||
}
|
||||
|
||||
SQLite::~SQLite()
|
||||
|
@ -45,7 +45,7 @@ void SQLite::exec(const std::string & stmt)
|
|||
{
|
||||
retrySQLite<void>([&]() {
|
||||
if (sqlite3_exec(db, stmt.c_str(), 0, 0, 0) != SQLITE_OK)
|
||||
throwSQLiteError(db, format("executing SQLite statement ‘%s’") % stmt);
|
||||
throwSQLiteError(db, format("executing SQLite statement '%s'") % stmt);
|
||||
});
|
||||
}
|
||||
|
||||
|
@ -54,7 +54,7 @@ void SQLiteStmt::create(sqlite3 * db, const string & sql)
|
|||
checkInterrupt();
|
||||
assert(!stmt);
|
||||
if (sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, 0) != SQLITE_OK)
|
||||
throwSQLiteError(db, fmt("creating statement ‘%s’", sql));
|
||||
throwSQLiteError(db, fmt("creating statement '%s'", sql));
|
||||
this->db = db;
|
||||
this->sql = sql;
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ SQLiteStmt::~SQLiteStmt()
|
|||
{
|
||||
try {
|
||||
if (stmt && sqlite3_finalize(stmt) != SQLITE_OK)
|
||||
throwSQLiteError(db, fmt("finalizing statement ‘%s’", sql));
|
||||
throwSQLiteError(db, fmt("finalizing statement '%s'", sql));
|
||||
} catch (...) {
|
||||
ignoreException();
|
||||
}
|
||||
|
@ -120,14 +120,14 @@ void SQLiteStmt::Use::exec()
|
|||
int r = step();
|
||||
assert(r != SQLITE_ROW);
|
||||
if (r != SQLITE_DONE)
|
||||
throwSQLiteError(stmt.db, fmt("executing SQLite statement ‘%s’", stmt.sql));
|
||||
throwSQLiteError(stmt.db, fmt("executing SQLite statement '%s'", stmt.sql));
|
||||
}
|
||||
|
||||
bool SQLiteStmt::Use::next()
|
||||
{
|
||||
int r = step();
|
||||
if (r != SQLITE_DONE && r != SQLITE_ROW)
|
||||
throwSQLiteError(stmt.db, fmt("executing SQLite query ‘%s’", stmt.sql));
|
||||
throwSQLiteError(stmt.db, fmt("executing SQLite query '%s'", stmt.sql));
|
||||
return r == SQLITE_ROW;
|
||||
}
|
||||
|
||||
|
|
|
@ -41,7 +41,7 @@ std::unique_ptr<SSHMaster::Connection> SSHMaster::startCommand(const std::string
|
|||
args.push_back(command);
|
||||
execvp(args.begin()->c_str(), stringsToCharPtrs(args).data());
|
||||
|
||||
throw SysError("executing ‘%s’ on ‘%s’", command, host);
|
||||
throw SysError("executing '%s' on '%s'", command, host);
|
||||
});
|
||||
|
||||
|
||||
|
@ -96,7 +96,7 @@ Path SSHMaster::startMaster()
|
|||
} catch (EndOfFile & e) { }
|
||||
|
||||
if (reply != "started")
|
||||
throw Error("failed to start SSH master connection to ‘%s’", host);
|
||||
throw Error("failed to start SSH master connection to '%s'", host);
|
||||
|
||||
return state->socketPath;
|
||||
}
|
||||
|
|
|
@ -30,14 +30,14 @@ bool Store::isStorePath(const Path & path) const
|
|||
void Store::assertStorePath(const Path & path) const
|
||||
{
|
||||
if (!isStorePath(path))
|
||||
throw Error(format("path ‘%1%’ is not in the Nix store") % path);
|
||||
throw Error(format("path '%1%' is not in the Nix store") % path);
|
||||
}
|
||||
|
||||
|
||||
Path Store::toStorePath(const Path & path) const
|
||||
{
|
||||
if (!isInStore(path))
|
||||
throw Error(format("path ‘%1%’ is not in the Nix store") % path);
|
||||
throw Error(format("path '%1%' is not in the Nix store") % path);
|
||||
Path::size_type slash = path.find('/', storeDir.size() + 1);
|
||||
if (slash == Path::npos)
|
||||
return path;
|
||||
|
@ -55,7 +55,7 @@ Path Store::followLinksToStore(const Path & _path) const
|
|||
path = absPath(target, dirOf(path));
|
||||
}
|
||||
if (!isInStore(path))
|
||||
throw Error(format("path ‘%1%’ is not in the Nix store") % path);
|
||||
throw Error(format("path '%1%' is not in the Nix store") % path);
|
||||
return path;
|
||||
}
|
||||
|
||||
|
@ -88,14 +88,14 @@ void checkStoreName(const string & name)
|
|||
/* Disallow names starting with a dot for possible security
|
||||
reasons (e.g., "." and ".."). */
|
||||
if (string(name, 0, 1) == ".")
|
||||
throw Error(format("illegal name: ‘%1%’") % name);
|
||||
throw Error(format("illegal name: '%1%'") % name);
|
||||
for (auto & i : name)
|
||||
if (!((i >= 'A' && i <= 'Z') ||
|
||||
(i >= 'a' && i <= 'z') ||
|
||||
(i >= '0' && i <= '9') ||
|
||||
validChars.find(i) != string::npos))
|
||||
{
|
||||
throw Error(format("invalid character ‘%1%’ in name ‘%2%’")
|
||||
throw Error(format("invalid character '%1%' in name '%2%'")
|
||||
% i % name);
|
||||
}
|
||||
}
|
||||
|
@ -328,7 +328,7 @@ void Store::queryPathInfo(const Path & storePath,
|
|||
if (res) {
|
||||
stats.narInfoReadAverted++;
|
||||
if (!*res)
|
||||
throw InvalidPath(format("path ‘%s’ is not valid") % storePath);
|
||||
throw InvalidPath(format("path '%s' is not valid") % storePath);
|
||||
return success(ref<ValidPathInfo>(*res));
|
||||
}
|
||||
}
|
||||
|
@ -343,7 +343,7 @@ void Store::queryPathInfo(const Path & storePath,
|
|||
res.first == NarInfoDiskCache::oInvalid ? 0 : res.second);
|
||||
if (res.first == NarInfoDiskCache::oInvalid ||
|
||||
(res.second->path != storePath && storePathToName(storePath) != ""))
|
||||
throw InvalidPath(format("path ‘%s’ is not valid") % storePath);
|
||||
throw InvalidPath(format("path '%s' is not valid") % storePath);
|
||||
}
|
||||
return success(ref<ValidPathInfo>(res.second));
|
||||
}
|
||||
|
@ -368,7 +368,7 @@ void Store::queryPathInfo(const Path & storePath,
|
|||
|| (info->path != storePath && storePathToName(storePath) != ""))
|
||||
{
|
||||
stats.narInfoMissing++;
|
||||
return failure(std::make_exception_ptr(InvalidPath(format("path ‘%s’ is not valid") % storePath)));
|
||||
return failure(std::make_exception_ptr(InvalidPath(format("path '%s' is not valid") % storePath)));
|
||||
}
|
||||
|
||||
callSuccess(success, failure, ref<ValidPathInfo>(info));
|
||||
|
@ -614,7 +614,7 @@ void copyPaths(ref<Store> srcStore, ref<Store> dstStore, const PathSet & storePa
|
|||
checkInterrupt();
|
||||
|
||||
if (!dstStore->isValidPath(storePath)) {
|
||||
printInfo("copying ‘%s’...", storePath);
|
||||
printInfo("copying '%s'...", storePath);
|
||||
copyStorePath(srcStore, dstStore, storePath, repair, checkSigs);
|
||||
}
|
||||
});
|
||||
|
@ -661,7 +661,7 @@ string showPaths(const PathSet & paths)
|
|||
string s;
|
||||
for (auto & i : paths) {
|
||||
if (s.size() != 0) s += ", ";
|
||||
s += "‘" + i + "’";
|
||||
s += "'" + i + "'";
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
@ -670,7 +670,7 @@ string showPaths(const PathSet & paths)
|
|||
std::string ValidPathInfo::fingerprint() const
|
||||
{
|
||||
if (narSize == 0 || !narHash)
|
||||
throw Error(format("cannot calculate fingerprint of path ‘%s’ because its size/hash is not known")
|
||||
throw Error(format("cannot calculate fingerprint of path '%s' because its size/hash is not known")
|
||||
% path);
|
||||
return
|
||||
"1;" + path + ";"
|
||||
|
@ -689,7 +689,7 @@ void ValidPathInfo::sign(const SecretKey & secretKey)
|
|||
bool ValidPathInfo::isContentAddressed(const Store & store) const
|
||||
{
|
||||
auto warn = [&]() {
|
||||
printError(format("warning: path ‘%s’ claims to be content-addressed but isn't") % path);
|
||||
printError(format("warning: path '%s' claims to be content-addressed but isn't") % path);
|
||||
};
|
||||
|
||||
if (hasPrefix(ca, "text:")) {
|
||||
|
@ -782,7 +782,7 @@ ref<Store> openStore(const std::string & uri_,
|
|||
}
|
||||
}
|
||||
|
||||
throw Error("don't know how to open Nix store ‘%s’", uri);
|
||||
throw Error("don't know how to open Nix store '%s'", uri);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -604,7 +604,7 @@ protected:
|
|||
/* Unsupported methods. */
|
||||
[[noreturn]] void unsupported()
|
||||
{
|
||||
throw Unsupported("requested operation is not supported by store ‘%s’", getUri());
|
||||
throw Unsupported("requested operation is not supported by store '%s'", getUri());
|
||||
}
|
||||
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue