style(3p/nix): Add braces around single-line conditionals
These were not caught by the previous clang-tidy invocation, but were instead sorted out using amber[0] as such: ambr --regex 'if (\(.+\))\s([a-z].*;)' 'if $1 { $2 }' [0]: https://github.com/dalance/amber
This commit is contained in:
parent
c6a31838cd
commit
867055133d
97 changed files with 2223 additions and 753 deletions
16
third_party/nix/src/build-remote/build-remote.cc
vendored
16
third_party/nix/src/build-remote/build-remote.cc
vendored
|
@ -40,7 +40,9 @@ static AutoCloseFD openSlotLock(const Machine& m, unsigned long long slot) {
|
|||
|
||||
static bool allSupportedLocally(const std::set<std::string>& requiredFeatures) {
|
||||
for (auto& feature : requiredFeatures)
|
||||
if (!settings.systemFeatures.get().count(feature)) return false;
|
||||
if (!settings.systemFeatures.get().count(feature)) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -50,7 +52,9 @@ static int _main(int argc, char** argv) {
|
|||
unsetenv("DISPLAY");
|
||||
unsetenv("SSH_ASKPASS");
|
||||
|
||||
if (argc != 2) throw UsageError("called without required arguments");
|
||||
if (argc != 2) {
|
||||
throw UsageError("called without required arguments");
|
||||
}
|
||||
|
||||
FdSource source(STDIN_FILENO);
|
||||
|
||||
|
@ -88,7 +92,9 @@ static int _main(int argc, char** argv) {
|
|||
while (true) {
|
||||
try {
|
||||
auto s = readString(source);
|
||||
if (s != "try") return 0;
|
||||
if (s != "try") {
|
||||
return 0;
|
||||
}
|
||||
} catch (EndOfFile&) {
|
||||
return 0;
|
||||
}
|
||||
|
@ -254,7 +260,9 @@ static int _main(int argc, char** argv) {
|
|||
|
||||
PathSet missing;
|
||||
for (auto& path : outputs)
|
||||
if (!store->isValidPath(path)) missing.insert(path);
|
||||
if (!store->isValidPath(path)) {
|
||||
missing.insert(path);
|
||||
}
|
||||
|
||||
if (!missing.empty()) {
|
||||
DLOG(INFO) << "copying outputs from '" << storeUri << "'";
|
||||
|
|
12
third_party/nix/src/libexpr/attr-path.cc
vendored
12
third_party/nix/src/libexpr/attr-path.cc
vendored
|
@ -19,14 +19,18 @@ static Strings parseAttrPath(const string& s) {
|
|||
if (i == s.end())
|
||||
throw Error(format("missing closing quote in selection path '%1%'") %
|
||||
s);
|
||||
if (*i == '"') break;
|
||||
if (*i == '"') {
|
||||
break;
|
||||
}
|
||||
cur.push_back(*i++);
|
||||
}
|
||||
} else
|
||||
cur.push_back(*i);
|
||||
++i;
|
||||
}
|
||||
if (!cur.empty()) res.push_back(cur);
|
||||
if (!cur.empty()) {
|
||||
res.push_back(cur);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -44,7 +48,9 @@ Value* findAlongAttrPath(EvalState& state, const string& attrPath,
|
|||
/* Is i an index (integer) or a normal attribute name? */
|
||||
enum { apAttr, apIndex } apType = apAttr;
|
||||
unsigned int attrIndex;
|
||||
if (string2Int(attr, attrIndex)) apType = apIndex;
|
||||
if (string2Int(attr, attrIndex)) {
|
||||
apType = apIndex;
|
||||
}
|
||||
|
||||
/* Evaluate the expression. */
|
||||
Value* vNew = state.allocValue();
|
||||
|
|
4
third_party/nix/src/libexpr/attr-set.hh
vendored
4
third_party/nix/src/libexpr/attr-set.hh
vendored
|
@ -51,7 +51,9 @@ class Bindings {
|
|||
iterator find(const Symbol& name) {
|
||||
Attr key(name, 0);
|
||||
iterator i = std::lower_bound(begin(), end(), key);
|
||||
if (i != end() && i->name == name) return i;
|
||||
if (i != end() && i->name == name) {
|
||||
return i;
|
||||
}
|
||||
return end();
|
||||
}
|
||||
|
||||
|
|
4
third_party/nix/src/libexpr/eval-inline.hh
vendored
4
third_party/nix/src/libexpr/eval-inline.hh
vendored
|
@ -81,7 +81,9 @@ inline void* allocBytes(size_t n) {
|
|||
#else
|
||||
p = calloc(n, 1);
|
||||
#endif
|
||||
if (!p) throw std::bad_alloc();
|
||||
if (!p) {
|
||||
throw std::bad_alloc();
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
|
|
132
third_party/nix/src/libexpr/eval.cc
vendored
132
third_party/nix/src/libexpr/eval.cc
vendored
|
@ -37,7 +37,9 @@ static char* dupString(const char* s) {
|
|||
#else
|
||||
t = strdup(s);
|
||||
#endif
|
||||
if (!t) throw std::bad_alloc();
|
||||
if (!t) {
|
||||
throw std::bad_alloc();
|
||||
}
|
||||
return t;
|
||||
}
|
||||
|
||||
|
@ -201,7 +203,9 @@ static Symbol getName(const AttrName& name, EvalState& state, Env& env) {
|
|||
static bool gcInitialised = false;
|
||||
|
||||
void initGC() {
|
||||
if (gcInitialised) return;
|
||||
if (gcInitialised) {
|
||||
return;
|
||||
}
|
||||
|
||||
#if HAVE_BOEHMGC
|
||||
/* Initialise the Boehm garbage collector. */
|
||||
|
@ -233,8 +237,12 @@ void initGC() {
|
|||
size_t maxSize = 384 * 1024 * 1024;
|
||||
long pageSize = sysconf(_SC_PAGESIZE);
|
||||
long pages = sysconf(_SC_PHYS_PAGES);
|
||||
if (pageSize != -1) size = (pageSize * pages) / 4; // 25% of RAM
|
||||
if (size > maxSize) size = maxSize;
|
||||
if (pageSize != -1) {
|
||||
size = (pageSize * pages) / 4;
|
||||
} // 25% of RAM
|
||||
if (size > maxSize) {
|
||||
size = maxSize;
|
||||
}
|
||||
#endif
|
||||
DLOG(INFO) << "setting initial heap size to " << size << " bytes";
|
||||
GC_expand_hp(size);
|
||||
|
@ -257,12 +265,16 @@ static Strings parseNixPath(const string& s) {
|
|||
auto start2 = p;
|
||||
|
||||
while (p != s.end() && *p != ':') {
|
||||
if (*p == '=') start2 = p + 1;
|
||||
if (*p == '=') {
|
||||
start2 = p + 1;
|
||||
}
|
||||
++p;
|
||||
}
|
||||
|
||||
if (p == s.end()) {
|
||||
if (p != start) res.push_back(std::string(start, p));
|
||||
if (p != start) {
|
||||
res.push_back(std::string(start, p));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -272,7 +284,9 @@ static Strings parseNixPath(const string& s) {
|
|||
while (p != s.end() && *p != ':') ++p;
|
||||
}
|
||||
res.push_back(std::string(start, p));
|
||||
if (p == s.end()) break;
|
||||
if (p == s.end()) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
++p;
|
||||
|
@ -331,7 +345,9 @@ EvalState::EvalState(const Strings& _searchPath, ref<Store> store)
|
|||
|
||||
for (auto& i : searchPath) {
|
||||
auto r = resolveSearchPathElem(i);
|
||||
if (!r.first) continue;
|
||||
if (!r.first) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto path = r.second;
|
||||
|
||||
|
@ -354,10 +370,14 @@ EvalState::EvalState(const Strings& _searchPath, ref<Store> store)
|
|||
EvalState::~EvalState() {}
|
||||
|
||||
Path EvalState::checkSourcePath(const Path& path_) {
|
||||
if (!allowedPaths) return path_;
|
||||
if (!allowedPaths) {
|
||||
return path_;
|
||||
}
|
||||
|
||||
auto i = resolvedPaths.find(path_);
|
||||
if (i != resolvedPaths.end()) return i->second;
|
||||
if (i != resolvedPaths.end()) {
|
||||
return i->second;
|
||||
}
|
||||
|
||||
bool found = false;
|
||||
|
||||
|
@ -394,7 +414,9 @@ Path EvalState::checkSourcePath(const Path& path_) {
|
|||
}
|
||||
|
||||
void EvalState::checkURI(const std::string& uri) {
|
||||
if (!evalSettings.restrictEval) return;
|
||||
if (!evalSettings.restrictEval) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* 'uri' should be equal to a prefix, or in a subdirectory of a
|
||||
prefix. Thus, the prefix https://github.co does not permit
|
||||
|
@ -565,7 +587,9 @@ inline Value* EvalState::lookupVar(Env* env, const ExprVar& var, bool noEval) {
|
|||
}
|
||||
Bindings::iterator j = env->values[0]->attrs->find(var.name);
|
||||
if (j != env->values[0]->attrs->end()) {
|
||||
if (countCalls && j->pos) attrSelects[*j->pos]++;
|
||||
if (countCalls && j->pos) {
|
||||
attrSelects[*j->pos]++;
|
||||
}
|
||||
return j->value;
|
||||
}
|
||||
if (!env->prevWith)
|
||||
|
@ -703,7 +727,9 @@ void EvalState::evalFile(const Path& path_, Value& v) {
|
|||
Expr* e = nullptr;
|
||||
|
||||
auto j = fileParseCache.find(path2);
|
||||
if (j != fileParseCache.end()) e = j->second;
|
||||
if (j != fileParseCache.end()) {
|
||||
e = j->second;
|
||||
}
|
||||
|
||||
if (!e) {
|
||||
e = parseExprFromFile(checkSourcePath(path2));
|
||||
|
@ -719,7 +745,9 @@ void EvalState::evalFile(const Path& path_, Value& v) {
|
|||
}
|
||||
|
||||
fileEvalCache[path2] = v;
|
||||
if (path != path2) fileEvalCache[path] = v;
|
||||
if (path != path2) {
|
||||
fileEvalCache[path] = v;
|
||||
}
|
||||
}
|
||||
|
||||
void EvalState::resetFileCache() {
|
||||
|
@ -831,7 +859,9 @@ void ExprAttrs::eval(EvalState& state, Env& env, Value& v) {
|
|||
Value nameVal;
|
||||
i.nameExpr->eval(state, *dynamicEnv, nameVal);
|
||||
state.forceValue(nameVal, i.pos);
|
||||
if (nameVal.type == tNull) continue;
|
||||
if (nameVal.type == tNull) {
|
||||
continue;
|
||||
}
|
||||
state.forceStringNoCtx(nameVal);
|
||||
Symbol nameSym = state.symbols.create(nameVal.string.s);
|
||||
Bindings::iterator j = v.attrs->find(nameSym);
|
||||
|
@ -923,7 +953,9 @@ void ExprSelect::eval(EvalState& state, Env& env, Value& v) {
|
|||
}
|
||||
vAttrs = j->value;
|
||||
pos2 = j->pos;
|
||||
if (state.countCalls && pos2) state.attrSelects[*pos2]++;
|
||||
if (state.countCalls && pos2) {
|
||||
state.attrSelects[*pos2]++;
|
||||
}
|
||||
}
|
||||
|
||||
state.forceValue(*vAttrs, (pos2 != NULL ? *pos2 : this->pos));
|
||||
|
@ -999,7 +1031,9 @@ void EvalState::callPrimOp(Value& fun, Value& arg, Value& v, const Pos& pos) {
|
|||
|
||||
/* And call the primop. */
|
||||
nrPrimOpCalls++;
|
||||
if (countCalls) primOpCalls[primOp->primOp->name]++;
|
||||
if (countCalls) {
|
||||
primOpCalls[primOp->primOp->name]++;
|
||||
}
|
||||
primOp->primOp->fun(*this, pos, vArgs, v);
|
||||
} else {
|
||||
Value* fun2 = allocValue();
|
||||
|
@ -1059,7 +1093,9 @@ void EvalState::callFunction(Value& fun, Value& arg, Value& v, const Pos& pos) {
|
|||
} else {
|
||||
forceAttrs(arg, pos);
|
||||
|
||||
if (!lambda.arg.empty()) env2.values[displ++] = &arg;
|
||||
if (!lambda.arg.empty()) {
|
||||
env2.values[displ++] = &arg;
|
||||
}
|
||||
|
||||
/* For each formal argument, get the actual argument. If
|
||||
there is no matching actual argument but the formal
|
||||
|
@ -1283,7 +1319,9 @@ void EvalState::concatLists(Value& v, size_t nrLists, Value** lists,
|
|||
auto out = v.listElems();
|
||||
for (size_t n = 0, pos = 0; n < nrLists; ++n) {
|
||||
auto l = lists[n]->listSize();
|
||||
if (l) memcpy(out + pos, lists[n]->listElems(), l * sizeof(Value*));
|
||||
if (l) {
|
||||
memcpy(out + pos, lists[n]->listElems(), l * sizeof(Value*));
|
||||
}
|
||||
pos += l;
|
||||
}
|
||||
}
|
||||
|
@ -1361,7 +1399,9 @@ void EvalState::forceValueDeep(Value& v) {
|
|||
std::function<void(Value & v)> recurse;
|
||||
|
||||
recurse = [&](Value& v) {
|
||||
if (seen.find(&v) != seen.end()) return;
|
||||
if (seen.find(&v) != seen.end()) {
|
||||
return;
|
||||
}
|
||||
seen.insert(&v);
|
||||
|
||||
forceValue(v);
|
||||
|
@ -1526,11 +1566,21 @@ string EvalState::coerceToString(const Pos& pos, Value& v, PathSet& context,
|
|||
if (coerceMore) {
|
||||
/* Note that `false' is represented as an empty string for
|
||||
shell scripting convenience, just like `null'. */
|
||||
if (v.type == tBool && v.boolean) return "1";
|
||||
if (v.type == tBool && !v.boolean) return "";
|
||||
if (v.type == tInt) return std::to_string(v.integer);
|
||||
if (v.type == tFloat) return std::to_string(v.fpoint);
|
||||
if (v.type == tNull) return "";
|
||||
if (v.type == tBool && v.boolean) {
|
||||
return "1";
|
||||
}
|
||||
if (v.type == tBool && !v.boolean) {
|
||||
return "";
|
||||
}
|
||||
if (v.type == tInt) {
|
||||
return std::to_string(v.integer);
|
||||
}
|
||||
if (v.type == tFloat) {
|
||||
return std::to_string(v.fpoint);
|
||||
}
|
||||
if (v.type == tNull) {
|
||||
return "";
|
||||
}
|
||||
|
||||
if (v.isList()) {
|
||||
string result;
|
||||
|
@ -1654,7 +1704,9 @@ bool EvalState::eqValues(Value& v1, Value& v2) {
|
|||
Bindings::iterator i, j;
|
||||
for (i = v1.attrs->begin(), j = v2.attrs->begin(); i != v1.attrs->end();
|
||||
++i, ++j) {
|
||||
if (i->name != j->name || !eqValues(*i->value, *j->value)) return false;
|
||||
if (i->name != j->name || !eqValues(*i->value, *j->value)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -1697,7 +1749,9 @@ void EvalState::printStats() {
|
|||
if (showStats) {
|
||||
auto outPath = getEnv("NIX_SHOW_STATS_PATH", "-");
|
||||
std::fstream fs;
|
||||
if (outPath != "-") fs.open(outPath, std::fstream::out);
|
||||
if (outPath != "-") {
|
||||
fs.open(outPath, std::fstream::out);
|
||||
}
|
||||
JSONObject topObj(outPath == "-" ? std::cerr : fs, true);
|
||||
topObj.attr("cpuTime", cpuTime);
|
||||
{
|
||||
|
@ -1796,7 +1850,9 @@ size_t valueSize(Value& v) {
|
|||
std::set<const void*> seen;
|
||||
|
||||
auto doString = [&](const char* s) -> size_t {
|
||||
if (seen.find(s) != seen.end()) return 0;
|
||||
if (seen.find(s) != seen.end()) {
|
||||
return 0;
|
||||
}
|
||||
seen.insert(s);
|
||||
return strlen(s) + 1;
|
||||
};
|
||||
|
@ -1805,7 +1861,9 @@ size_t valueSize(Value& v) {
|
|||
std::function<size_t(Env & v)> doEnv;
|
||||
|
||||
doValue = [&](Value& v) -> size_t {
|
||||
if (seen.find(&v) != seen.end()) return 0;
|
||||
if (seen.find(&v) != seen.end()) {
|
||||
return 0;
|
||||
}
|
||||
seen.insert(&v);
|
||||
|
||||
size_t sz = sizeof(Value);
|
||||
|
@ -1851,7 +1909,9 @@ size_t valueSize(Value& v) {
|
|||
sz += doValue(*v.primOpApp.right);
|
||||
break;
|
||||
case tExternal:
|
||||
if (seen.find(v.external) != seen.end()) break;
|
||||
if (seen.find(v.external) != seen.end()) {
|
||||
break;
|
||||
}
|
||||
seen.insert(v.external);
|
||||
sz += v.external->valueSize(seen);
|
||||
break;
|
||||
|
@ -1862,16 +1922,22 @@ size_t valueSize(Value& v) {
|
|||
};
|
||||
|
||||
doEnv = [&](Env& env) -> size_t {
|
||||
if (seen.find(&env) != seen.end()) return 0;
|
||||
if (seen.find(&env) != seen.end()) {
|
||||
return 0;
|
||||
}
|
||||
seen.insert(&env);
|
||||
|
||||
size_t sz = sizeof(Env) + sizeof(Value*) * env.size;
|
||||
|
||||
if (env.type != Env::HasWithExpr)
|
||||
for (size_t i = 0; i < env.size; ++i)
|
||||
if (env.values[i]) sz += doValue(*env.values[i]);
|
||||
if (env.values[i]) {
|
||||
sz += doValue(*env.values[i]);
|
||||
}
|
||||
|
||||
if (env.up) sz += doEnv(*env.up);
|
||||
if (env.up) {
|
||||
sz += doEnv(*env.up);
|
||||
}
|
||||
|
||||
return sz;
|
||||
};
|
||||
|
|
52
third_party/nix/src/libexpr/get-drvs.cc
vendored
52
third_party/nix/src/libexpr/get-drvs.cc
vendored
|
@ -44,7 +44,9 @@ DrvInfo::DrvInfo(EvalState& state, ref<Store> store,
|
|||
string DrvInfo::queryName() const {
|
||||
if (name == "" && attrs) {
|
||||
auto i = attrs->find(state->sName);
|
||||
if (i == attrs->end()) throw TypeError("derivation name missing");
|
||||
if (i == attrs->end()) {
|
||||
throw TypeError("derivation name missing");
|
||||
}
|
||||
name = state->forceStringNoCtx(*i->value);
|
||||
}
|
||||
return name;
|
||||
|
@ -122,13 +124,19 @@ DrvInfo::Outputs DrvInfo::queryOutputs(bool onlyOutputsToInstall) {
|
|||
}
|
||||
const auto errMsg = Error("this derivation has bad 'meta.outputsToInstall'");
|
||||
/* ^ this shows during `nix-env -i` right under the bad derivation */
|
||||
if (!outTI->isList()) throw errMsg;
|
||||
if (!outTI->isList()) {
|
||||
throw errMsg;
|
||||
}
|
||||
Outputs result;
|
||||
for (auto i = outTI->listElems(); i != outTI->listElems() + outTI->listSize();
|
||||
++i) {
|
||||
if ((*i)->type != tString) throw errMsg;
|
||||
if ((*i)->type != tString) {
|
||||
throw errMsg;
|
||||
}
|
||||
auto out = outputs.find((*i)->string.s);
|
||||
if (out == outputs.end()) throw errMsg;
|
||||
if (out == outputs.end()) {
|
||||
throw errMsg;
|
||||
}
|
||||
result.insert(*out);
|
||||
}
|
||||
return result;
|
||||
|
@ -206,7 +214,9 @@ Value* DrvInfo::queryMeta(const string& name) {
|
|||
|
||||
string DrvInfo::queryMetaString(const string& name) {
|
||||
Value* v = queryMeta(name);
|
||||
if (!v || v->type != tString) return "";
|
||||
if (!v || v->type != tString) {
|
||||
return "";
|
||||
}
|
||||
return v->string.s;
|
||||
}
|
||||
|
||||
|
@ -222,7 +232,9 @@ NixInt DrvInfo::queryMetaInt(const string& name, NixInt def) {
|
|||
/* Backwards compatibility with before we had support for
|
||||
integer meta fields. */
|
||||
NixInt n;
|
||||
if (string2Int(v->string.s, n)) return n;
|
||||
if (string2Int(v->string.s, n)) {
|
||||
return n;
|
||||
}
|
||||
}
|
||||
return def;
|
||||
}
|
||||
|
@ -239,7 +251,9 @@ NixFloat DrvInfo::queryMetaFloat(const string& name, NixFloat def) {
|
|||
/* Backwards compatibility with before we had support for
|
||||
float meta fields. */
|
||||
NixFloat n;
|
||||
if (string2Float(v->string.s, n)) return n;
|
||||
if (string2Float(v->string.s, n)) {
|
||||
return n;
|
||||
}
|
||||
}
|
||||
return def;
|
||||
}
|
||||
|
@ -255,8 +269,12 @@ bool DrvInfo::queryMetaBool(const string& name, bool def) {
|
|||
if (v->type == tString) {
|
||||
/* Backwards compatibility with before we had support for
|
||||
Boolean meta fields. */
|
||||
if (strcmp(v->string.s, "true") == 0) return true;
|
||||
if (strcmp(v->string.s, "false") == 0) return false;
|
||||
if (strcmp(v->string.s, "true") == 0) {
|
||||
return true;
|
||||
}
|
||||
if (strcmp(v->string.s, "false") == 0) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return def;
|
||||
}
|
||||
|
@ -268,7 +286,9 @@ void DrvInfo::setMeta(const string& name, Value* v) {
|
|||
Symbol sym = state->symbols.create(name);
|
||||
if (old) {
|
||||
for (auto i : *old) {
|
||||
if (i.name != sym) meta->push_back(i);
|
||||
if (i.name != sym) {
|
||||
meta->push_back(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (v) {
|
||||
|
@ -295,7 +315,9 @@ static bool getDerivation(EvalState& state, Value& v, const string& attrPath,
|
|||
|
||||
/* Remove spurious duplicates (e.g., a set like `rec { x =
|
||||
derivation {...}; y = x;}'. */
|
||||
if (done.find(v.attrs) != done.end()) return false;
|
||||
if (done.find(v.attrs) != done.end()) {
|
||||
return false;
|
||||
}
|
||||
done.insert(v.attrs);
|
||||
|
||||
DrvInfo drv(state, attrPath, v.attrs);
|
||||
|
@ -319,7 +341,9 @@ std::optional<DrvInfo> getDerivation(EvalState& state, Value& v,
|
|||
Done done;
|
||||
DrvInfos drvs;
|
||||
getDerivation(state, v, "", drvs, done, ignoreAssertionFailures);
|
||||
if (drvs.size() != 1) return {};
|
||||
if (drvs.size() != 1) {
|
||||
return {};
|
||||
}
|
||||
return std::move(drvs.front());
|
||||
}
|
||||
|
||||
|
@ -354,7 +378,9 @@ static void getDerivations(EvalState& state, Value& vIn,
|
|||
precedence). */
|
||||
for (auto& i : v.attrs->lexicographicOrder()) {
|
||||
DLOG(INFO) << "evaluating attribute '" << i->name << "'";
|
||||
if (!std::regex_match(std::string(i->name), attrRegex)) continue;
|
||||
if (!std::regex_match(std::string(i->name), attrRegex)) {
|
||||
continue;
|
||||
}
|
||||
string pathPrefix2 = addToPath(pathPrefix, i->name);
|
||||
if (combineChannels)
|
||||
getDerivations(state, *i->value, pathPrefix2, autoArgs, drvs, done,
|
||||
|
|
28
third_party/nix/src/libexpr/json-to-value.cc
vendored
28
third_party/nix/src/libexpr/json-to-value.cc
vendored
|
@ -12,9 +12,13 @@ static void skipWhitespace(const char*& s) {
|
|||
|
||||
static string parseJSONString(const char*& s) {
|
||||
string res;
|
||||
if (*s++ != '"') throw JSONParseError("expected JSON string");
|
||||
if (*s++ != '"') {
|
||||
throw JSONParseError("expected JSON string");
|
||||
}
|
||||
while (*s != '"') {
|
||||
if (!*s) throw JSONParseError("got end-of-string in JSON string");
|
||||
if (!*s) {
|
||||
throw JSONParseError("got end-of-string in JSON string");
|
||||
}
|
||||
if (*s == '\\') {
|
||||
s++;
|
||||
if (*s == '"')
|
||||
|
@ -52,7 +56,9 @@ static string parseJSONString(const char*& s) {
|
|||
static void parseJSON(EvalState& state, const char*& s, Value& v) {
|
||||
skipWhitespace(s);
|
||||
|
||||
if (!*s) throw JSONParseError("expected JSON value");
|
||||
if (!*s) {
|
||||
throw JSONParseError("expected JSON value");
|
||||
}
|
||||
|
||||
if (*s == '[') {
|
||||
s++;
|
||||
|
@ -60,7 +66,9 @@ static void parseJSON(EvalState& state, const char*& s, Value& v) {
|
|||
values.reserve(128);
|
||||
skipWhitespace(s);
|
||||
while (1) {
|
||||
if (values.empty() && *s == ']') break;
|
||||
if (values.empty() && *s == ']') {
|
||||
break;
|
||||
}
|
||||
Value* v2 = state.allocValue();
|
||||
parseJSON(state, s, *v2);
|
||||
values.push_back(v2);
|
||||
|
@ -82,10 +90,14 @@ static void parseJSON(EvalState& state, const char*& s, Value& v) {
|
|||
ValueMap attrs;
|
||||
while (1) {
|
||||
skipWhitespace(s);
|
||||
if (attrs.empty() && *s == '}') break;
|
||||
if (attrs.empty() && *s == '}') {
|
||||
break;
|
||||
}
|
||||
string name = parseJSONString(s);
|
||||
skipWhitespace(s);
|
||||
if (*s != ':') throw JSONParseError("expected ':' in JSON object");
|
||||
if (*s != ':') {
|
||||
throw JSONParseError("expected ':' in JSON object");
|
||||
}
|
||||
s++;
|
||||
Value* v2 = state.allocValue();
|
||||
parseJSON(state, s, *v2);
|
||||
|
@ -114,7 +126,9 @@ static void parseJSON(EvalState& state, const char*& s, Value& v) {
|
|||
ValueType number_type = tInt;
|
||||
|
||||
while (isdigit(*s) || *s == '-' || *s == '.' || *s == 'e' || *s == 'E') {
|
||||
if (*s == '.' || *s == 'e' || *s == 'E') number_type = tFloat;
|
||||
if (*s == '.' || *s == 'e' || *s == 'E') {
|
||||
number_type = tFloat;
|
||||
}
|
||||
tmp_number += *s++;
|
||||
}
|
||||
|
||||
|
|
8
third_party/nix/src/libexpr/lexer.l
vendored
8
third_party/nix/src/libexpr/lexer.l
vendored
|
@ -60,15 +60,15 @@ static Expr * unescapeStr(SymbolTable & symbols, const char * s, size_t length)
|
|||
if (c == '\\') {
|
||||
assert(*s);
|
||||
c = *s++;
|
||||
if (c == 'n') t += '\n';
|
||||
else if (c == 'r') t += '\r';
|
||||
else if (c == 't') t += '\t';
|
||||
if (c == 'n') { t += '\n'; }
|
||||
else if (c == 'r') { t += '\r'; }
|
||||
else if (c == 't') { t += '\t'; }
|
||||
else t += c;
|
||||
}
|
||||
else if (c == '\r') {
|
||||
/* Normalise CR and CR/LF into LF. */
|
||||
t += '\n';
|
||||
if (*s == '\n') s++; /* cr/lf */
|
||||
if (*s == '\n') { s++; } /* cr/lf */
|
||||
}
|
||||
else t += c;
|
||||
}
|
||||
|
|
12
third_party/nix/src/libexpr/names.cc
vendored
12
third_party/nix/src/libexpr/names.cc
vendored
|
@ -28,9 +28,13 @@ bool DrvName::matches(DrvName& n) {
|
|||
if (!regex)
|
||||
regex = std::unique_ptr<std::regex>(
|
||||
new std::regex(name, std::regex::extended));
|
||||
if (!std::regex_match(n.name, *regex)) return false;
|
||||
if (!std::regex_match(n.name, *regex)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (version != "" && version != n.version) {
|
||||
return false;
|
||||
}
|
||||
if (version != "" && version != n.version) return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -39,7 +43,9 @@ string nextComponent(string::const_iterator& p,
|
|||
/* Skip any dots and dashes (component separators). */
|
||||
while (p != end && (*p == '.' || *p == '-')) ++p;
|
||||
|
||||
if (p == end) return "";
|
||||
if (p == end) {
|
||||
return "";
|
||||
}
|
||||
|
||||
/* If the first character is a digit, consume the longest sequence
|
||||
of digits. Otherwise, consume the longest sequence of
|
||||
|
|
36
third_party/nix/src/libexpr/nixexpr.cc
vendored
36
third_party/nix/src/libexpr/nixexpr.cc
vendored
|
@ -70,7 +70,9 @@ void ExprVar::show(std::ostream& str) const { str << name; }
|
|||
|
||||
void ExprSelect::show(std::ostream& str) const {
|
||||
str << "(" << *e << ")." << showAttrPath(attrPath);
|
||||
if (def) str << " or (" << *def << ")";
|
||||
if (def) {
|
||||
str << " or (" << *def << ")";
|
||||
}
|
||||
}
|
||||
|
||||
void ExprOpHasAttr::show(std::ostream& str) const {
|
||||
|
@ -78,7 +80,9 @@ void ExprOpHasAttr::show(std::ostream& str) const {
|
|||
}
|
||||
|
||||
void ExprAttrs::show(std::ostream& str) const {
|
||||
if (recursive) str << "rec ";
|
||||
if (recursive) {
|
||||
str << "rec ";
|
||||
}
|
||||
str << "{ ";
|
||||
for (auto& i : attrs)
|
||||
if (i.second.inherited)
|
||||
|
@ -108,16 +112,24 @@ void ExprLambda::show(std::ostream& str) const {
|
|||
else
|
||||
str << ", ";
|
||||
str << i.name;
|
||||
if (i.def) str << " ? " << *i.def;
|
||||
if (i.def) {
|
||||
str << " ? " << *i.def;
|
||||
}
|
||||
}
|
||||
if (formals->ellipsis) {
|
||||
if (!first) str << ", ";
|
||||
if (!first) {
|
||||
str << ", ";
|
||||
}
|
||||
str << "...";
|
||||
}
|
||||
str << " }";
|
||||
if (!arg.empty()) str << " @ ";
|
||||
if (!arg.empty()) {
|
||||
str << " @ ";
|
||||
}
|
||||
}
|
||||
if (!arg.empty()) {
|
||||
str << arg;
|
||||
}
|
||||
if (!arg.empty()) str << arg;
|
||||
str << ": " << *body << ")";
|
||||
}
|
||||
|
||||
|
@ -239,13 +251,17 @@ void ExprSelect::bindVars(const StaticEnv& env) {
|
|||
def->bindVars(env);
|
||||
}
|
||||
for (auto& i : attrPath)
|
||||
if (!i.symbol.set()) i.expr->bindVars(env);
|
||||
if (!i.symbol.set()) {
|
||||
i.expr->bindVars(env);
|
||||
}
|
||||
}
|
||||
|
||||
void ExprOpHasAttr::bindVars(const StaticEnv& env) {
|
||||
e->bindVars(env);
|
||||
for (auto& i : attrPath)
|
||||
if (!i.symbol.set()) i.expr->bindVars(env);
|
||||
if (!i.symbol.set()) {
|
||||
i.expr->bindVars(env);
|
||||
}
|
||||
}
|
||||
|
||||
void ExprAttrs::bindVars(const StaticEnv& env) {
|
||||
|
@ -296,7 +312,9 @@ void ExprLambda::bindVars(const StaticEnv& env) {
|
|||
}
|
||||
|
||||
for (auto& i : formals->formals)
|
||||
if (i.def) i.def->bindVars(newEnv);
|
||||
if (i.def) {
|
||||
i.def->bindVars(newEnv);
|
||||
}
|
||||
}
|
||||
|
||||
body->bindVars(newEnv);
|
||||
|
|
20
third_party/nix/src/libexpr/parser.y
vendored
20
third_party/nix/src/libexpr/parser.y
vendored
|
@ -89,7 +89,7 @@ static void addAttr(ExprAttrs * attrs, AttrPath & attrPath,
|
|||
if (j != attrs->attrs.end()) {
|
||||
if (!j->second.inherited) {
|
||||
ExprAttrs * attrs2 = dynamic_cast<ExprAttrs *>(j->second.e);
|
||||
if (!attrs2) dupAttr(attrPath, pos, j->second.pos);
|
||||
if (!attrs2) { dupAttr(attrPath, pos, j->second.pos); }
|
||||
attrs = attrs2;
|
||||
} else
|
||||
dupAttr(attrPath, pos, j->second.pos);
|
||||
|
@ -148,7 +148,7 @@ static void addFormal(const Pos & pos, Formals * formals, const Formal & formal)
|
|||
|
||||
static Expr * stripIndentation(const Pos & pos, SymbolTable & symbols, vector<Expr *> & es)
|
||||
{
|
||||
if (es.empty()) return new ExprString(symbols.create(""));
|
||||
if (es.empty()) { return new ExprString(symbols.create("")); }
|
||||
|
||||
/* Figure out the minimum indentation. Note that by design
|
||||
whitespace-only final lines are not taken into account. (So
|
||||
|
@ -162,7 +162,7 @@ static Expr * stripIndentation(const Pos & pos, SymbolTable & symbols, vector<Ex
|
|||
/* Anti-quotations end the current start-of-line whitespace. */
|
||||
if (atStartOfLine) {
|
||||
atStartOfLine = false;
|
||||
if (curIndent < minIndent) minIndent = curIndent;
|
||||
if (curIndent < minIndent) { minIndent = curIndent; }
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
@ -176,7 +176,7 @@ static Expr * stripIndentation(const Pos & pos, SymbolTable & symbols, vector<Ex
|
|||
curIndent = 0;
|
||||
} else {
|
||||
atStartOfLine = false;
|
||||
if (curIndent < minIndent) minIndent = curIndent;
|
||||
if (curIndent < minIndent) { minIndent = curIndent; }
|
||||
}
|
||||
} else if (e->s[j] == '\n') {
|
||||
atStartOfLine = true;
|
||||
|
@ -216,7 +216,7 @@ static Expr * stripIndentation(const Pos & pos, SymbolTable & symbols, vector<Ex
|
|||
}
|
||||
} else {
|
||||
s2 += e->s[j];
|
||||
if (e->s[j] == '\n') atStartOfLine = true;
|
||||
if (e->s[j] == '\n') { atStartOfLine = true; }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -559,7 +559,7 @@ Expr * EvalState::parse(const char * text,
|
|||
int res = yyparse(scanner, &data);
|
||||
yylex_destroy(scanner);
|
||||
|
||||
if (res) throw ParseError(data.error);
|
||||
if (res) { throw ParseError(data.error); }
|
||||
|
||||
data.result->bindVars(staticEnv);
|
||||
|
||||
|
@ -577,7 +577,7 @@ Path resolveExprPath(Path path)
|
|||
while (true) {
|
||||
if (lstat(path.c_str(), &st))
|
||||
throw SysError(format("getting status of '%1%'") % path);
|
||||
if (!S_ISLNK(st.st_mode)) break;
|
||||
if (!S_ISLNK(st.st_mode)) { break; }
|
||||
path = absPath(readLink(path), dirOf(path));
|
||||
}
|
||||
|
||||
|
@ -656,9 +656,9 @@ Path EvalState::findFile(SearchPath & searchPath, const string & path, const Pos
|
|||
suffix = path.size() == s ? "" : "/" + string(path, s);
|
||||
}
|
||||
auto r = resolveSearchPathElem(i);
|
||||
if (!r.first) continue;
|
||||
if (!r.first) { continue; }
|
||||
Path res = r.second + suffix;
|
||||
if (pathExists(res)) return canonPath(res);
|
||||
if (pathExists(res)) { return canonPath(res); }
|
||||
}
|
||||
format f = format(
|
||||
"file '%1%' was not found in the Nix search path (add it using $NIX_PATH or -I)"
|
||||
|
@ -671,7 +671,7 @@ Path EvalState::findFile(SearchPath & searchPath, const string & path, const Pos
|
|||
std::pair<bool, std::string> EvalState::resolveSearchPathElem(const SearchPathElem & elem)
|
||||
{
|
||||
auto i = searchPathResolved.find(elem.second);
|
||||
if (i != searchPathResolved.end()) return i->second;
|
||||
if (i != searchPathResolved.end()) { return i->second; }
|
||||
|
||||
std::pair<bool, std::string> res;
|
||||
|
||||
|
|
104
third_party/nix/src/libexpr/primops.cc
vendored
104
third_party/nix/src/libexpr/primops.cc
vendored
|
@ -51,7 +51,9 @@ void EvalState::realiseContext(const PathSet& context) {
|
|||
std::pair<string, string> decoded = decodeContext(i);
|
||||
Path ctx = decoded.first;
|
||||
assert(store->isStorePath(ctx));
|
||||
if (!store->isValidPath(ctx)) throw InvalidPathError(ctx);
|
||||
if (!store->isValidPath(ctx)) {
|
||||
throw InvalidPathError(ctx);
|
||||
}
|
||||
if (!decoded.second.empty() && nix::isDerivation(ctx)) {
|
||||
drvs.insert(decoded.first + "!" + decoded.second);
|
||||
|
||||
|
@ -68,7 +70,9 @@ void EvalState::realiseContext(const PathSet& context) {
|
|||
}
|
||||
}
|
||||
|
||||
if (drvs.empty()) return;
|
||||
if (drvs.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!evalSettings.enableImportFromDerivation)
|
||||
throw EvalError(format("attempted to realize '%1%' during evaluation but "
|
||||
|
@ -417,7 +421,9 @@ static void prim_genericClosure(EvalState& state, const Pos& pos, Value** args,
|
|||
throw EvalError(format("attribute 'key' required, at %1%") % pos);
|
||||
state.forceValue(*key->value);
|
||||
|
||||
if (doneKeys.find(key->value) != doneKeys.end()) continue;
|
||||
if (doneKeys.find(key->value) != doneKeys.end()) {
|
||||
continue;
|
||||
}
|
||||
doneKeys.insert(key->value);
|
||||
res.push_back(e);
|
||||
|
||||
|
@ -583,7 +589,9 @@ static void prim_derivationStrict(EvalState& state, const Pos& pos,
|
|||
outputs.insert("out");
|
||||
|
||||
for (auto& i : args[0]->attrs->lexicographicOrder()) {
|
||||
if (i->name == state.sIgnoreNulls) continue;
|
||||
if (i->name == state.sIgnoreNulls) {
|
||||
continue;
|
||||
}
|
||||
const string& key = i->name;
|
||||
|
||||
auto handleHashMode = [&](const std::string& s) {
|
||||
|
@ -623,7 +631,9 @@ static void prim_derivationStrict(EvalState& state, const Pos& pos,
|
|||
try {
|
||||
if (ignoreNulls) {
|
||||
state.forceValue(*i->value);
|
||||
if (i->value->type == tNull) continue;
|
||||
if (i->value->type == tNull) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/* The `args' attribute is special: it supplies the
|
||||
|
@ -641,7 +651,9 @@ static void prim_derivationStrict(EvalState& state, const Pos& pos,
|
|||
the environment. */
|
||||
else {
|
||||
if (jsonObject) {
|
||||
if (i->name == state.sStructuredAttrs) continue;
|
||||
if (i->name == state.sStructuredAttrs) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto placeholder(jsonObject->placeholder(key));
|
||||
printValueAsJSON(state, true, *i->value, placeholder, context);
|
||||
|
@ -758,7 +770,9 @@ static void prim_derivationStrict(EvalState& state, const Pos& pos,
|
|||
|
||||
Path outPath =
|
||||
state.store->makeFixedOutputPath(outputHashRecursive, h, drvName);
|
||||
if (!jsonObject) drv.env["out"] = outPath;
|
||||
if (!jsonObject) {
|
||||
drv.env["out"] = outPath;
|
||||
}
|
||||
drv.outputs["out"] = DerivationOutput(
|
||||
outPath, (outputHashRecursive ? "r:" : "") + printHashType(h.type),
|
||||
h.to_string(Base16, false));
|
||||
|
@ -771,7 +785,9 @@ static void prim_derivationStrict(EvalState& state, const Pos& pos,
|
|||
an empty value. This ensures that changes in the set of
|
||||
output names do get reflected in the hash. */
|
||||
for (auto& i : outputs) {
|
||||
if (!jsonObject) drv.env[i] = "";
|
||||
if (!jsonObject) {
|
||||
drv.env[i] = "";
|
||||
}
|
||||
drv.outputs[i] = DerivationOutput("", "", "");
|
||||
}
|
||||
|
||||
|
@ -782,7 +798,9 @@ static void prim_derivationStrict(EvalState& state, const Pos& pos,
|
|||
for (auto& i : drv.outputs)
|
||||
if (i.second.path == "") {
|
||||
Path outPath = state.store->makeOutputPath(i.first, h, drvName);
|
||||
if (!jsonObject) drv.env[i.first] = outPath;
|
||||
if (!jsonObject) {
|
||||
drv.env[i.first] = outPath;
|
||||
}
|
||||
i.second.path = outPath;
|
||||
}
|
||||
}
|
||||
|
@ -845,12 +863,16 @@ static void prim_storePath(EvalState& state, const Pos& pos, Value** args,
|
|||
/* Resolve symlinks in ‘path’, unless ‘path’ itself is a symlink
|
||||
directly in the store. The latter condition is necessary so
|
||||
e.g. nix-push does the right thing. */
|
||||
if (!state.store->isStorePath(path)) path = canonPath(path, true);
|
||||
if (!state.store->isStorePath(path)) {
|
||||
path = canonPath(path, true);
|
||||
}
|
||||
if (!state.store->isInStore(path))
|
||||
throw EvalError(format("path '%1%' is not in the Nix store, at %2%") %
|
||||
path % pos);
|
||||
Path path2 = state.store->toStorePath(path);
|
||||
if (!settings.readOnlyMode) state.store->ensurePath(path2);
|
||||
if (!settings.readOnlyMode) {
|
||||
state.store->ensurePath(path2);
|
||||
}
|
||||
context.insert(path2);
|
||||
mkString(v, path, context);
|
||||
}
|
||||
|
@ -936,7 +958,9 @@ static void prim_findFile(EvalState& state, const Pos& pos, Value** args,
|
|||
|
||||
string prefix;
|
||||
Bindings::iterator i = v2.attrs->find(state.symbols.create("prefix"));
|
||||
if (i != v2.attrs->end()) prefix = state.forceStringNoCtx(*i->value, pos);
|
||||
if (i != v2.attrs->end()) {
|
||||
prefix = state.forceStringNoCtx(*i->value, pos);
|
||||
}
|
||||
|
||||
i = v2.attrs->find(state.symbols.create("path"));
|
||||
if (i == v2.attrs->end())
|
||||
|
@ -995,7 +1019,9 @@ static void prim_readDir(EvalState& state, const Pos& pos, Value** args,
|
|||
|
||||
for (auto& ent : entries) {
|
||||
Value* ent_val = state.allocAttr(v, state.symbols.create(ent.name));
|
||||
if (ent.type == DT_UNKNOWN) ent.type = getFileType(path + "/" + ent.name);
|
||||
if (ent.type == DT_UNKNOWN) {
|
||||
ent.type = getFileType(path + "/" + ent.name);
|
||||
}
|
||||
mkStringNoCopy(*ent_val,
|
||||
ent.type == DT_REG
|
||||
? "regular"
|
||||
|
@ -1178,8 +1204,12 @@ static void prim_path(EvalState& state, const Pos& pos, Value** args,
|
|||
format("unsupported argument '%1%' to 'addPath', at %2%") %
|
||||
attr.name % *attr.pos);
|
||||
}
|
||||
if (path.empty()) throw EvalError(format("'path' required, at %1%") % pos);
|
||||
if (name.empty()) name = baseNameOf(path);
|
||||
if (path.empty()) {
|
||||
throw EvalError(format("'path' required, at %1%") % pos);
|
||||
}
|
||||
if (name.empty()) {
|
||||
name = baseNameOf(path);
|
||||
}
|
||||
|
||||
addPath(state, pos, name, path, filterFun, recursive, expectedHash, v);
|
||||
}
|
||||
|
@ -1236,7 +1266,9 @@ void prim_getAttr(EvalState& state, const Pos& pos, Value** args, Value& v) {
|
|||
if (i == args[1]->attrs->end())
|
||||
throw EvalError(format("attribute '%1%' missing, at %2%") % attr % pos);
|
||||
// !!! add to stack trace?
|
||||
if (state.countCalls && i->pos) state.attrSelects[*i->pos]++;
|
||||
if (state.countCalls && i->pos) {
|
||||
state.attrSelects[*i->pos]++;
|
||||
}
|
||||
state.forceValue(*i->value);
|
||||
v = *i->value;
|
||||
}
|
||||
|
@ -1287,7 +1319,9 @@ static void prim_removeAttrs(EvalState& state, const Pos& pos, Value** args,
|
|||
vector. */
|
||||
state.mkAttrs(v, args[0]->attrs->size());
|
||||
for (auto& i : *args[0]->attrs) {
|
||||
if (names.find(i.name) == names.end()) v.attrs->push_back(i);
|
||||
if (names.find(i.name) == names.end()) {
|
||||
v.attrs->push_back(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1673,12 +1707,16 @@ static void prim_partition(EvalState& state, const Pos& pos, Value** args,
|
|||
Value* vRight = state.allocAttr(v, state.sRight);
|
||||
auto rsize = right.size();
|
||||
state.mkList(*vRight, rsize);
|
||||
if (rsize) memcpy(vRight->listElems(), right.data(), sizeof(Value*) * rsize);
|
||||
if (rsize) {
|
||||
memcpy(vRight->listElems(), right.data(), sizeof(Value*) * rsize);
|
||||
}
|
||||
|
||||
Value* vWrong = state.allocAttr(v, state.sWrong);
|
||||
auto wsize = wrong.size();
|
||||
state.mkList(*vWrong, wsize);
|
||||
if (wsize) memcpy(vWrong->listElems(), wrong.data(), sizeof(Value*) * wsize);
|
||||
if (wsize) {
|
||||
memcpy(vWrong->listElems(), wrong.data(), sizeof(Value*) * wsize);
|
||||
}
|
||||
|
||||
v.attrs->sort();
|
||||
}
|
||||
|
@ -1705,7 +1743,9 @@ static void prim_concatMap(EvalState& state, const Pos& pos, Value** args,
|
|||
auto out = v.listElems();
|
||||
for (unsigned int n = 0, pos = 0; n < nrLists; ++n) {
|
||||
auto l = lists[n].listSize();
|
||||
if (l) memcpy(out + pos, lists[n].listElems(), l * sizeof(Value*));
|
||||
if (l) {
|
||||
memcpy(out + pos, lists[n].listElems(), l * sizeof(Value*));
|
||||
}
|
||||
pos += l;
|
||||
}
|
||||
}
|
||||
|
@ -1752,7 +1792,9 @@ static void prim_div(EvalState& state, const Pos& pos, Value** args, Value& v) {
|
|||
state.forceValue(*args[1], pos);
|
||||
|
||||
NixFloat f2 = state.forceFloat(*args[1], pos);
|
||||
if (f2 == 0) throw EvalError(format("division by zero, at %1%") % pos);
|
||||
if (f2 == 0) {
|
||||
throw EvalError(format("division by zero, at %1%") % pos);
|
||||
}
|
||||
|
||||
if (args[0]->type == tFloat || args[1]->type == tFloat) {
|
||||
mkFloat(v,
|
||||
|
@ -2012,7 +2054,9 @@ static void prim_replaceStrings(EvalState& state, const Pos& pos, Value** args,
|
|||
found = true;
|
||||
res += j->first;
|
||||
if (i->empty()) {
|
||||
if (p < s.size()) res += s[p];
|
||||
if (p < s.size()) {
|
||||
res += s[p];
|
||||
}
|
||||
p++;
|
||||
} else {
|
||||
p += i->size();
|
||||
|
@ -2022,7 +2066,9 @@ static void prim_replaceStrings(EvalState& state, const Pos& pos, Value** args,
|
|||
break;
|
||||
}
|
||||
if (!found) {
|
||||
if (p < s.size()) res += s[p];
|
||||
if (p < s.size()) {
|
||||
res += s[p];
|
||||
}
|
||||
p++;
|
||||
}
|
||||
}
|
||||
|
@ -2059,7 +2105,9 @@ static void prim_splitVersion(EvalState& state, const Pos& pos, Value** args,
|
|||
Strings components;
|
||||
while (iter != version.cend()) {
|
||||
auto component = nextComponent(iter, version.cend());
|
||||
if (component.empty()) break;
|
||||
if (component.empty()) {
|
||||
break;
|
||||
}
|
||||
components.emplace_back(std::move(component));
|
||||
}
|
||||
state.mkList(v, components.size());
|
||||
|
@ -2114,7 +2162,9 @@ void fetch(EvalState& state, const Pos& pos, Value** args, Value& v,
|
|||
|
||||
auto res = getDownloader()->downloadCached(state.store, request);
|
||||
|
||||
if (state.allowedPaths) state.allowedPaths->insert(res.path);
|
||||
if (state.allowedPaths) {
|
||||
state.allowedPaths->insert(res.path);
|
||||
}
|
||||
|
||||
mkString(v, res.storePath, PathSet({res.storePath}));
|
||||
}
|
||||
|
@ -2136,7 +2186,9 @@ static void prim_fetchTarball(EvalState& state, const Pos& pos, Value** args,
|
|||
RegisterPrimOp::PrimOps* RegisterPrimOp::primOps;
|
||||
|
||||
RegisterPrimOp::RegisterPrimOp(std::string name, size_t arity, PrimOpFun fun) {
|
||||
if (!primOps) primOps = new PrimOps;
|
||||
if (!primOps) {
|
||||
primOps = new PrimOps;
|
||||
}
|
||||
primOps->emplace_back(name, arity, fun);
|
||||
}
|
||||
|
||||
|
|
12
third_party/nix/src/libexpr/primops/context.cc
vendored
12
third_party/nix/src/libexpr/primops/context.cc
vendored
|
@ -111,7 +111,9 @@ static void prim_getContext(EvalState& state, const Pos& pos, Value** args,
|
|||
for (const auto& info : contextInfos) {
|
||||
auto& infoVal = *state.allocAttr(v, state.symbols.create(info.first));
|
||||
state.mkAttrs(infoVal, 3);
|
||||
if (info.second.path) mkBool(*state.allocAttr(infoVal, sPath), true);
|
||||
if (info.second.path) {
|
||||
mkBool(*state.allocAttr(infoVal, sPath), true);
|
||||
}
|
||||
if (info.second.allOutputs)
|
||||
mkBool(*state.allocAttr(infoVal, sAllOutputs), true);
|
||||
if (!info.second.outputs.empty()) {
|
||||
|
@ -147,11 +149,15 @@ static void prim_appendContext(EvalState& state, const Pos& pos, Value** args,
|
|||
if (!state.store->isStorePath(i.name))
|
||||
throw EvalError("Context key '%s' is not a store path, at %s", i.name,
|
||||
i.pos);
|
||||
if (!settings.readOnlyMode) state.store->ensurePath(i.name);
|
||||
if (!settings.readOnlyMode) {
|
||||
state.store->ensurePath(i.name);
|
||||
}
|
||||
state.forceAttrs(*i.value, *i.pos);
|
||||
auto iter = i.value->attrs->find(sPath);
|
||||
if (iter != i.value->attrs->end()) {
|
||||
if (state.forceBool(*iter->value, *iter->pos)) context.insert(i.name);
|
||||
if (state.forceBool(*iter->value, *iter->pos)) {
|
||||
context.insert(i.name);
|
||||
}
|
||||
}
|
||||
|
||||
iter = i.value->attrs->find(sAllOutputs);
|
||||
|
|
12
third_party/nix/src/libexpr/primops/fetchGit.cc
vendored
12
third_party/nix/src/libexpr/primops/fetchGit.cc
vendored
|
@ -37,7 +37,9 @@ GitInfo exportGit(ref<Store> store, const std::string& uri,
|
|||
runProgram("git", true,
|
||||
{"-C", uri, "diff-index", "--quiet", "HEAD", "--"});
|
||||
} catch (ExecError& e) {
|
||||
if (!WIFEXITED(e.status) || WEXITSTATUS(e.status) != 1) throw;
|
||||
if (!WIFEXITED(e.status) || WEXITSTATUS(e.status) != 1) {
|
||||
throw;
|
||||
}
|
||||
clean = false;
|
||||
}
|
||||
|
||||
|
@ -78,7 +80,9 @@ GitInfo exportGit(ref<Store> store, const std::string& uri,
|
|||
ref = "HEAD"s;
|
||||
}
|
||||
|
||||
if (!ref) ref = "HEAD"s;
|
||||
if (!ref) {
|
||||
ref = "HEAD"s;
|
||||
}
|
||||
|
||||
if (rev != "" && !std::regex_match(rev, revRegex))
|
||||
throw Error("invalid Git revision '%s'", rev);
|
||||
|
@ -166,7 +170,9 @@ GitInfo exportGit(ref<Store> store, const std::string& uri,
|
|||
}
|
||||
|
||||
} catch (SysError& e) {
|
||||
if (e.errNo != ENOENT) throw;
|
||||
if (e.errNo != ENOENT) {
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: should pipe this, or find some better way to extract a
|
||||
|
|
|
@ -73,7 +73,9 @@ HgInfo exportMercurial(ref<Store> store, const std::string& uri,
|
|||
}
|
||||
}
|
||||
|
||||
if (rev == "") rev = "default";
|
||||
if (rev == "") {
|
||||
rev = "default";
|
||||
}
|
||||
|
||||
Path cacheDir = fmt("%s/nix/hg/%s", getCacheDir(),
|
||||
hashString(htSHA256, uri).to_string(Base32, false));
|
||||
|
@ -149,7 +151,9 @@ HgInfo exportMercurial(ref<Store> store, const std::string& uri,
|
|||
}
|
||||
|
||||
} catch (SysError& e) {
|
||||
if (e.errNo != ENOENT) throw;
|
||||
if (e.errNo != ENOENT) {
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
Path tmpDir = createTempDir();
|
||||
|
|
8
third_party/nix/src/libexpr/value-to-xml.cc
vendored
8
third_party/nix/src/libexpr/value-to-xml.cc
vendored
|
@ -36,7 +36,9 @@ static void showAttrs(EvalState& state, bool strict, bool location,
|
|||
|
||||
XMLAttrs xmlAttrs;
|
||||
xmlAttrs["name"] = i;
|
||||
if (location && a.pos != &noPos) posToXML(xmlAttrs, *a.pos);
|
||||
if (location && a.pos != &noPos) {
|
||||
posToXML(xmlAttrs, *a.pos);
|
||||
}
|
||||
|
||||
XMLOpenElement _(doc, "attr", xmlAttrs);
|
||||
printValueAsXML(state, strict, location, *a.value, doc, context, drvsSeen);
|
||||
|
@ -132,7 +134,9 @@ static void printValueAsXML(EvalState& state, bool strict, bool location,
|
|||
|
||||
case tLambda: {
|
||||
XMLAttrs xmlAttrs;
|
||||
if (location) posToXML(xmlAttrs, v.lambda.fun->pos);
|
||||
if (location) {
|
||||
posToXML(xmlAttrs, v.lambda.fun->pos);
|
||||
}
|
||||
XMLOpenElement _(doc, "function", xmlAttrs);
|
||||
|
||||
if (v.lambda.fun->matchAttrs) {
|
||||
|
|
4
third_party/nix/src/libmain/common-args.cc
vendored
4
third_party/nix/src/libmain/common-args.cc
vendored
|
@ -32,7 +32,9 @@ MixCommonArgs::MixCommonArgs(const string& programName)
|
|||
globalConfig.convertToArgs(*this, cat);
|
||||
|
||||
// Backward compatibility hack: nix-env already had a --system flag.
|
||||
if (programName == "nix-env") longFlags.erase("system");
|
||||
if (programName == "nix-env") {
|
||||
longFlags.erase("system");
|
||||
}
|
||||
|
||||
hiddenCategories.insert(cat);
|
||||
}
|
||||
|
|
40
third_party/nix/src/libmain/shared.cc
vendored
40
third_party/nix/src/libmain/shared.cc
vendored
|
@ -128,11 +128,15 @@ void initNix() {
|
|||
sigemptyset(&act.sa_mask);
|
||||
act.sa_handler = SIG_DFL;
|
||||
act.sa_flags = 0;
|
||||
if (sigaction(SIGCHLD, &act, 0)) throw SysError("resetting SIGCHLD");
|
||||
if (sigaction(SIGCHLD, &act, 0)) {
|
||||
throw SysError("resetting SIGCHLD");
|
||||
}
|
||||
|
||||
/* Install a dummy SIGUSR1 handler for use with pthread_kill(). */
|
||||
act.sa_handler = sigHandler;
|
||||
if (sigaction(SIGUSR1, &act, 0)) throw SysError("handling SIGUSR1");
|
||||
if (sigaction(SIGUSR1, &act, 0)) {
|
||||
throw SysError("handling SIGUSR1");
|
||||
}
|
||||
|
||||
#if __APPLE__
|
||||
/* HACK: on darwin, we need can’t use sigprocmask with SIGWINCH.
|
||||
|
@ -140,7 +144,9 @@ void initNix() {
|
|||
* can handle the rest. */
|
||||
struct sigaction sa;
|
||||
sa.sa_handler = sigHandler;
|
||||
if (sigaction(SIGWINCH, &sa, 0)) throw SysError("handling SIGWINCH");
|
||||
if (sigaction(SIGWINCH, &sa, 0)) {
|
||||
throw SysError("handling SIGWINCH");
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Register a SIGSEGV handler to detect stack overflows. */
|
||||
|
@ -223,14 +229,18 @@ LegacyArgs::LegacyArgs(
|
|||
}
|
||||
|
||||
bool LegacyArgs::processFlag(Strings::iterator& pos, Strings::iterator end) {
|
||||
if (MixCommonArgs::processFlag(pos, end)) return true;
|
||||
if (MixCommonArgs::processFlag(pos, end)) {
|
||||
return true;
|
||||
}
|
||||
bool res = parseArg(pos, end);
|
||||
if (res) ++pos;
|
||||
return res;
|
||||
}
|
||||
|
||||
bool LegacyArgs::processArgs(const Strings& args, bool finish) {
|
||||
if (args.empty()) return true;
|
||||
if (args.empty()) {
|
||||
return true;
|
||||
}
|
||||
assert(args.size() == 1);
|
||||
Strings ss(args);
|
||||
auto pos = ss.begin();
|
||||
|
@ -321,10 +331,16 @@ int handleExceptions(const string& programName, std::function<void()> fun) {
|
|||
}
|
||||
|
||||
RunPager::RunPager() {
|
||||
if (!isatty(STDOUT_FILENO)) return;
|
||||
if (!isatty(STDOUT_FILENO)) {
|
||||
return;
|
||||
}
|
||||
char* pager = getenv("NIX_PAGER");
|
||||
if (!pager) pager = getenv("PAGER");
|
||||
if (pager && ((string)pager == "" || (string)pager == "cat")) return;
|
||||
if (!pager) {
|
||||
pager = getenv("PAGER");
|
||||
}
|
||||
if (pager && ((string)pager == "" || (string)pager == "cat")) {
|
||||
return;
|
||||
}
|
||||
|
||||
Pipe toPager;
|
||||
toPager.create();
|
||||
|
@ -332,9 +348,13 @@ RunPager::RunPager() {
|
|||
pid = startProcess([&]() {
|
||||
if (dup2(toPager.readSide.get(), STDIN_FILENO) == -1)
|
||||
throw SysError("dupping stdin");
|
||||
if (!getenv("LESS")) setenv("LESS", "FRSXMK", 1);
|
||||
if (!getenv("LESS")) {
|
||||
setenv("LESS", "FRSXMK", 1);
|
||||
}
|
||||
restoreSignals();
|
||||
if (pager) execl("/bin/sh", "sh", "-c", pager, nullptr);
|
||||
if (pager) {
|
||||
execl("/bin/sh", "sh", "-c", pager, nullptr);
|
||||
}
|
||||
execlp("pager", "pager", nullptr);
|
||||
execlp("less", "less", nullptr);
|
||||
execlp("more", "more", nullptr);
|
||||
|
|
4
third_party/nix/src/libmain/shared.hh
vendored
4
third_party/nix/src/libmain/shared.hh
vendored
|
@ -53,7 +53,9 @@ template <class N>
|
|||
N getIntArg(const string& opt, Strings::iterator& i,
|
||||
const Strings::iterator& end, bool allowUnit) {
|
||||
++i;
|
||||
if (i == end) throw UsageError(format("'%1%' requires an argument") % opt);
|
||||
if (i == end) {
|
||||
throw UsageError(format("'%1%' requires an argument") % opt);
|
||||
}
|
||||
string s = *i;
|
||||
N multiplier = 1;
|
||||
if (allowUnit && !s.empty()) {
|
||||
|
|
16
third_party/nix/src/libmain/stack.cc
vendored
16
third_party/nix/src/libmain/stack.cc
vendored
|
@ -25,7 +25,9 @@ static void sigsegvHandler(int signo, siginfo_t* info, void* ctx) {
|
|||
|
||||
if (haveSP) {
|
||||
ptrdiff_t diff = (char*)info->si_addr - sp;
|
||||
if (diff < 0) diff = -diff;
|
||||
if (diff < 0) {
|
||||
diff = -diff;
|
||||
}
|
||||
if (diff < 4096) {
|
||||
char msg[] = "error: stack overflow (possible infinite recursion)\n";
|
||||
[[gnu::unused]] auto res = write(2, msg, strlen(msg));
|
||||
|
@ -38,7 +40,9 @@ static void sigsegvHandler(int signo, siginfo_t* info, void* ctx) {
|
|||
sigfillset(&act.sa_mask);
|
||||
act.sa_handler = SIG_DFL;
|
||||
act.sa_flags = 0;
|
||||
if (sigaction(SIGSEGV, &act, 0)) abort();
|
||||
if (sigaction(SIGSEGV, &act, 0)) {
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
void detectStackOverflow() {
|
||||
|
@ -50,7 +54,9 @@ void detectStackOverflow() {
|
|||
stack.ss_size = 4096 * 4 + MINSIGSTKSZ;
|
||||
static auto stackBuf = std::make_unique<std::vector<char>>(stack.ss_size);
|
||||
stack.ss_sp = stackBuf->data();
|
||||
if (!stack.ss_sp) throw Error("cannot allocate alternative stack");
|
||||
if (!stack.ss_sp) {
|
||||
throw Error("cannot allocate alternative stack");
|
||||
}
|
||||
stack.ss_flags = 0;
|
||||
if (sigaltstack(&stack, 0) == -1)
|
||||
throw SysError("cannot set alternative stack");
|
||||
|
@ -59,7 +65,9 @@ void detectStackOverflow() {
|
|||
sigfillset(&act.sa_mask);
|
||||
act.sa_sigaction = sigsegvHandler;
|
||||
act.sa_flags = SA_SIGINFO | SA_ONSTACK;
|
||||
if (sigaction(SIGSEGV, &act, 0)) throw SysError("resetting SIGSEGV");
|
||||
if (sigaction(SIGSEGV, &act, 0)) {
|
||||
throw SysError("resetting SIGSEGV");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
|
|
@ -38,7 +38,9 @@ void BinaryCacheStore::init() {
|
|||
} else {
|
||||
for (auto& line : tokenizeString<Strings>(*cacheInfo, "\n")) {
|
||||
size_t colon = line.find(':');
|
||||
if (colon == std::string::npos) continue;
|
||||
if (colon == std::string::npos) {
|
||||
continue;
|
||||
}
|
||||
auto name = line.substr(0, colon);
|
||||
auto value = trim(line.substr(colon + 1, std::string::npos));
|
||||
if (name == "StoreDir") {
|
||||
|
@ -115,12 +117,16 @@ void BinaryCacheStore::addToStore(const ValidPathInfo& info,
|
|||
const ref<std::string>& nar,
|
||||
RepairFlag repair, CheckSigsFlag checkSigs,
|
||||
std::shared_ptr<FSAccessor> accessor) {
|
||||
if (!repair && isValidPath(info.path)) return;
|
||||
if (!repair && isValidPath(info.path)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Verify that all references are valid. This may do some .narinfo
|
||||
reads, but typically they'll already be cached. */
|
||||
for (auto& ref : info.references) try {
|
||||
if (ref != info.path) queryPathInfo(ref);
|
||||
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") %
|
||||
|
@ -152,7 +158,9 @@ void BinaryCacheStore::addToStore(const ValidPathInfo& info,
|
|||
|
||||
auto narAccessor = makeNarAccessor(nar);
|
||||
|
||||
if (accessor_) accessor_->addToCache(info.path, *nar, narAccessor);
|
||||
if (accessor_) {
|
||||
accessor_->addToCache(info.path, *nar, narAccessor);
|
||||
}
|
||||
|
||||
{
|
||||
auto res = jsonRoot.placeholder("root");
|
||||
|
@ -165,7 +173,9 @@ void BinaryCacheStore::addToStore(const ValidPathInfo& info,
|
|||
}
|
||||
|
||||
else {
|
||||
if (accessor_) accessor_->addToCache(info.path, *nar, makeNarAccessor(nar));
|
||||
if (accessor_) {
|
||||
accessor_->addToCache(info.path, *nar, makeNarAccessor(nar));
|
||||
}
|
||||
}
|
||||
|
||||
/* Compress the NAR. */
|
||||
|
@ -201,7 +211,9 @@ void BinaryCacheStore::addToStore(const ValidPathInfo& info,
|
|||
stats.narWriteCompressionTimeMs += duration;
|
||||
|
||||
/* Atomically write the NAR info file.*/
|
||||
if (secretKey) narInfo->sign(*secretKey);
|
||||
if (secretKey) {
|
||||
narInfo->sign(*secretKey);
|
||||
}
|
||||
|
||||
writeNarInfo(narInfo);
|
||||
|
||||
|
@ -254,7 +266,9 @@ void BinaryCacheStore::queryPathInfoUncached(
|
|||
try {
|
||||
auto data = fut.get();
|
||||
|
||||
if (!data) return (*callbackPtr)(nullptr);
|
||||
if (!data) {
|
||||
return (*callbackPtr)(nullptr);
|
||||
}
|
||||
|
||||
stats.narInfoRead++;
|
||||
|
||||
|
@ -341,7 +355,9 @@ std::shared_ptr<std::string> BinaryCacheStore::getBuildLog(const Path& path) {
|
|||
try {
|
||||
auto info = queryPathInfo(path);
|
||||
// FIXME: add a "Log" field to .narinfo
|
||||
if (info->deriver == "") return nullptr;
|
||||
if (info->deriver == "") {
|
||||
return nullptr;
|
||||
}
|
||||
drvPath = info->deriver;
|
||||
} catch (InvalidPath&) {
|
||||
return nullptr;
|
||||
|
|
324
third_party/nix/src/libstore/build.cc
vendored
324
third_party/nix/src/libstore/build.cc
vendored
|
@ -334,7 +334,9 @@ void addToWeakGoals(WeakGoals& goals, GoalPtr p) {
|
|||
// FIXME: necessary?
|
||||
// FIXME: O(n)
|
||||
for (auto& i : goals)
|
||||
if (i.lock() == p) return;
|
||||
if (i.lock() == p) {
|
||||
return;
|
||||
}
|
||||
goals.push_back(p);
|
||||
}
|
||||
|
||||
|
@ -368,7 +370,9 @@ void Goal::waiteeDone(GoalPtr waitee, ExitCode result) {
|
|||
for (auto& goal : waitees) {
|
||||
WeakGoals waiters2;
|
||||
for (auto& j : goal->waiters)
|
||||
if (j.lock() != shared_from_this()) waiters2.push_back(j);
|
||||
if (j.lock() != shared_from_this()) {
|
||||
waiters2.push_back(j);
|
||||
}
|
||||
goal->waiters = waiters2;
|
||||
}
|
||||
waitees.clear();
|
||||
|
@ -385,7 +389,9 @@ void Goal::amDone(ExitCode result) {
|
|||
exitCode = result;
|
||||
for (auto& i : waiters) {
|
||||
GoalPtr goal = i.lock();
|
||||
if (goal) goal->waiteeDone(shared_from_this(), result);
|
||||
if (goal) {
|
||||
goal->waiteeDone(shared_from_this(), result);
|
||||
}
|
||||
}
|
||||
waiters.clear();
|
||||
worker.removeGoal(shared_from_this());
|
||||
|
@ -405,7 +411,9 @@ static void commonChildInit(Pipe& logPipe) {
|
|||
process group) so that it has no controlling terminal (meaning
|
||||
that e.g. ssh cannot open /dev/tty) and it doesn't receive
|
||||
terminal signals. */
|
||||
if (setsid() == -1) throw SysError(format("creating a new session"));
|
||||
if (setsid() == -1) {
|
||||
throw SysError(format("creating a new session"));
|
||||
}
|
||||
|
||||
/* Dup the write side of the logger pipe into stderr. */
|
||||
if (dup2(logPipe.writeSide.get(), STDERR_FILENO) == -1)
|
||||
|
@ -539,7 +547,9 @@ UserLock::UserLock() {
|
|||
try {
|
||||
AutoCloseFD fd =
|
||||
open(fnUserLock.c_str(), O_RDWR | O_CREAT | O_CLOEXEC, 0600);
|
||||
if (!fd) throw SysError(format("opening user lock '%1%'") % fnUserLock);
|
||||
if (!fd) {
|
||||
throw SysError(format("opening user lock '%1%'") % fnUserLock);
|
||||
}
|
||||
|
||||
if (lockFile(fd.get(), ltWrite, false)) {
|
||||
fdUserLock = std::move(fd);
|
||||
|
@ -671,7 +681,9 @@ HookInstance::HookInstance() {
|
|||
HookInstance::~HookInstance() {
|
||||
try {
|
||||
toHook.writeSide = -1;
|
||||
if (pid != -1) pid.kill();
|
||||
if (pid != -1) {
|
||||
pid.kill();
|
||||
}
|
||||
} catch (...) {
|
||||
ignoreException();
|
||||
}
|
||||
|
@ -1051,7 +1063,9 @@ void DerivationGoal::work() { (this->*state)(); }
|
|||
|
||||
void DerivationGoal::addWantedOutputs(const StringSet& outputs) {
|
||||
/* If we already want all outputs, there is nothing to do. */
|
||||
if (wantedOutputs.empty()) return;
|
||||
if (wantedOutputs.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (outputs.empty()) {
|
||||
wantedOutputs.clear();
|
||||
|
@ -1192,7 +1206,9 @@ void DerivationGoal::outputsSubstituted() {
|
|||
i.first, i.second, buildMode == bmRepair ? bmRepair : bmNormal));
|
||||
|
||||
for (auto& i : drv->inputSrcs) {
|
||||
if (worker.store.isValidPath(i)) continue;
|
||||
if (worker.store.isValidPath(i)) {
|
||||
continue;
|
||||
}
|
||||
if (!settings.useSubstitutes)
|
||||
throw Error(format("dependency '%1%' of '%2%' does not exist, and "
|
||||
"substitution is disabled") %
|
||||
|
@ -1215,7 +1231,9 @@ void DerivationGoal::repairClosure() {
|
|||
/* Get the output closure. */
|
||||
PathSet outputClosure;
|
||||
for (auto& i : drv->outputs) {
|
||||
if (!wantOutput(i.first, wantedOutputs)) continue;
|
||||
if (!wantOutput(i.first, wantedOutputs)) {
|
||||
continue;
|
||||
}
|
||||
worker.store.computeFSClosure(i.second.path, outputClosure);
|
||||
}
|
||||
|
||||
|
@ -1226,7 +1244,9 @@ void DerivationGoal::repairClosure() {
|
|||
derivation is responsible for which path in the output
|
||||
closure. */
|
||||
PathSet inputClosure;
|
||||
if (useDerivation) worker.store.computeFSClosure(drvPath, inputClosure);
|
||||
if (useDerivation) {
|
||||
worker.store.computeFSClosure(drvPath, inputClosure);
|
||||
}
|
||||
std::map<Path, Path> outputsToDrv;
|
||||
for (auto& i : inputClosure)
|
||||
if (isDerivation(i)) {
|
||||
|
@ -1237,7 +1257,9 @@ void DerivationGoal::repairClosure() {
|
|||
/* Check each path (slow!). */
|
||||
PathSet broken;
|
||||
for (auto& i : outputClosure) {
|
||||
if (worker.pathContentsGood(i)) continue;
|
||||
if (worker.pathContentsGood(i)) {
|
||||
continue;
|
||||
}
|
||||
LOG(ERROR) << "found corrupted or missing path '" << i
|
||||
<< "' in the output closure of '" << drvPath << "'";
|
||||
Path drvPath2 = outputsToDrv[i];
|
||||
|
@ -1373,7 +1395,9 @@ void DerivationGoal::tryToBuild() {
|
|||
them. */
|
||||
for (auto& i : drv->outputs) {
|
||||
Path path = i.second.path;
|
||||
if (worker.store.isValidPath(path)) continue;
|
||||
if (worker.store.isValidPath(path)) {
|
||||
continue;
|
||||
}
|
||||
DLOG(INFO) << "removing invalid path " << path;
|
||||
deletePath(worker.store.toRealPath(path));
|
||||
}
|
||||
|
@ -1459,7 +1483,9 @@ void replaceValidPath(const Path& storePath, const Path tmpPath) {
|
|||
we're repairing (say) Glibc, we end up with a broken system. */
|
||||
Path oldPath =
|
||||
(format("%1%.old-%2%-%3%") % storePath % getpid() % random()).str();
|
||||
if (pathExists(storePath)) rename(storePath.c_str(), oldPath.c_str());
|
||||
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);
|
||||
deletePath(oldPath);
|
||||
|
@ -1504,7 +1530,9 @@ MakeError(NotDeterministic, BuildError)
|
|||
malicious user from leaving behind a process that keeps files
|
||||
open and modifies them after they have been chown'ed to
|
||||
root. */
|
||||
if (buildUser) buildUser->kill();
|
||||
if (buildUser) {
|
||||
buildUser->kill();
|
||||
}
|
||||
|
||||
bool diskFull = false;
|
||||
|
||||
|
@ -1670,7 +1698,9 @@ HookReply DerivationGoal::tryBuildHook() {
|
|||
return rpDecline;
|
||||
}
|
||||
|
||||
if (!worker.hook) worker.hook = std::make_unique<HookInstance>();
|
||||
if (!worker.hook) {
|
||||
worker.hook = std::make_unique<HookInstance>();
|
||||
}
|
||||
|
||||
try {
|
||||
/* Send the request to the hook. */
|
||||
|
@ -1808,7 +1838,9 @@ static void preloadNSS() {
|
|||
|
||||
if (getaddrinfo("this.pre-initializes.the.dns.resolvers.invalid.", "http",
|
||||
NULL, &res) != 0) {
|
||||
if (res) freeaddrinfo(res);
|
||||
if (res) {
|
||||
freeaddrinfo(res);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -1823,7 +1855,9 @@ void DerivationGoal::startBuilder() {
|
|||
concatStringsSep(", ", parsedDrv->getRequiredSystemFeatures()), drvPath,
|
||||
settings.thisSystem, concatStringsSep(", ", settings.systemFeatures));
|
||||
|
||||
if (drv->isBuiltin()) preloadNSS();
|
||||
if (drv->isBuiltin()) {
|
||||
preloadNSS();
|
||||
}
|
||||
|
||||
#if __APPLE__
|
||||
additionalSandboxProfile =
|
||||
|
@ -1930,7 +1964,9 @@ void DerivationGoal::startBuilder() {
|
|||
dirsInChroot.clear();
|
||||
|
||||
for (auto i : dirs) {
|
||||
if (i.empty()) continue;
|
||||
if (i.empty()) {
|
||||
continue;
|
||||
}
|
||||
bool optional = false;
|
||||
if (i[i.size() - 1] == '?') {
|
||||
optional = true;
|
||||
|
@ -2161,7 +2197,9 @@ void DerivationGoal::startBuilder() {
|
|||
// builderOut.create();
|
||||
|
||||
builderOut.readSide = posix_openpt(O_RDWR | O_NOCTTY);
|
||||
if (!builderOut.readSide) throw SysError("opening pseudoterminal master");
|
||||
if (!builderOut.readSide) {
|
||||
throw SysError("opening pseudoterminal master");
|
||||
}
|
||||
|
||||
std::string slaveName(ptsname(builderOut.readSide.get()));
|
||||
|
||||
|
@ -2187,7 +2225,9 @@ void DerivationGoal::startBuilder() {
|
|||
throw SysError("unlocking pseudoterminal");
|
||||
|
||||
builderOut.writeSide = open(slaveName.c_str(), O_RDWR | O_NOCTTY);
|
||||
if (!builderOut.writeSide) throw SysError("opening pseudoterminal slave");
|
||||
if (!builderOut.writeSide) {
|
||||
throw SysError("opening pseudoterminal slave");
|
||||
}
|
||||
|
||||
// Put the pt into raw mode to prevent \n -> \r\n translation.
|
||||
struct termios term;
|
||||
|
@ -2265,11 +2305,15 @@ void DerivationGoal::startBuilder() {
|
|||
char* stack =
|
||||
(char*)mmap(0, stackSize, PROT_WRITE | PROT_READ,
|
||||
MAP_PRIVATE | MAP_ANONYMOUS | MAP_STACK, -1, 0);
|
||||
if (stack == MAP_FAILED) throw SysError("allocating stack");
|
||||
if (stack == MAP_FAILED) {
|
||||
throw SysError("allocating stack");
|
||||
}
|
||||
|
||||
int flags = CLONE_NEWUSER | CLONE_NEWPID | CLONE_NEWNS |
|
||||
CLONE_NEWIPC | CLONE_NEWUTS | CLONE_PARENT | SIGCHLD;
|
||||
if (privateNetwork) flags |= CLONE_NEWNET;
|
||||
if (privateNetwork) {
|
||||
flags |= CLONE_NEWNET;
|
||||
}
|
||||
|
||||
pid_t child = clone(childEntry, stack + stackSize, flags, this);
|
||||
if (child == -1 && errno == EINVAL) {
|
||||
|
@ -2292,7 +2336,9 @@ void DerivationGoal::startBuilder() {
|
|||
if (child == -1 && (errno == EPERM || errno == EINVAL) &&
|
||||
settings.sandboxFallback)
|
||||
_exit(1);
|
||||
if (child == -1) throw SysError("cloning builder process");
|
||||
if (child == -1) {
|
||||
throw SysError("cloning builder process");
|
||||
}
|
||||
|
||||
writeFull(builderOut.writeSide.get(), std::to_string(child) + "\n");
|
||||
_exit(0);
|
||||
|
@ -2310,7 +2356,9 @@ void DerivationGoal::startBuilder() {
|
|||
userNamespaceSync.readSide = -1;
|
||||
|
||||
pid_t tmp;
|
||||
if (!string2Int<pid_t>(readLine(builderOut.readSide.get()), tmp)) abort();
|
||||
if (!string2Int<pid_t>(readLine(builderOut.readSide.get()), tmp)) {
|
||||
abort();
|
||||
}
|
||||
pid = tmp;
|
||||
|
||||
/* Set the UID/GID mapping of the builder's user namespace
|
||||
|
@ -2350,7 +2398,9 @@ void DerivationGoal::startBuilder() {
|
|||
while (true) {
|
||||
string msg = readLine(builderOut.readSide.get());
|
||||
if (string(msg, 0, 1) == "\1") {
|
||||
if (msg.size() == 1) break;
|
||||
if (msg.size() == 1) {
|
||||
break;
|
||||
}
|
||||
throw Error(string(msg, 1));
|
||||
}
|
||||
DLOG(INFO) << msg;
|
||||
|
@ -2435,7 +2485,9 @@ void DerivationGoal::initEnv() {
|
|||
derivation, tell the builder, so that for instance `fetchurl'
|
||||
can skip checking the output. On older Nixes, this environment
|
||||
variable won't be set, so `fetchurl' will do the check. */
|
||||
if (fixedOutput) env["NIX_OUTPUT_CHECKED"] = "1";
|
||||
if (fixedOutput) {
|
||||
env["NIX_OUTPUT_CHECKED"] = "1";
|
||||
}
|
||||
|
||||
/* *Only* if this is a fixed-output derivation, propagate the
|
||||
values of the environment variables specified in the
|
||||
|
@ -2465,7 +2517,9 @@ static std::regex shVarName("[A-Za-z_][A-Za-z0-9_]*");
|
|||
|
||||
void DerivationGoal::writeStructuredAttrs() {
|
||||
auto& structuredAttrs = parsedDrv->getStructuredAttrs();
|
||||
if (!structuredAttrs) return;
|
||||
if (!structuredAttrs) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto json = *structuredAttrs;
|
||||
|
||||
|
@ -2503,14 +2557,20 @@ void DerivationGoal::writeStructuredAttrs() {
|
|||
|
||||
auto handleSimpleType =
|
||||
[](const nlohmann::json& value) -> std::optional<std::string> {
|
||||
if (value.is_string()) return shellEscape(value);
|
||||
if (value.is_string()) {
|
||||
return shellEscape(value);
|
||||
}
|
||||
|
||||
if (value.is_number()) {
|
||||
auto f = value.get<float>();
|
||||
if (std::ceil(f) == f) return std::to_string(value.get<int>());
|
||||
if (std::ceil(f) == f) {
|
||||
return std::to_string(value.get<int>());
|
||||
}
|
||||
}
|
||||
|
||||
if (value.is_null()) return std::string("''");
|
||||
if (value.is_null()) {
|
||||
return std::string("''");
|
||||
}
|
||||
|
||||
if (value.is_boolean())
|
||||
return value.get<bool>() ? std::string("1") : std::string("");
|
||||
|
@ -2521,7 +2581,9 @@ void DerivationGoal::writeStructuredAttrs() {
|
|||
std::string jsonSh;
|
||||
|
||||
for (auto i = json.begin(); i != json.end(); ++i) {
|
||||
if (!std::regex_match(i.key(), shVarName)) continue;
|
||||
if (!std::regex_match(i.key(), shVarName)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto& value = i.value();
|
||||
|
||||
|
@ -2543,7 +2605,9 @@ void DerivationGoal::writeStructuredAttrs() {
|
|||
s2 += ' ';
|
||||
}
|
||||
|
||||
if (good) jsonSh += fmt("declare -a %s=(%s)\n", i.key(), s2);
|
||||
if (good) {
|
||||
jsonSh += fmt("declare -a %s=(%s)\n", i.key(), s2);
|
||||
}
|
||||
}
|
||||
|
||||
else if (value.is_object()) {
|
||||
|
@ -2559,7 +2623,9 @@ void DerivationGoal::writeStructuredAttrs() {
|
|||
s2 += fmt("[%s]=%s ", shellEscape(i.key()), *s3);
|
||||
}
|
||||
|
||||
if (good) jsonSh += fmt("declare -A %s=(%s)\n", i.key(), s2);
|
||||
if (good) {
|
||||
jsonSh += fmt("declare -A %s=(%s)\n", i.key(), s2);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2568,14 +2634,18 @@ void DerivationGoal::writeStructuredAttrs() {
|
|||
}
|
||||
|
||||
void DerivationGoal::chownToBuilder(const Path& path) {
|
||||
if (!buildUser) return;
|
||||
if (!buildUser) {
|
||||
return;
|
||||
}
|
||||
if (chown(path.c_str(), buildUser->getUID(), buildUser->getGID()) == -1)
|
||||
throw SysError(format("cannot change ownership of '%1%'") % path);
|
||||
}
|
||||
|
||||
void setupSeccomp() {
|
||||
#if __linux__
|
||||
if (!settings.filterSyscalls) return;
|
||||
if (!settings.filterSyscalls) {
|
||||
return;
|
||||
}
|
||||
#if HAVE_SECCOMP
|
||||
scmp_filter_ctx ctx;
|
||||
|
||||
|
@ -2653,7 +2723,9 @@ void DerivationGoal::runChild() {
|
|||
try {
|
||||
setupSeccomp();
|
||||
} catch (...) {
|
||||
if (buildUser) throw;
|
||||
if (buildUser) {
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
bool setUser = true;
|
||||
|
@ -2679,7 +2751,9 @@ void DerivationGoal::runChild() {
|
|||
if (privateNetwork) {
|
||||
/* Initialise the loopback interface. */
|
||||
AutoCloseFD fd(socket(PF_INET, SOCK_DGRAM, IPPROTO_IP));
|
||||
if (!fd) throw SysError("cannot open IP socket");
|
||||
if (!fd) {
|
||||
throw SysError("cannot open IP socket");
|
||||
}
|
||||
|
||||
struct ifreq ifr;
|
||||
strcpy(ifr.ifr_name, "lo");
|
||||
|
@ -2782,7 +2856,9 @@ void DerivationGoal::runChild() {
|
|||
};
|
||||
|
||||
for (auto& i : dirsInChroot) {
|
||||
if (i.second.source == "/proc") continue; // backwards compatibility
|
||||
if (i.second.source == "/proc") {
|
||||
continue;
|
||||
} // backwards compatibility
|
||||
doBind(i.second.source, chrootRootDir + i.first, i.second.optional);
|
||||
}
|
||||
|
||||
|
@ -2813,7 +2889,9 @@ void DerivationGoal::runChild() {
|
|||
Linux versions, it is created with permissions 0. */
|
||||
chmod_(chrootRootDir + "/dev/pts/ptmx", 0666);
|
||||
} else {
|
||||
if (errno != EINVAL) throw SysError("mounting /dev/pts");
|
||||
if (errno != EINVAL) {
|
||||
throw SysError("mounting /dev/pts");
|
||||
}
|
||||
doBind("/dev/pts", chrootRootDir + "/dev/pts");
|
||||
doBind("/dev/ptmx", chrootRootDir + "/dev/ptmx");
|
||||
}
|
||||
|
@ -2844,8 +2922,12 @@ void DerivationGoal::runChild() {
|
|||
/* Switch to the sandbox uid/gid in the user namespace,
|
||||
which corresponds to the build user or calling user in
|
||||
the parent namespace. */
|
||||
if (setgid(sandboxGid) == -1) throw SysError("setgid failed");
|
||||
if (setuid(sandboxUid) == -1) throw SysError("setuid failed");
|
||||
if (setgid(sandboxGid) == -1) {
|
||||
throw SysError("setgid failed");
|
||||
}
|
||||
if (setuid(sandboxUid) == -1) {
|
||||
throw SysError("setuid failed");
|
||||
}
|
||||
|
||||
setUser = false;
|
||||
}
|
||||
|
@ -2875,13 +2957,17 @@ void DerivationGoal::runChild() {
|
|||
if ((drv->platform == "i686-linux" || drv->platform == "x86_64-linux") &&
|
||||
settings.impersonateLinux26) {
|
||||
int cur = personality(0xffffffff);
|
||||
if (cur != -1) personality(cur | 0x0020000 /* == UNAME26 */);
|
||||
if (cur != -1) {
|
||||
personality(cur | 0x0020000 /* == UNAME26 */);
|
||||
}
|
||||
}
|
||||
|
||||
/* Disable address space randomization for improved
|
||||
determinism. */
|
||||
int cur = personality(0xffffffff);
|
||||
if (cur != -1) personality(cur | ADDR_NO_RANDOMIZE);
|
||||
if (cur != -1) {
|
||||
personality(cur | ADDR_NO_RANDOMIZE);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Disable core dumps by default. */
|
||||
|
@ -2972,7 +3058,9 @@ void DerivationGoal::runChild() {
|
|||
|
||||
sandboxProfile += "(import \"sandbox-defaults.sb\")\n";
|
||||
|
||||
if (fixedOutput) sandboxProfile += "(import \"sandbox-network.sb\")\n";
|
||||
if (fixedOutput) {
|
||||
sandboxProfile += "(import \"sandbox-network.sb\")\n";
|
||||
}
|
||||
|
||||
/* Our rwx outputs */
|
||||
sandboxProfile += "(allow file-read* file-write* process-exec\n";
|
||||
|
@ -3001,7 +3089,9 @@ void DerivationGoal::runChild() {
|
|||
string path = i.first;
|
||||
struct stat st;
|
||||
if (lstat(path.c_str(), &st)) {
|
||||
if (i.second.optional && errno == ENOENT) continue;
|
||||
if (i.second.optional && errno == ENOENT) {
|
||||
continue;
|
||||
}
|
||||
throw SysError(format("getting attributes of path '%1%'") % path);
|
||||
}
|
||||
if (S_ISDIR(st.st_mode))
|
||||
|
@ -3040,7 +3130,9 @@ void DerivationGoal::runChild() {
|
|||
Path globalTmpDir = canonPath(getEnv("TMPDIR", "/tmp"), true);
|
||||
|
||||
/* They don't like trailing slashes on subpath directives */
|
||||
if (globalTmpDir.back() == '/') globalTmpDir.pop_back();
|
||||
if (globalTmpDir.back() == '/') {
|
||||
globalTmpDir.pop_back();
|
||||
}
|
||||
|
||||
builder = "/usr/bin/sandbox-exec";
|
||||
args.push_back("sandbox-exec");
|
||||
|
@ -3127,7 +3219,9 @@ void DerivationGoal::registerOutputs() {
|
|||
if (hook) {
|
||||
bool allValid = true;
|
||||
for (auto& i : drv->outputs)
|
||||
if (!worker.store.isValidPath(i.second.path)) allValid = false;
|
||||
if (!worker.store.isValidPath(i.second.path)) {
|
||||
allValid = false;
|
||||
}
|
||||
if (allValid) {
|
||||
return;
|
||||
}
|
||||
|
@ -3150,7 +3244,9 @@ void DerivationGoal::registerOutputs() {
|
|||
output paths read-only. */
|
||||
for (auto& i : drv->outputs) {
|
||||
Path path = i.second.path;
|
||||
if (missingPaths.find(path) == missingPaths.end()) continue;
|
||||
if (missingPaths.find(path) == missingPaths.end()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ValidPathInfo info;
|
||||
|
||||
|
@ -3168,7 +3264,9 @@ void DerivationGoal::registerOutputs() {
|
|||
"the Nix store") %
|
||||
path);
|
||||
}
|
||||
if (buildMode != bmCheck) actualPath = worker.store.toRealPath(path);
|
||||
if (buildMode != bmCheck) {
|
||||
actualPath = worker.store.toRealPath(path);
|
||||
}
|
||||
}
|
||||
|
||||
if (needsHashRewrite()) {
|
||||
|
@ -3177,7 +3275,9 @@ void DerivationGoal::registerOutputs() {
|
|||
redirectedBadOutputs.find(path) != redirectedBadOutputs.end() &&
|
||||
pathExists(redirected))
|
||||
replaceValidPath(path, redirected);
|
||||
if (buildMode == bmCheck && redirected != "") actualPath = redirected;
|
||||
if (buildMode == bmCheck && redirected != "") {
|
||||
actualPath = redirected;
|
||||
}
|
||||
}
|
||||
|
||||
struct stat st;
|
||||
|
@ -3293,7 +3393,9 @@ void DerivationGoal::registerOutputs() {
|
|||
PathSet references = scanForReferences(actualPath, allPaths, hash);
|
||||
|
||||
if (buildMode == bmCheck) {
|
||||
if (!worker.store.isValidPath(path)) continue;
|
||||
if (!worker.store.isValidPath(path)) {
|
||||
continue;
|
||||
}
|
||||
auto info = *worker.store.queryPathInfo(path);
|
||||
if (hash.first != info.narHash) {
|
||||
worker.checkMismatch = true;
|
||||
|
@ -3353,7 +3455,9 @@ void DerivationGoal::registerOutputs() {
|
|||
info.ultimate = true;
|
||||
worker.store.signPathInfo(info);
|
||||
|
||||
if (!info.references.empty()) info.ca.clear();
|
||||
if (!info.references.empty()) {
|
||||
info.ca.clear();
|
||||
}
|
||||
|
||||
infos[i.first] = info;
|
||||
}
|
||||
|
@ -3434,7 +3538,9 @@ void DerivationGoal::registerOutputs() {
|
|||
|
||||
/* In case of a fixed-output derivation hash mismatch, throw an
|
||||
exception now that we have registered the output as valid. */
|
||||
if (delayedException) std::rethrow_exception(delayedException);
|
||||
if (delayedException) {
|
||||
std::rethrow_exception(delayedException);
|
||||
}
|
||||
}
|
||||
|
||||
void DerivationGoal::checkOutputs(
|
||||
|
@ -3466,7 +3572,9 @@ void DerivationGoal::checkOutputs(
|
|||
while (!pathsLeft.empty()) {
|
||||
auto path = pathsLeft.front();
|
||||
pathsLeft.pop();
|
||||
if (!pathsDone.insert(path).second) continue;
|
||||
if (!pathsDone.insert(path).second) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto i = outputsByPath.find(path);
|
||||
if (i != outputsByPath.end()) {
|
||||
|
@ -3499,22 +3607,30 @@ void DerivationGoal::checkOutputs(
|
|||
|
||||
auto checkRefs = [&](const std::optional<Strings>& value, bool allowed,
|
||||
bool recursive) {
|
||||
if (!value) return;
|
||||
if (!value) {
|
||||
return;
|
||||
}
|
||||
|
||||
PathSet spec = parseReferenceSpecifiers(worker.store, *drv, *value);
|
||||
|
||||
PathSet used =
|
||||
recursive ? getClosure(info.path).first : info.references;
|
||||
|
||||
if (recursive && checks.ignoreSelfRefs) used.erase(info.path);
|
||||
if (recursive && checks.ignoreSelfRefs) {
|
||||
used.erase(info.path);
|
||||
}
|
||||
|
||||
PathSet badPaths;
|
||||
|
||||
for (auto& i : used)
|
||||
if (allowed) {
|
||||
if (!spec.count(i)) badPaths.insert(i);
|
||||
if (!spec.count(i)) {
|
||||
badPaths.insert(i);
|
||||
}
|
||||
} else {
|
||||
if (spec.count(i)) badPaths.insert(i);
|
||||
if (spec.count(i)) {
|
||||
badPaths.insert(i);
|
||||
}
|
||||
}
|
||||
|
||||
if (!badPaths.empty()) {
|
||||
|
@ -3595,7 +3711,9 @@ void DerivationGoal::checkOutputs(
|
|||
Path DerivationGoal::openLogFile() {
|
||||
logSize = 0;
|
||||
|
||||
if (!settings.keepLog) return "";
|
||||
if (!settings.keepLog) {
|
||||
return "";
|
||||
}
|
||||
|
||||
string baseName = baseNameOf(drvPath);
|
||||
|
||||
|
@ -3625,8 +3743,12 @@ Path DerivationGoal::openLogFile() {
|
|||
|
||||
void DerivationGoal::closeLogFile() {
|
||||
auto logSink2 = std::dynamic_pointer_cast<CompressionSink>(logSink);
|
||||
if (logSink2) logSink2->finish();
|
||||
if (logFileSink) logFileSink->flush();
|
||||
if (logSink2) {
|
||||
logSink2->finish();
|
||||
}
|
||||
if (logFileSink) {
|
||||
logFileSink->flush();
|
||||
}
|
||||
logSink = logFileSink = 0;
|
||||
fdLogFile = -1;
|
||||
}
|
||||
|
@ -3682,7 +3804,9 @@ void DerivationGoal::handleChildOutput(int fd, const string& data) {
|
|||
}
|
||||
|
||||
void DerivationGoal::handleEOF(int fd) {
|
||||
if (!currentLogLine.empty()) flushLine();
|
||||
if (!currentLogLine.empty()) {
|
||||
flushLine();
|
||||
}
|
||||
worker.wakeUp(shared_from_this());
|
||||
}
|
||||
|
||||
|
@ -3691,7 +3815,9 @@ void DerivationGoal::flushLine() {
|
|||
LOG(INFO) << currentLogLine;
|
||||
else {
|
||||
logTail.push_back(currentLogLine);
|
||||
if (logTail.size() > settings.logLines) logTail.pop_front();
|
||||
if (logTail.size() > settings.logLines) {
|
||||
logTail.pop_front();
|
||||
}
|
||||
}
|
||||
|
||||
currentLogLine = "";
|
||||
|
@ -3732,7 +3858,9 @@ void DerivationGoal::done(BuildResult::Status status, const string& msg) {
|
|||
result.status = status;
|
||||
result.errorMsg = msg;
|
||||
amDone(result.success() ? ecSuccess : ecFailed);
|
||||
if (result.status == BuildResult::TimedOut) worker.timedOut = true;
|
||||
if (result.status == BuildResult::TimedOut) {
|
||||
worker.timedOut = true;
|
||||
}
|
||||
if (result.status == BuildResult::PermanentFailure)
|
||||
worker.permanentFailure = true;
|
||||
|
||||
|
@ -3740,9 +3868,13 @@ void DerivationGoal::done(BuildResult::Status status, const string& msg) {
|
|||
mcRunningBuilds.reset();
|
||||
|
||||
if (result.success()) {
|
||||
if (status == BuildResult::Built) worker.doneBuilds++;
|
||||
if (status == BuildResult::Built) {
|
||||
worker.doneBuilds++;
|
||||
}
|
||||
} else {
|
||||
if (status != BuildResult::DependencyFailed) worker.failedBuilds++;
|
||||
if (status != BuildResult::DependencyFailed) {
|
||||
worker.failedBuilds++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -4068,7 +4200,9 @@ void SubstitutionGoal::finished() {
|
|||
void SubstitutionGoal::handleChildOutput(int fd, const string& data) {}
|
||||
|
||||
void SubstitutionGoal::handleEOF(int fd) {
|
||||
if (fd == outPipe.readSide.get()) worker.wakeUp(shared_from_this());
|
||||
if (fd == outPipe.readSide.get()) {
|
||||
worker.wakeUp(shared_from_this());
|
||||
}
|
||||
}
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
@ -4077,7 +4211,9 @@ static bool working = false;
|
|||
|
||||
Worker::Worker(LocalStore& store) : store(store) {
|
||||
/* Debugging: prevent recursive workers. */
|
||||
if (working) abort();
|
||||
if (working) {
|
||||
abort();
|
||||
}
|
||||
working = true;
|
||||
nrLocalBuilds = 0;
|
||||
lastWokenUp = steady_time_point::min();
|
||||
|
@ -4160,7 +4296,9 @@ void Worker::removeGoal(GoalPtr goal) {
|
|||
/* Wake up goals waiting for any goal to finish. */
|
||||
for (auto& i : waitingForAnyGoal) {
|
||||
GoalPtr goal = i.lock();
|
||||
if (goal) wakeUp(goal);
|
||||
if (goal) {
|
||||
wakeUp(goal);
|
||||
}
|
||||
}
|
||||
|
||||
waitingForAnyGoal.clear();
|
||||
|
@ -4192,7 +4330,9 @@ void Worker::childTerminated(Goal* goal, bool wakeSleepers) {
|
|||
auto i =
|
||||
std::find_if(children.begin(), children.end(),
|
||||
[&](const Child& child) { return child.goal2 == goal; });
|
||||
if (i == children.end()) return;
|
||||
if (i == children.end()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (i->inBuildSlot) {
|
||||
assert(nrLocalBuilds > 0);
|
||||
|
@ -4205,7 +4345,9 @@ void Worker::childTerminated(Goal* goal, bool wakeSleepers) {
|
|||
/* Wake up goals waiting for a build slot. */
|
||||
for (auto& j : wantingToBuild) {
|
||||
GoalPtr goal = j.lock();
|
||||
if (goal) wakeUp(goal);
|
||||
if (goal) {
|
||||
wakeUp(goal);
|
||||
}
|
||||
}
|
||||
|
||||
wantingToBuild.clear();
|
||||
|
@ -4246,17 +4388,23 @@ void Worker::run(const Goals& _topGoals) {
|
|||
Goals awake2;
|
||||
for (auto& i : awake) {
|
||||
GoalPtr goal = i.lock();
|
||||
if (goal) awake2.insert(goal);
|
||||
if (goal) {
|
||||
awake2.insert(goal);
|
||||
}
|
||||
}
|
||||
awake.clear();
|
||||
for (auto& goal : awake2) {
|
||||
checkInterrupt();
|
||||
goal->work();
|
||||
if (topGoals.empty()) break; // stuff may have been cancelled
|
||||
if (topGoals.empty()) {
|
||||
break;
|
||||
} // stuff may have been cancelled
|
||||
}
|
||||
}
|
||||
|
||||
if (topGoals.empty()) break;
|
||||
if (topGoals.empty()) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* Wait for input. */
|
||||
if (!children.empty() || !waitingForAWhile.empty())
|
||||
|
@ -4300,7 +4448,9 @@ void Worker::waitForInput() {
|
|||
// Periodicallty wake up to see if we need to run the garbage collector.
|
||||
nearest = before + std::chrono::seconds(10);
|
||||
for (auto& i : children) {
|
||||
if (!i.respectTimeouts) continue;
|
||||
if (!i.respectTimeouts) {
|
||||
continue;
|
||||
}
|
||||
if (0 != settings.maxSilentTime)
|
||||
nearest = std::min(
|
||||
nearest, i.lastOutput + std::chrono::seconds(settings.maxSilentTime));
|
||||
|
@ -4344,14 +4494,20 @@ void Worker::waitForInput() {
|
|||
int fdMax = 0;
|
||||
for (auto& i : children) {
|
||||
for (auto& j : i.fds) {
|
||||
if (j >= FD_SETSIZE) throw Error("reached FD_SETSIZE limit");
|
||||
if (j >= FD_SETSIZE) {
|
||||
throw Error("reached FD_SETSIZE limit");
|
||||
}
|
||||
FD_SET(j, &fds);
|
||||
if (j >= fdMax) fdMax = j + 1;
|
||||
if (j >= fdMax) {
|
||||
fdMax = j + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (select(fdMax, &fds, 0, 0, useTimeout ? &timeout : 0) == -1) {
|
||||
if (errno == EINTR) return;
|
||||
if (errno == EINTR) {
|
||||
return;
|
||||
}
|
||||
throw SysError("waiting for input");
|
||||
}
|
||||
|
||||
|
@ -4414,7 +4570,9 @@ void Worker::waitForInput() {
|
|||
lastWokenUp = after;
|
||||
for (auto& i : waitingForAWhile) {
|
||||
GoalPtr goal = i.lock();
|
||||
if (goal) wakeUp(goal);
|
||||
if (goal) {
|
||||
wakeUp(goal);
|
||||
}
|
||||
}
|
||||
waitingForAWhile.clear();
|
||||
}
|
||||
|
@ -4452,7 +4610,9 @@ unsigned int Worker::exitStatus() {
|
|||
|
||||
bool Worker::pathContentsGood(const Path& path) {
|
||||
std::map<Path, bool>::iterator i = pathContentsGoodCache.find(path);
|
||||
if (i != pathContentsGoodCache.end()) return i->second;
|
||||
if (i != pathContentsGoodCache.end()) {
|
||||
return i->second;
|
||||
}
|
||||
LOG(INFO) << "checking path '" << path << "'...";
|
||||
auto info = store.queryPathInfo(path);
|
||||
bool res;
|
||||
|
@ -4543,7 +4703,9 @@ BuildResult LocalStore::buildDerivation(const Path& drvPath,
|
|||
|
||||
void LocalStore::ensurePath(const Path& path) {
|
||||
/* If the path is already valid, we're done. */
|
||||
if (isValidPath(path)) return;
|
||||
if (isValidPath(path)) {
|
||||
return;
|
||||
}
|
||||
|
||||
primeCache(*this, {path});
|
||||
|
||||
|
|
|
@ -99,7 +99,9 @@ static void createLinks(const Path& srcDir, const Path& dstDir, int priority) {
|
|||
"to change the priority of one of the conflicting packages"
|
||||
" (0 being the highest priority)",
|
||||
srcFile, readLink(dstFile), priority);
|
||||
if (prevPriority < priority) continue;
|
||||
if (prevPriority < priority) {
|
||||
continue;
|
||||
}
|
||||
if (unlink(dstFile.c_str()) == -1)
|
||||
throw SysError(format("unlinking '%1%'") % dstFile);
|
||||
} else if (S_ISDIR(dstSt.st_mode))
|
||||
|
@ -124,7 +126,9 @@ static FileProp postponed = FileProp{};
|
|||
static Path out;
|
||||
|
||||
static void addPkg(const Path& pkgDir, int priority) {
|
||||
if (done.count(pkgDir)) return;
|
||||
if (done.count(pkgDir)) {
|
||||
return;
|
||||
}
|
||||
done.insert(pkgDir);
|
||||
createLinks(pkgDir, out, priority);
|
||||
|
||||
|
@ -132,9 +136,13 @@ static void addPkg(const Path& pkgDir, int priority) {
|
|||
for (const auto& p : tokenizeString<std::vector<string>>(
|
||||
readFile(pkgDir + "/nix-support/propagated-user-env-packages"),
|
||||
" \n"))
|
||||
if (!done.count(p)) postponed.insert(p);
|
||||
if (!done.count(p)) {
|
||||
postponed.insert(p);
|
||||
}
|
||||
} catch (SysError& e) {
|
||||
if (e.errNo != ENOENT && e.errNo != ENOTDIR) throw;
|
||||
if (e.errNo != ENOENT && e.errNo != ENOTDIR) {
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -151,7 +159,9 @@ typedef std::vector<Package> Packages;
|
|||
void builtinBuildenv(const BasicDerivation& drv) {
|
||||
auto getAttr = [&](const string& name) {
|
||||
auto i = drv.env.find(name);
|
||||
if (i == drv.env.end()) throw Error("attribute '%s' missing", name);
|
||||
if (i == drv.env.end()) {
|
||||
throw Error("attribute '%s' missing", name);
|
||||
}
|
||||
return i->second;
|
||||
};
|
||||
|
||||
|
@ -187,7 +197,9 @@ void builtinBuildenv(const BasicDerivation& drv) {
|
|||
(a.priority == b.priority && a.path < b.path);
|
||||
});
|
||||
for (const auto& pkg : pkgs)
|
||||
if (pkg.active) addPkg(pkg.path, pkg.priority);
|
||||
if (pkg.active) {
|
||||
addPkg(pkg.path, pkg.priority);
|
||||
}
|
||||
|
||||
/* Symlink to the packages that have been "propagated" by packages
|
||||
* installed by the user (i.e., package X declares that it wants Y
|
||||
|
|
|
@ -61,7 +61,9 @@ void builtinFetchurl(const BasicDerivation& drv, const std::string& netrcData) {
|
|||
/* Try the hashed mirrors first. */
|
||||
if (getAttr("outputHashMode") == "flat")
|
||||
for (auto hashedMirror : settings.hashedMirrors.get()) try {
|
||||
if (!hasSuffix(hashedMirror, "/")) hashedMirror += '/';
|
||||
if (!hasSuffix(hashedMirror, "/")) {
|
||||
hashedMirror += '/';
|
||||
}
|
||||
auto ht = parseHashType(getAttr("outputHashAlgo"));
|
||||
auto h = Hash(getAttr("outputHash"), ht);
|
||||
fetch(hashedMirror + printHashType(h.type) + "/" +
|
||||
|
|
16
third_party/nix/src/libstore/crypto.cc
vendored
16
third_party/nix/src/libstore/crypto.cc
vendored
|
@ -11,7 +11,9 @@ namespace nix {
|
|||
|
||||
static std::pair<std::string, std::string> split(const string& s) {
|
||||
size_t colon = s.find(':');
|
||||
if (colon == std::string::npos || colon == 0) return {"", ""};
|
||||
if (colon == std::string::npos || colon == 0) {
|
||||
return {"", ""};
|
||||
}
|
||||
return {std::string(s, 0, colon), std::string(s, colon + 1)};
|
||||
}
|
||||
|
||||
|
@ -21,7 +23,9 @@ Key::Key(const string& s) {
|
|||
name = ss.first;
|
||||
key = ss.second;
|
||||
|
||||
if (name == "" || key == "") throw Error("secret key is corrupt");
|
||||
if (name == "" || key == "") {
|
||||
throw Error("secret key is corrupt");
|
||||
}
|
||||
|
||||
key = base64Decode(key);
|
||||
}
|
||||
|
@ -76,10 +80,14 @@ bool verifyDetached(const std::string& data, const std::string& sig,
|
|||
auto ss = split(sig);
|
||||
|
||||
auto key = publicKeys.find(ss.first);
|
||||
if (key == publicKeys.end()) return false;
|
||||
if (key == publicKeys.end()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
auto sig2 = base64Decode(ss.second);
|
||||
if (sig2.size() != crypto_sign_BYTES) throw Error("signature is not valid");
|
||||
if (sig2.size() != crypto_sign_BYTES) {
|
||||
throw Error("signature is not valid");
|
||||
}
|
||||
|
||||
return crypto_sign_verify_detached(
|
||||
(unsigned char*)sig2.data(), (unsigned char*)data.data(),
|
||||
|
|
44
third_party/nix/src/libstore/download.cc
vendored
44
third_party/nix/src/libstore/download.cc
vendored
|
@ -232,7 +232,9 @@ struct CurlDownloader : public Downloader {
|
|||
|
||||
size_t readOffset = 0;
|
||||
size_t readCallback(char* buffer, size_t size, size_t nitems) {
|
||||
if (readOffset == request.data->length()) return 0;
|
||||
if (readOffset == request.data->length()) {
|
||||
return 0;
|
||||
}
|
||||
auto count = std::min(size * nitems, request.data->length() - readOffset);
|
||||
assert(count);
|
||||
memcpy(buffer, request.data->data() + readOffset, count);
|
||||
|
@ -291,7 +293,9 @@ struct CurlDownloader : public Downloader {
|
|||
|
||||
curl_easy_setopt(req, CURLOPT_HTTPHEADER, requestHeaders);
|
||||
|
||||
if (request.head) curl_easy_setopt(req, CURLOPT_NOBODY, 1);
|
||||
if (request.head) {
|
||||
curl_easy_setopt(req, CURLOPT_NOBODY, 1);
|
||||
}
|
||||
|
||||
if (request.data) {
|
||||
curl_easy_setopt(req, CURLOPT_UPLOAD, 1L);
|
||||
|
@ -336,7 +340,9 @@ struct CurlDownloader : public Downloader {
|
|||
|
||||
char* effectiveUriCStr;
|
||||
curl_easy_getinfo(req, CURLINFO_EFFECTIVE_URL, &effectiveUriCStr);
|
||||
if (effectiveUriCStr) result.effectiveUri = effectiveUriCStr;
|
||||
if (effectiveUriCStr) {
|
||||
result.effectiveUri = effectiveUriCStr;
|
||||
}
|
||||
|
||||
DLOG(INFO) << "finished " << request.verb() << " of " << request.uri
|
||||
<< "; curl status = " << code
|
||||
|
@ -664,7 +670,9 @@ struct CurlDownloader : public Downloader {
|
|||
auto [path, params] = splitUriAndParams(uri);
|
||||
|
||||
auto slash = path.find('/', 5); // 5 is the length of "s3://" prefix
|
||||
if (slash == std::string::npos) throw nix::Error("bad S3 URI '%s'", path);
|
||||
if (slash == std::string::npos) {
|
||||
throw nix::Error("bad S3 URI '%s'", path);
|
||||
}
|
||||
|
||||
std::string bucketName(path, 5, slash - 5);
|
||||
std::string key(path, slash + 1);
|
||||
|
@ -766,7 +774,9 @@ void Downloader::download(DownloadRequest&& request, Sink& sink) {
|
|||
request.dataCallback = [_state](char* buf, size_t len) {
|
||||
auto state(_state->lock());
|
||||
|
||||
if (state->quit) return;
|
||||
if (state->quit) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* If the buffer is full, then go to sleep until the calling
|
||||
thread wakes us up (i.e. when it has removed data from the
|
||||
|
@ -808,7 +818,9 @@ void Downloader::download(DownloadRequest&& request, Sink& sink) {
|
|||
|
||||
while (state->data.empty()) {
|
||||
if (state->quit) {
|
||||
if (state->exc) std::rethrow_exception(state->exc);
|
||||
if (state->exc) {
|
||||
std::rethrow_exception(state->exc);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -835,7 +847,9 @@ CachedDownloadResult Downloader::downloadCached(
|
|||
auto name = request.name;
|
||||
if (name == "") {
|
||||
auto p = url.rfind('/');
|
||||
if (p != string::npos) name = string(url, p + 1);
|
||||
if (p != string::npos) {
|
||||
name = string(url, p + 1);
|
||||
}
|
||||
}
|
||||
|
||||
Path expectedStorePath;
|
||||
|
@ -919,7 +933,9 @@ CachedDownloadResult Downloader::downloadCached(
|
|||
writeFile(dataFile,
|
||||
url + "\n" + res.etag + "\n" + std::to_string(time(0)) + "\n");
|
||||
} catch (DownloadError& e) {
|
||||
if (storePath.empty()) throw;
|
||||
if (storePath.empty()) {
|
||||
throw;
|
||||
}
|
||||
LOG(WARNING) << e.msg() << "; using cached result";
|
||||
result.etag = expectedETag;
|
||||
}
|
||||
|
@ -933,7 +949,9 @@ CachedDownloadResult Downloader::downloadCached(
|
|||
if (pathExists(unpackedLink)) {
|
||||
unpackedStorePath = readLink(unpackedLink);
|
||||
store->addTempRoot(unpackedStorePath);
|
||||
if (!store->isValidPath(unpackedStorePath)) unpackedStorePath = "";
|
||||
if (!store->isValidPath(unpackedStorePath)) {
|
||||
unpackedStorePath = "";
|
||||
}
|
||||
}
|
||||
if (unpackedStorePath.empty()) {
|
||||
LOG(INFO) << "unpacking '" << url << "' ...";
|
||||
|
@ -970,9 +988,13 @@ CachedDownloadResult Downloader::downloadCached(
|
|||
}
|
||||
|
||||
bool isUri(const string& s) {
|
||||
if (s.compare(0, 8, "channel:") == 0) return true;
|
||||
if (s.compare(0, 8, "channel:") == 0) {
|
||||
return true;
|
||||
}
|
||||
size_t pos = s.find("://");
|
||||
if (pos == string::npos) return false;
|
||||
if (pos == string::npos) {
|
||||
return false;
|
||||
}
|
||||
string scheme(s, 0, pos);
|
||||
return scheme == "http" || scheme == "https" || scheme == "file" ||
|
||||
scheme == "channel" || scheme == "git" || scheme == "s3" ||
|
||||
|
|
12
third_party/nix/src/libstore/export-import.cc
vendored
12
third_party/nix/src/libstore/export-import.cc
vendored
|
@ -59,7 +59,9 @@ Paths Store::importPaths(Source& source, std::shared_ptr<FSAccessor> accessor,
|
|||
Paths res;
|
||||
while (true) {
|
||||
auto n = readNum<uint64_t>(source);
|
||||
if (n == 0) break;
|
||||
if (n == 0) {
|
||||
break;
|
||||
}
|
||||
if (n != 1)
|
||||
throw Error(
|
||||
"input doesn't look like something created by 'nix-store --export'");
|
||||
|
@ -82,13 +84,17 @@ Paths Store::importPaths(Source& source, std::shared_ptr<FSAccessor> accessor,
|
|||
info.references = readStorePaths<PathSet>(*this, source);
|
||||
|
||||
info.deriver = readString(source);
|
||||
if (info.deriver != "") assertStorePath(info.deriver);
|
||||
if (info.deriver != "") {
|
||||
assertStorePath(info.deriver);
|
||||
}
|
||||
|
||||
info.narHash = hashString(htSHA256, *tee.source.data);
|
||||
info.narSize = tee.source.data->size();
|
||||
|
||||
// Ignore optional legacy signature.
|
||||
if (readInt(source) == 1) readString(source);
|
||||
if (readInt(source) == 1) {
|
||||
readString(source);
|
||||
}
|
||||
|
||||
addToStore(info, tee.source.data, NoRepair, checkSigs, accessor);
|
||||
|
||||
|
|
104
third_party/nix/src/libstore/gc.cc
vendored
104
third_party/nix/src/libstore/gc.cc
vendored
|
@ -161,7 +161,9 @@ void LocalStore::addTempRoot(const Path& path) {
|
|||
struct stat st;
|
||||
if (fstat(state->fdTempRoots.get(), &st) == -1)
|
||||
throw SysError(format("statting '%1%'") % fnTempRoots);
|
||||
if (st.st_size == 0) break;
|
||||
if (st.st_size == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* The garbage collector deleted this file before we could
|
||||
get a lock. (It won't delete the file after we get a
|
||||
|
@ -196,13 +198,15 @@ void LocalStore::findTempRoots(FDs& fds, Roots& tempRoots, bool censor) {
|
|||
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;
|
||||
if (errno == ENOENT) {
|
||||
continue;
|
||||
}
|
||||
throw SysError(format("opening temporary roots file '%1%'") % path);
|
||||
}
|
||||
|
||||
/* This should work, but doesn't, for some reason. */
|
||||
// FDPtr fd(new AutoCloseFD(openLockFile(path, false)));
|
||||
// if (*fd == -1) continue;
|
||||
// if (*fd == -1) { continue; }
|
||||
|
||||
/* Try to acquire a write lock without blocking. This can
|
||||
only succeed if the owning process has died. In that case
|
||||
|
@ -249,7 +253,9 @@ void LocalStore::findRoots(const Path& path, unsigned char type, Roots& roots) {
|
|||
};
|
||||
|
||||
try {
|
||||
if (type == DT_UNKNOWN) type = getFileType(path);
|
||||
if (type == DT_UNKNOWN) {
|
||||
type = getFileType(path);
|
||||
}
|
||||
|
||||
if (type == DT_DIR) {
|
||||
for (auto& i : readDirectory(path))
|
||||
|
@ -258,7 +264,9 @@ void LocalStore::findRoots(const Path& path, unsigned char type, Roots& roots) {
|
|||
|
||||
else if (type == DT_LNK) {
|
||||
Path target = readLink(path);
|
||||
if (isInStore(target)) foundRoot(path, target);
|
||||
if (isInStore(target)) {
|
||||
foundRoot(path, target);
|
||||
}
|
||||
|
||||
/* Handle indirect roots. */
|
||||
else {
|
||||
|
@ -271,9 +279,13 @@ void LocalStore::findRoots(const Path& path, unsigned char type, Roots& roots) {
|
|||
}
|
||||
} else {
|
||||
struct stat st2 = lstat(target);
|
||||
if (!S_ISLNK(st2.st_mode)) return;
|
||||
if (!S_ISLNK(st2.st_mode)) {
|
||||
return;
|
||||
}
|
||||
Path target2 = readLink(target);
|
||||
if (isInStore(target2)) foundRoot(target, target2);
|
||||
if (isInStore(target2)) {
|
||||
foundRoot(target, target2);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -376,7 +388,9 @@ void LocalStore::findRuntimeRoots(Roots& roots, bool censor) {
|
|||
auto fdStr = fmt("/proc/%s/fd", ent->d_name);
|
||||
auto fdDir = AutoCloseDir(opendir(fdStr.c_str()));
|
||||
if (!fdDir) {
|
||||
if (errno == ENOENT || errno == EACCES) continue;
|
||||
if (errno == ENOENT || errno == EACCES) {
|
||||
continue;
|
||||
}
|
||||
throw SysError(format("opening %1%") % fdStr);
|
||||
}
|
||||
struct dirent* fd_ent;
|
||||
|
@ -385,7 +399,9 @@ void LocalStore::findRuntimeRoots(Roots& roots, bool censor) {
|
|||
readProcLink(fmt("%s/%s", fdStr, fd_ent->d_name), unchecked);
|
||||
}
|
||||
if (errno) {
|
||||
if (errno == ESRCH) continue;
|
||||
if (errno == ESRCH) {
|
||||
continue;
|
||||
}
|
||||
throw SysError(format("iterating /proc/%1%/fd") % ent->d_name);
|
||||
}
|
||||
fdDir.reset();
|
||||
|
@ -408,12 +424,16 @@ void LocalStore::findRuntimeRoots(Roots& roots, bool censor) {
|
|||
i != env_end; ++i)
|
||||
unchecked[i->str()].emplace(envFile);
|
||||
} catch (SysError& e) {
|
||||
if (errno == ENOENT || errno == EACCES || errno == ESRCH) continue;
|
||||
if (errno == ENOENT || errno == EACCES || errno == ESRCH) {
|
||||
continue;
|
||||
}
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (errno) throw SysError("iterating /proc");
|
||||
if (errno) {
|
||||
throw SysError("iterating /proc");
|
||||
}
|
||||
}
|
||||
|
||||
#if !defined(__linux__)
|
||||
|
@ -495,7 +515,9 @@ void LocalStore::deletePathRecursive(GCState& state, const Path& path) {
|
|||
PathSet referrers;
|
||||
queryReferrers(path, referrers);
|
||||
for (auto& i : referrers)
|
||||
if (i != path) deletePathRecursive(state, i);
|
||||
if (i != path) {
|
||||
deletePathRecursive(state, i);
|
||||
}
|
||||
size = queryPathInfo(path)->narSize;
|
||||
invalidatePathChecked(path);
|
||||
}
|
||||
|
@ -504,7 +526,9 @@ void LocalStore::deletePathRecursive(GCState& state, const Path& path) {
|
|||
|
||||
struct stat st;
|
||||
if (lstat(realPath.c_str(), &st)) {
|
||||
if (errno == ENOENT) return;
|
||||
if (errno == ENOENT) {
|
||||
return;
|
||||
}
|
||||
throw SysError(format("getting status of %1%") % realPath);
|
||||
}
|
||||
|
||||
|
@ -549,11 +573,17 @@ void LocalStore::deletePathRecursive(GCState& state, const Path& path) {
|
|||
|
||||
bool LocalStore::canReachRoot(GCState& state, PathSet& visited,
|
||||
const Path& path) {
|
||||
if (visited.count(path)) return false;
|
||||
if (visited.count(path)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (state.alive.count(path)) return true;
|
||||
if (state.alive.count(path)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (state.dead.count(path)) return false;
|
||||
if (state.dead.count(path)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (state.roots.count(path)) {
|
||||
DLOG(INFO) << "cannot delete '" << path << "' because it's a root";
|
||||
|
@ -563,7 +593,9 @@ bool LocalStore::canReachRoot(GCState& state, PathSet& visited,
|
|||
|
||||
visited.insert(path);
|
||||
|
||||
if (!isStorePath(path) || !isValidPath(path)) return false;
|
||||
if (!isStorePath(path) || !isValidPath(path)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
PathSet incoming;
|
||||
|
||||
|
@ -600,7 +632,9 @@ void LocalStore::tryToDelete(GCState& state, const Path& path) {
|
|||
checkInterrupt();
|
||||
|
||||
auto realPath = realStoreDir + "/" + baseNameOf(path);
|
||||
if (realPath == linksDir || realPath == trashDir) return;
|
||||
if (realPath == linksDir || realPath == trashDir) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Activity act(*logger, lvlDebug, format("considering whether to delete
|
||||
// '%1%'") % path);
|
||||
|
@ -608,16 +642,22 @@ void LocalStore::tryToDelete(GCState& state, const Path& path) {
|
|||
if (!isStorePath(path) || !isValidPath(path)) {
|
||||
/* A lock file belonging to a path that we're building right
|
||||
now isn't garbage. */
|
||||
if (isActiveTempFile(state, path, ".lock")) return;
|
||||
if (isActiveTempFile(state, path, ".lock")) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Don't delete .chroot directories for derivations that are
|
||||
currently being built. */
|
||||
if (isActiveTempFile(state, path, ".chroot")) return;
|
||||
if (isActiveTempFile(state, path, ".chroot")) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Don't delete .check directories for derivations that are
|
||||
currently being built, because we may need to run
|
||||
diff-hook. */
|
||||
if (isActiveTempFile(state, path, ".check")) return;
|
||||
if (isActiveTempFile(state, path, ".check")) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
PathSet visited;
|
||||
|
@ -653,7 +693,9 @@ void LocalStore::removeUnusedLinks(const GCState& state) {
|
|||
while (errno = 0, dirent = readdir(dir.get())) {
|
||||
checkInterrupt();
|
||||
string name = dirent->d_name;
|
||||
if (name == "." || name == "..") continue;
|
||||
if (name == "." || name == "..") {
|
||||
continue;
|
||||
}
|
||||
Path path = linksDir + "/" + name;
|
||||
|
||||
struct stat st;
|
||||
|
@ -789,7 +831,9 @@ void LocalStore::collectGarbage(const GCOptions& options, GCResults& results) {
|
|||
while (errno = 0, dirent = readdir(dir.get())) {
|
||||
checkInterrupt();
|
||||
string name = dirent->d_name;
|
||||
if (name == "." || name == "..") continue;
|
||||
if (name == "." || name == "..") {
|
||||
continue;
|
||||
}
|
||||
Path path = storeDir + "/" + name;
|
||||
if (isStorePath(path) && isValidPath(path))
|
||||
entries.push_back(path);
|
||||
|
@ -840,7 +884,7 @@ void LocalStore::collectGarbage(const GCOptions& options, GCResults& results) {
|
|||
}
|
||||
|
||||
/* While we're at it, vacuum the database. */
|
||||
// if (options.action == GCOptions::gcDeleteDead) vacuumDB();
|
||||
// if (options.action == GCOptions::gcDeleteDead) { vacuumDB(); }
|
||||
}
|
||||
|
||||
void LocalStore::autoGC(bool sync) {
|
||||
|
@ -879,9 +923,13 @@ void LocalStore::autoGC(bool sync) {
|
|||
|
||||
state->lastGCCheck = now;
|
||||
|
||||
if (avail >= settings.minFree || avail >= settings.maxFree) return;
|
||||
if (avail >= settings.minFree || avail >= settings.maxFree) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (avail > state->availAfterGC * 0.97) return;
|
||||
if (avail > state->availAfterGC * 0.97) {
|
||||
return;
|
||||
}
|
||||
|
||||
state->gcRunning = true;
|
||||
|
||||
|
@ -919,7 +967,9 @@ void LocalStore::autoGC(bool sync) {
|
|||
|
||||
sync:
|
||||
// Wait for the future outside of the state lock.
|
||||
if (sync) future.get();
|
||||
if (sync) {
|
||||
future.get();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace nix
|
||||
|
|
8
third_party/nix/src/libstore/globals.cc
vendored
8
third_party/nix/src/libstore/globals.cc
vendored
|
@ -98,7 +98,9 @@ StringSet Settings::getDefaultSystemFeatures() {
|
|||
StringSet features{"nixos-test", "benchmark", "big-parallel"};
|
||||
|
||||
#if __linux__
|
||||
if (access("/dev/kvm", R_OK | W_OK) == 0) features.insert("kvm");
|
||||
if (access("/dev/kvm", R_OK | W_OK) == 0) {
|
||||
features.insert("kvm");
|
||||
}
|
||||
#endif
|
||||
|
||||
return features;
|
||||
|
@ -171,7 +173,9 @@ void initPlugins() {
|
|||
for (const auto& ent : ents)
|
||||
pluginFiles.emplace_back(pluginFile + "/" + ent.name);
|
||||
} catch (SysError& e) {
|
||||
if (e.errNo != ENOTDIR) throw;
|
||||
if (e.errNo != ENOTDIR) {
|
||||
throw;
|
||||
}
|
||||
pluginFiles.emplace_back(pluginFile);
|
||||
}
|
||||
for (const auto& file : pluginFiles) {
|
||||
|
|
|
@ -23,7 +23,9 @@ class HttpBinaryCacheStore : public BinaryCacheStore {
|
|||
public:
|
||||
HttpBinaryCacheStore(const Params& params, const Path& _cacheUri)
|
||||
: BinaryCacheStore(params), cacheUri(_cacheUri) {
|
||||
if (cacheUri.back() == '/') cacheUri.pop_back();
|
||||
if (cacheUri.back() == '/') {
|
||||
cacheUri.pop_back();
|
||||
}
|
||||
|
||||
diskCache = getNarInfoDiskCache();
|
||||
}
|
||||
|
@ -57,7 +59,9 @@ class HttpBinaryCacheStore : public BinaryCacheStore {
|
|||
|
||||
void checkEnabled() {
|
||||
auto state(_state.lock());
|
||||
if (state->enabled) return;
|
||||
if (state->enabled) {
|
||||
return;
|
||||
}
|
||||
if (std::chrono::steady_clock::now() > state->disabledUntil) {
|
||||
state->enabled = true;
|
||||
DLOG(INFO) << "re-enabling binary cache '" << getUri() << "'";
|
||||
|
|
|
@ -99,7 +99,9 @@ struct LegacySSHStore : public Store {
|
|||
|
||||
auto info = std::make_shared<ValidPathInfo>();
|
||||
conn->from >> info->path;
|
||||
if (info->path.empty()) return callback(nullptr);
|
||||
if (info->path.empty()) {
|
||||
return callback(nullptr);
|
||||
}
|
||||
assert(path == info->path);
|
||||
|
||||
PathSet references;
|
||||
|
@ -253,7 +255,9 @@ struct LegacySSHStore : public Store {
|
|||
static RegisterStoreImplementation regStore(
|
||||
[](const std::string& uri,
|
||||
const Store::Params& params) -> std::shared_ptr<Store> {
|
||||
if (std::string(uri, 0, uriScheme.size()) != uriScheme) return 0;
|
||||
if (std::string(uri, 0, uriScheme.size()) != uriScheme) {
|
||||
return 0;
|
||||
}
|
||||
return std::make_shared<LegacySSHStore>(
|
||||
std::string(uri, uriScheme.size()), params);
|
||||
});
|
||||
|
|
|
@ -68,7 +68,9 @@ ref<FSAccessor> LocalFSStore::getFSAccessor() {
|
|||
}
|
||||
|
||||
void LocalFSStore::narFromPath(const Path& path, Sink& sink) {
|
||||
if (!isValidPath(path)) throw Error(format("path '%s' is not valid") % path);
|
||||
if (!isValidPath(path)) {
|
||||
throw Error(format("path '%s' is not valid") % path);
|
||||
}
|
||||
dumpPath(getRealStoreDir() + std::string(path, storeDir.size()), sink);
|
||||
}
|
||||
|
||||
|
@ -85,7 +87,9 @@ std::shared_ptr<std::string> LocalFSStore::getBuildLog(const Path& path_) {
|
|||
} catch (InvalidPath&) {
|
||||
return nullptr;
|
||||
}
|
||||
if (path == "") return nullptr;
|
||||
if (path == "") {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
string baseName = baseNameOf(path);
|
||||
|
|
108
third_party/nix/src/libstore/local-store.cc
vendored
108
third_party/nix/src/libstore/local-store.cc
vendored
|
@ -268,7 +268,9 @@ LocalStore::~LocalStore() {
|
|||
|
||||
{
|
||||
auto state(_state.lock());
|
||||
if (state->gcRunning) future = state->gcFuture;
|
||||
if (state->gcRunning) {
|
||||
future = state->gcFuture;
|
||||
}
|
||||
}
|
||||
|
||||
if (future.valid()) {
|
||||
|
@ -375,7 +377,9 @@ void LocalStore::openDB(State& state, bool create) {
|
|||
bind mount. So make the Nix store writable for this process. */
|
||||
void LocalStore::makeStoreWritable() {
|
||||
#if __linux__
|
||||
if (getuid() != 0) return;
|
||||
if (getuid() != 0) {
|
||||
return;
|
||||
}
|
||||
/* Check if /nix/store is on a read-only mount. */
|
||||
struct statvfs stat;
|
||||
if (statvfs(realStoreDir.c_str(), &stat) != 0)
|
||||
|
@ -469,7 +473,9 @@ static void canonicalisePathMetaData_(const Path& path, uid_t fromUid,
|
|||
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 (eaName == "security.selinux") {
|
||||
continue;
|
||||
}
|
||||
if (lremovexattr(path.c_str(), eaName.c_str()) == -1)
|
||||
throw SysError("removing extended attribute '%s' from '%s'", eaName,
|
||||
path);
|
||||
|
@ -654,7 +660,9 @@ void LocalStore::queryPathInfoUncached(
|
|||
/* Get the path info. */
|
||||
auto useQueryPathInfo(state->stmtQueryPathInfo.use()(path));
|
||||
|
||||
if (!useQueryPathInfo.next()) return std::shared_ptr<ValidPathInfo>();
|
||||
if (!useQueryPathInfo.next()) {
|
||||
return std::shared_ptr<ValidPathInfo>();
|
||||
}
|
||||
|
||||
info->id = useQueryPathInfo.getInt(0);
|
||||
|
||||
|
@ -667,7 +675,9 @@ void LocalStore::queryPathInfoUncached(
|
|||
info->registrationTime = useQueryPathInfo.getInt(2);
|
||||
|
||||
auto s = (const char*)sqlite3_column_text(state->stmtQueryPathInfo, 3);
|
||||
if (s) info->deriver = s;
|
||||
if (s) {
|
||||
info->deriver = s;
|
||||
}
|
||||
|
||||
/* Note that narSize = NULL yields 0. */
|
||||
info->narSize = useQueryPathInfo.getInt(4);
|
||||
|
@ -675,10 +685,14 @@ void LocalStore::queryPathInfoUncached(
|
|||
info->ultimate = useQueryPathInfo.getInt(5) == 1;
|
||||
|
||||
s = (const char*)sqlite3_column_text(state->stmtQueryPathInfo, 6);
|
||||
if (s) info->sigs = tokenizeString<StringSet>(s, " ");
|
||||
if (s) {
|
||||
info->sigs = tokenizeString<StringSet>(s, " ");
|
||||
}
|
||||
|
||||
s = (const char*)sqlite3_column_text(state->stmtQueryPathInfo, 7);
|
||||
if (s) info->ca = s;
|
||||
if (s) {
|
||||
info->ca = s;
|
||||
}
|
||||
|
||||
/* Get the references. */
|
||||
auto useQueryReferences(state->stmtQueryReferences.use()(info->id));
|
||||
|
@ -706,7 +720,9 @@ void LocalStore::updatePathInfo(State& state, const ValidPathInfo& info) {
|
|||
|
||||
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);
|
||||
if (!use.next()) {
|
||||
throw Error(format("path '%1%' is not valid") % path);
|
||||
}
|
||||
return use.getInt(0);
|
||||
}
|
||||
|
||||
|
@ -725,7 +741,9 @@ PathSet LocalStore::queryValidPaths(const PathSet& paths,
|
|||
SubstituteFlag maybeSubstitute) {
|
||||
PathSet res;
|
||||
for (auto& i : paths)
|
||||
if (isValidPath(i)) res.insert(i);
|
||||
if (isValidPath(i)) {
|
||||
res.insert(i);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -802,7 +820,9 @@ StringSet LocalStore::queryDerivationOutputNames(const Path& path) {
|
|||
}
|
||||
|
||||
Path LocalStore::queryPathFromHashPart(const string& hashPart) {
|
||||
if (hashPart.size() != storePathHashLen) throw Error("invalid hash part");
|
||||
if (hashPart.size() != storePathHashLen) {
|
||||
throw Error("invalid hash part");
|
||||
}
|
||||
|
||||
Path prefix = storeDir + "/" + hashPart;
|
||||
|
||||
|
@ -812,7 +832,9 @@ Path LocalStore::queryPathFromHashPart(const string& hashPart) {
|
|||
auto useQueryPathFromHashPart(
|
||||
state->stmtQueryPathFromHashPart.use()(prefix));
|
||||
|
||||
if (!useQueryPathFromHashPart.next()) return "";
|
||||
if (!useQueryPathFromHashPart.next()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
const char* s =
|
||||
(const char*)sqlite3_column_text(state->stmtQueryPathFromHashPart, 0);
|
||||
|
@ -822,15 +844,23 @@ Path LocalStore::queryPathFromHashPart(const string& hashPart) {
|
|||
}
|
||||
|
||||
PathSet LocalStore::querySubstitutablePaths(const PathSet& paths) {
|
||||
if (!settings.useSubstitutes) return PathSet();
|
||||
if (!settings.useSubstitutes) {
|
||||
return PathSet();
|
||||
}
|
||||
|
||||
auto remaining = paths;
|
||||
PathSet res;
|
||||
|
||||
for (auto& sub : getDefaultSubstituters()) {
|
||||
if (remaining.empty()) break;
|
||||
if (sub->storeDir != storeDir) continue;
|
||||
if (!sub->wantMassQuery()) continue;
|
||||
if (remaining.empty()) {
|
||||
break;
|
||||
}
|
||||
if (sub->storeDir != storeDir) {
|
||||
continue;
|
||||
}
|
||||
if (!sub->wantMassQuery()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto valid = sub->queryValidPaths(remaining);
|
||||
|
||||
|
@ -849,11 +879,17 @@ PathSet LocalStore::querySubstitutablePaths(const PathSet& paths) {
|
|||
|
||||
void LocalStore::querySubstitutablePathInfos(const PathSet& paths,
|
||||
SubstitutablePathInfos& infos) {
|
||||
if (!settings.useSubstitutes) return;
|
||||
if (!settings.useSubstitutes) {
|
||||
return;
|
||||
}
|
||||
for (auto& sub : getDefaultSubstituters()) {
|
||||
if (sub->storeDir != storeDir) continue;
|
||||
if (sub->storeDir != storeDir) {
|
||||
continue;
|
||||
}
|
||||
for (auto& path : paths) {
|
||||
if (infos.count(path)) continue;
|
||||
if (infos.count(path)) {
|
||||
continue;
|
||||
}
|
||||
DLOG(INFO) << "checking substituter '" << sub->getUri() << "' for path '"
|
||||
<< path << "'";
|
||||
try {
|
||||
|
@ -887,7 +923,9 @@ void LocalStore::registerValidPaths(const ValidPathInfos& infos) {
|
|||
be fsync-ed. So some may want to fsync them before registering
|
||||
the validity, at the expense of some speed of the path
|
||||
registering operation. */
|
||||
if (settings.syncBeforeRegistering) sync();
|
||||
if (settings.syncBeforeRegistering) {
|
||||
sync();
|
||||
}
|
||||
|
||||
return retrySQLite<void>([&]() {
|
||||
auto state(_state.lock());
|
||||
|
@ -979,7 +1017,9 @@ void LocalStore::addToStore(const ValidPathInfo& info, Source& source,
|
|||
/* Lock the output path. But don't lock if we're being called
|
||||
from a build hook (whose parent process already acquired a
|
||||
lock on this path). */
|
||||
if (!locksHeld.count(info.path)) outputLock.lockPaths({realPath});
|
||||
if (!locksHeld.count(info.path)) {
|
||||
outputLock.lockPaths({realPath});
|
||||
}
|
||||
|
||||
if (repair || !isValidPath(info.path)) {
|
||||
deletePath(realPath);
|
||||
|
@ -1289,7 +1329,9 @@ void LocalStore::verifyPath(const Path& path, const PathSet& store,
|
|||
for (auto& i : referrers)
|
||||
if (i != path) {
|
||||
verifyPath(i, store, done, validPaths, repair, errors);
|
||||
if (validPaths.find(i) != validPaths.end()) canInvalidate = false;
|
||||
if (validPaths.find(i) != validPaths.end()) {
|
||||
canInvalidate = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (canInvalidate) {
|
||||
|
@ -1328,7 +1370,9 @@ static void makeMutable(const Path& path) {
|
|||
|
||||
struct stat st = lstat(path);
|
||||
|
||||
if (!S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode)) return;
|
||||
if (!S_ISDIR(st.st_mode) && !S_ISREG(st.st_mode)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
for (auto& i : readDirectory(path)) makeMutable(path + "/" + i.name);
|
||||
|
@ -1339,7 +1383,9 @@ static void makeMutable(const Path& path) {
|
|||
security hole). */
|
||||
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_NOFOLLOW | O_CLOEXEC);
|
||||
if (fd == -1) {
|
||||
if (errno == ELOOP) return; // it's a symlink
|
||||
if (errno == ELOOP) {
|
||||
return;
|
||||
} // it's a symlink
|
||||
throw SysError(format("opening file '%1%'") % path);
|
||||
}
|
||||
|
||||
|
@ -1347,16 +1393,24 @@ static void makeMutable(const Path& path) {
|
|||
|
||||
/* Silently ignore errors getting/setting the immutable flag so
|
||||
that we work correctly on filesystems that don't support it. */
|
||||
if (ioctl(fd, FS_IOC_GETFLAGS, &flags)) return;
|
||||
if (ioctl(fd, FS_IOC_GETFLAGS, &flags)) {
|
||||
return;
|
||||
}
|
||||
old = flags;
|
||||
flags &= ~FS_IMMUTABLE_FL;
|
||||
if (old == flags) return;
|
||||
if (ioctl(fd, FS_IOC_SETFLAGS, &flags)) return;
|
||||
if (old == flags) {
|
||||
return;
|
||||
}
|
||||
if (ioctl(fd, FS_IOC_SETFLAGS, &flags)) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* Upgrade from schema 6 (Nix 0.15) to schema 7 (Nix >= 1.3). */
|
||||
void LocalStore::upgradeStore7() {
|
||||
if (getuid() != 0) return;
|
||||
if (getuid() != 0) {
|
||||
return;
|
||||
}
|
||||
printError(
|
||||
"removing immutable bits from the Nix store (this may take a while)...");
|
||||
makeMutable(realStoreDir);
|
||||
|
|
4
third_party/nix/src/libstore/machines.cc
vendored
4
third_party/nix/src/libstore/machines.cc
vendored
|
@ -50,7 +50,9 @@ void parseMachines(const std::string& s, Machines& machines) {
|
|||
for (auto line : tokenizeString<std::vector<string>>(s, "\n;")) {
|
||||
trim(line);
|
||||
line.erase(std::find(line.begin(), line.end(), '#'), line.end());
|
||||
if (line.empty()) continue;
|
||||
if (line.empty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (line[0] == '@') {
|
||||
auto file = trim(std::string(line, 1));
|
||||
|
|
64
third_party/nix/src/libstore/misc.cc
vendored
64
third_party/nix/src/libstore/misc.cc
vendored
|
@ -27,8 +27,12 @@ void Store::computeFSClosure(const PathSet& startPaths, PathSet& paths_,
|
|||
enqueue = [&](const Path& path) -> void {
|
||||
{
|
||||
auto state(state_.lock());
|
||||
if (state->exc) return;
|
||||
if (state->paths.count(path)) return;
|
||||
if (state->exc) {
|
||||
return;
|
||||
}
|
||||
if (state->paths.count(path)) {
|
||||
return;
|
||||
}
|
||||
state->paths.insert(path);
|
||||
state->pending++;
|
||||
}
|
||||
|
@ -44,7 +48,9 @@ void Store::computeFSClosure(const PathSet& startPaths, PathSet& paths_,
|
|||
PathSet referrers;
|
||||
queryReferrers(path, referrers);
|
||||
for (auto& ref : referrers)
|
||||
if (ref != path) enqueue(ref);
|
||||
if (ref != path) {
|
||||
enqueue(ref);
|
||||
}
|
||||
|
||||
if (includeOutputs)
|
||||
for (auto& i : queryValidDerivers(path)) enqueue(i);
|
||||
|
@ -56,11 +62,15 @@ void Store::computeFSClosure(const PathSet& startPaths, PathSet& paths_,
|
|||
|
||||
} else {
|
||||
for (auto& ref : info->references)
|
||||
if (ref != path) enqueue(ref);
|
||||
if (ref != path) {
|
||||
enqueue(ref);
|
||||
}
|
||||
|
||||
if (includeOutputs && isDerivation(path))
|
||||
for (auto& i : queryDerivationOutputs(path))
|
||||
if (isValidPath(i)) enqueue(i);
|
||||
if (isValidPath(i)) {
|
||||
enqueue(i);
|
||||
}
|
||||
|
||||
if (includeDerivers && isValidPath(info->deriver))
|
||||
enqueue(info->deriver);
|
||||
|
@ -69,14 +79,20 @@ void Store::computeFSClosure(const PathSet& startPaths, PathSet& paths_,
|
|||
{
|
||||
auto state(state_.lock());
|
||||
assert(state->pending);
|
||||
if (!--state->pending) done.notify_one();
|
||||
if (!--state->pending) {
|
||||
done.notify_one();
|
||||
}
|
||||
}
|
||||
|
||||
} catch (...) {
|
||||
auto state(state_.lock());
|
||||
if (!state->exc) state->exc = std::current_exception();
|
||||
if (!state->exc) {
|
||||
state->exc = std::current_exception();
|
||||
}
|
||||
assert(state->pending);
|
||||
if (!--state->pending) done.notify_one();
|
||||
if (!--state->pending) {
|
||||
done.notify_one();
|
||||
}
|
||||
};
|
||||
}});
|
||||
};
|
||||
|
@ -86,7 +102,9 @@ void Store::computeFSClosure(const PathSet& startPaths, PathSet& paths_,
|
|||
{
|
||||
auto state(state_.lock());
|
||||
while (state->pending) state.wait(done);
|
||||
if (state->exc) std::rethrow_exception(state->exc);
|
||||
if (state->exc) {
|
||||
std::rethrow_exception(state->exc);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -139,7 +157,9 @@ void Store::queryMissing(const PathSet& targets, PathSet& willBuild_,
|
|||
|
||||
auto checkOutput = [&](const Path& drvPath, ref<Derivation> drv,
|
||||
const Path& outPath, ref<Sync<DrvState>> drvState_) {
|
||||
if (drvState_->lock()->done) return;
|
||||
if (drvState_->lock()->done) {
|
||||
return;
|
||||
}
|
||||
|
||||
SubstitutablePathInfos infos;
|
||||
querySubstitutablePathInfos({outPath}, infos);
|
||||
|
@ -150,7 +170,9 @@ void Store::queryMissing(const PathSet& targets, PathSet& willBuild_,
|
|||
} else {
|
||||
{
|
||||
auto drvState(drvState_->lock());
|
||||
if (drvState->done) return;
|
||||
if (drvState->done) {
|
||||
return;
|
||||
}
|
||||
assert(drvState->left);
|
||||
drvState->left--;
|
||||
drvState->outPaths.insert(outPath);
|
||||
|
@ -165,7 +187,9 @@ void Store::queryMissing(const PathSet& targets, PathSet& willBuild_,
|
|||
doPath = [&](const Path& path) {
|
||||
{
|
||||
auto state(state_.lock());
|
||||
if (state->done.count(path)) return;
|
||||
if (state->done.count(path)) {
|
||||
return;
|
||||
}
|
||||
state->done.insert(path);
|
||||
}
|
||||
|
||||
|
@ -186,7 +210,9 @@ void Store::queryMissing(const PathSet& targets, PathSet& willBuild_,
|
|||
for (auto& j : drv.outputs)
|
||||
if (wantOutput(j.first, i2.second) && !isValidPath(j.second.path))
|
||||
invalid.insert(j.second.path);
|
||||
if (invalid.empty()) return;
|
||||
if (invalid.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (settings.useSubstitutes && parsedDrv.substitutesAllowed()) {
|
||||
auto drvState = make_ref<Sync<DrvState>>(DrvState(invalid.size()));
|
||||
|
@ -197,7 +223,9 @@ void Store::queryMissing(const PathSet& targets, PathSet& willBuild_,
|
|||
mustBuildDrv(i2.first, drv);
|
||||
|
||||
} else {
|
||||
if (isValidPath(path)) return;
|
||||
if (isValidPath(path)) {
|
||||
return;
|
||||
}
|
||||
|
||||
SubstitutablePathInfos infos;
|
||||
querySubstitutablePathInfos({path}, infos);
|
||||
|
@ -240,7 +268,9 @@ Paths Store::topoSortPaths(const PathSet& paths) {
|
|||
format("cycle detected in the references of '%1%' from '%2%'") %
|
||||
path % *parent);
|
||||
|
||||
if (visited.find(path) != visited.end()) return;
|
||||
if (visited.find(path) != visited.end()) {
|
||||
return;
|
||||
}
|
||||
visited.insert(path);
|
||||
parents.insert(path);
|
||||
|
||||
|
@ -253,7 +283,9 @@ Paths Store::topoSortPaths(const PathSet& paths) {
|
|||
for (auto& i : references)
|
||||
/* Don't traverse into paths that don't exist. That can
|
||||
happen due to substitutes for non-existent paths. */
|
||||
if (i != path && paths.find(i) != paths.end()) dfsVisit(i, &path);
|
||||
if (i != path && paths.find(i) != paths.end()) {
|
||||
dfsVisit(i, &path);
|
||||
}
|
||||
|
||||
sorted.push_front(path);
|
||||
parents.erase(path);
|
||||
|
|
24
third_party/nix/src/libstore/nar-accessor.cc
vendored
24
third_party/nix/src/libstore/nar-accessor.cc
vendored
|
@ -133,7 +133,9 @@ struct NarAccessor : public FSAccessor {
|
|||
for (auto it = path.begin(); it != end;) {
|
||||
// because it != end, the remaining component is non-empty so we need
|
||||
// a directory
|
||||
if (current->type != FSAccessor::Type::tDirectory) return nullptr;
|
||||
if (current->type != FSAccessor::Type::tDirectory) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
// skip slash (canonPath above ensures that this is always a slash)
|
||||
assert(*it == '/');
|
||||
|
@ -142,7 +144,9 @@ struct NarAccessor : public FSAccessor {
|
|||
// lookup current component
|
||||
auto next = std::find(it, end, '/');
|
||||
auto child = current->children.find(std::string(it, next));
|
||||
if (child == current->children.end()) return nullptr;
|
||||
if (child == current->children.end()) {
|
||||
return nullptr;
|
||||
}
|
||||
current = &child->second;
|
||||
|
||||
it = next;
|
||||
|
@ -160,7 +164,9 @@ struct NarAccessor : public FSAccessor {
|
|||
|
||||
Stat stat(const Path& path) override {
|
||||
auto i = find(path);
|
||||
if (i == nullptr) return {FSAccessor::Type::tMissing, 0, false};
|
||||
if (i == nullptr) {
|
||||
return {FSAccessor::Type::tMissing, 0, false};
|
||||
}
|
||||
return {i->type, i->size, i->isExecutable, i->start};
|
||||
}
|
||||
|
||||
|
@ -183,7 +189,9 @@ struct NarAccessor : public FSAccessor {
|
|||
throw Error(format("path '%1%' inside NAR file is not a regular file") %
|
||||
path);
|
||||
|
||||
if (getNarBytes) return getNarBytes(i.start, i.size);
|
||||
if (getNarBytes) {
|
||||
return getNarBytes(i.start, i.size);
|
||||
}
|
||||
|
||||
assert(nar);
|
||||
return std::string(*nar, i.start, i.size);
|
||||
|
@ -216,8 +224,12 @@ void listNar(JSONPlaceholder& res, ref<FSAccessor> accessor, const Path& path,
|
|||
case FSAccessor::Type::tRegular:
|
||||
obj.attr("type", "regular");
|
||||
obj.attr("size", st.fileSize);
|
||||
if (st.isExecutable) obj.attr("executable", true);
|
||||
if (st.narOffset) obj.attr("narOffset", st.narOffset);
|
||||
if (st.isExecutable) {
|
||||
obj.attr("executable", true);
|
||||
}
|
||||
if (st.narOffset) {
|
||||
obj.attr("narOffset", st.narOffset);
|
||||
}
|
||||
break;
|
||||
case FSAccessor::Type::tDirectory:
|
||||
obj.attr("type", "directory");
|
||||
|
|
|
@ -143,7 +143,9 @@ class NarInfoDiskCacheImpl : public NarInfoDiskCache {
|
|||
|
||||
Cache& getCache(State& state, const std::string& uri) {
|
||||
auto i = state.caches.find(uri);
|
||||
if (i == state.caches.end()) abort();
|
||||
if (i == state.caches.end()) {
|
||||
abort();
|
||||
}
|
||||
return i->second;
|
||||
}
|
||||
|
||||
|
@ -170,7 +172,9 @@ class NarInfoDiskCacheImpl : public NarInfoDiskCache {
|
|||
auto i = state->caches.find(uri);
|
||||
if (i == state->caches.end()) {
|
||||
auto queryCache(state->queryCache.use()(uri));
|
||||
if (!queryCache.next()) return false;
|
||||
if (!queryCache.next()) {
|
||||
return false;
|
||||
}
|
||||
state->caches.emplace(
|
||||
uri, Cache{(int)queryCache.getInt(0), queryCache.getStr(1),
|
||||
queryCache.getInt(2) != 0, (int)queryCache.getInt(3)});
|
||||
|
@ -199,9 +203,13 @@ class NarInfoDiskCacheImpl : public NarInfoDiskCache {
|
|||
now - settings.ttlNegativeNarInfoCache)(
|
||||
now - settings.ttlPositiveNarInfoCache));
|
||||
|
||||
if (!queryNAR.next()) return {oUnknown, 0};
|
||||
if (!queryNAR.next()) {
|
||||
return {oUnknown, 0};
|
||||
}
|
||||
|
||||
if (!queryNAR.getInt(0)) return {oInvalid, 0};
|
||||
if (!queryNAR.getInt(0)) {
|
||||
return {oInvalid, 0};
|
||||
}
|
||||
|
||||
auto narInfo = make_ref<NarInfo>();
|
||||
|
||||
|
@ -210,7 +218,9 @@ class NarInfoDiskCacheImpl : public NarInfoDiskCache {
|
|||
(namePart.empty() ? "" : "-" + namePart);
|
||||
narInfo->url = queryNAR.getStr(2);
|
||||
narInfo->compression = queryNAR.getStr(3);
|
||||
if (!queryNAR.isNull(4)) narInfo->fileHash = Hash(queryNAR.getStr(4));
|
||||
if (!queryNAR.isNull(4)) {
|
||||
narInfo->fileHash = Hash(queryNAR.getStr(4));
|
||||
}
|
||||
narInfo->fileSize = queryNAR.getInt(5);
|
||||
narInfo->narHash = Hash(queryNAR.getStr(6));
|
||||
narInfo->narSize = queryNAR.getInt(7);
|
||||
|
|
56
third_party/nix/src/libstore/nar-info.cc
vendored
56
third_party/nix/src/libstore/nar-info.cc
vendored
|
@ -22,17 +22,23 @@ NarInfo::NarInfo(const Store& store, const std::string& s,
|
|||
size_t pos = 0;
|
||||
while (pos < s.size()) {
|
||||
size_t colon = s.find(':', pos);
|
||||
if (colon == std::string::npos) corrupt();
|
||||
if (colon == std::string::npos) {
|
||||
corrupt();
|
||||
}
|
||||
|
||||
std::string name(s, pos, colon - pos);
|
||||
|
||||
size_t eol = s.find('\n', colon + 2);
|
||||
if (eol == std::string::npos) corrupt();
|
||||
if (eol == std::string::npos) {
|
||||
corrupt();
|
||||
}
|
||||
|
||||
std::string value(s, colon + 2, eol - colon - 2);
|
||||
|
||||
if (name == "StorePath") {
|
||||
if (!store.isStorePath(value)) corrupt();
|
||||
if (!store.isStorePath(value)) {
|
||||
corrupt();
|
||||
}
|
||||
path = value;
|
||||
} else if (name == "URL")
|
||||
url = value;
|
||||
|
@ -41,23 +47,33 @@ NarInfo::NarInfo(const Store& store, const std::string& s,
|
|||
else if (name == "FileHash")
|
||||
fileHash = parseHashField(value);
|
||||
else if (name == "FileSize") {
|
||||
if (!string2Int(value, fileSize)) corrupt();
|
||||
if (!string2Int(value, fileSize)) {
|
||||
corrupt();
|
||||
}
|
||||
} else if (name == "NarHash")
|
||||
narHash = parseHashField(value);
|
||||
else if (name == "NarSize") {
|
||||
if (!string2Int(value, narSize)) corrupt();
|
||||
if (!string2Int(value, narSize)) {
|
||||
corrupt();
|
||||
}
|
||||
} else if (name == "References") {
|
||||
auto refs = tokenizeString<Strings>(value, " ");
|
||||
if (!references.empty()) corrupt();
|
||||
if (!references.empty()) {
|
||||
corrupt();
|
||||
}
|
||||
for (auto& r : refs) {
|
||||
auto r2 = store.storeDir + "/" + r;
|
||||
if (!store.isStorePath(r2)) corrupt();
|
||||
if (!store.isStorePath(r2)) {
|
||||
corrupt();
|
||||
}
|
||||
references.insert(r2);
|
||||
}
|
||||
} else if (name == "Deriver") {
|
||||
if (value != "unknown-deriver") {
|
||||
auto p = store.storeDir + "/" + value;
|
||||
if (!store.isStorePath(p)) corrupt();
|
||||
if (!store.isStorePath(p)) {
|
||||
corrupt();
|
||||
}
|
||||
deriver = p;
|
||||
}
|
||||
} else if (name == "System")
|
||||
|
@ -65,16 +81,22 @@ NarInfo::NarInfo(const Store& store, const std::string& s,
|
|||
else if (name == "Sig")
|
||||
sigs.insert(value);
|
||||
else if (name == "CA") {
|
||||
if (!ca.empty()) corrupt();
|
||||
if (!ca.empty()) {
|
||||
corrupt();
|
||||
}
|
||||
ca = value;
|
||||
}
|
||||
|
||||
pos = eol + 1;
|
||||
}
|
||||
|
||||
if (compression == "") compression = "bzip2";
|
||||
if (compression == "") {
|
||||
compression = "bzip2";
|
||||
}
|
||||
|
||||
if (path.empty() || url.empty() || narSize == 0 || !narHash) corrupt();
|
||||
if (path.empty() || url.empty() || narSize == 0 || !narHash) {
|
||||
corrupt();
|
||||
}
|
||||
}
|
||||
|
||||
std::string NarInfo::to_string() const {
|
||||
|
@ -92,13 +114,19 @@ std::string NarInfo::to_string() const {
|
|||
|
||||
res += "References: " + concatStringsSep(" ", shortRefs()) + "\n";
|
||||
|
||||
if (!deriver.empty()) res += "Deriver: " + baseNameOf(deriver) + "\n";
|
||||
if (!deriver.empty()) {
|
||||
res += "Deriver: " + baseNameOf(deriver) + "\n";
|
||||
}
|
||||
|
||||
if (!system.empty()) res += "System: " + system + "\n";
|
||||
if (!system.empty()) {
|
||||
res += "System: " + system + "\n";
|
||||
}
|
||||
|
||||
for (auto sig : sigs) res += "Sig: " + sig + "\n";
|
||||
|
||||
if (!ca.empty()) res += "CA: " + ca + "\n";
|
||||
if (!ca.empty()) {
|
||||
res += "CA: " + ca + "\n";
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
12
third_party/nix/src/libstore/optimise-store.cc
vendored
12
third_party/nix/src/libstore/optimise-store.cc
vendored
|
@ -29,7 +29,9 @@ struct MakeReadOnly {
|
|||
~MakeReadOnly() {
|
||||
try {
|
||||
/* This will make the path read-only. */
|
||||
if (path != "") canonicaliseTimestampAndPermissions(path);
|
||||
if (path != "") {
|
||||
canonicaliseTimestampAndPermissions(path);
|
||||
}
|
||||
} catch (...) {
|
||||
ignoreException();
|
||||
}
|
||||
|
@ -79,7 +81,9 @@ Strings LocalStore::readDirectoryIgnoringInodes(const Path& path,
|
|||
}
|
||||
|
||||
string name = dirent->d_name;
|
||||
if (name == "." || name == "..") continue;
|
||||
if (name == "." || name == "..") {
|
||||
continue;
|
||||
}
|
||||
names.push_back(name);
|
||||
}
|
||||
if (errno) {
|
||||
|
@ -261,7 +265,9 @@ void LocalStore::optimiseStore(OptimiseStats& stats) {
|
|||
|
||||
for (auto& i : paths) {
|
||||
addTempRoot(i);
|
||||
if (!isValidPath(i)) continue; /* path was GC'ed, probably */
|
||||
if (!isValidPath(i)) {
|
||||
continue;
|
||||
} /* path was GC'ed, probably */
|
||||
{
|
||||
LOG(INFO) << "optimising path '" << i << "'";
|
||||
optimisePath_(stats, realStoreDir + "/" + baseNameOf(i), inodeHash);
|
||||
|
|
|
@ -100,7 +100,9 @@ bool ParsedDerivation::canBuildLocally() const {
|
|||
return false;
|
||||
|
||||
for (auto& feature : getRequiredSystemFeatures())
|
||||
if (!settings.systemFeatures.get().count(feature)) return false;
|
||||
if (!settings.systemFeatures.get().count(feature)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
12
third_party/nix/src/libstore/pathlocks.cc
vendored
12
third_party/nix/src/libstore/pathlocks.cc
vendored
|
@ -57,8 +57,12 @@ bool lockFile(int fd, LockType lockType, bool wait) {
|
|||
} else {
|
||||
while (flock(fd, type | LOCK_NB) != 0) {
|
||||
checkInterrupt();
|
||||
if (errno == EWOULDBLOCK) return false;
|
||||
if (errno != EINTR) throw SysError(format("acquiring/releasing lock"));
|
||||
if (errno == EWOULDBLOCK) {
|
||||
return false;
|
||||
}
|
||||
if (errno != EINTR) {
|
||||
throw SysError(format("acquiring/releasing lock"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -143,7 +147,9 @@ PathLocks::~PathLocks() {
|
|||
|
||||
void PathLocks::unlock() {
|
||||
for (auto& i : fds) {
|
||||
if (deletePaths) deleteLockFile(i.second, i.first);
|
||||
if (deletePaths) {
|
||||
deleteLockFile(i.second, i.first);
|
||||
}
|
||||
|
||||
if (close(i.first) == -1) {
|
||||
LOG(WARNING) << "cannot close lock file on '" << i.second << "'";
|
||||
|
|
24
third_party/nix/src/libstore/profiles.cc
vendored
24
third_party/nix/src/libstore/profiles.cc
vendored
|
@ -19,10 +19,14 @@ static bool cmpGensByNumber(const Generation& a, const Generation& b) {
|
|||
/* Parse a generation name of the format
|
||||
`<profilename>-<number>-link'. */
|
||||
static int parseName(const string& profileName, const string& name) {
|
||||
if (string(name, 0, profileName.size() + 1) != profileName + "-") return -1;
|
||||
if (string(name, 0, profileName.size() + 1) != profileName + "-") {
|
||||
return -1;
|
||||
}
|
||||
string s = string(name, profileName.size() + 1);
|
||||
string::size_type p = s.find("-link");
|
||||
if (p == string::npos) return -1;
|
||||
if (p == string::npos) {
|
||||
return -1;
|
||||
}
|
||||
int n;
|
||||
if (string2Int(string(s, 0, p), n) && n >= 0)
|
||||
return n;
|
||||
|
@ -135,7 +139,9 @@ void deleteGenerations(const Path& profile,
|
|||
profile);
|
||||
|
||||
for (auto& i : gens) {
|
||||
if (gensToDelete.find(i.number) == gensToDelete.end()) continue;
|
||||
if (gensToDelete.find(i.number) == gensToDelete.end()) {
|
||||
continue;
|
||||
}
|
||||
deleteGeneration2(profile, i.number, dryRun);
|
||||
}
|
||||
}
|
||||
|
@ -171,7 +177,9 @@ void deleteOldGenerations(const Path& profile, bool dryRun) {
|
|||
Generations gens = findGenerations(profile, curGen);
|
||||
|
||||
for (auto& i : gens)
|
||||
if (i.number != curGen) deleteGeneration2(profile, i.number, dryRun);
|
||||
if (i.number != curGen) {
|
||||
deleteGeneration2(profile, i.number, dryRun);
|
||||
}
|
||||
}
|
||||
|
||||
void deleteGenerationsOlderThan(const Path& profile, time_t t, bool dryRun) {
|
||||
|
@ -185,7 +193,9 @@ void deleteGenerationsOlderThan(const Path& profile, time_t t, bool dryRun) {
|
|||
for (auto i = gens.rbegin(); i != gens.rend(); ++i)
|
||||
if (canDelete) {
|
||||
assert(i->creationTime < t);
|
||||
if (i->number != curGen) deleteGeneration2(profile, i->number, dryRun);
|
||||
if (i->number != curGen) {
|
||||
deleteGeneration2(profile, i->number, dryRun);
|
||||
}
|
||||
} else if (i->creationTime < t) {
|
||||
/* We may now start deleting generations, but we don't
|
||||
delete this generation yet, because this generation was
|
||||
|
@ -211,7 +221,9 @@ void deleteGenerationsOlderThan(const Path& profile, const string& timeSpec,
|
|||
|
||||
void switchLink(Path link, Path target) {
|
||||
/* Hacky. */
|
||||
if (dirOf(target) == dirOf(link)) target = baseNameOf(target);
|
||||
if (dirOf(target) == dirOf(link)) {
|
||||
target = baseNameOf(target);
|
||||
}
|
||||
|
||||
replaceSymlink(target, link);
|
||||
}
|
||||
|
|
12
third_party/nix/src/libstore/references.cc
vendored
12
third_party/nix/src/libstore/references.cc
vendored
|
@ -35,7 +35,9 @@ static void search(const unsigned char* s, size_t len, StringSet& hashes,
|
|||
match = false;
|
||||
break;
|
||||
}
|
||||
if (!match) continue;
|
||||
if (!match) {
|
||||
continue;
|
||||
}
|
||||
string ref((const char*)s + i, refLength);
|
||||
if (hashes.find(ref) != hashes.end()) {
|
||||
DLOG(INFO) << "found reference to '" << ref << "' at offset " << i;
|
||||
|
@ -88,7 +90,9 @@ PathSet scanForReferences(const string& path, const PathSet& refs,
|
|||
for (auto& i : refs) {
|
||||
string baseName = baseNameOf(i);
|
||||
string::size_type pos = baseName.find('-');
|
||||
if (pos == string::npos) throw Error(format("bad reference '%1%'") % i);
|
||||
if (pos == string::npos) {
|
||||
throw Error(format("bad reference '%1%'") % i);
|
||||
}
|
||||
string s = string(baseName, 0, pos);
|
||||
assert(s.size() == refLength);
|
||||
assert(backMap.find(s) == backMap.end());
|
||||
|
@ -104,7 +108,9 @@ PathSet scanForReferences(const string& path, const PathSet& refs,
|
|||
PathSet found;
|
||||
for (auto& i : sink.seen) {
|
||||
std::map<string, Path>::iterator j;
|
||||
if ((j = backMap.find(i)) == backMap.end()) abort();
|
||||
if ((j = backMap.find(i)) == backMap.end()) {
|
||||
abort();
|
||||
}
|
||||
found.insert(j->second);
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,9 @@ namespace nix {
|
|||
|
||||
RemoteFSAccessor::RemoteFSAccessor(ref<Store> store, const Path& cacheDir)
|
||||
: store(store), cacheDir(cacheDir) {
|
||||
if (cacheDir != "") createDirs(cacheDir);
|
||||
if (cacheDir != "") {
|
||||
createDirs(cacheDir);
|
||||
}
|
||||
}
|
||||
|
||||
Path RemoteFSAccessor::makeCacheFile(const Path& storePath,
|
||||
|
@ -51,7 +53,9 @@ std::pair<ref<FSAccessor>, Path> RemoteFSAccessor::fetch(const Path& path_) {
|
|||
storePath);
|
||||
|
||||
auto i = nars.find(storePath);
|
||||
if (i != nars.end()) return {i->second, restPath};
|
||||
if (i != nars.end()) {
|
||||
return {i->second, restPath};
|
||||
}
|
||||
|
||||
StringSink sink;
|
||||
std::string listing;
|
||||
|
@ -65,7 +69,9 @@ std::pair<ref<FSAccessor>, Path> RemoteFSAccessor::fetch(const Path& path_) {
|
|||
auto narAccessor = makeLazyNarAccessor(
|
||||
listing, [cacheFile](uint64_t offset, uint64_t length) {
|
||||
AutoCloseFD fd = open(cacheFile.c_str(), O_RDONLY | O_CLOEXEC);
|
||||
if (!fd) throw SysError("opening NAR cache file '%s'", cacheFile);
|
||||
if (!fd) {
|
||||
throw SysError("opening NAR cache file '%s'", cacheFile);
|
||||
}
|
||||
|
||||
if (lseek(fd.get(), offset, SEEK_SET) != (off_t)offset)
|
||||
throw SysError("seeking in '%s'", cacheFile);
|
||||
|
|
72
third_party/nix/src/libstore/remote-store.cc
vendored
72
third_party/nix/src/libstore/remote-store.cc
vendored
|
@ -96,7 +96,9 @@ ref<RemoteStore::Connection> UDSRemoteStore::openConnection() {
|
|||
#endif
|
||||
,
|
||||
0);
|
||||
if (!conn->fd) throw SysError("cannot create Unix domain socket");
|
||||
if (!conn->fd) {
|
||||
throw SysError("cannot create Unix domain socket");
|
||||
}
|
||||
closeOnExec(conn->fd.get());
|
||||
|
||||
string socketPath = path ? *path : settings.nixDaemonSocketFile;
|
||||
|
@ -126,7 +128,9 @@ void RemoteStore::initConnection(Connection& conn) {
|
|||
conn.to << WORKER_MAGIC_1;
|
||||
conn.to.flush();
|
||||
unsigned int magic = readInt(conn.from);
|
||||
if (magic != WORKER_MAGIC_2) throw Error("protocol mismatch");
|
||||
if (magic != WORKER_MAGIC_2) {
|
||||
throw Error("protocol mismatch");
|
||||
}
|
||||
|
||||
conn.from >> conn.daemonVersion;
|
||||
if (GET_PROTOCOL_MAJOR(conn.daemonVersion) !=
|
||||
|
@ -144,10 +148,14 @@ void RemoteStore::initConnection(Connection& conn) {
|
|||
conn.to << 0;
|
||||
}
|
||||
|
||||
if (GET_PROTOCOL_MINOR(conn.daemonVersion) >= 11) conn.to << false;
|
||||
if (GET_PROTOCOL_MINOR(conn.daemonVersion) >= 11) {
|
||||
conn.to << false;
|
||||
}
|
||||
|
||||
auto ex = conn.processStderr();
|
||||
if (ex) std::rethrow_exception(ex);
|
||||
if (ex) {
|
||||
std::rethrow_exception(ex);
|
||||
}
|
||||
} catch (Error& e) {
|
||||
throw Error("cannot open connection to remote store '%s': %s", getUri(),
|
||||
e.what());
|
||||
|
@ -185,7 +193,9 @@ void RemoteStore::setOptions(Connection& conn) {
|
|||
}
|
||||
|
||||
auto ex = conn.processStderr();
|
||||
if (ex) std::rethrow_exception(ex);
|
||||
if (ex) {
|
||||
std::rethrow_exception(ex);
|
||||
}
|
||||
}
|
||||
|
||||
/* A wrapper around Pool<RemoteStore::Connection>::Handle that marks
|
||||
|
@ -238,7 +248,9 @@ PathSet RemoteStore::queryValidPaths(const PathSet& paths,
|
|||
if (GET_PROTOCOL_MINOR(conn->daemonVersion) < 12) {
|
||||
PathSet res;
|
||||
for (auto& i : paths)
|
||||
if (isValidPath(i)) res.insert(i);
|
||||
if (isValidPath(i)) {
|
||||
res.insert(i);
|
||||
}
|
||||
return res;
|
||||
} else {
|
||||
conn->to << wopQueryValidPaths << paths;
|
||||
|
@ -261,7 +273,9 @@ PathSet RemoteStore::querySubstitutablePaths(const PathSet& paths) {
|
|||
for (auto& i : paths) {
|
||||
conn->to << wopHasSubstitutes << i;
|
||||
conn.processStderr();
|
||||
if (readInt(conn->from)) res.insert(i);
|
||||
if (readInt(conn->from)) {
|
||||
res.insert(i);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
} else {
|
||||
|
@ -273,7 +287,9 @@ PathSet RemoteStore::querySubstitutablePaths(const PathSet& paths) {
|
|||
|
||||
void RemoteStore::querySubstitutablePathInfos(const PathSet& paths,
|
||||
SubstitutablePathInfos& infos) {
|
||||
if (paths.empty()) return;
|
||||
if (paths.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto conn(getConnection());
|
||||
|
||||
|
@ -283,9 +299,13 @@ void RemoteStore::querySubstitutablePathInfos(const PathSet& paths,
|
|||
conn->to << wopQuerySubstitutablePathInfo << i;
|
||||
conn.processStderr();
|
||||
unsigned int reply = readInt(conn->from);
|
||||
if (reply == 0) continue;
|
||||
if (reply == 0) {
|
||||
continue;
|
||||
}
|
||||
info.deriver = readString(conn->from);
|
||||
if (info.deriver != "") assertStorePath(info.deriver);
|
||||
if (info.deriver != "") {
|
||||
assertStorePath(info.deriver);
|
||||
}
|
||||
info.references = readStorePaths<PathSet>(*this, conn->from);
|
||||
info.downloadSize = readLongLong(conn->from);
|
||||
info.narSize = readLongLong(conn->from);
|
||||
|
@ -300,7 +320,9 @@ void RemoteStore::querySubstitutablePathInfos(const PathSet& paths,
|
|||
Path path = readStorePath(*this, conn->from);
|
||||
SubstitutablePathInfo& info(infos[path]);
|
||||
info.deriver = readString(conn->from);
|
||||
if (info.deriver != "") assertStorePath(info.deriver);
|
||||
if (info.deriver != "") {
|
||||
assertStorePath(info.deriver);
|
||||
}
|
||||
info.references = readStorePaths<PathSet>(*this, conn->from);
|
||||
info.downloadSize = readLongLong(conn->from);
|
||||
info.narSize = readLongLong(conn->from);
|
||||
|
@ -327,12 +349,16 @@ void RemoteStore::queryPathInfoUncached(
|
|||
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);
|
||||
}
|
||||
}
|
||||
info = std::make_shared<ValidPathInfo>();
|
||||
info->path = path;
|
||||
info->deriver = readString(conn->from);
|
||||
if (info->deriver != "") assertStorePath(info->deriver);
|
||||
if (info->deriver != "") {
|
||||
assertStorePath(info->deriver);
|
||||
}
|
||||
info->narHash = Hash(readString(conn->from), htSHA256);
|
||||
info->references = readStorePaths<PathSet>(*this, conn->from);
|
||||
conn->from >> info->registrationTime >> info->narSize;
|
||||
|
@ -382,7 +408,9 @@ Path RemoteStore::queryPathFromHashPart(const string& hashPart) {
|
|||
conn->to << wopQueryPathFromHashPart << hashPart;
|
||||
conn.processStderr();
|
||||
Path path = readString(conn->from);
|
||||
if (!path.empty()) assertStorePath(path);
|
||||
if (!path.empty()) {
|
||||
assertStorePath(path);
|
||||
}
|
||||
return path;
|
||||
}
|
||||
|
||||
|
@ -416,7 +444,9 @@ void RemoteStore::addToStore(const ValidPathInfo& info, Source& source,
|
|||
<< info.registrationTime << info.narSize << info.ultimate
|
||||
<< info.sigs << info.ca << repair << !checkSigs;
|
||||
bool tunnel = GET_PROTOCOL_MINOR(conn->daemonVersion) >= 21;
|
||||
if (!tunnel) copyNAR(source, conn->to);
|
||||
if (!tunnel) {
|
||||
copyNAR(source, conn->to);
|
||||
}
|
||||
conn.processStderr(0, tunnel ? &source : nullptr);
|
||||
}
|
||||
}
|
||||
|
@ -647,12 +677,16 @@ std::exception_ptr RemoteStore::Connection::processStderr(Sink* sink,
|
|||
|
||||
if (msg == STDERR_WRITE) {
|
||||
string s = readString(from);
|
||||
if (!sink) throw Error("no sink");
|
||||
if (!sink) {
|
||||
throw Error("no sink");
|
||||
}
|
||||
(*sink)(s);
|
||||
}
|
||||
|
||||
else if (msg == STDERR_READ) {
|
||||
if (!source) throw Error("no source");
|
||||
if (!source) {
|
||||
throw Error("no source");
|
||||
}
|
||||
size_t len = readNum<size_t>(from);
|
||||
auto buf = std::make_unique<unsigned char[]>(len);
|
||||
writeString(buf.get(), source->read(buf.get(), len), to);
|
||||
|
@ -690,7 +724,9 @@ static std::string uriScheme = "unix://";
|
|||
static RegisterStoreImplementation regStore(
|
||||
[](const std::string& uri,
|
||||
const Store::Params& params) -> std::shared_ptr<Store> {
|
||||
if (std::string(uri, 0, uriScheme.size()) != uriScheme) return 0;
|
||||
if (std::string(uri, 0, uriScheme.size()) != uriScheme) {
|
||||
return 0;
|
||||
}
|
||||
return std::make_shared<UDSRemoteStore>(
|
||||
std::string(uri, uriScheme.size()), params);
|
||||
});
|
||||
|
|
|
@ -153,7 +153,9 @@ S3Helper::DownloadResult S3Helper::getObject(const std::string& bucketName,
|
|||
dynamic_cast<std::stringstream&>(result.GetBody()).str());
|
||||
|
||||
} catch (S3Error& e) {
|
||||
if (e.err != Aws::S3::S3Errors::NO_SUCH_KEY) throw;
|
||||
if (e.err != Aws::S3::S3Errors::NO_SUCH_KEY) {
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
auto now2 = std::chrono::steady_clock::now();
|
||||
|
@ -315,7 +317,9 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore {
|
|||
|
||||
request.SetContentType(mimeType);
|
||||
|
||||
if (contentEncoding != "") request.SetContentEncoding(contentEncoding);
|
||||
if (contentEncoding != "") {
|
||||
request.SetContentEncoding(contentEncoding);
|
||||
}
|
||||
|
||||
auto stream = std::make_shared<istringstream_nocopy>(data);
|
||||
|
||||
|
@ -394,7 +398,9 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore {
|
|||
|
||||
for (auto object : contents) {
|
||||
auto& key = object.GetKey();
|
||||
if (key.size() != 40 || !hasSuffix(key, ".narinfo")) continue;
|
||||
if (key.size() != 40 || !hasSuffix(key, ".narinfo")) {
|
||||
continue;
|
||||
}
|
||||
paths.insert(storeDir + "/" + key.substr(0, key.size() - 8));
|
||||
}
|
||||
|
||||
|
@ -408,7 +414,9 @@ struct S3BinaryCacheStoreImpl : public S3BinaryCacheStore {
|
|||
static RegisterStoreImplementation regStore(
|
||||
[](const std::string& uri,
|
||||
const Store::Params& params) -> std::shared_ptr<Store> {
|
||||
if (std::string(uri, 0, 5) != "s3://") return 0;
|
||||
if (std::string(uri, 0, 5) != "s3://") {
|
||||
return 0;
|
||||
}
|
||||
auto store =
|
||||
std::make_shared<S3BinaryCacheStoreImpl>(params, std::string(uri, 5));
|
||||
store->init();
|
||||
|
|
4
third_party/nix/src/libstore/ssh-store.cc
vendored
4
third_party/nix/src/libstore/ssh-store.cc
vendored
|
@ -77,7 +77,9 @@ ref<RemoteStore::Connection> SSHStore::openConnection() {
|
|||
static RegisterStoreImplementation regStore([](const std::string& uri,
|
||||
const Store::Params& params)
|
||||
-> std::shared_ptr<Store> {
|
||||
if (std::string(uri, 0, uriScheme.size()) != uriScheme) return 0;
|
||||
if (std::string(uri, 0, uriScheme.size()) != uriScheme) {
|
||||
return 0;
|
||||
}
|
||||
return std::make_shared<SSHStore>(std::string(uri, uriScheme.size()), params);
|
||||
});
|
||||
|
||||
|
|
18
third_party/nix/src/libstore/ssh.cc
vendored
18
third_party/nix/src/libstore/ssh.cc
vendored
|
@ -17,8 +17,12 @@ SSHMaster::SSHMaster(const std::string& host, const std::string& keyFile,
|
|||
void SSHMaster::addCommonSSHOpts(Strings& args) {
|
||||
for (auto& i : tokenizeString<Strings>(getEnv("NIX_SSHOPTS")))
|
||||
args.push_back(i);
|
||||
if (!keyFile.empty()) args.insert(args.end(), {"-i", keyFile});
|
||||
if (compress) args.push_back("-C");
|
||||
if (!keyFile.empty()) {
|
||||
args.insert(args.end(), {"-i", keyFile});
|
||||
}
|
||||
if (compress) {
|
||||
args.push_back("-C");
|
||||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<SSHMaster::Connection> SSHMaster::startCommand(
|
||||
|
@ -81,11 +85,15 @@ std::unique_ptr<SSHMaster::Connection> SSHMaster::startCommand(
|
|||
}
|
||||
|
||||
Path SSHMaster::startMaster() {
|
||||
if (!useMaster) return "";
|
||||
if (!useMaster) {
|
||||
return "";
|
||||
}
|
||||
|
||||
auto state(state_.lock());
|
||||
|
||||
if (state->sshMaster != -1) return state->socketPath;
|
||||
if (state->sshMaster != -1) {
|
||||
return state->socketPath;
|
||||
}
|
||||
|
||||
state->tmpDir =
|
||||
std::make_unique<AutoDelete>(createTempDir("", "nix", true, true, 0700));
|
||||
|
@ -112,7 +120,7 @@ Path SSHMaster::startMaster() {
|
|||
"-S", state->socketPath,
|
||||
"-o", "LocalCommand=echo started",
|
||||
"-o", "PermitLocalCommand=yes"};
|
||||
// if (verbosity >= lvlChatty) args.push_back("-v");
|
||||
// if (verbosity >= lvlChatty) { args.push_back("-v"); }
|
||||
addCommonSSHOpts(args);
|
||||
execvp(args.begin()->c_str(), stringsToCharPtrs(args).data());
|
||||
|
||||
|
|
92
third_party/nix/src/libstore/store-api.cc
vendored
92
third_party/nix/src/libstore/store-api.cc
vendored
|
@ -342,7 +342,9 @@ void Store::queryPathInfo(const Path& storePath,
|
|||
try {
|
||||
auto info = fut.get();
|
||||
|
||||
if (diskCache) diskCache->upsertNarInfo(getUri(), hashPart, info);
|
||||
if (diskCache) {
|
||||
diskCache->upsertNarInfo(getUri(), hashPart, info);
|
||||
}
|
||||
|
||||
{
|
||||
auto state_(state.lock());
|
||||
|
@ -388,7 +390,9 @@ PathSet Store::queryValidPaths(const PathSet& paths,
|
|||
state->exc = std::current_exception();
|
||||
}
|
||||
assert(state->left);
|
||||
if (!--state->left) wakeup.notify_one();
|
||||
if (!--state->left) {
|
||||
wakeup.notify_one();
|
||||
}
|
||||
}});
|
||||
};
|
||||
|
||||
|
@ -399,7 +403,9 @@ PathSet Store::queryValidPaths(const PathSet& paths,
|
|||
while (true) {
|
||||
auto state(state_.lock());
|
||||
if (!state->left) {
|
||||
if (state->exc) std::rethrow_exception(state->exc);
|
||||
if (state->exc) {
|
||||
std::rethrow_exception(state->exc);
|
||||
}
|
||||
return state->valid;
|
||||
}
|
||||
state.wait(wakeup);
|
||||
|
@ -455,7 +461,9 @@ void Store::pathInfoToJSON(JSONPlaceholder& jsonOut, const PathSet& storePaths,
|
|||
for (auto& ref : info->references) jsonRefs.elem(ref);
|
||||
}
|
||||
|
||||
if (info->ca != "") jsonPath.attr("ca", info->ca);
|
||||
if (info->ca != "") {
|
||||
jsonPath.attr("ca", info->ca);
|
||||
}
|
||||
|
||||
std::pair<uint64_t, uint64_t> closureSizes;
|
||||
|
||||
|
@ -465,12 +473,16 @@ void Store::pathInfoToJSON(JSONPlaceholder& jsonOut, const PathSet& storePaths,
|
|||
}
|
||||
|
||||
if (includeImpureInfo) {
|
||||
if (info->deriver != "") jsonPath.attr("deriver", info->deriver);
|
||||
if (info->deriver != "") {
|
||||
jsonPath.attr("deriver", info->deriver);
|
||||
}
|
||||
|
||||
if (info->registrationTime)
|
||||
jsonPath.attr("registrationTime", info->registrationTime);
|
||||
|
||||
if (info->ultimate) jsonPath.attr("ultimate", info->ultimate);
|
||||
if (info->ultimate) {
|
||||
jsonPath.attr("ultimate", info->ultimate);
|
||||
}
|
||||
|
||||
if (!info->sigs.empty()) {
|
||||
auto jsonSigs = jsonPath.list("signatures");
|
||||
|
@ -481,7 +493,9 @@ void Store::pathInfoToJSON(JSONPlaceholder& jsonOut, const PathSet& storePaths,
|
|||
std::shared_ptr<const ValidPathInfo>(info));
|
||||
|
||||
if (narInfo) {
|
||||
if (!narInfo->url.empty()) jsonPath.attr("url", narInfo->url);
|
||||
if (!narInfo->url.empty()) {
|
||||
jsonPath.attr("url", narInfo->url);
|
||||
}
|
||||
if (narInfo->fileHash)
|
||||
jsonPath.attr("downloadHash", narInfo->fileHash.to_string());
|
||||
if (narInfo->fileSize)
|
||||
|
@ -506,7 +520,9 @@ std::pair<uint64_t, uint64_t> Store::getClosureSize(const Path& storePath) {
|
|||
totalNarSize += info->narSize;
|
||||
auto narInfo = std::dynamic_pointer_cast<const NarInfo>(
|
||||
std::shared_ptr<const ValidPathInfo>(info));
|
||||
if (narInfo) totalDownloadSize += narInfo->fileSize;
|
||||
if (narInfo) {
|
||||
totalDownloadSize += narInfo->fileSize;
|
||||
}
|
||||
}
|
||||
return {totalNarSize, totalDownloadSize};
|
||||
}
|
||||
|
@ -521,9 +537,13 @@ const Store::Stats& Store::getStats() {
|
|||
|
||||
void Store::buildPaths(const PathSet& paths, BuildMode buildMode) {
|
||||
for (auto& path : paths)
|
||||
if (isDerivation(path)) unsupported("buildPaths");
|
||||
if (isDerivation(path)) {
|
||||
unsupported("buildPaths");
|
||||
}
|
||||
|
||||
if (queryValidPaths(paths).size() != paths.size()) unsupported("buildPaths");
|
||||
if (queryValidPaths(paths).size() != paths.size()) {
|
||||
unsupported("buildPaths");
|
||||
}
|
||||
}
|
||||
|
||||
void copyStorePath(ref<Store> srcStore, ref<Store> dstStore,
|
||||
|
@ -552,8 +572,12 @@ void copyStorePath(ref<Store> srcStore, ref<Store> dstStore,
|
|||
srcStore->narFromPath({storePath}, sink);
|
||||
auto info2 = make_ref<ValidPathInfo>(*info);
|
||||
info2->narHash = hashString(htSHA256, *sink.s);
|
||||
if (!info->narSize) info2->narSize = sink.s->size();
|
||||
if (info->ultimate) info2->ultimate = false;
|
||||
if (!info->narSize) {
|
||||
info2->narSize = sink.s->size();
|
||||
}
|
||||
if (info->ultimate) {
|
||||
info2->ultimate = false;
|
||||
}
|
||||
info = info2;
|
||||
|
||||
StringSource source(*sink.s);
|
||||
|
@ -590,9 +614,13 @@ void copyPaths(ref<Store> srcStore, ref<Store> dstStore,
|
|||
|
||||
PathSet missing;
|
||||
for (auto& path : storePaths)
|
||||
if (!valid.count(path)) missing.insert(path);
|
||||
if (!valid.count(path)) {
|
||||
missing.insert(path);
|
||||
}
|
||||
|
||||
if (missing.empty()) return;
|
||||
if (missing.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
LOG(INFO) << "copying " << missing.size() << " paths";
|
||||
|
||||
|
@ -628,7 +656,9 @@ void copyPaths(ref<Store> srcStore, ref<Store> dstStore,
|
|||
copyStorePath(srcStore, dstStore, storePath, repair, checkSigs);
|
||||
} catch (Error& e) {
|
||||
nrFailed++;
|
||||
if (!settings.keepGoing) throw e;
|
||||
if (!settings.keepGoing) {
|
||||
throw e;
|
||||
}
|
||||
LOG(ERROR) << "could not copy " << storePath << ": " << e.what();
|
||||
return;
|
||||
}
|
||||
|
@ -658,25 +688,33 @@ ValidPathInfo decodeValidPathInfo(std::istream& str, bool hashGiven) {
|
|||
getline(str, s);
|
||||
info.narHash = Hash(s, htSHA256);
|
||||
getline(str, s);
|
||||
if (!string2Int(s, info.narSize)) throw Error("number expected");
|
||||
if (!string2Int(s, info.narSize)) {
|
||||
throw Error("number expected");
|
||||
}
|
||||
}
|
||||
getline(str, info.deriver);
|
||||
string s;
|
||||
int n;
|
||||
getline(str, s);
|
||||
if (!string2Int(s, n)) throw Error("number expected");
|
||||
if (!string2Int(s, n)) {
|
||||
throw Error("number expected");
|
||||
}
|
||||
while (n--) {
|
||||
getline(str, s);
|
||||
info.references.insert(s);
|
||||
}
|
||||
if (!str || str.eof()) throw Error("missing input");
|
||||
if (!str || str.eof()) {
|
||||
throw Error("missing input");
|
||||
}
|
||||
return info;
|
||||
}
|
||||
|
||||
string showPaths(const PathSet& paths) {
|
||||
string s;
|
||||
for (auto& i : paths) {
|
||||
if (s.size() != 0) s += ", ";
|
||||
if (s.size() != 0) {
|
||||
s += ", ";
|
||||
}
|
||||
s += "'" + i + "'";
|
||||
}
|
||||
return s;
|
||||
|
@ -725,11 +763,15 @@ bool ValidPathInfo::isContentAddressed(const Store& store) const {
|
|||
|
||||
size_t ValidPathInfo::checkSignatures(const Store& store,
|
||||
const PublicKeys& publicKeys) const {
|
||||
if (isContentAddressed(store)) return maxSigs;
|
||||
if (isContentAddressed(store)) {
|
||||
return maxSigs;
|
||||
}
|
||||
|
||||
size_t good = 0;
|
||||
for (auto& sig : sigs)
|
||||
if (checkSignature(publicKeys, sig)) good++;
|
||||
if (checkSignature(publicKeys, sig)) {
|
||||
good++;
|
||||
}
|
||||
return good;
|
||||
}
|
||||
|
||||
|
@ -848,7 +890,9 @@ static RegisterStoreImplementation regStore([](const std::string& uri,
|
|||
return std::shared_ptr<Store>(std::make_shared<UDSRemoteStore>(params));
|
||||
case tLocal: {
|
||||
Store::Params params2 = params;
|
||||
if (hasPrefix(uri, "/")) params2["root"] = uri;
|
||||
if (hasPrefix(uri, "/")) {
|
||||
params2["root"] = uri;
|
||||
}
|
||||
return std::shared_ptr<Store>(std::make_shared<LocalStore>(params2));
|
||||
}
|
||||
default:
|
||||
|
@ -863,7 +907,9 @@ std::list<ref<Store>> getDefaultSubstituters() {
|
|||
StringSet done;
|
||||
|
||||
auto addStore = [&](const std::string& uri) {
|
||||
if (done.count(uri)) return;
|
||||
if (done.count(uri)) {
|
||||
return;
|
||||
}
|
||||
done.insert(uri);
|
||||
try {
|
||||
stores.push_back(openStore(uri));
|
||||
|
|
4
third_party/nix/src/libstore/store-api.hh
vendored
4
third_party/nix/src/libstore/store-api.hh
vendored
|
@ -747,7 +747,9 @@ struct RegisterStoreImplementation {
|
|||
static Implementations* implementations;
|
||||
|
||||
RegisterStoreImplementation(OpenStore fun) {
|
||||
if (!implementations) implementations = new Implementations;
|
||||
if (!implementations) {
|
||||
implementations = new Implementations;
|
||||
}
|
||||
implementations->push_back(fun);
|
||||
}
|
||||
};
|
||||
|
|
36
third_party/nix/src/libutil/archive.cc
vendored
36
third_party/nix/src/libutil/archive.cc
vendored
|
@ -46,7 +46,9 @@ static void dumpContents(const Path& path, size_t size, Sink& sink) {
|
|||
sink << "contents" << size;
|
||||
|
||||
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC);
|
||||
if (!fd) throw SysError(format("opening file '%1%'") % path);
|
||||
if (!fd) {
|
||||
throw SysError(format("opening file '%1%'") % path);
|
||||
}
|
||||
|
||||
std::vector<unsigned char> buf(65536);
|
||||
size_t left = size;
|
||||
|
@ -162,7 +164,9 @@ static void parseContents(ParseSink& sink, Source& source, const Path& path) {
|
|||
while (left) {
|
||||
checkInterrupt();
|
||||
auto n = buf.size();
|
||||
if ((unsigned long long)n > left) n = left;
|
||||
if ((unsigned long long)n > left) {
|
||||
n = left;
|
||||
}
|
||||
source(buf.data(), n);
|
||||
sink.receiveContents(buf.data(), n);
|
||||
left -= n;
|
||||
|
@ -181,7 +185,9 @@ static void parse(ParseSink& sink, Source& source, const Path& path) {
|
|||
string s;
|
||||
|
||||
s = readString(source);
|
||||
if (s != "(") throw badArchive("expected open tag");
|
||||
if (s != "(") {
|
||||
throw badArchive("expected open tag");
|
||||
}
|
||||
|
||||
enum { tpUnknown, tpRegular, tpDirectory, tpSymlink } type = tpUnknown;
|
||||
|
||||
|
@ -197,7 +203,9 @@ static void parse(ParseSink& sink, Source& source, const Path& path) {
|
|||
}
|
||||
|
||||
else if (s == "type") {
|
||||
if (type != tpUnknown) throw badArchive("multiple type fields");
|
||||
if (type != tpUnknown) {
|
||||
throw badArchive("multiple type fields");
|
||||
}
|
||||
string t = readString(source);
|
||||
|
||||
if (t == "regular") {
|
||||
|
@ -225,7 +233,9 @@ static void parse(ParseSink& sink, Source& source, const Path& path) {
|
|||
|
||||
else if (s == "executable" && type == tpRegular) {
|
||||
auto s = readString(source);
|
||||
if (s != "") throw badArchive("executable marker has non-empty value");
|
||||
if (s != "") {
|
||||
throw badArchive("executable marker has non-empty value");
|
||||
}
|
||||
sink.isExecutable();
|
||||
}
|
||||
|
||||
|
@ -233,7 +243,9 @@ static void parse(ParseSink& sink, Source& source, const Path& path) {
|
|||
string name, prevName;
|
||||
|
||||
s = readString(source);
|
||||
if (s != "(") throw badArchive("expected open tag");
|
||||
if (s != "(") {
|
||||
throw badArchive("expected open tag");
|
||||
}
|
||||
|
||||
while (1) {
|
||||
checkInterrupt();
|
||||
|
@ -248,7 +260,9 @@ static void parse(ParseSink& sink, Source& source, const Path& path) {
|
|||
name.find('/') != string::npos ||
|
||||
name.find((char)0) != string::npos)
|
||||
throw Error(format("NAR contains invalid file name '%1%'") % name);
|
||||
if (name <= prevName) throw Error("NAR directory is not sorted");
|
||||
if (name <= prevName) {
|
||||
throw Error("NAR directory is not sorted");
|
||||
}
|
||||
prevName = name;
|
||||
if (archiveSettings.useCaseHack) {
|
||||
auto i = names.find(name);
|
||||
|
@ -306,12 +320,16 @@ struct RestoreSink : ParseSink {
|
|||
void createRegularFile(const Path& path) {
|
||||
Path p = dstPath + path;
|
||||
fd = open(p.c_str(), O_CREAT | O_EXCL | O_WRONLY | O_CLOEXEC, 0666);
|
||||
if (!fd) throw SysError(format("creating file '%1%'") % p);
|
||||
if (!fd) {
|
||||
throw SysError(format("creating file '%1%'") % p);
|
||||
}
|
||||
}
|
||||
|
||||
void isExecutable() {
|
||||
struct stat st;
|
||||
if (fstat(fd.get(), &st) == -1) throw SysError("fstat");
|
||||
if (fstat(fd.get(), &st) == -1) {
|
||||
throw SysError("fstat");
|
||||
}
|
||||
if (fchmod(fd.get(), st.st_mode | (S_IXUSR | S_IXGRP | S_IXOTH)) == -1)
|
||||
throw SysError("fchmod");
|
||||
}
|
||||
|
|
40
third_party/nix/src/libutil/args.cc
vendored
40
third_party/nix/src/libutil/args.cc
vendored
|
@ -9,7 +9,9 @@ Args::FlagMaker Args::mkFlag() { return FlagMaker(*this); }
|
|||
Args::FlagMaker::~FlagMaker() {
|
||||
assert(flag->longName != "");
|
||||
args.longFlags[flag->longName] = flag;
|
||||
if (flag->shortName) args.shortFlags[flag->shortName] = flag;
|
||||
if (flag->shortName) {
|
||||
args.shortFlags[flag->shortName] = flag;
|
||||
}
|
||||
}
|
||||
|
||||
void Args::parseCmdline(const Strings& _cmdline) {
|
||||
|
@ -46,7 +48,9 @@ void Args::parseCmdline(const Strings& _cmdline) {
|
|||
throw UsageError(format("unrecognised flag '%1%'") % arg);
|
||||
} else {
|
||||
pendingArgs.push_back(*pos++);
|
||||
if (processArgs(pendingArgs, false)) pendingArgs.clear();
|
||||
if (processArgs(pendingArgs, false)) {
|
||||
pendingArgs.clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -58,13 +62,19 @@ void Args::printHelp(const string& programName, std::ostream& out) {
|
|||
for (auto& exp : expectedArgs) {
|
||||
std::cout << renderLabels({exp.label});
|
||||
// FIXME: handle arity > 1
|
||||
if (exp.arity == 0) std::cout << "...";
|
||||
if (exp.optional) std::cout << "?";
|
||||
if (exp.arity == 0) {
|
||||
std::cout << "...";
|
||||
}
|
||||
if (exp.optional) {
|
||||
std::cout << "?";
|
||||
}
|
||||
}
|
||||
std::cout << "\n";
|
||||
|
||||
auto s = description();
|
||||
if (s != "") std::cout << "\nSummary: " << s << ".\n";
|
||||
if (s != "") {
|
||||
std::cout << "\nSummary: " << s << ".\n";
|
||||
}
|
||||
|
||||
if (longFlags.size()) {
|
||||
std::cout << "\n";
|
||||
|
@ -76,7 +86,9 @@ void Args::printHelp(const string& programName, std::ostream& out) {
|
|||
void Args::printFlags(std::ostream& out) {
|
||||
Table2 table;
|
||||
for (auto& flag : longFlags) {
|
||||
if (hiddenCategories.count(flag.second->category)) continue;
|
||||
if (hiddenCategories.count(flag.second->category)) {
|
||||
continue;
|
||||
}
|
||||
table.push_back(std::make_pair(
|
||||
(flag.second->shortName
|
||||
? std::string("-") + flag.second->shortName + ", "
|
||||
|
@ -95,7 +107,9 @@ bool Args::processFlag(Strings::iterator& pos, Strings::iterator end) {
|
|||
std::vector<std::string> args;
|
||||
for (size_t n = 0; n < flag.arity; ++n) {
|
||||
if (pos == end) {
|
||||
if (flag.arity == ArityAny) break;
|
||||
if (flag.arity == ArityAny) {
|
||||
break;
|
||||
}
|
||||
throw UsageError(format("flag '%1%' requires %2% argument(s)") % name %
|
||||
flag.arity);
|
||||
}
|
||||
|
@ -107,14 +121,18 @@ bool Args::processFlag(Strings::iterator& pos, Strings::iterator end) {
|
|||
|
||||
if (string(*pos, 0, 2) == "--") {
|
||||
auto i = longFlags.find(string(*pos, 2));
|
||||
if (i == longFlags.end()) return false;
|
||||
if (i == longFlags.end()) {
|
||||
return false;
|
||||
}
|
||||
return process("--" + i->first, *i->second);
|
||||
}
|
||||
|
||||
if (string(*pos, 0, 1) == "-" && pos->size() == 2) {
|
||||
auto c = (*pos)[1];
|
||||
auto i = shortFlags.find(c);
|
||||
if (i == shortFlags.end()) return false;
|
||||
if (i == shortFlags.end()) {
|
||||
return false;
|
||||
}
|
||||
return process(std::string("-") + c, *i->second);
|
||||
}
|
||||
|
||||
|
@ -153,7 +171,9 @@ Args::FlagMaker& Args::FlagMaker::mkHashTypeFlag(HashType* ht) {
|
|||
description("hash algorithm ('md5', 'sha1', 'sha256', or 'sha512')");
|
||||
handler([ht](std::string s) {
|
||||
*ht = parseHashType(s);
|
||||
if (*ht == htUnknown) throw UsageError("unknown hash type '%1%'", s);
|
||||
if (*ht == htUnknown) {
|
||||
throw UsageError("unknown hash type '%1%'", s);
|
||||
}
|
||||
});
|
||||
return *this;
|
||||
}
|
||||
|
|
12
third_party/nix/src/libutil/compression.cc
vendored
12
third_party/nix/src/libutil/compression.cc
vendored
|
@ -138,7 +138,9 @@ struct BrotliDecompressionSink : ChunkedCompressionSink {
|
|||
|
||||
BrotliDecompressionSink(Sink& nextSink) : nextSink(nextSink) {
|
||||
state = BrotliDecoderCreateInstance(nullptr, nullptr, nullptr);
|
||||
if (!state) throw CompressionError("unable to initialize brotli decoder");
|
||||
if (!state) {
|
||||
throw CompressionError("unable to initialize brotli decoder");
|
||||
}
|
||||
}
|
||||
|
||||
~BrotliDecompressionSink() { BrotliDecoderDestroyInstance(state); }
|
||||
|
@ -214,7 +216,9 @@ struct XzCompressionSink : CompressionSink {
|
|||
mt_options.check = LZMA_CHECK_CRC64;
|
||||
mt_options.threads = lzma_cputhreads();
|
||||
mt_options.block_size = 0;
|
||||
if (mt_options.threads == 0) mt_options.threads = 1;
|
||||
if (mt_options.threads == 0) {
|
||||
mt_options.threads = 1;
|
||||
}
|
||||
// FIXME: maybe use lzma_stream_encoder_mt_memusage() to control the
|
||||
// number of threads.
|
||||
ret = lzma_stream_encoder_mt(&strm, &mt_options);
|
||||
|
@ -322,7 +326,9 @@ struct BrotliCompressionSink : ChunkedCompressionSink {
|
|||
|
||||
BrotliCompressionSink(Sink& nextSink) : nextSink(nextSink) {
|
||||
state = BrotliEncoderCreateInstance(nullptr, nullptr, nullptr);
|
||||
if (!state) throw CompressionError("unable to initialise brotli encoder");
|
||||
if (!state) {
|
||||
throw CompressionError("unable to initialise brotli encoder");
|
||||
}
|
||||
}
|
||||
|
||||
~BrotliCompressionSink() { BrotliEncoderDestroyInstance(state); }
|
||||
|
|
24
third_party/nix/src/libutil/config.cc
vendored
24
third_party/nix/src/libutil/config.cc
vendored
|
@ -11,7 +11,9 @@ namespace nix {
|
|||
|
||||
bool Config::set(const std::string& name, const std::string& value) {
|
||||
auto i = _settings.find(name);
|
||||
if (i == _settings.end()) return false;
|
||||
if (i == _settings.end()) {
|
||||
return false;
|
||||
}
|
||||
i->second.setting->set(value);
|
||||
i->second.setting->overriden = true;
|
||||
return true;
|
||||
|
@ -84,10 +86,14 @@ void AbstractConfig::applyConfigFile(const Path& path) {
|
|||
pos++;
|
||||
|
||||
string::size_type hash = line.find('#');
|
||||
if (hash != string::npos) line = string(line, 0, hash);
|
||||
if (hash != string::npos) {
|
||||
line = string(line, 0, hash);
|
||||
}
|
||||
|
||||
vector<string> tokens = tokenizeString<vector<string> >(line);
|
||||
if (tokens.empty()) continue;
|
||||
if (tokens.empty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (tokens.size() < 2)
|
||||
throw UsageError("illegal configuration line '%1%' in '%2%'", line,
|
||||
|
@ -147,7 +153,9 @@ void Config::toJSON(JSONObject& out) {
|
|||
|
||||
void Config::convertToArgs(Args& args, const std::string& category) {
|
||||
for (auto& s : _settings)
|
||||
if (!s.second.isAlias) s.second.setting->convertToArg(args, category);
|
||||
if (!s.second.isAlias) {
|
||||
s.second.setting->convertToArg(args, category);
|
||||
}
|
||||
}
|
||||
|
||||
AbstractSetting::AbstractSetting(const std::string& name,
|
||||
|
@ -284,7 +292,9 @@ void PathSetting::set(const std::string& str) {
|
|||
|
||||
bool GlobalConfig::set(const std::string& name, const std::string& value) {
|
||||
for (auto& config : *configRegistrations)
|
||||
if (config->set(name, value)) return true;
|
||||
if (config->set(name, value)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
unknownSettings.emplace(name, value);
|
||||
|
||||
|
@ -315,7 +325,9 @@ GlobalConfig globalConfig;
|
|||
GlobalConfig::ConfigRegistrations* GlobalConfig::configRegistrations;
|
||||
|
||||
GlobalConfig::Register::Register(Config* config) {
|
||||
if (!configRegistrations) configRegistrations = new ConfigRegistrations;
|
||||
if (!configRegistrations) {
|
||||
configRegistrations = new ConfigRegistrations;
|
||||
}
|
||||
configRegistrations->emplace_back(config);
|
||||
}
|
||||
|
||||
|
|
24
third_party/nix/src/libutil/hash.cc
vendored
24
third_party/nix/src/libutil/hash.cc
vendored
|
@ -139,7 +139,9 @@ Hash::Hash(const std::string& s, HashType type) : type(type) {
|
|||
if (sep != string::npos) {
|
||||
string hts = string(s, 0, sep);
|
||||
this->type = parseHashType(hts);
|
||||
if (this->type == htUnknown) throw BadHash("unknown hash type '%s'", hts);
|
||||
if (this->type == htUnknown) {
|
||||
throw BadHash("unknown hash type '%s'", hts);
|
||||
}
|
||||
if (type != htUnknown && type != this->type)
|
||||
throw BadHash("hash '%s' should have type '%s'", s, printHashType(type));
|
||||
pos = sep + 1;
|
||||
|
@ -174,8 +176,12 @@ Hash::Hash(const std::string& s, HashType type) : type(type) {
|
|||
char c = s[pos + size - n - 1];
|
||||
unsigned char digit;
|
||||
for (digit = 0; digit < base32Chars.size(); ++digit) /* !!! slow */
|
||||
if (base32Chars[digit] == c) break;
|
||||
if (digit >= 32) throw BadHash("invalid base-32 hash '%s'", s);
|
||||
if (base32Chars[digit] == c) {
|
||||
break;
|
||||
}
|
||||
if (digit >= 32) {
|
||||
throw BadHash("invalid base-32 hash '%s'", s);
|
||||
}
|
||||
unsigned int b = n * 5;
|
||||
unsigned int i = b / 8;
|
||||
unsigned int j = b % 8;
|
||||
|
@ -184,7 +190,9 @@ Hash::Hash(const std::string& s, HashType type) : type(type) {
|
|||
if (i < hashSize - 1) {
|
||||
hash[i + 1] |= digit >> (8 - j);
|
||||
} else {
|
||||
if (digit >> (8 - j)) throw BadHash("invalid base-32 hash '%s'", s);
|
||||
if (digit >> (8 - j)) {
|
||||
throw BadHash("invalid base-32 hash '%s'", s);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -258,13 +266,17 @@ Hash hashFile(HashType ht, const Path& path) {
|
|||
start(ht, ctx);
|
||||
|
||||
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC);
|
||||
if (!fd) throw SysError(format("opening file '%1%'") % path);
|
||||
if (!fd) {
|
||||
throw SysError(format("opening file '%1%'") % path);
|
||||
}
|
||||
|
||||
std::vector<unsigned char> buf(8192);
|
||||
ssize_t n;
|
||||
while ((n = read(fd.get(), buf.data(), buf.size()))) {
|
||||
checkInterrupt();
|
||||
if (n == -1) throw SysError(format("reading file '%1%'") % path);
|
||||
if (n == -1) {
|
||||
throw SysError(format("reading file '%1%'") % path);
|
||||
}
|
||||
update(ht, ctx, buf.data(), n);
|
||||
}
|
||||
|
||||
|
|
8
third_party/nix/src/libutil/json.cc
vendored
8
third_party/nix/src/libutil/json.cc
vendored
|
@ -91,7 +91,9 @@ JSONWriter::~JSONWriter() {
|
|||
if (state) {
|
||||
assertActive();
|
||||
state->stack--;
|
||||
if (state->stack == 0) delete state;
|
||||
if (state->stack == 0) {
|
||||
delete state;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -158,7 +160,9 @@ void JSONObject::attr(const std::string& s) {
|
|||
comma();
|
||||
toJSON(state->str, s);
|
||||
state->str << ':';
|
||||
if (state->indent) state->str << ' ';
|
||||
if (state->indent) {
|
||||
state->str << ' ';
|
||||
}
|
||||
}
|
||||
|
||||
JSONList JSONObject::list(const std::string& name) {
|
||||
|
|
4
third_party/nix/src/libutil/lazy.hh
vendored
4
third_party/nix/src/libutil/lazy.hh
vendored
|
@ -35,7 +35,9 @@ class Lazy {
|
|||
ex = std::current_exception();
|
||||
}
|
||||
});
|
||||
if (ex) std::rethrow_exception(ex);
|
||||
if (ex) {
|
||||
std::rethrow_exception(ex);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
};
|
||||
|
|
12
third_party/nix/src/libutil/lru-cache.hh
vendored
12
third_party/nix/src/libutil/lru-cache.hh
vendored
|
@ -31,7 +31,9 @@ class LRUCache {
|
|||
|
||||
/* Insert or upsert an item in the cache. */
|
||||
void upsert(const Key& key, const Value& value) {
|
||||
if (capacity == 0) return;
|
||||
if (capacity == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
erase(key);
|
||||
|
||||
|
@ -53,7 +55,9 @@ class LRUCache {
|
|||
|
||||
bool erase(const Key& key) {
|
||||
auto i = data.find(key);
|
||||
if (i == data.end()) return false;
|
||||
if (i == data.end()) {
|
||||
return false;
|
||||
}
|
||||
lru.erase(i->second.first.it);
|
||||
data.erase(i);
|
||||
return true;
|
||||
|
@ -63,7 +67,9 @@ class LRUCache {
|
|||
recently used item. */
|
||||
std::optional<Value> get(const Key& key) {
|
||||
auto i = data.find(key);
|
||||
if (i == data.end()) return {};
|
||||
if (i == data.end()) {
|
||||
return {};
|
||||
}
|
||||
|
||||
/* Move this item to the back of the LRU list. */
|
||||
lru.erase(i->second.first.it);
|
||||
|
|
8
third_party/nix/src/libutil/monitor-fd.hh
vendored
8
third_party/nix/src/libutil/monitor-fd.hh
vendored
|
@ -28,7 +28,9 @@ class MonitorFdHup {
|
|||
*/
|
||||
fds[0].events = POLLHUP;
|
||||
auto count = poll(fds, 1, -1);
|
||||
if (count == -1) abort(); // can't happen
|
||||
if (count == -1) {
|
||||
abort();
|
||||
} // can't happen
|
||||
/* This shouldn't happen, but can on macOS due to a bug.
|
||||
See rdar://37550628.
|
||||
|
||||
|
@ -36,7 +38,9 @@ class MonitorFdHup {
|
|||
coordination with the main thread if spinning proves
|
||||
too harmful.
|
||||
*/
|
||||
if (count == 0) continue;
|
||||
if (count == 0) {
|
||||
continue;
|
||||
}
|
||||
assert(fds[0].revents & POLLHUP);
|
||||
triggerInterrupt();
|
||||
break;
|
||||
|
|
12
third_party/nix/src/libutil/pool.hh
vendored
12
third_party/nix/src/libutil/pool.hh
vendored
|
@ -99,10 +99,14 @@ class Pool {
|
|||
Handle(const Handle& l) = delete;
|
||||
|
||||
~Handle() {
|
||||
if (!r) return;
|
||||
if (!r) {
|
||||
return;
|
||||
}
|
||||
{
|
||||
auto state_(pool.state.lock());
|
||||
if (!bad) state_->idle.push_back(ref<R>(r));
|
||||
if (!bad) {
|
||||
state_->idle.push_back(ref<R>(r));
|
||||
}
|
||||
assert(state_->inUse);
|
||||
state_->inUse--;
|
||||
}
|
||||
|
@ -160,7 +164,9 @@ class Pool {
|
|||
auto state_(state.lock());
|
||||
std::vector<ref<R>> left;
|
||||
for (auto& p : state_->idle)
|
||||
if (validator(p)) left.push_back(p);
|
||||
if (validator(p)) {
|
||||
left.push_back(p);
|
||||
}
|
||||
std::swap(state_->idle, left);
|
||||
}
|
||||
};
|
||||
|
|
8
third_party/nix/src/libutil/ref.hh
vendored
8
third_party/nix/src/libutil/ref.hh
vendored
|
@ -17,11 +17,15 @@ class ref {
|
|||
ref<T>(const ref<T>& r) : p(r.p) {}
|
||||
|
||||
explicit ref<T>(const std::shared_ptr<T>& p) : p(p) {
|
||||
if (!p) throw std::invalid_argument("null pointer cast to ref");
|
||||
if (!p) {
|
||||
throw std::invalid_argument("null pointer cast to ref");
|
||||
}
|
||||
}
|
||||
|
||||
explicit ref<T>(T* p) : p(p) {
|
||||
if (!p) throw std::invalid_argument("null pointer cast to ref");
|
||||
if (!p) {
|
||||
throw std::invalid_argument("null pointer cast to ref");
|
||||
}
|
||||
}
|
||||
|
||||
T* operator->() const { return &*p; }
|
||||
|
|
44
third_party/nix/src/libutil/serialise.cc
vendored
44
third_party/nix/src/libutil/serialise.cc
vendored
|
@ -11,7 +11,9 @@
|
|||
namespace nix {
|
||||
|
||||
void BufferedSink::operator()(const unsigned char* data, size_t len) {
|
||||
if (!buffer) buffer = decltype(buffer)(new unsigned char[bufSize]);
|
||||
if (!buffer) {
|
||||
buffer = decltype(buffer)(new unsigned char[bufSize]);
|
||||
}
|
||||
|
||||
while (len) {
|
||||
/* Optimisation: bypass the buffer if the data exceeds the
|
||||
|
@ -28,12 +30,16 @@ void BufferedSink::operator()(const unsigned char* data, size_t len) {
|
|||
data += n;
|
||||
bufPos += n;
|
||||
len -= n;
|
||||
if (bufPos == bufSize) flush();
|
||||
if (bufPos == bufSize) {
|
||||
flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void BufferedSink::flush() {
|
||||
if (bufPos == 0) return;
|
||||
if (bufPos == 0) {
|
||||
return;
|
||||
}
|
||||
size_t n = bufPos;
|
||||
bufPos = 0; // don't trigger the assert() in ~BufferedSink()
|
||||
write(buffer.get(), n);
|
||||
|
@ -97,15 +103,21 @@ std::string Source::drain() {
|
|||
}
|
||||
|
||||
size_t BufferedSource::read(unsigned char* data, size_t len) {
|
||||
if (!buffer) buffer = decltype(buffer)(new unsigned char[bufSize]);
|
||||
if (!buffer) {
|
||||
buffer = decltype(buffer)(new unsigned char[bufSize]);
|
||||
}
|
||||
|
||||
if (!bufPosIn) bufPosIn = readUnbuffered(buffer.get(), bufSize);
|
||||
if (!bufPosIn) {
|
||||
bufPosIn = readUnbuffered(buffer.get(), bufSize);
|
||||
}
|
||||
|
||||
/* Copy out the data in the buffer. */
|
||||
size_t n = len > bufPosIn - bufPosOut ? bufPosIn - bufPosOut : len;
|
||||
memcpy(data, buffer.get() + bufPosOut, n);
|
||||
bufPosOut += n;
|
||||
if (bufPosIn == bufPosOut) bufPosIn = bufPosOut = 0;
|
||||
if (bufPosIn == bufPosOut) {
|
||||
bufPosIn = bufPosOut = 0;
|
||||
}
|
||||
return n;
|
||||
}
|
||||
|
||||
|
@ -132,7 +144,9 @@ size_t FdSource::readUnbuffered(unsigned char* data, size_t len) {
|
|||
bool FdSource::good() { return _good; }
|
||||
|
||||
size_t StringSource::read(unsigned char* data, size_t len) {
|
||||
if (pos == s.size()) throw EndOfFile("end of string reached");
|
||||
if (pos == s.size()) {
|
||||
throw EndOfFile("end of string reached");
|
||||
}
|
||||
size_t n = s.copy((char*)data, len, pos);
|
||||
pos += n;
|
||||
return n;
|
||||
|
@ -162,7 +176,9 @@ std::unique_ptr<Source> sinkToSource(std::function<void(Sink&)> fun,
|
|||
if (!coro)
|
||||
coro = coro_t::pull_type([&](coro_t::push_type& yield) {
|
||||
LambdaSink sink([&](const unsigned char* data, size_t len) {
|
||||
if (len) yield(std::string((const char*)data, len));
|
||||
if (len) {
|
||||
yield(std::string((const char*)data, len));
|
||||
}
|
||||
});
|
||||
fun(sink);
|
||||
});
|
||||
|
@ -232,13 +248,17 @@ void readPadding(size_t len, Source& source) {
|
|||
size_t n = 8 - (len % 8);
|
||||
source(zero, n);
|
||||
for (unsigned int i = 0; i < n; i++)
|
||||
if (zero[i]) throw SerialisationError("non-zero padding");
|
||||
if (zero[i]) {
|
||||
throw SerialisationError("non-zero padding");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
size_t readString(unsigned char* buf, size_t max, Source& source) {
|
||||
auto len = readNum<size_t>(source);
|
||||
if (len > max) throw SerialisationError("string is too long");
|
||||
if (len > max) {
|
||||
throw SerialisationError("string is too long");
|
||||
}
|
||||
source(buf, len);
|
||||
readPadding(len, source);
|
||||
return len;
|
||||
|
@ -246,7 +266,9 @@ size_t readString(unsigned char* buf, size_t max, Source& source) {
|
|||
|
||||
string readString(Source& source, size_t max) {
|
||||
auto len = readNum<size_t>(source);
|
||||
if (len > max) throw SerialisationError("string is too long");
|
||||
if (len > max) {
|
||||
throw SerialisationError("string is too long");
|
||||
}
|
||||
std::string res(len, 0);
|
||||
source((unsigned char*)res.data(), len);
|
||||
readPadding(len, source);
|
||||
|
|
24
third_party/nix/src/libutil/thread-pool.cc
vendored
24
third_party/nix/src/libutil/thread-pool.cc
vendored
|
@ -10,7 +10,9 @@ ThreadPool::ThreadPool(size_t _maxThreads) : maxThreads(_maxThreads) {
|
|||
|
||||
if (!maxThreads) {
|
||||
maxThreads = std::thread::hardware_concurrency();
|
||||
if (!maxThreads) maxThreads = 1;
|
||||
if (!maxThreads) {
|
||||
maxThreads = 1;
|
||||
}
|
||||
}
|
||||
|
||||
DLOG(INFO) << "starting pool of " << maxThreads - 1 << " threads";
|
||||
|
@ -26,7 +28,9 @@ void ThreadPool::shutdown() {
|
|||
std::swap(workers, state->workers);
|
||||
}
|
||||
|
||||
if (workers.empty()) return;
|
||||
if (workers.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
DLOG(INFO) << "reaping " << workers.size() << " worker threads";
|
||||
|
||||
|
@ -62,7 +66,9 @@ void ThreadPool::process() {
|
|||
|
||||
assert(quit);
|
||||
|
||||
if (state->exception) std::rethrow_exception(state->exception);
|
||||
if (state->exception) {
|
||||
std::rethrow_exception(state->exception);
|
||||
}
|
||||
|
||||
} catch (...) {
|
||||
/* In the exceptional case, some workers may still be
|
||||
|
@ -76,7 +82,9 @@ void ThreadPool::process() {
|
|||
}
|
||||
|
||||
void ThreadPool::doWork(bool mainThread) {
|
||||
if (!mainThread) interruptCheck = [&]() { return (bool)quit; };
|
||||
if (!mainThread) {
|
||||
interruptCheck = [&]() { return (bool)quit; };
|
||||
}
|
||||
|
||||
bool didWork = false;
|
||||
std::exception_ptr exc;
|
||||
|
@ -114,9 +122,13 @@ void ThreadPool::doWork(bool mainThread) {
|
|||
/* Wait until a work item is available or we're asked to
|
||||
quit. */
|
||||
while (true) {
|
||||
if (quit) return;
|
||||
if (quit) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!state->pending.empty()) break;
|
||||
if (!state->pending.empty()) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* If there are no active or pending items, and the
|
||||
main thread is running process(), then no new items
|
||||
|
|
12
third_party/nix/src/libutil/thread-pool.hh
vendored
12
third_party/nix/src/libutil/thread-pool.hh
vendored
|
@ -78,7 +78,9 @@ void processGraph(ThreadPool& pool, const std::set<T>& nodes,
|
|||
{
|
||||
auto graph(graph_.lock());
|
||||
auto i = graph->refs.find(node);
|
||||
if (i == graph->refs.end()) goto getRefs;
|
||||
if (i == graph->refs.end()) {
|
||||
goto getRefs;
|
||||
}
|
||||
goto doWork;
|
||||
}
|
||||
|
||||
|
@ -93,7 +95,9 @@ void processGraph(ThreadPool& pool, const std::set<T>& nodes,
|
|||
graph->refs[node].insert(ref);
|
||||
graph->rrefs[ref].insert(node);
|
||||
}
|
||||
if (graph->refs[node].empty()) goto doWork;
|
||||
if (graph->refs[node].empty()) {
|
||||
goto doWork;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -111,7 +115,9 @@ void processGraph(ThreadPool& pool, const std::set<T>& nodes,
|
|||
auto i = refs.find(node);
|
||||
assert(i != refs.end());
|
||||
refs.erase(i);
|
||||
if (refs.empty()) pool.enqueue(std::bind(worker, rref));
|
||||
if (refs.empty()) {
|
||||
pool.enqueue(std::bind(worker, rref));
|
||||
}
|
||||
}
|
||||
graph->left.erase(node);
|
||||
graph->refs.erase(node);
|
||||
|
|
256
third_party/nix/src/libutil/util.cc
vendored
256
third_party/nix/src/libutil/util.cc
vendored
|
@ -107,7 +107,9 @@ Path canonPath(const Path& path, bool resolveSymlinks) {
|
|||
|
||||
string s;
|
||||
|
||||
if (path[0] != '/') throw Error(format("not an absolute path: '%1%'") % path);
|
||||
if (path[0] != '/') {
|
||||
throw Error(format("not an absolute path: '%1%'") % path);
|
||||
}
|
||||
|
||||
string::const_iterator i = path.begin(), end = path.end();
|
||||
string temp;
|
||||
|
@ -119,15 +121,21 @@ Path canonPath(const Path& path, bool resolveSymlinks) {
|
|||
while (1) {
|
||||
/* Skip slashes. */
|
||||
while (i != end && *i == '/') i++;
|
||||
if (i == end) break;
|
||||
if (i == end) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* Ignore `.'. */
|
||||
if (*i == '.' && (i + 1 == end || i[1] == '/')) i++;
|
||||
if (*i == '.' && (i + 1 == end || i[1] == '/')) {
|
||||
i++;
|
||||
}
|
||||
|
||||
/* If `..', delete the last component. */
|
||||
else if (*i == '.' && i + 1 < end && i[1] == '.' &&
|
||||
(i + 2 == end || i[2] == '/')) {
|
||||
if (!s.empty()) s.erase(s.rfind('/'));
|
||||
if (!s.empty()) {
|
||||
s.erase(s.rfind('/'));
|
||||
}
|
||||
i += 2;
|
||||
}
|
||||
|
||||
|
@ -155,15 +163,21 @@ Path canonPath(const Path& path, bool resolveSymlinks) {
|
|||
|
||||
Path dirOf(const Path& path) {
|
||||
Path::size_type pos = path.rfind('/');
|
||||
if (pos == string::npos) return ".";
|
||||
if (pos == string::npos) {
|
||||
return ".";
|
||||
}
|
||||
return pos == 0 ? "/" : Path(path, 0, pos);
|
||||
}
|
||||
|
||||
string baseNameOf(const Path& path) {
|
||||
if (path.empty()) return "";
|
||||
if (path.empty()) {
|
||||
return "";
|
||||
}
|
||||
|
||||
Path::size_type last = path.length() - 1;
|
||||
if (path[last] == '/' && last > 0) last -= 1;
|
||||
if (path[last] == '/' && last > 0) {
|
||||
last -= 1;
|
||||
}
|
||||
|
||||
Path::size_type pos = path.rfind('/', last);
|
||||
if (pos == string::npos)
|
||||
|
@ -228,13 +242,17 @@ DirEntries readDirectory(const Path& path) {
|
|||
entries.reserve(64);
|
||||
|
||||
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();
|
||||
string name = dirent->d_name;
|
||||
if (name == "." || name == "..") continue;
|
||||
if (name == "." || name == "..") {
|
||||
continue;
|
||||
}
|
||||
entries.emplace_back(name, dirent->d_ino,
|
||||
#ifdef HAVE_STRUCT_DIRENT_D_TYPE
|
||||
dirent->d_type
|
||||
|
@ -243,22 +261,32 @@ DirEntries readDirectory(const Path& path) {
|
|||
#endif
|
||||
);
|
||||
}
|
||||
if (errno) throw SysError(format("reading directory '%1%'") % path);
|
||||
if (errno) {
|
||||
throw SysError(format("reading directory '%1%'") % path);
|
||||
}
|
||||
|
||||
return entries;
|
||||
}
|
||||
|
||||
unsigned char getFileType(const Path& path) {
|
||||
struct stat st = lstat(path);
|
||||
if (S_ISDIR(st.st_mode)) return DT_DIR;
|
||||
if (S_ISLNK(st.st_mode)) return DT_LNK;
|
||||
if (S_ISREG(st.st_mode)) return DT_REG;
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
return DT_DIR;
|
||||
}
|
||||
if (S_ISLNK(st.st_mode)) {
|
||||
return DT_LNK;
|
||||
}
|
||||
if (S_ISREG(st.st_mode)) {
|
||||
return DT_REG;
|
||||
}
|
||||
return DT_UNKNOWN;
|
||||
}
|
||||
|
||||
string readFile(int fd) {
|
||||
struct stat st;
|
||||
if (fstat(fd, &st) == -1) throw SysError("statting file");
|
||||
if (fstat(fd, &st) == -1) {
|
||||
throw SysError("statting file");
|
||||
}
|
||||
|
||||
std::vector<unsigned char> buf(st.st_size);
|
||||
readFull(fd, buf.data(), st.st_size);
|
||||
|
@ -268,27 +296,35 @@ string readFile(int fd) {
|
|||
|
||||
string readFile(const Path& path, bool drain) {
|
||||
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC);
|
||||
if (!fd) throw SysError(format("opening file '%1%'") % path);
|
||||
if (!fd) {
|
||||
throw SysError(format("opening file '%1%'") % path);
|
||||
}
|
||||
return drain ? drainFD(fd.get()) : readFile(fd.get());
|
||||
}
|
||||
|
||||
void readFile(const Path& path, Sink& sink) {
|
||||
AutoCloseFD fd = open(path.c_str(), O_RDONLY | O_CLOEXEC);
|
||||
if (!fd) throw SysError("opening file '%s'", path);
|
||||
if (!fd) {
|
||||
throw SysError("opening file '%s'", path);
|
||||
}
|
||||
drainFD(fd.get(), sink);
|
||||
}
|
||||
|
||||
void writeFile(const Path& path, const string& s, mode_t mode) {
|
||||
AutoCloseFD fd =
|
||||
open(path.c_str(), O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, mode);
|
||||
if (!fd) throw SysError(format("opening file '%1%'") % path);
|
||||
if (!fd) {
|
||||
throw SysError(format("opening file '%1%'") % path);
|
||||
}
|
||||
writeFull(fd.get(), s);
|
||||
}
|
||||
|
||||
void writeFile(const Path& path, Source& source, mode_t mode) {
|
||||
AutoCloseFD fd =
|
||||
open(path.c_str(), O_WRONLY | O_TRUNC | O_CREAT | O_CLOEXEC, mode);
|
||||
if (!fd) throw SysError(format("opening file '%1%'") % path);
|
||||
if (!fd) {
|
||||
throw SysError(format("opening file '%1%'") % path);
|
||||
}
|
||||
|
||||
std::vector<unsigned char> buf(64 * 1024);
|
||||
|
||||
|
@ -310,11 +346,15 @@ string readLine(int fd) {
|
|||
// FIXME: inefficient
|
||||
ssize_t rd = read(fd, &ch, 1);
|
||||
if (rd == -1) {
|
||||
if (errno != EINTR) throw SysError("reading a line");
|
||||
if (errno != EINTR) {
|
||||
throw SysError("reading a line");
|
||||
}
|
||||
} else if (rd == 0)
|
||||
throw EndOfFile("unexpected EOF reading a line");
|
||||
else {
|
||||
if (ch == '\n') return s;
|
||||
if (ch == '\n') {
|
||||
return s;
|
||||
}
|
||||
s += ch;
|
||||
}
|
||||
}
|
||||
|
@ -330,11 +370,15 @@ static void _deletePath(const Path& path, unsigned long long& bytesFreed) {
|
|||
|
||||
struct stat st;
|
||||
if (lstat(path.c_str(), &st) == -1) {
|
||||
if (errno == ENOENT) return;
|
||||
if (errno == ENOENT) {
|
||||
return;
|
||||
}
|
||||
throw SysError(format("getting status of '%1%'") % path);
|
||||
}
|
||||
|
||||
if (!S_ISDIR(st.st_mode) && st.st_nlink == 1) bytesFreed += st.st_size;
|
||||
if (!S_ISDIR(st.st_mode) && st.st_nlink == 1) {
|
||||
bytesFreed += st.st_size;
|
||||
}
|
||||
|
||||
if (S_ISDIR(st.st_mode)) {
|
||||
/* Make the directory accessible. */
|
||||
|
@ -349,7 +393,9 @@ static void _deletePath(const Path& path, unsigned long long& bytesFreed) {
|
|||
}
|
||||
|
||||
if (remove(path.c_str()) == -1) {
|
||||
if (errno == ENOENT) return;
|
||||
if (errno == ENOENT) {
|
||||
return;
|
||||
}
|
||||
throw SysError(format("cannot unlink '%1%'") % path);
|
||||
}
|
||||
}
|
||||
|
@ -409,7 +455,9 @@ Path createTempDir(const Path& tmpRoot, const Path& prefix, bool includePid,
|
|||
std::string getUserName() {
|
||||
auto pw = getpwuid(geteuid());
|
||||
std::string name = pw ? pw->pw_name : getEnv("USER", "");
|
||||
if (name.empty()) throw Error("cannot figure out user name");
|
||||
if (name.empty()) {
|
||||
throw Error("cannot figure out user name");
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
|
@ -431,13 +479,17 @@ Path getHome() { return getHome2(); }
|
|||
|
||||
Path getCacheDir() {
|
||||
Path cacheDir = getEnv("XDG_CACHE_HOME");
|
||||
if (cacheDir.empty()) cacheDir = getHome() + "/.cache";
|
||||
if (cacheDir.empty()) {
|
||||
cacheDir = getHome() + "/.cache";
|
||||
}
|
||||
return cacheDir;
|
||||
}
|
||||
|
||||
Path getConfigDir() {
|
||||
Path configDir = getEnv("XDG_CONFIG_HOME");
|
||||
if (configDir.empty()) configDir = getHome() + "/.config";
|
||||
if (configDir.empty()) {
|
||||
configDir = getHome() + "/.config";
|
||||
}
|
||||
return configDir;
|
||||
}
|
||||
|
||||
|
@ -452,13 +504,17 @@ std::vector<Path> getConfigDirs() {
|
|||
|
||||
Path getDataDir() {
|
||||
Path dataDir = getEnv("XDG_DATA_HOME");
|
||||
if (dataDir.empty()) dataDir = getHome() + "/.local/share";
|
||||
if (dataDir.empty()) {
|
||||
dataDir = getHome() + "/.local/share";
|
||||
}
|
||||
return dataDir;
|
||||
}
|
||||
|
||||
Paths createDirs(const Path& path) {
|
||||
Paths created;
|
||||
if (path == "/") return created;
|
||||
if (path == "/") {
|
||||
return created;
|
||||
}
|
||||
|
||||
struct stat st;
|
||||
if (lstat(path.c_str(), &st) == -1) {
|
||||
|
@ -491,7 +547,9 @@ void replaceSymlink(const Path& target, const Path& link) {
|
|||
try {
|
||||
createSymlink(target, tmp);
|
||||
} catch (SysError& e) {
|
||||
if (e.errNo == EEXIST) continue;
|
||||
if (e.errNo == EEXIST) {
|
||||
continue;
|
||||
}
|
||||
throw;
|
||||
}
|
||||
|
||||
|
@ -507,10 +565,14 @@ void readFull(int fd, unsigned char* buf, size_t count) {
|
|||
checkInterrupt();
|
||||
ssize_t res = read(fd, (char*)buf, count);
|
||||
if (res == -1) {
|
||||
if (errno == EINTR) continue;
|
||||
if (errno == EINTR) {
|
||||
continue;
|
||||
}
|
||||
throw SysError("reading from file");
|
||||
}
|
||||
if (res == 0) throw EndOfFile("unexpected end-of-file");
|
||||
if (res == 0) {
|
||||
throw EndOfFile("unexpected end-of-file");
|
||||
}
|
||||
count -= res;
|
||||
buf += res;
|
||||
}
|
||||
|
@ -519,9 +581,13 @@ void readFull(int fd, unsigned char* buf, size_t count) {
|
|||
void writeFull(int fd, const unsigned char* buf, size_t count,
|
||||
bool allowInterrupts) {
|
||||
while (count) {
|
||||
if (allowInterrupts) checkInterrupt();
|
||||
if (allowInterrupts) {
|
||||
checkInterrupt();
|
||||
}
|
||||
ssize_t res = write(fd, (char*)buf, count);
|
||||
if (res == -1 && errno != EINTR) throw SysError("writing to file");
|
||||
if (res == -1 && errno != EINTR) {
|
||||
throw SysError("writing to file");
|
||||
}
|
||||
if (res > 0) {
|
||||
count -= res;
|
||||
buf += res;
|
||||
|
@ -560,8 +626,12 @@ void drainFD(int fd, Sink& sink, bool block) {
|
|||
checkInterrupt();
|
||||
ssize_t rd = read(fd, buf.data(), buf.size());
|
||||
if (rd == -1) {
|
||||
if (!block && (errno == EAGAIN || errno == EWOULDBLOCK)) break;
|
||||
if (errno != EINTR) throw SysError("reading from file");
|
||||
if (!block && (errno == EAGAIN || errno == EWOULDBLOCK)) {
|
||||
break;
|
||||
}
|
||||
if (errno != EINTR) {
|
||||
throw SysError("reading from file");
|
||||
}
|
||||
} else if (rd == 0)
|
||||
break;
|
||||
else
|
||||
|
@ -644,9 +714,13 @@ int AutoCloseFD::release() {
|
|||
void Pipe::create() {
|
||||
int fds[2];
|
||||
#if HAVE_PIPE2
|
||||
if (pipe2(fds, O_CLOEXEC) != 0) throw SysError("creating pipe");
|
||||
if (pipe2(fds, O_CLOEXEC) != 0) {
|
||||
throw SysError("creating pipe");
|
||||
}
|
||||
#else
|
||||
if (pipe(fds) != 0) throw SysError("creating pipe");
|
||||
if (pipe(fds) != 0) {
|
||||
throw SysError("creating pipe");
|
||||
}
|
||||
closeOnExec(fds[0]);
|
||||
closeOnExec(fds[1]);
|
||||
#endif
|
||||
|
@ -661,11 +735,15 @@ Pid::Pid() {}
|
|||
Pid::Pid(pid_t pid) : pid(pid) {}
|
||||
|
||||
Pid::~Pid() {
|
||||
if (pid != -1) kill();
|
||||
if (pid != -1) {
|
||||
kill();
|
||||
}
|
||||
}
|
||||
|
||||
void Pid::operator=(pid_t pid) {
|
||||
if (this->pid != -1 && this->pid != pid) kill();
|
||||
if (this->pid != -1 && this->pid != pid) {
|
||||
kill();
|
||||
}
|
||||
this->pid = pid;
|
||||
killSignal = SIGKILL; // reset signal to default
|
||||
}
|
||||
|
@ -744,11 +822,17 @@ void killUser(uid_t uid) {
|
|||
calling process. In the OSX libc, it's set to true,
|
||||
which means "follow POSIX", which we don't want here
|
||||
*/
|
||||
if (syscall(SYS_kill, -1, SIGKILL, false) == 0) break;
|
||||
if (syscall(SYS_kill, -1, SIGKILL, false) == 0) {
|
||||
break;
|
||||
}
|
||||
#else
|
||||
if (kill(-1, SIGKILL) == 0) break;
|
||||
if (kill(-1, SIGKILL) == 0) {
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
if (errno == ESRCH) break; /* no more processes */
|
||||
if (errno == ESRCH) {
|
||||
break;
|
||||
} /* no more processes */
|
||||
if (errno != EINTR)
|
||||
throw SysError(format("cannot kill processes for uid '%1%'") % uid);
|
||||
}
|
||||
|
@ -780,7 +864,9 @@ static pid_t doFork(bool allowVfork, std::function<void()> fun) {
|
|||
#else
|
||||
pid_t pid = fork();
|
||||
#endif
|
||||
if (pid != 0) return pid;
|
||||
if (pid != 0) {
|
||||
return pid;
|
||||
}
|
||||
fun();
|
||||
abort();
|
||||
}
|
||||
|
@ -808,7 +894,9 @@ pid_t startProcess(std::function<void()> fun, const ProcessOptions& options) {
|
|||
};
|
||||
|
||||
pid_t pid = doFork(options.allowVfork, wrapper);
|
||||
if (pid == -1) throw SysError("unable to fork");
|
||||
if (pid == -1) {
|
||||
throw SysError("unable to fork");
|
||||
}
|
||||
|
||||
return pid;
|
||||
}
|
||||
|
@ -866,19 +954,27 @@ void runProgram2(const RunOptions& options) {
|
|||
|
||||
/* Create a pipe. */
|
||||
Pipe out, in;
|
||||
if (options.standardOut) out.create();
|
||||
if (source) in.create();
|
||||
if (options.standardOut) {
|
||||
out.create();
|
||||
}
|
||||
if (source) {
|
||||
in.create();
|
||||
}
|
||||
|
||||
ProcessOptions processOptions;
|
||||
// vfork implies that the environment of the main process and the fork will
|
||||
// be shared (technically this is undefined, but in practice that's the
|
||||
// case), so we can't use it if we alter the environment
|
||||
if (options.environment) processOptions.allowVfork = false;
|
||||
if (options.environment) {
|
||||
processOptions.allowVfork = false;
|
||||
}
|
||||
|
||||
/* Fork. */
|
||||
Pid pid = startProcess(
|
||||
[&]() {
|
||||
if (options.environment) replaceEnv(*options.environment);
|
||||
if (options.environment) {
|
||||
replaceEnv(*options.environment);
|
||||
}
|
||||
if (options.standardOut &&
|
||||
dup2(out.writeSide.get(), STDOUT_FILENO) == -1)
|
||||
throw SysError("dupping stdout");
|
||||
|
@ -919,7 +1015,9 @@ void runProgram2(const RunOptions& options) {
|
|||
std::promise<void> promise;
|
||||
|
||||
Finally doJoin([&]() {
|
||||
if (writerThread.joinable()) writerThread.join();
|
||||
if (writerThread.joinable()) {
|
||||
writerThread.join();
|
||||
}
|
||||
});
|
||||
|
||||
if (source) {
|
||||
|
@ -944,13 +1042,17 @@ void runProgram2(const RunOptions& options) {
|
|||
});
|
||||
}
|
||||
|
||||
if (options.standardOut) drainFD(out.readSide.get(), *options.standardOut);
|
||||
if (options.standardOut) {
|
||||
drainFD(out.readSide.get(), *options.standardOut);
|
||||
}
|
||||
|
||||
/* Wait for the child to finish. */
|
||||
int status = pid.wait();
|
||||
|
||||
/* Wait for the writer thread to finish. */
|
||||
if (source) promise.get_future().get();
|
||||
if (source) {
|
||||
promise.get_future().get();
|
||||
}
|
||||
|
||||
if (status)
|
||||
throw ExecError(status, fmt("program '%1%' %2%", options.program,
|
||||
|
@ -975,7 +1077,9 @@ void closeMostFDs(const set<int>& exceptions) {
|
|||
int maxFD = 0;
|
||||
maxFD = sysconf(_SC_OPEN_MAX);
|
||||
for (int fd = 0; fd < maxFD; ++fd)
|
||||
if (!exceptions.count(fd)) close(fd); /* ignore result */
|
||||
if (!exceptions.count(fd)) {
|
||||
close(fd);
|
||||
} /* ignore result */
|
||||
}
|
||||
|
||||
void closeOnExec(int fd) {
|
||||
|
@ -1012,7 +1116,9 @@ C tokenizeString(const string& s, const string& separators) {
|
|||
string::size_type pos = s.find_first_not_of(separators, 0);
|
||||
while (pos != string::npos) {
|
||||
string::size_type end = s.find_first_of(separators, pos + 1);
|
||||
if (end == string::npos) end = s.size();
|
||||
if (end == string::npos) {
|
||||
end = s.size();
|
||||
}
|
||||
string token(s, pos, end - pos);
|
||||
result.insert(result.end(), token);
|
||||
pos = s.find_first_not_of(separators, end);
|
||||
|
@ -1028,7 +1134,9 @@ template vector<string> tokenizeString(const string& s,
|
|||
string concatStringsSep(const string& sep, const Strings& ss) {
|
||||
string s;
|
||||
for (auto& i : ss) {
|
||||
if (s.size() != 0) s += sep;
|
||||
if (s.size() != 0) {
|
||||
s += sep;
|
||||
}
|
||||
s += i;
|
||||
}
|
||||
return s;
|
||||
|
@ -1037,7 +1145,9 @@ string concatStringsSep(const string& sep, const Strings& ss) {
|
|||
string concatStringsSep(const string& sep, const StringSet& ss) {
|
||||
string s;
|
||||
for (auto& i : ss) {
|
||||
if (s.size() != 0) s += sep;
|
||||
if (s.size() != 0) {
|
||||
s += sep;
|
||||
}
|
||||
s += i;
|
||||
}
|
||||
return s;
|
||||
|
@ -1050,14 +1160,18 @@ string chomp(const string& s) {
|
|||
|
||||
string trim(const string& s, const string& whitespace) {
|
||||
auto i = s.find_first_not_of(whitespace);
|
||||
if (i == string::npos) return "";
|
||||
if (i == string::npos) {
|
||||
return "";
|
||||
}
|
||||
auto j = s.find_last_not_of(whitespace);
|
||||
return string(s, i, j == string::npos ? j : j - i + 1);
|
||||
}
|
||||
|
||||
string replaceStrings(const std::string& s, const std::string& from,
|
||||
const std::string& to) {
|
||||
if (from.empty()) return s;
|
||||
if (from.empty()) {
|
||||
return s;
|
||||
}
|
||||
string res = s;
|
||||
size_t pos = 0;
|
||||
while ((pos = res.find(from, pos)) != std::string::npos) {
|
||||
|
@ -1143,12 +1257,18 @@ std::string filterANSIEscapes(const std::string& s, bool filterAll,
|
|||
// eat intermediate bytes
|
||||
while (i != s.end() && *i >= 0x20 && *i <= 0x2f) e += *i++;
|
||||
// eat final byte
|
||||
if (i != s.end() && *i >= 0x40 && *i <= 0x7e) e += last = *i++;
|
||||
if (i != s.end() && *i >= 0x40 && *i <= 0x7e) {
|
||||
e += last = *i++;
|
||||
}
|
||||
} else {
|
||||
if (i != s.end() && *i >= 0x40 && *i <= 0x5f) e += *i++;
|
||||
if (i != s.end() && *i >= 0x40 && *i <= 0x5f) {
|
||||
e += *i++;
|
||||
}
|
||||
}
|
||||
|
||||
if (!filterAll && last == 'm') t += e;
|
||||
if (!filterAll && last == 'm') {
|
||||
t += e;
|
||||
}
|
||||
}
|
||||
|
||||
else if (*i == '\t') {
|
||||
|
@ -1190,7 +1310,9 @@ string base64Encode(const string& s) {
|
|||
}
|
||||
}
|
||||
|
||||
if (nbits) res.push_back(base64Chars[data << (6 - nbits) & 0x3f]);
|
||||
if (nbits) {
|
||||
res.push_back(base64Chars[data << (6 - nbits) & 0x3f]);
|
||||
}
|
||||
while (res.size() % 4) res.push_back('=');
|
||||
|
||||
return res;
|
||||
|
@ -1212,11 +1334,17 @@ string base64Decode(const string& s) {
|
|||
unsigned int d = 0, bits = 0;
|
||||
|
||||
for (char c : s) {
|
||||
if (c == '=') break;
|
||||
if (c == '\n') continue;
|
||||
if (c == '=') {
|
||||
break;
|
||||
}
|
||||
if (c == '\n') {
|
||||
continue;
|
||||
}
|
||||
|
||||
char digit = decode[(unsigned char)c];
|
||||
if (digit == -1) throw Error("invalid character in Base64 string");
|
||||
if (digit == -1) {
|
||||
throw Error("invalid character in Base64 string");
|
||||
}
|
||||
|
||||
bits += 6;
|
||||
d = d << 6 | digit;
|
||||
|
|
4
third_party/nix/src/libutil/util.hh
vendored
4
third_party/nix/src/libutil/util.hh
vendored
|
@ -416,7 +416,9 @@ class Callback {
|
|||
|
||||
Callback(Callback&& callback) : fun(std::move(callback.fun)) {
|
||||
auto prev = callback.done.test_and_set();
|
||||
if (prev) done.test_and_set();
|
||||
if (prev) {
|
||||
done.test_and_set();
|
||||
}
|
||||
}
|
||||
|
||||
void operator()(T&& t) noexcept {
|
||||
|
|
16
third_party/nix/src/libutil/xml-writer.cc
vendored
16
third_party/nix/src/libutil/xml-writer.cc
vendored
|
@ -33,7 +33,9 @@ void XMLWriter::openElement(const string& name, const XMLAttrs& attrs) {
|
|||
output << "<" << name;
|
||||
writeAttrs(attrs);
|
||||
output << ">";
|
||||
if (indent) output << std::endl;
|
||||
if (indent) {
|
||||
output << std::endl;
|
||||
}
|
||||
pendingElems.push_back(name);
|
||||
}
|
||||
|
||||
|
@ -41,9 +43,13 @@ void XMLWriter::closeElement() {
|
|||
assert(!pendingElems.empty());
|
||||
indent_(pendingElems.size() - 1);
|
||||
output << "</" << pendingElems.back() << ">";
|
||||
if (indent) output << std::endl;
|
||||
if (indent) {
|
||||
output << std::endl;
|
||||
}
|
||||
pendingElems.pop_back();
|
||||
if (pendingElems.empty()) closed = true;
|
||||
if (pendingElems.empty()) {
|
||||
closed = true;
|
||||
}
|
||||
}
|
||||
|
||||
void XMLWriter::writeEmptyElement(const string& name, const XMLAttrs& attrs) {
|
||||
|
@ -52,7 +58,9 @@ void XMLWriter::writeEmptyElement(const string& name, const XMLAttrs& attrs) {
|
|||
output << "<" << name;
|
||||
writeAttrs(attrs);
|
||||
output << " />";
|
||||
if (indent) output << std::endl;
|
||||
if (indent) {
|
||||
output << std::endl;
|
||||
}
|
||||
}
|
||||
|
||||
void XMLWriter::writeAttrs(const XMLAttrs& attrs) {
|
||||
|
|
40
third_party/nix/src/nix-build/nix-build.cc
vendored
40
third_party/nix/src/nix-build/nix-build.cc
vendored
|
@ -62,7 +62,9 @@ std::vector<string> shellwords(const string& s) {
|
|||
}
|
||||
}
|
||||
cur.append(begin, it);
|
||||
if (!cur.empty()) res.push_back(cur);
|
||||
if (!cur.empty()) {
|
||||
res.push_back(cur);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
|
@ -172,7 +174,9 @@ static void _main(int argc, char** argv) {
|
|||
runEnv = true;
|
||||
|
||||
else if (*arg == "--command" || *arg == "--run") {
|
||||
if (*arg == "--run") interactive = false;
|
||||
if (*arg == "--run") {
|
||||
interactive = false;
|
||||
}
|
||||
envCommand = getArg(*arg, arg, end) + "\nexit";
|
||||
}
|
||||
|
||||
|
@ -261,11 +265,17 @@ static void _main(int argc, char** argv) {
|
|||
fromArgs = true;
|
||||
left = {joined.str()};
|
||||
} else if (!fromArgs) {
|
||||
if (left.empty() && runEnv && pathExists("shell.nix")) left = {"shell.nix"};
|
||||
if (left.empty()) left = {"default.nix"};
|
||||
if (left.empty() && runEnv && pathExists("shell.nix")) {
|
||||
left = {"shell.nix"};
|
||||
}
|
||||
if (left.empty()) {
|
||||
left = {"default.nix"};
|
||||
}
|
||||
}
|
||||
|
||||
if (runEnv) setenv("IN_NIX_SHELL", pure ? "pure" : "impure", 1);
|
||||
if (runEnv) {
|
||||
setenv("IN_NIX_SHELL", pure ? "pure" : "impure", 1);
|
||||
}
|
||||
|
||||
DrvInfos drvs;
|
||||
|
||||
|
@ -299,7 +309,9 @@ static void _main(int argc, char** argv) {
|
|||
}
|
||||
|
||||
/* Evaluate them into derivations. */
|
||||
if (attrPaths.empty()) attrPaths = {""};
|
||||
if (attrPaths.empty()) {
|
||||
attrPaths = {""};
|
||||
}
|
||||
|
||||
for (auto e : exprs) {
|
||||
Value vRoot;
|
||||
|
@ -326,7 +338,9 @@ static void _main(int argc, char** argv) {
|
|||
printMissing(ref<Store>(store), willBuild, willSubstitute, unknown,
|
||||
downloadSize, narSize);
|
||||
|
||||
if (!dryRun) store->buildPaths(paths, buildMode);
|
||||
if (!dryRun) {
|
||||
store->buildPaths(paths, buildMode);
|
||||
}
|
||||
};
|
||||
|
||||
if (runEnv) {
|
||||
|
@ -391,7 +405,9 @@ static void _main(int argc, char** argv) {
|
|||
if (pure) {
|
||||
decltype(env) newEnv;
|
||||
for (auto& i : env)
|
||||
if (keepVars.count(i.first)) newEnv.emplace(i);
|
||||
if (keepVars.count(i.first)) {
|
||||
newEnv.emplace(i);
|
||||
}
|
||||
env = newEnv;
|
||||
// NixOS hack: prevent /etc/bashrc from sourcing /etc/profile.
|
||||
env["__ETC_PROFILE_SOURCED"] = "1";
|
||||
|
@ -490,12 +506,16 @@ static void _main(int argc, char** argv) {
|
|||
drvPrefix = i->second;
|
||||
else {
|
||||
drvPrefix = outLink;
|
||||
if (drvPrefixes.size()) drvPrefix += fmt("-%d", drvPrefixes.size() + 1);
|
||||
if (drvPrefixes.size()) {
|
||||
drvPrefix += fmt("-%d", drvPrefixes.size() + 1);
|
||||
}
|
||||
drvPrefixes[drvPath] = drvPrefix;
|
||||
}
|
||||
|
||||
std::string symlink = drvPrefix;
|
||||
if (outputName != "out") symlink += "-" + outputName;
|
||||
if (outputName != "out") {
|
||||
symlink += "-" + outputName;
|
||||
}
|
||||
|
||||
resultSymlinks[symlink] = outPath;
|
||||
outPaths.push_back(outPath);
|
||||
|
|
12
third_party/nix/src/nix-channel/nix-channel.cc
vendored
12
third_party/nix/src/nix-channel/nix-channel.cc
vendored
|
@ -26,7 +26,9 @@ static void readChannels() {
|
|||
for (const auto& line :
|
||||
tokenizeString<std::vector<string>>(channelsFile, "\n")) {
|
||||
chomp(line);
|
||||
if (std::regex_search(line, std::regex("^\\s*\\#"))) continue;
|
||||
if (std::regex_search(line, std::regex("^\\s*\\#"))) {
|
||||
continue;
|
||||
}
|
||||
auto split = tokenizeString<std::vector<string>>(line, " ");
|
||||
auto url = std::regex_replace(split[0], std::regex("/*$"), "");
|
||||
auto name = split.size() > 1 ? split[1] : baseNameOf(url);
|
||||
|
@ -80,7 +82,9 @@ static void update(const StringSet& channelNames) {
|
|||
for (const auto& channel : channels) {
|
||||
auto name = channel.first;
|
||||
auto url = channel.second;
|
||||
if (!(channelNames.empty() || channelNames.count(name))) continue;
|
||||
if (!(channelNames.empty() || channelNames.count(name))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// We want to download the url to a file to see if it's a tarball while also
|
||||
// checking if we got redirected in the process, so that we can grab the
|
||||
|
@ -225,7 +229,9 @@ static int _main(int argc, char** argv) {
|
|||
removeChannel(args[0]);
|
||||
break;
|
||||
case cList:
|
||||
if (!args.empty()) throw UsageError("'--list' expects no arguments");
|
||||
if (!args.empty()) {
|
||||
throw UsageError("'--list' expects no arguments");
|
||||
}
|
||||
readChannels();
|
||||
for (const auto& channel : channels)
|
||||
std::cout << channel.first << ' ' << channel.second << '\n';
|
||||
|
|
|
@ -19,7 +19,9 @@ bool dryRun = false;
|
|||
* impossible. */
|
||||
|
||||
void removeOldGenerations(std::string dir) {
|
||||
if (access(dir.c_str(), R_OK) != 0) return;
|
||||
if (access(dir.c_str(), R_OK) != 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
bool canWrite = access(dir.c_str(), W_OK) == 0;
|
||||
|
||||
|
@ -34,7 +36,9 @@ void removeOldGenerations(std::string dir) {
|
|||
try {
|
||||
link = readLink(path);
|
||||
} catch (SysError& e) {
|
||||
if (e.errNo == ENOENT) continue;
|
||||
if (e.errNo == ENOENT) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (link.find("link") != string::npos) {
|
||||
LOG(INFO) << "removing old generations of profile " << path;
|
||||
|
@ -79,7 +83,9 @@ static int _main(int argc, char** argv) {
|
|||
initPlugins();
|
||||
|
||||
auto profilesDir = settings.nixStateDir + "/profiles";
|
||||
if (removeOld) removeOldGenerations(profilesDir);
|
||||
if (removeOld) {
|
||||
removeOldGenerations(profilesDir);
|
||||
}
|
||||
|
||||
// Run the actual garbage collector.
|
||||
if (!dryRun) {
|
||||
|
|
|
@ -49,7 +49,9 @@ static int _main(int argc, char** argv) {
|
|||
|
||||
initPlugins();
|
||||
|
||||
if (sshHost.empty()) throw UsageError("no host name specified");
|
||||
if (sshHost.empty()) {
|
||||
throw UsageError("no host name specified");
|
||||
}
|
||||
|
||||
auto remoteUri = "ssh://" + sshHost + (gzip ? "?compress=true" : "");
|
||||
auto to = toMode ? openStore(remoteUri) : openStore();
|
||||
|
|
92
third_party/nix/src/nix-daemon/nix-daemon.cc
vendored
92
third_party/nix/src/nix-daemon/nix-daemon.cc
vendored
|
@ -42,12 +42,16 @@ static ssize_t splice(int fd_in, void* off_in, int fd_out, void* off_out,
|
|||
* syscall */
|
||||
std::vector<char> buf(8192);
|
||||
auto read_count = read(fd_in, buf.data(), buf.size());
|
||||
if (read_count == -1) return read_count;
|
||||
if (read_count == -1) {
|
||||
return read_count;
|
||||
}
|
||||
auto write_count = decltype(read_count)(0);
|
||||
while (write_count < read_count) {
|
||||
auto res =
|
||||
write(fd_out, buf.data() + write_count, read_count - write_count);
|
||||
if (res == -1) return res;
|
||||
if (res == -1) {
|
||||
return res;
|
||||
}
|
||||
write_count += res;
|
||||
}
|
||||
return read_count;
|
||||
|
@ -121,7 +125,9 @@ struct TunnelLogger {
|
|||
to << STDERR_LAST;
|
||||
} else {
|
||||
to << STDERR_ERROR << msg;
|
||||
if (status != 0) to << status;
|
||||
if (status != 0) {
|
||||
to << status;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -157,7 +163,9 @@ struct TunnelSource : BufferedSource {
|
|||
to << STDERR_READ << len;
|
||||
to.flush();
|
||||
size_t n = readString(data, len, from);
|
||||
if (n == 0) throw EndOfFile("unexpected end-of-file");
|
||||
if (n == 0) {
|
||||
throw EndOfFile("unexpected end-of-file");
|
||||
}
|
||||
return n;
|
||||
}
|
||||
};
|
||||
|
@ -309,10 +317,14 @@ static void performOp(TunnelLogger* logger, ref<Store> store, bool trusted,
|
|||
}
|
||||
|
||||
logger->startWork();
|
||||
if (!savedRegular.regular) throw Error("regular file expected");
|
||||
if (!savedRegular.regular) {
|
||||
throw Error("regular file expected");
|
||||
}
|
||||
|
||||
auto store2 = store.dynamic_pointer_cast<LocalStore>();
|
||||
if (!store2) throw Error("operation is only supported by LocalStore");
|
||||
if (!store2) {
|
||||
throw Error("operation is only supported by LocalStore");
|
||||
}
|
||||
|
||||
Path path = store2->addToStoreFromDump(
|
||||
recursive ? *savedNAR.data : savedRegular.s, baseName, recursive,
|
||||
|
@ -381,7 +393,9 @@ static void performOp(TunnelLogger* logger, ref<Store> store, bool trusted,
|
|||
readDerivation(from, *store, drv);
|
||||
BuildMode buildMode = (BuildMode)readInt(from);
|
||||
logger->startWork();
|
||||
if (!trusted) throw Error("you are not privileged to build derivations");
|
||||
if (!trusted) {
|
||||
throw Error("you are not privileged to build derivations");
|
||||
}
|
||||
auto res = store->buildDerivation(drvPath, drv, buildMode);
|
||||
logger->stopWork();
|
||||
to << res.status << res.errorMsg;
|
||||
|
@ -493,7 +507,9 @@ static void performOp(TunnelLogger* logger, ref<Store> store, bool trusted,
|
|||
auto& value(i.second);
|
||||
|
||||
auto setSubstituters = [&](Setting<Strings>& res) {
|
||||
if (name != res.name && res.aliases.count(name) == 0) return false;
|
||||
if (name != res.name && res.aliases.count(name) == 0) {
|
||||
return false;
|
||||
}
|
||||
StringSet trusted = settings.trustedSubstituters;
|
||||
for (auto& s : settings.substituters.get()) trusted.insert(s);
|
||||
Strings subs;
|
||||
|
@ -582,7 +598,9 @@ static void performOp(TunnelLogger* logger, ref<Store> store, bool trusted,
|
|||
}
|
||||
logger->stopWork();
|
||||
if (info) {
|
||||
if (GET_PROTOCOL_MINOR(clientVersion) >= 17) to << 1;
|
||||
if (GET_PROTOCOL_MINOR(clientVersion) >= 17) {
|
||||
to << 1;
|
||||
}
|
||||
to << info->deriver << info->narHash.to_string(Base16, false)
|
||||
<< info->references << info->registrationTime << info->narSize;
|
||||
if (GET_PROTOCOL_MINOR(clientVersion) >= 16) {
|
||||
|
@ -618,7 +636,9 @@ static void performOp(TunnelLogger* logger, ref<Store> store, bool trusted,
|
|||
Path path = readStorePath(*store, from);
|
||||
StringSet sigs = readStrings<StringSet>(from);
|
||||
logger->startWork();
|
||||
if (!trusted) throw Error("you are not privileged to add signatures");
|
||||
if (!trusted) {
|
||||
throw Error("you are not privileged to add signatures");
|
||||
}
|
||||
store->addSignatures(path, sigs);
|
||||
logger->stopWork();
|
||||
to << 1;
|
||||
|
@ -638,7 +658,9 @@ static void performOp(TunnelLogger* logger, ref<Store> store, bool trusted,
|
|||
ValidPathInfo info;
|
||||
info.path = readStorePath(*store, from);
|
||||
from >> info.deriver;
|
||||
if (!info.deriver.empty()) store->assertStorePath(info.deriver);
|
||||
if (!info.deriver.empty()) {
|
||||
store->assertStorePath(info.deriver);
|
||||
}
|
||||
info.narHash = Hash(readString(from), htSHA256);
|
||||
info.references = readStorePaths<PathSet>(*store, from);
|
||||
from >> info.registrationTime >> info.narSize >> info.ultimate;
|
||||
|
@ -695,12 +717,16 @@ static void processConnection(bool trusted, const std::string& userName,
|
|||
|
||||
/* Exchange the greeting. */
|
||||
unsigned int magic = readInt(from);
|
||||
if (magic != WORKER_MAGIC_1) throw Error("protocol mismatch");
|
||||
if (magic != WORKER_MAGIC_1) {
|
||||
throw Error("protocol mismatch");
|
||||
}
|
||||
to << WORKER_MAGIC_2 << PROTOCOL_VERSION;
|
||||
to.flush();
|
||||
unsigned int clientVersion = readInt(from);
|
||||
|
||||
if (clientVersion < 0x10a) throw Error("the Nix client version is too old");
|
||||
if (clientVersion < 0x10a) {
|
||||
throw Error("the Nix client version is too old");
|
||||
}
|
||||
|
||||
auto tunnelLogger = new TunnelLogger(clientVersion);
|
||||
// logger = tunnelLogger;
|
||||
|
@ -804,17 +830,27 @@ static void setSigChldAction(bool autoReap) {
|
|||
}
|
||||
|
||||
bool matchUser(const string& user, const string& group, const Strings& users) {
|
||||
if (find(users.begin(), users.end(), "*") != users.end()) return true;
|
||||
if (find(users.begin(), users.end(), "*") != users.end()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (find(users.begin(), users.end(), user) != users.end()) return true;
|
||||
if (find(users.begin(), users.end(), user) != users.end()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (auto& i : users)
|
||||
if (string(i, 0, 1) == "@") {
|
||||
if (group == string(i, 1)) return true;
|
||||
if (group == string(i, 1)) {
|
||||
return true;
|
||||
}
|
||||
struct group* gr = getgrnam(i.c_str() + 1);
|
||||
if (!gr) continue;
|
||||
if (!gr) {
|
||||
continue;
|
||||
}
|
||||
for (char** mem = gr->gr_mem; *mem; mem++)
|
||||
if (user == string(*mem)) return true;
|
||||
if (user == string(*mem)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -861,7 +897,9 @@ static PeerInfo getPeerInfo(int remote) {
|
|||
#define SD_LISTEN_FDS_START 3
|
||||
|
||||
static void daemonLoop(char** argv) {
|
||||
if (chdir("/") == -1) throw SysError("cannot change current directory");
|
||||
if (chdir("/") == -1) {
|
||||
throw SysError("cannot change current directory");
|
||||
}
|
||||
|
||||
/* Get rid of children automatically; don't let them become
|
||||
zombies. */
|
||||
|
@ -881,7 +919,9 @@ static void daemonLoop(char** argv) {
|
|||
else {
|
||||
/* Create and bind to a Unix domain socket. */
|
||||
fdSocket = socket(PF_UNIX, SOCK_STREAM, 0);
|
||||
if (!fdSocket) throw SysError("cannot create Unix domain socket");
|
||||
if (!fdSocket) {
|
||||
throw SysError("cannot create Unix domain socket");
|
||||
}
|
||||
|
||||
string socketPath = settings.nixDaemonSocketFile;
|
||||
|
||||
|
@ -931,7 +971,9 @@ static void daemonLoop(char** argv) {
|
|||
accept(fdSocket.get(), (struct sockaddr*)&remoteAddr, &remoteAddrLen);
|
||||
checkInterrupt();
|
||||
if (!remote) {
|
||||
if (errno == EINTR) continue;
|
||||
if (errno == EINTR) {
|
||||
continue;
|
||||
}
|
||||
throw SysError("accepting connection");
|
||||
}
|
||||
|
||||
|
@ -949,7 +991,9 @@ static void daemonLoop(char** argv) {
|
|||
Strings trustedUsers = settings.trustedUsers;
|
||||
Strings allowedUsers = settings.allowedUsers;
|
||||
|
||||
if (matchUser(user, group, trustedUsers)) trusted = true;
|
||||
if (matchUser(user, group, trustedUsers)) {
|
||||
trusted = true;
|
||||
}
|
||||
|
||||
if ((!trusted && !matchUser(user, group, allowedUsers)) ||
|
||||
group == settings.buildUsersGroup) {
|
||||
|
@ -1030,7 +1074,9 @@ static int _main(int argc, char** argv) {
|
|||
/* Forward on this connection to the real daemon */
|
||||
auto socketPath = settings.nixDaemonSocketFile;
|
||||
auto s = socket(PF_UNIX, SOCK_STREAM, 0);
|
||||
if (s == -1) throw SysError("creating Unix domain socket");
|
||||
if (s == -1) {
|
||||
throw SysError("creating Unix domain socket");
|
||||
}
|
||||
|
||||
auto socketDir = dirOf(socketPath);
|
||||
if (chdir(socketDir.c_str()) == -1)
|
||||
|
|
108
third_party/nix/src/nix-env/nix-env.cc
vendored
108
third_party/nix/src/nix-env/nix-env.cc
vendored
|
@ -93,7 +93,9 @@ static void getAllExprs(EvalState& state, const Path& path, StringSet& attrs,
|
|||
/* Ignore the manifest.nix used by profiles. This is
|
||||
necessary to prevent it from showing up in channels (which
|
||||
are implemented using profiles). */
|
||||
if (i == "manifest.nix") continue;
|
||||
if (i == "manifest.nix") {
|
||||
continue;
|
||||
}
|
||||
|
||||
Path path2 = path + "/" + i;
|
||||
|
||||
|
@ -136,7 +138,9 @@ static void loadSourceExpr(EvalState& state, const Path& path, Value& v) {
|
|||
if (stat(path.c_str(), &st) == -1)
|
||||
throw SysError(format("getting information about '%1%'") % path);
|
||||
|
||||
if (isNixExpr(path, st)) state.evalFile(path, v);
|
||||
if (isNixExpr(path, st)) {
|
||||
state.evalFile(path, v);
|
||||
}
|
||||
|
||||
/* The path is a directory. Put the Nix expressions in the
|
||||
directory in a set, with the file name of each expression as
|
||||
|
@ -172,7 +176,9 @@ static void loadDerivations(EvalState& state, Path nixExprPath,
|
|||
for (DrvInfos::iterator i = elems.begin(), j; i != elems.end(); i = j) {
|
||||
j = i;
|
||||
j++;
|
||||
if (systemFilter != "*" && i->querySystem() != systemFilter) elems.erase(i);
|
||||
if (systemFilter != "*" && i->querySystem() != systemFilter) {
|
||||
elems.erase(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -188,7 +194,9 @@ static long comparePriorities(EvalState& state, DrvInfo& drv1, DrvInfo& drv2) {
|
|||
// at a time.
|
||||
static bool isPrebuilt(EvalState& state, DrvInfo& elem) {
|
||||
Path path = elem.queryOutPath();
|
||||
if (state.store->isValidPath(path)) return true;
|
||||
if (state.store->isValidPath(path)) {
|
||||
return true;
|
||||
}
|
||||
PathSet ps = state.store->querySubstitutablePaths({path});
|
||||
return ps.find(path) != ps.end();
|
||||
}
|
||||
|
@ -203,7 +211,9 @@ static void checkSelectorUse(DrvNames& selectors) {
|
|||
static DrvInfos filterBySelector(EvalState& state, const DrvInfos& allElems,
|
||||
const Strings& args, bool newestOnly) {
|
||||
DrvNames selectors = drvNamesFromArgs(args);
|
||||
if (selectors.empty()) selectors.push_back(DrvName("*"));
|
||||
if (selectors.empty()) {
|
||||
selectors.push_back(DrvName("*"));
|
||||
}
|
||||
|
||||
DrvInfos elems;
|
||||
set<unsigned int> done;
|
||||
|
@ -248,7 +258,9 @@ static DrvInfos filterBySelector(EvalState& state, const DrvInfos& allElems,
|
|||
: k->second.first.querySystem() == settings.thisSystem
|
||||
? -1
|
||||
: 0;
|
||||
if (d == 0) d = comparePriorities(state, j.first, k->second.first);
|
||||
if (d == 0) {
|
||||
d = comparePriorities(state, j.first, k->second.first);
|
||||
}
|
||||
if (d == 0)
|
||||
d = compareVersions(drvName.version,
|
||||
DrvName(k->second.first.queryName()).version);
|
||||
|
@ -343,7 +355,9 @@ static void queryInstSources(EvalState& state, InstallSourceInfo& instSource,
|
|||
|
||||
string name = baseNameOf(path);
|
||||
string::size_type dash = name.find('-');
|
||||
if (dash != string::npos) name = string(name, dash + 1);
|
||||
if (dash != string::npos) {
|
||||
name = string(name, dash + 1);
|
||||
}
|
||||
|
||||
DrvInfo elem(state, "", nullptr);
|
||||
elem.setName(name);
|
||||
|
@ -419,7 +433,9 @@ static void installDerivations(Globals& globals, const Strings& args,
|
|||
one-click installs, namely those where the name used in the
|
||||
path is not the one we want (e.g., `java-front' versus
|
||||
`java-front-0.9pre15899'). */
|
||||
if (globals.forceName != "") i.setName(globals.forceName);
|
||||
if (globals.forceName != "") {
|
||||
i.setName(globals.forceName);
|
||||
}
|
||||
newNames.insert(DrvName(i.queryName()).name);
|
||||
}
|
||||
|
||||
|
@ -517,7 +533,9 @@ static void upgradeDerivations(Globals& globals, const Strings& args,
|
|||
DrvInfos::iterator bestElem = availElems.end();
|
||||
string bestVersion;
|
||||
for (auto j = availElems.begin(); j != availElems.end(); ++j) {
|
||||
if (comparePriorities(*globals.state, i, *j) > 0) continue;
|
||||
if (comparePriorities(*globals.state, i, *j) > 0) {
|
||||
continue;
|
||||
}
|
||||
DrvName newName(j->queryName());
|
||||
if (newName.name == drvName.name) {
|
||||
int d = compareVersions(drvName.version, newName.version);
|
||||
|
@ -527,7 +545,9 @@ static void upgradeDerivations(Globals& globals, const Strings& args,
|
|||
long d2 = -1;
|
||||
if (bestElem != availElems.end()) {
|
||||
d2 = comparePriorities(*globals.state, *bestElem, *j);
|
||||
if (d2 == 0) d2 = compareVersions(bestVersion, newName.version);
|
||||
if (d2 == 0) {
|
||||
d2 = compareVersions(bestVersion, newName.version);
|
||||
}
|
||||
}
|
||||
if (d2 < 0 &&
|
||||
(!globals.prebuiltOnly || isPrebuilt(*globals.state, *j))) {
|
||||
|
@ -636,7 +656,9 @@ static void opSetFlag(Globals& globals, Strings opFlags, Strings opArgs) {
|
|||
|
||||
static void opSet(Globals& globals, Strings opFlags, Strings opArgs) {
|
||||
auto store2 = globals.state->store.dynamic_pointer_cast<LocalFSStore>();
|
||||
if (!store2) throw Error("--set is not supported for this Nix store");
|
||||
if (!store2) {
|
||||
throw Error("--set is not supported for this Nix store");
|
||||
}
|
||||
|
||||
for (Strings::iterator i = opFlags.begin(); i != opFlags.end();) {
|
||||
string arg = *i++;
|
||||
|
@ -649,11 +671,15 @@ static void opSet(Globals& globals, Strings opFlags, Strings opArgs) {
|
|||
DrvInfos elems;
|
||||
queryInstSources(*globals.state, globals.instSource, opArgs, elems, true);
|
||||
|
||||
if (elems.size() != 1) throw Error("--set requires exactly one derivation");
|
||||
if (elems.size() != 1) {
|
||||
throw Error("--set requires exactly one derivation");
|
||||
}
|
||||
|
||||
DrvInfo& drv(elems.front());
|
||||
|
||||
if (globals.forceName != "") drv.setName(globals.forceName);
|
||||
if (globals.forceName != "") {
|
||||
drv.setName(globals.forceName);
|
||||
}
|
||||
|
||||
if (drv.queryDrvPath() != "") {
|
||||
PathSet paths = {drv.queryDrvPath()};
|
||||
|
@ -699,7 +725,9 @@ static void uninstallDerivations(Globals& globals, Strings& selectors,
|
|||
found = true;
|
||||
break;
|
||||
}
|
||||
if (!found) newElems.push_back(i);
|
||||
if (!found) {
|
||||
newElems.push_back(i);
|
||||
}
|
||||
}
|
||||
|
||||
if (globals.dryRun) {
|
||||
|
@ -740,7 +768,9 @@ void printTable(Table& table) {
|
|||
Strings::iterator j;
|
||||
size_t column;
|
||||
for (j = i.begin(), column = 0; j != i.end(); ++j, ++column)
|
||||
if (j->size() > widths[column]) widths[column] = j->size();
|
||||
if (j->size() > widths[column]) {
|
||||
widths[column] = j->size();
|
||||
}
|
||||
}
|
||||
|
||||
for (auto& i : table) {
|
||||
|
@ -939,7 +969,9 @@ static void opQuery(Globals& globals, Strings opFlags, Strings opArgs) {
|
|||
|
||||
for (auto& i : elems) {
|
||||
try {
|
||||
if (i.hasFailed()) continue;
|
||||
if (i.hasFailed()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Activity act(*logger, lvlDebug, format("outputting query result '%1%'")
|
||||
// % i.attrPath);
|
||||
|
@ -1024,14 +1056,18 @@ static void opQuery(Globals& globals, Strings opFlags, Strings opArgs) {
|
|||
}
|
||||
|
||||
if (xmlOutput) {
|
||||
if (i.querySystem() != "") attrs["system"] = i.querySystem();
|
||||
if (i.querySystem() != "") {
|
||||
attrs["system"] = i.querySystem();
|
||||
}
|
||||
} else if (printSystem)
|
||||
columns.push_back(i.querySystem());
|
||||
|
||||
if (printDrvPath) {
|
||||
string drvPath = i.queryDrvPath();
|
||||
if (xmlOutput) {
|
||||
if (drvPath != "") attrs["drvPath"] = drvPath;
|
||||
if (drvPath != "") {
|
||||
attrs["drvPath"] = drvPath;
|
||||
}
|
||||
} else
|
||||
columns.push_back(drvPath == "" ? "-" : drvPath);
|
||||
}
|
||||
|
@ -1040,7 +1076,9 @@ static void opQuery(Globals& globals, Strings opFlags, Strings opArgs) {
|
|||
DrvInfo::Outputs outputs = i.queryOutputs();
|
||||
string s;
|
||||
for (auto& j : outputs) {
|
||||
if (!s.empty()) s += ';';
|
||||
if (!s.empty()) {
|
||||
s += ';';
|
||||
}
|
||||
if (j.first != "out") {
|
||||
s += j.first;
|
||||
s += "=";
|
||||
|
@ -1053,7 +1091,9 @@ static void opQuery(Globals& globals, Strings opFlags, Strings opArgs) {
|
|||
if (printDescription) {
|
||||
string descr = i.queryMetaString("description");
|
||||
if (xmlOutput) {
|
||||
if (descr != "") attrs["description"] = descr;
|
||||
if (descr != "") {
|
||||
attrs["description"] = descr;
|
||||
}
|
||||
} else
|
||||
columns.push_back(descr);
|
||||
}
|
||||
|
@ -1100,7 +1140,9 @@ static void opQuery(Globals& globals, Strings opFlags, Strings opArgs) {
|
|||
attrs2["type"] = "strings";
|
||||
XMLOpenElement m(xml, "meta", attrs2);
|
||||
for (unsigned int j = 0; j < v->listSize(); ++j) {
|
||||
if (v->listElems()[j]->type != tString) continue;
|
||||
if (v->listElems()[j]->type != tString) {
|
||||
continue;
|
||||
}
|
||||
XMLAttrs attrs3;
|
||||
attrs3["value"] = v->listElems()[j]->string.s;
|
||||
xml.writeEmptyElement("string", attrs3);
|
||||
|
@ -1111,7 +1153,9 @@ static void opQuery(Globals& globals, Strings opFlags, Strings opArgs) {
|
|||
Bindings& attrs = *v->attrs;
|
||||
for (auto& i : attrs) {
|
||||
Attr& a(*attrs.find(i.name));
|
||||
if (a.value->type != tString) continue;
|
||||
if (a.value->type != tString) {
|
||||
continue;
|
||||
}
|
||||
XMLAttrs attrs3;
|
||||
attrs3["type"] = i.name;
|
||||
attrs3["value"] = a.value->string.s;
|
||||
|
@ -1204,7 +1248,9 @@ static void opSwitchGeneration(Globals& globals, Strings opFlags,
|
|||
static void opRollback(Globals& globals, Strings opFlags, Strings opArgs) {
|
||||
if (opFlags.size() > 0)
|
||||
throw UsageError(format("unknown flag '%1%'") % opFlags.front());
|
||||
if (opArgs.size() != 0) throw UsageError(format("no arguments expected"));
|
||||
if (opArgs.size() != 0) {
|
||||
throw UsageError(format("no arguments expected"));
|
||||
}
|
||||
|
||||
switchGeneration(globals, prevGen);
|
||||
}
|
||||
|
@ -1213,7 +1259,9 @@ static void opListGenerations(Globals& globals, Strings opFlags,
|
|||
Strings opArgs) {
|
||||
if (opFlags.size() > 0)
|
||||
throw UsageError(format("unknown flag '%1%'") % opFlags.front());
|
||||
if (opArgs.size() != 0) throw UsageError(format("no arguments expected"));
|
||||
if (opArgs.size() != 0) {
|
||||
throw UsageError(format("no arguments expected"));
|
||||
}
|
||||
|
||||
PathLocks lock;
|
||||
lockProfile(lock, globals.profile);
|
||||
|
@ -1225,7 +1273,9 @@ static void opListGenerations(Globals& globals, Strings opFlags,
|
|||
|
||||
for (auto& i : gens) {
|
||||
tm t;
|
||||
if (!localtime_r(&i.creationTime, &t)) throw Error("cannot convert time");
|
||||
if (!localtime_r(&i.creationTime, &t)) {
|
||||
throw Error("cannot convert time");
|
||||
}
|
||||
cout << format("%|4| %|4|-%|02|-%|02| %|02|:%|02|:%|02| %||\n") %
|
||||
i.number % (t.tm_year + 1900) % (t.tm_mon + 1) % t.tm_mday %
|
||||
t.tm_hour % t.tm_min % t.tm_sec %
|
||||
|
@ -1369,7 +1419,9 @@ static int _main(int argc, char** argv) {
|
|||
|
||||
initPlugins();
|
||||
|
||||
if (!op) throw UsageError("no operation specified");
|
||||
if (!op) {
|
||||
throw UsageError("no operation specified");
|
||||
}
|
||||
|
||||
auto store = openStore();
|
||||
|
||||
|
@ -1382,7 +1434,9 @@ static int _main(int argc, char** argv) {
|
|||
|
||||
globals.instSource.autoArgs = myArgs.getAutoArgs(*globals.state);
|
||||
|
||||
if (globals.profile == "") globals.profile = getEnv("NIX_PROFILE", "");
|
||||
if (globals.profile == "") {
|
||||
globals.profile = getEnv("NIX_PROFILE", "");
|
||||
}
|
||||
|
||||
if (globals.profile == "") {
|
||||
Path profileLink = getHome() + "/.nix-profile";
|
||||
|
|
16
third_party/nix/src/nix-env/user-env.cc
vendored
16
third_party/nix/src/nix-env/user-env.cc
vendored
|
@ -31,7 +31,9 @@ bool createUserEnv(EvalState& state, DrvInfos& elems, const Path& profile,
|
|||
exist already. */
|
||||
PathSet drvsToBuild;
|
||||
for (auto& i : elems)
|
||||
if (i.queryDrvPath() != "") drvsToBuild.insert(i.queryDrvPath());
|
||||
if (i.queryDrvPath() != "") {
|
||||
drvsToBuild.insert(i.queryDrvPath());
|
||||
}
|
||||
|
||||
DLOG(INFO) << "building user environment dependencies";
|
||||
state.store->buildPaths(drvsToBuild, state.repair ? bmRepair : bmNormal);
|
||||
|
@ -54,7 +56,9 @@ bool createUserEnv(EvalState& state, DrvInfos& elems, const Path& profile,
|
|||
mkString(*state.allocAttr(v, state.sType), "derivation");
|
||||
mkString(*state.allocAttr(v, state.sName), i.queryName());
|
||||
auto system = i.querySystem();
|
||||
if (!system.empty()) mkString(*state.allocAttr(v, state.sSystem), system);
|
||||
if (!system.empty()) {
|
||||
mkString(*state.allocAttr(v, state.sSystem), system);
|
||||
}
|
||||
mkString(*state.allocAttr(v, state.sOutPath), i.queryOutPath());
|
||||
if (drvPath != "")
|
||||
mkString(*state.allocAttr(v, state.sDrvPath), i.queryDrvPath());
|
||||
|
@ -84,13 +88,17 @@ bool createUserEnv(EvalState& state, DrvInfos& elems, const Path& profile,
|
|||
StringSet metaNames = i.queryMetaNames();
|
||||
for (auto& j : metaNames) {
|
||||
Value* v = i.queryMeta(j);
|
||||
if (!v) continue;
|
||||
if (!v) {
|
||||
continue;
|
||||
}
|
||||
vMeta.attrs->push_back(Attr(state.symbols.create(j), v));
|
||||
}
|
||||
vMeta.attrs->sort();
|
||||
v.attrs->sort();
|
||||
|
||||
if (drvPath != "") references.insert(drvPath);
|
||||
if (drvPath != "") {
|
||||
references.insert(drvPath);
|
||||
}
|
||||
}
|
||||
|
||||
/* Also write a copy of the list of user environment elements to
|
||||
|
|
|
@ -49,7 +49,9 @@ void processExpr(EvalState& state, const Strings& attrPaths, bool parseOnly,
|
|||
else if (output == okJSON)
|
||||
printValueAsJSON(state, strict, vRes, std::cout, context);
|
||||
else {
|
||||
if (strict) state.forceValueDeep(vRes);
|
||||
if (strict) {
|
||||
state.forceValueDeep(vRes);
|
||||
}
|
||||
std::cout << vRes << std::endl;
|
||||
}
|
||||
} else {
|
||||
|
@ -69,7 +71,9 @@ void processExpr(EvalState& state, const Strings& attrPaths, bool parseOnly,
|
|||
printGCWarning();
|
||||
else {
|
||||
Path rootName = indirectRoot ? absPath(gcRoot) : gcRoot;
|
||||
if (++rootNr > 1) rootName += "-" + std::to_string(rootNr);
|
||||
if (++rootNr > 1) {
|
||||
rootName += "-" + std::to_string(rootNr);
|
||||
}
|
||||
auto store2 = state.store.dynamic_pointer_cast<LocalFSStore>();
|
||||
if (store2)
|
||||
drvPath = store2->addPermRoot(drvPath, rootName, indirectRoot);
|
||||
|
@ -158,7 +162,9 @@ static int _main(int argc, char** argv) {
|
|||
|
||||
Bindings& autoArgs = *myArgs.getAutoArgs(*state);
|
||||
|
||||
if (attrPaths.empty()) attrPaths = {""};
|
||||
if (attrPaths.empty()) {
|
||||
attrPaths = {""};
|
||||
}
|
||||
|
||||
if (findFile) {
|
||||
for (auto& i : files) {
|
||||
|
|
|
@ -21,11 +21,15 @@ using namespace nix;
|
|||
/* If ‘uri’ starts with ‘mirror://’, then resolve it using the list of
|
||||
mirrors defined in Nixpkgs. */
|
||||
string resolveMirrorUri(EvalState& state, string uri) {
|
||||
if (string(uri, 0, 9) != "mirror://") return uri;
|
||||
if (string(uri, 0, 9) != "mirror://") {
|
||||
return uri;
|
||||
}
|
||||
|
||||
string s(uri, 9);
|
||||
auto p = s.find('/');
|
||||
if (p == string::npos) throw Error("invalid mirror URI");
|
||||
if (p == string::npos) {
|
||||
throw Error("invalid mirror URI");
|
||||
}
|
||||
string mirrorName(s, 0, p);
|
||||
|
||||
Value vMirrors;
|
||||
|
@ -92,7 +96,9 @@ static int _main(int argc, char** argv) {
|
|||
|
||||
initPlugins();
|
||||
|
||||
if (args.size() > 2) throw UsageError("too many arguments");
|
||||
if (args.size() > 2) {
|
||||
throw UsageError("too many arguments");
|
||||
}
|
||||
|
||||
auto store = openStore();
|
||||
auto state = std::make_unique<EvalState>(myArgs.searchPath, store);
|
||||
|
@ -103,7 +109,9 @@ static int _main(int argc, char** argv) {
|
|||
expression. */
|
||||
string uri;
|
||||
if (!fromExpr) {
|
||||
if (args.empty()) throw UsageError("you must specify a URI");
|
||||
if (args.empty()) {
|
||||
throw UsageError("you must specify a URI");
|
||||
}
|
||||
uri = args[0];
|
||||
} else {
|
||||
Path path =
|
||||
|
@ -118,7 +126,9 @@ static int _main(int argc, char** argv) {
|
|||
if (attr == v.attrs->end())
|
||||
throw Error("attribute set does not contain a 'urls' attribute");
|
||||
state->forceList(*attr->value);
|
||||
if (attr->value->listSize() < 1) throw Error("'urls' list is empty");
|
||||
if (attr->value->listSize() < 1) {
|
||||
throw Error("'urls' list is empty");
|
||||
}
|
||||
uri = state->forceString(*attr->value->listElems()[0]);
|
||||
|
||||
/* Extract the hash mode. */
|
||||
|
@ -131,12 +141,16 @@ static int _main(int argc, char** argv) {
|
|||
/* Extract the name. */
|
||||
if (name.empty()) {
|
||||
attr = v.attrs->find(state->symbols.create("name"));
|
||||
if (attr != v.attrs->end()) name = state->forceString(*attr->value);
|
||||
if (attr != v.attrs->end()) {
|
||||
name = state->forceString(*attr->value);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Figure out a name in the Nix store. */
|
||||
if (name.empty()) name = baseNameOf(uri);
|
||||
if (name.empty()) {
|
||||
name = baseNameOf(uri);
|
||||
}
|
||||
if (name.empty())
|
||||
throw Error(format("cannot figure out file name for '%1%'") % uri);
|
||||
|
||||
|
@ -163,7 +177,9 @@ static int _main(int argc, char** argv) {
|
|||
{
|
||||
AutoCloseFD fd =
|
||||
open(tmpFile.c_str(), O_WRONLY | O_CREAT | O_EXCL, 0600);
|
||||
if (!fd) throw SysError("creating temporary file '%s'", tmpFile);
|
||||
if (!fd) {
|
||||
throw SysError("creating temporary file '%s'", tmpFile);
|
||||
}
|
||||
|
||||
FdSink sink(fd.get());
|
||||
|
||||
|
@ -213,7 +229,9 @@ static int _main(int argc, char** argv) {
|
|||
}
|
||||
|
||||
std::cout << printHash16or32(hash) << std::endl;
|
||||
if (printPath) std::cout << storePath << std::endl;
|
||||
if (printPath) {
|
||||
std::cout << storePath << std::endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
6
third_party/nix/src/nix-store/dotgraph.cc
vendored
6
third_party/nix/src/nix-store/dotgraph.cc
vendored
|
@ -89,7 +89,9 @@ void printDotGraph(ref<Store> store, const PathSet& roots) {
|
|||
Path path = *(workList.begin());
|
||||
workList.erase(path);
|
||||
|
||||
if (doneSet.find(path) != doneSet.end()) continue;
|
||||
if (doneSet.find(path) != doneSet.end()) {
|
||||
continue;
|
||||
}
|
||||
doneSet.insert(path);
|
||||
|
||||
cout << makeNode(path, symbolicName(path), "#ff0000");
|
||||
|
@ -118,7 +120,7 @@ void printDotGraph(ref<Store> store, const PathSet& roots) {
|
|||
colour = "#00ff00";
|
||||
for (StringPairs::iterator i = ne.derivation.env.begin();
|
||||
i != ne.derivation.env.end(); ++i)
|
||||
if (i->first == "name") label = i->second;
|
||||
if (i->first == "name") { label = i->second; }
|
||||
}
|
||||
|
||||
else if (ne.type == StoreExpr::neClosure) {
|
||||
|
|
4
third_party/nix/src/nix-store/graphml.cc
vendored
4
third_party/nix/src/nix-store/graphml.cc
vendored
|
@ -58,7 +58,9 @@ void printGraphML(ref<Store> store, const PathSet& roots) {
|
|||
workList.erase(path);
|
||||
|
||||
ret = doneSet.insert(path);
|
||||
if (ret.second == false) continue;
|
||||
if (ret.second == false) {
|
||||
continue;
|
||||
}
|
||||
|
||||
ValidPathInfo info = *(store->queryPathInfo(path));
|
||||
cout << makeNode(info);
|
||||
|
|
168
third_party/nix/src/nix-store/nix-store.cc
vendored
168
third_party/nix/src/nix-store/nix-store.cc
vendored
|
@ -44,7 +44,9 @@ ref<LocalStore> ensureLocalStore() {
|
|||
}
|
||||
|
||||
static Path useDeriver(Path path) {
|
||||
if (isDerivation(path)) return path;
|
||||
if (isDerivation(path)) {
|
||||
return path;
|
||||
}
|
||||
Path drvPath = store->queryPathInfo(path)->deriver;
|
||||
if (drvPath == "")
|
||||
throw Error(format("deriver of path '%1%' is not known") % path);
|
||||
|
@ -59,7 +61,9 @@ static PathSet realisePath(Path path, bool build = true) {
|
|||
auto store2 = std::dynamic_pointer_cast<LocalFSStore>(store);
|
||||
|
||||
if (isDerivation(p.first)) {
|
||||
if (build) store->buildPaths({path});
|
||||
if (build) {
|
||||
store->buildPaths({path});
|
||||
}
|
||||
Derivation drv = store->derivationFromPath(p.first);
|
||||
rootNr++;
|
||||
|
||||
|
@ -79,8 +83,12 @@ static PathSet realisePath(Path path, bool build = true) {
|
|||
printGCWarning();
|
||||
else {
|
||||
Path rootName = gcRoot;
|
||||
if (rootNr > 1) rootName += "-" + std::to_string(rootNr);
|
||||
if (i->first != "out") rootName += "-" + i->first;
|
||||
if (rootNr > 1) {
|
||||
rootName += "-" + std::to_string(rootNr);
|
||||
}
|
||||
if (i->first != "out") {
|
||||
rootName += "-" + i->first;
|
||||
}
|
||||
outPath = store2->addPermRoot(outPath, rootName, indirectRoot);
|
||||
}
|
||||
}
|
||||
|
@ -101,7 +109,9 @@ static PathSet realisePath(Path path, bool build = true) {
|
|||
else {
|
||||
Path rootName = gcRoot;
|
||||
rootNr++;
|
||||
if (rootNr > 1) rootName += "-" + std::to_string(rootNr);
|
||||
if (rootNr > 1) {
|
||||
rootName += "-" + std::to_string(rootNr);
|
||||
}
|
||||
path = store2->addPermRoot(path, rootName, indirectRoot);
|
||||
}
|
||||
}
|
||||
|
@ -142,7 +152,9 @@ static void opRealise(Strings opFlags, Strings opArgs) {
|
|||
if (ignoreUnknown) {
|
||||
Paths paths2;
|
||||
for (auto& i : paths)
|
||||
if (unknown.find(i) == unknown.end()) paths2.push_back(i);
|
||||
if (unknown.find(i) == unknown.end()) {
|
||||
paths2.push_back(i);
|
||||
}
|
||||
paths = paths2;
|
||||
unknown = PathSet();
|
||||
}
|
||||
|
@ -168,7 +180,9 @@ static void opRealise(Strings opFlags, Strings opArgs) {
|
|||
|
||||
/* Add files to the Nix store and print the resulting paths. */
|
||||
static void opAdd(Strings opFlags, Strings opArgs) {
|
||||
if (!opFlags.empty()) throw UsageError("unknown flag");
|
||||
if (!opFlags.empty()) {
|
||||
throw UsageError("unknown flag");
|
||||
}
|
||||
|
||||
for (auto& i : opArgs)
|
||||
cout << format("%1%\n") % store->addToStore(baseNameOf(i), i);
|
||||
|
@ -185,7 +199,9 @@ static void opAddFixed(Strings opFlags, Strings opArgs) {
|
|||
else
|
||||
throw UsageError(format("unknown flag '%1%'") % i);
|
||||
|
||||
if (opArgs.empty()) throw UsageError("first argument must be hash algorithm");
|
||||
if (opArgs.empty()) {
|
||||
throw UsageError("first argument must be hash algorithm");
|
||||
}
|
||||
|
||||
HashType hashAlgo = parseHashType(opArgs.front());
|
||||
opArgs.pop_front();
|
||||
|
@ -307,7 +323,9 @@ static void opQuery(Strings opFlags, Strings opArgs) {
|
|||
else if (i == "--deriver" || i == "-d")
|
||||
query = qDeriver;
|
||||
else if (i == "--binding" || i == "-b") {
|
||||
if (opArgs.size() == 0) throw UsageError("expected binding name");
|
||||
if (opArgs.size() == 0) {
|
||||
throw UsageError("expected binding name");
|
||||
}
|
||||
bindingName = opArgs.front();
|
||||
opArgs.pop_front();
|
||||
query = qBinding;
|
||||
|
@ -348,7 +366,9 @@ static void opQuery(Strings opFlags, Strings opArgs) {
|
|||
case qOutputs: {
|
||||
for (auto& i : opArgs) {
|
||||
i = store->followLinksToStorePath(i);
|
||||
if (forceRealise) realisePath(i);
|
||||
if (forceRealise) {
|
||||
realisePath(i);
|
||||
}
|
||||
Derivation drv = store->derivationFromPath(i);
|
||||
for (auto& j : drv.outputs) cout << format("%1%\n") % j.second.path;
|
||||
}
|
||||
|
@ -476,7 +496,9 @@ static void opQuery(Strings opFlags, Strings opArgs) {
|
|||
}
|
||||
|
||||
static void opPrintEnv(Strings opFlags, Strings opArgs) {
|
||||
if (!opFlags.empty()) throw UsageError("unknown flag");
|
||||
if (!opFlags.empty()) {
|
||||
throw UsageError("unknown flag");
|
||||
}
|
||||
if (opArgs.size() != 1)
|
||||
throw UsageError("'--print-env' requires one derivation store path");
|
||||
|
||||
|
@ -493,7 +515,9 @@ static void opPrintEnv(Strings opFlags, Strings opArgs) {
|
|||
cout << "export _args; _args='";
|
||||
bool first = true;
|
||||
for (auto& i : drv.args) {
|
||||
if (!first) cout << ' ';
|
||||
if (!first) {
|
||||
cout << ' ';
|
||||
}
|
||||
first = false;
|
||||
cout << shellEscape(i);
|
||||
}
|
||||
|
@ -501,7 +525,9 @@ static void opPrintEnv(Strings opFlags, Strings opArgs) {
|
|||
}
|
||||
|
||||
static void opReadLog(Strings opFlags, Strings opArgs) {
|
||||
if (!opFlags.empty()) throw UsageError("unknown flag");
|
||||
if (!opFlags.empty()) {
|
||||
throw UsageError("unknown flag");
|
||||
}
|
||||
|
||||
RunPager pager;
|
||||
|
||||
|
@ -515,7 +541,9 @@ static void opReadLog(Strings opFlags, Strings opArgs) {
|
|||
}
|
||||
|
||||
static void opDumpDB(Strings opFlags, Strings opArgs) {
|
||||
if (!opFlags.empty()) throw UsageError("unknown flag");
|
||||
if (!opFlags.empty()) {
|
||||
throw UsageError("unknown flag");
|
||||
}
|
||||
if (!opArgs.empty()) {
|
||||
for (auto& i : opArgs) i = store->followLinksToStorePath(i);
|
||||
for (auto& i : opArgs)
|
||||
|
@ -533,10 +561,14 @@ static void registerValidity(bool reregister, bool hashGiven,
|
|||
|
||||
while (1) {
|
||||
ValidPathInfo info = decodeValidPathInfo(cin, hashGiven);
|
||||
if (info.path == "") break;
|
||||
if (info.path == "") {
|
||||
break;
|
||||
}
|
||||
if (!store->isValidPath(info.path) || reregister) {
|
||||
/* !!! races */
|
||||
if (canonicalise) canonicalisePathMetaData(info.path, -1);
|
||||
if (canonicalise) {
|
||||
canonicalisePathMetaData(info.path, -1);
|
||||
}
|
||||
if (!hashGiven) {
|
||||
HashResult hash = hashPath(htSHA256, info.path);
|
||||
info.narHash = hash.first;
|
||||
|
@ -550,8 +582,12 @@ static void registerValidity(bool reregister, bool hashGiven,
|
|||
}
|
||||
|
||||
static void opLoadDB(Strings opFlags, Strings opArgs) {
|
||||
if (!opFlags.empty()) throw UsageError("unknown flag");
|
||||
if (!opArgs.empty()) throw UsageError("no arguments expected");
|
||||
if (!opFlags.empty()) {
|
||||
throw UsageError("unknown flag");
|
||||
}
|
||||
if (!opArgs.empty()) {
|
||||
throw UsageError("no arguments expected");
|
||||
}
|
||||
registerValidity(true, true, false);
|
||||
}
|
||||
|
||||
|
@ -567,7 +603,9 @@ static void opRegisterValidity(Strings opFlags, Strings opArgs) {
|
|||
else
|
||||
throw UsageError(format("unknown flag '%1%'") % i);
|
||||
|
||||
if (!opArgs.empty()) throw UsageError("no arguments expected");
|
||||
if (!opArgs.empty()) {
|
||||
throw UsageError("no arguments expected");
|
||||
}
|
||||
|
||||
registerValidity(reregister, hashGiven, true);
|
||||
}
|
||||
|
@ -615,7 +653,9 @@ static void opGC(Strings opFlags, Strings opArgs) {
|
|||
} else
|
||||
throw UsageError(format("bad sub-operation '%1%' in GC") % *i);
|
||||
|
||||
if (!opArgs.empty()) throw UsageError("no arguments expected");
|
||||
if (!opArgs.empty()) {
|
||||
throw UsageError("no arguments expected");
|
||||
}
|
||||
|
||||
if (printRoots) {
|
||||
Roots roots = store->findRoots(false);
|
||||
|
@ -660,8 +700,12 @@ static void opDelete(Strings opFlags, Strings opArgs) {
|
|||
/* Dump a path as a Nix archive. The archive is written to standard
|
||||
output. */
|
||||
static void opDump(Strings opFlags, Strings opArgs) {
|
||||
if (!opFlags.empty()) throw UsageError("unknown flag");
|
||||
if (opArgs.size() != 1) throw UsageError("only one argument allowed");
|
||||
if (!opFlags.empty()) {
|
||||
throw UsageError("unknown flag");
|
||||
}
|
||||
if (opArgs.size() != 1) {
|
||||
throw UsageError("only one argument allowed");
|
||||
}
|
||||
|
||||
FdSink sink(STDOUT_FILENO);
|
||||
string path = *opArgs.begin();
|
||||
|
@ -672,8 +716,12 @@ static void opDump(Strings opFlags, Strings opArgs) {
|
|||
/* Restore a value from a Nix archive. The archive is read from
|
||||
standard input. */
|
||||
static void opRestore(Strings opFlags, Strings opArgs) {
|
||||
if (!opFlags.empty()) throw UsageError("unknown flag");
|
||||
if (opArgs.size() != 1) throw UsageError("only one argument allowed");
|
||||
if (!opFlags.empty()) {
|
||||
throw UsageError("unknown flag");
|
||||
}
|
||||
if (opArgs.size() != 1) {
|
||||
throw UsageError("only one argument allowed");
|
||||
}
|
||||
|
||||
FdSource source(STDIN_FILENO);
|
||||
restorePath(*opArgs.begin(), source);
|
||||
|
@ -692,7 +740,9 @@ static void opExport(Strings opFlags, Strings opArgs) {
|
|||
static void opImport(Strings opFlags, Strings opArgs) {
|
||||
for (auto& i : opFlags) throw UsageError(format("unknown flag '%1%'") % i);
|
||||
|
||||
if (!opArgs.empty()) throw UsageError("no arguments expected");
|
||||
if (!opArgs.empty()) {
|
||||
throw UsageError("no arguments expected");
|
||||
}
|
||||
|
||||
FdSource source(STDIN_FILENO);
|
||||
Paths paths = store->importPaths(source, nullptr, NoCheckSigs);
|
||||
|
@ -702,15 +752,21 @@ static void opImport(Strings opFlags, Strings opArgs) {
|
|||
|
||||
/* Initialise the Nix databases. */
|
||||
static void opInit(Strings opFlags, Strings opArgs) {
|
||||
if (!opFlags.empty()) throw UsageError("unknown flag");
|
||||
if (!opArgs.empty()) throw UsageError("no arguments expected");
|
||||
if (!opFlags.empty()) {
|
||||
throw UsageError("unknown flag");
|
||||
}
|
||||
if (!opArgs.empty()) {
|
||||
throw UsageError("no arguments expected");
|
||||
}
|
||||
/* Doesn't do anything right now; database tables are initialised
|
||||
automatically. */
|
||||
}
|
||||
|
||||
/* Verify the consistency of the Nix environment. */
|
||||
static void opVerify(Strings opFlags, Strings opArgs) {
|
||||
if (!opArgs.empty()) throw UsageError("no arguments expected");
|
||||
if (!opArgs.empty()) {
|
||||
throw UsageError("no arguments expected");
|
||||
}
|
||||
|
||||
bool checkContents = false;
|
||||
RepairFlag repair = NoRepair;
|
||||
|
@ -731,7 +787,9 @@ static void opVerify(Strings opFlags, Strings opArgs) {
|
|||
|
||||
/* Verify whether the contents of the given store path have not changed. */
|
||||
static void opVerifyPath(Strings opFlags, Strings opArgs) {
|
||||
if (!opFlags.empty()) throw UsageError("no flags expected");
|
||||
if (!opFlags.empty()) {
|
||||
throw UsageError("no flags expected");
|
||||
}
|
||||
|
||||
int status = 0;
|
||||
|
||||
|
@ -756,7 +814,9 @@ static void opVerifyPath(Strings opFlags, Strings opArgs) {
|
|||
/* Repair the contents of the given path by redownloading it using a
|
||||
substituter (if available). */
|
||||
static void opRepairPath(Strings opFlags, Strings opArgs) {
|
||||
if (!opFlags.empty()) throw UsageError("no flags expected");
|
||||
if (!opFlags.empty()) {
|
||||
throw UsageError("no flags expected");
|
||||
}
|
||||
|
||||
for (auto& i : opArgs) {
|
||||
Path path = store->followLinksToStorePath(i);
|
||||
|
@ -782,14 +842,18 @@ static void opServe(Strings opFlags, Strings opArgs) {
|
|||
else
|
||||
throw UsageError(format("unknown flag '%1%'") % i);
|
||||
|
||||
if (!opArgs.empty()) throw UsageError("no arguments expected");
|
||||
if (!opArgs.empty()) {
|
||||
throw UsageError("no arguments expected");
|
||||
}
|
||||
|
||||
FdSource in(STDIN_FILENO);
|
||||
FdSink out(STDOUT_FILENO);
|
||||
|
||||
/* Exchange the greeting. */
|
||||
unsigned int magic = readInt(in);
|
||||
if (magic != SERVE_MAGIC_1) throw Error("protocol mismatch");
|
||||
if (magic != SERVE_MAGIC_1) {
|
||||
throw Error("protocol mismatch");
|
||||
}
|
||||
out << SERVE_MAGIC_2 << SERVE_PROTOCOL_VERSION;
|
||||
out.flush();
|
||||
unsigned int clientVersion = readInt(in);
|
||||
|
@ -834,7 +898,9 @@ static void opServe(Strings opFlags, Strings opArgs) {
|
|||
/* Filter out .drv files (we don't want to build anything). */
|
||||
PathSet paths2;
|
||||
for (auto& path : paths)
|
||||
if (!isDerivation(path)) paths2.insert(path);
|
||||
if (!isDerivation(path)) {
|
||||
paths2.insert(path);
|
||||
}
|
||||
unsigned long long downloadSize, narSize;
|
||||
PathSet willBuild, willSubstitute, unknown;
|
||||
store->queryMissing(PathSet(paths2.begin(), paths2.end()), willBuild,
|
||||
|
@ -877,7 +943,9 @@ static void opServe(Strings opFlags, Strings opArgs) {
|
|||
break;
|
||||
|
||||
case cmdImportPaths: {
|
||||
if (!writeAllowed) throw Error("importing paths is not allowed");
|
||||
if (!writeAllowed) {
|
||||
throw Error("importing paths is not allowed");
|
||||
}
|
||||
store->importPaths(in, nullptr,
|
||||
NoCheckSigs); // FIXME: should we skip sig checking?
|
||||
out << 1; // indicate success
|
||||
|
@ -891,7 +959,9 @@ static void opServe(Strings opFlags, Strings opArgs) {
|
|||
}
|
||||
|
||||
case cmdBuildPaths: {
|
||||
if (!writeAllowed) throw Error("building paths is not allowed");
|
||||
if (!writeAllowed) {
|
||||
throw Error("building paths is not allowed");
|
||||
}
|
||||
PathSet paths = readStorePaths<PathSet>(*store, in);
|
||||
|
||||
getBuildSettings();
|
||||
|
@ -909,7 +979,9 @@ static void opServe(Strings opFlags, Strings opArgs) {
|
|||
|
||||
case cmdBuildDerivation: { /* Used by hydra-queue-runner. */
|
||||
|
||||
if (!writeAllowed) throw Error("building paths is not allowed");
|
||||
if (!writeAllowed) {
|
||||
throw Error("building paths is not allowed");
|
||||
}
|
||||
|
||||
Path drvPath = readStorePath(*store, in); // informational only
|
||||
BasicDerivation drv;
|
||||
|
@ -939,12 +1011,16 @@ static void opServe(Strings opFlags, Strings opArgs) {
|
|||
}
|
||||
|
||||
case cmdAddToStoreNar: {
|
||||
if (!writeAllowed) throw Error("importing paths is not allowed");
|
||||
if (!writeAllowed) {
|
||||
throw Error("importing paths is not allowed");
|
||||
}
|
||||
|
||||
ValidPathInfo info;
|
||||
info.path = readStorePath(*store, in);
|
||||
in >> info.deriver;
|
||||
if (!info.deriver.empty()) store->assertStorePath(info.deriver);
|
||||
if (!info.deriver.empty()) {
|
||||
store->assertStorePath(info.deriver);
|
||||
}
|
||||
info.narHash = Hash(readString(in), htSHA256);
|
||||
info.references = readStorePaths<PathSet>(*store, in);
|
||||
in >> info.registrationTime >> info.narSize >> info.ultimate;
|
||||
|
@ -978,18 +1054,24 @@ static void opServe(Strings opFlags, Strings opArgs) {
|
|||
static void opGenerateBinaryCacheKey(Strings opFlags, Strings opArgs) {
|
||||
for (auto& i : opFlags) throw UsageError(format("unknown flag '%1%'") % i);
|
||||
|
||||
if (opArgs.size() != 3) throw UsageError("three arguments expected");
|
||||
if (opArgs.size() != 3) {
|
||||
throw UsageError("three arguments expected");
|
||||
}
|
||||
auto i = opArgs.begin();
|
||||
string keyName = *i++;
|
||||
string secretKeyFile = *i++;
|
||||
string publicKeyFile = *i++;
|
||||
|
||||
#if HAVE_SODIUM
|
||||
if (sodium_init() == -1) throw Error("could not initialise libsodium");
|
||||
if (sodium_init() == -1) {
|
||||
throw Error("could not initialise libsodium");
|
||||
}
|
||||
|
||||
unsigned char pk[crypto_sign_PUBLICKEYBYTES];
|
||||
unsigned char sk[crypto_sign_SECRETKEYBYTES];
|
||||
if (crypto_sign_keypair(pk, sk) != 0) throw Error("key generation failed");
|
||||
if (crypto_sign_keypair(pk, sk) != 0) {
|
||||
throw Error("key generation failed");
|
||||
}
|
||||
|
||||
writeFile(publicKeyFile,
|
||||
keyName + ":" +
|
||||
|
@ -1095,7 +1177,9 @@ static int _main(int argc, char** argv) {
|
|||
|
||||
initPlugins();
|
||||
|
||||
if (!op) throw UsageError("no operation specified");
|
||||
if (!op) {
|
||||
throw UsageError("no operation specified");
|
||||
}
|
||||
|
||||
if (op != opDump && op != opRestore) /* !!! hack */
|
||||
store = openStore();
|
||||
|
|
8
third_party/nix/src/nix/add-to-store.cc
vendored
8
third_party/nix/src/nix/add-to-store.cc
vendored
|
@ -27,7 +27,9 @@ struct CmdAddToStore : MixDryRun, StoreCommand {
|
|||
Examples examples() override { return {}; }
|
||||
|
||||
void run(ref<Store> store) override {
|
||||
if (!namePart) namePart = baseNameOf(path);
|
||||
if (!namePart) {
|
||||
namePart = baseNameOf(path);
|
||||
}
|
||||
|
||||
StringSink sink;
|
||||
dumpPath(path, sink);
|
||||
|
@ -38,7 +40,9 @@ struct CmdAddToStore : MixDryRun, StoreCommand {
|
|||
info.path = store->makeFixedOutputPath(true, info.narHash, *namePart);
|
||||
info.ca = makeFixedOutputCA(true, info.narHash);
|
||||
|
||||
if (!dryRun) store->addToStore(info, sink.s);
|
||||
if (!dryRun) {
|
||||
store->addToStore(info, sink.s);
|
||||
}
|
||||
|
||||
std::cout << fmt("%s\n", info.path);
|
||||
}
|
||||
|
|
8
third_party/nix/src/nix/build.cc
vendored
8
third_party/nix/src/nix/build.cc
vendored
|
@ -51,8 +51,12 @@ struct CmdBuild : MixDryRun, InstallablesCommand {
|
|||
for (auto& output : b.outputs)
|
||||
if (auto store2 = store.dynamic_pointer_cast<LocalFSStore>()) {
|
||||
std::string symlink = outLink;
|
||||
if (i) symlink += fmt("-%d", i);
|
||||
if (output.first != "out") symlink += fmt("-%s", output.first);
|
||||
if (i) {
|
||||
symlink += fmt("-%d", i);
|
||||
}
|
||||
if (output.first != "out") {
|
||||
symlink += fmt("-%s", output.first);
|
||||
}
|
||||
store2->addPermRoot(output.second, absPath(symlink), true);
|
||||
}
|
||||
}
|
||||
|
|
8
third_party/nix/src/nix/command.cc
vendored
8
third_party/nix/src/nix/command.cc
vendored
|
@ -62,8 +62,12 @@ void MultiCommand::printHelp(const string& programName, std::ostream& out) {
|
|||
}
|
||||
|
||||
bool MultiCommand::processFlag(Strings::iterator& pos, Strings::iterator end) {
|
||||
if (Args::processFlag(pos, end)) return true;
|
||||
if (command && command->processFlag(pos, end)) return true;
|
||||
if (Args::processFlag(pos, end)) {
|
||||
return true;
|
||||
}
|
||||
if (command && command->processFlag(pos, end)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
4
third_party/nix/src/nix/command.hh
vendored
4
third_party/nix/src/nix/command.hh
vendored
|
@ -163,7 +163,9 @@ struct RegisterCommand {
|
|||
static Commands* commands;
|
||||
|
||||
RegisterCommand(ref<Command> command) {
|
||||
if (!commands) commands = new Commands;
|
||||
if (!commands) {
|
||||
commands = new Commands;
|
||||
}
|
||||
commands->emplace(command->name(), command);
|
||||
}
|
||||
};
|
||||
|
|
4
third_party/nix/src/nix/hash.cc
vendored
4
third_party/nix/src/nix/hash.cc
vendored
|
@ -36,7 +36,9 @@ struct CmdHash : Command {
|
|||
void run() override {
|
||||
for (auto path : paths) {
|
||||
Hash h = mode == mFile ? hashFile(ht, path) : hashPath(ht, path).first;
|
||||
if (truncate && h.hashSize > 20) h = compressHash(h, 20);
|
||||
if (truncate && h.hashSize > 20) {
|
||||
h = compressHash(h, 20);
|
||||
}
|
||||
std::cout << format("%1%\n") % h.to_string(base, base == SRI);
|
||||
}
|
||||
}
|
||||
|
|
12
third_party/nix/src/nix/installables.cc
vendored
12
third_party/nix/src/nix/installables.cc
vendored
|
@ -45,8 +45,12 @@ Value* SourceExprCommand::getSourceExpr(EvalState& state) {
|
|||
std::unordered_set<std::string> seen;
|
||||
|
||||
auto addEntry = [&](const std::string& name) {
|
||||
if (name == "") return;
|
||||
if (!seen.insert(name).second) return;
|
||||
if (name == "") {
|
||||
return;
|
||||
}
|
||||
if (!seen.insert(name).second) {
|
||||
return;
|
||||
}
|
||||
Value* v1 = state.allocValue();
|
||||
mkPrimOpApp(*v1, state.getBuiltin("findFile"),
|
||||
state.getBuiltin("nixPath"));
|
||||
|
@ -189,7 +193,9 @@ static std::vector<std::shared_ptr<Installable>> parseInstallables(
|
|||
std::vector<std::shared_ptr<Installable>> result;
|
||||
|
||||
if (ss.empty() && useDefaultInstallables) {
|
||||
if (cmd.file == "") cmd.file = ".";
|
||||
if (cmd.file == "") {
|
||||
cmd.file = ".";
|
||||
}
|
||||
ss = {""};
|
||||
}
|
||||
|
||||
|
|
8
third_party/nix/src/nix/log.cc
vendored
8
third_party/nix/src/nix/log.cc
vendored
|
@ -42,10 +42,14 @@ struct CmdLog : InstallableCommand {
|
|||
for (auto& sub : subs) {
|
||||
auto log = b.drvPath != "" ? sub->getBuildLog(b.drvPath) : nullptr;
|
||||
for (auto& output : b.outputs) {
|
||||
if (log) break;
|
||||
if (log) {
|
||||
break;
|
||||
}
|
||||
log = sub->getBuildLog(output.second);
|
||||
}
|
||||
if (!log) continue;
|
||||
if (!log) {
|
||||
continue;
|
||||
}
|
||||
LOG(INFO) << "got build log for '" << installable->what() << "' from '"
|
||||
<< sub->getUri() << "'";
|
||||
std::cout << *log;
|
||||
|
|
24
third_party/nix/src/nix/main.cc
vendored
24
third_party/nix/src/nix/main.cc
vendored
|
@ -27,12 +27,16 @@ namespace nix {
|
|||
static bool haveInternet() {
|
||||
struct ifaddrs* addrs;
|
||||
|
||||
if (getifaddrs(&addrs)) return true;
|
||||
if (getifaddrs(&addrs)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Finally free([&]() { freeifaddrs(addrs); });
|
||||
|
||||
for (auto i = addrs; i; i = i->ifa_next) {
|
||||
if (!i->ifa_addr) continue;
|
||||
if (!i->ifa_addr) {
|
||||
continue;
|
||||
}
|
||||
if (i->ifa_addr->sa_family == AF_INET) {
|
||||
if (ntohl(((sockaddr_in*)i->ifa_addr)->sin_addr.s_addr) !=
|
||||
INADDR_LOOPBACK) {
|
||||
|
@ -127,7 +131,9 @@ void mainWrapped(int argc, char** argv) {
|
|||
|
||||
{
|
||||
auto legacy = (*RegisterLegacyCommand::commands)[programName];
|
||||
if (legacy) return legacy(argc, argv);
|
||||
if (legacy) {
|
||||
return legacy(argc, argv);
|
||||
}
|
||||
}
|
||||
|
||||
settings.verboseBuild = false;
|
||||
|
@ -138,7 +144,9 @@ void mainWrapped(int argc, char** argv) {
|
|||
|
||||
initPlugins();
|
||||
|
||||
if (!args.command) args.showHelpAndExit();
|
||||
if (!args.command) {
|
||||
args.showHelpAndExit();
|
||||
}
|
||||
|
||||
if (args.useNet && !haveInternet()) {
|
||||
LOG(WARNING) << "you don't have Internet access; "
|
||||
|
@ -148,10 +156,14 @@ void mainWrapped(int argc, char** argv) {
|
|||
|
||||
if (!args.useNet) {
|
||||
// FIXME: should check for command line overrides only.
|
||||
if (!settings.useSubstitutes.overriden) settings.useSubstitutes = false;
|
||||
if (!settings.useSubstitutes.overriden) {
|
||||
settings.useSubstitutes = false;
|
||||
}
|
||||
if (!settings.tarballTtl.overriden)
|
||||
settings.tarballTtl = std::numeric_limits<unsigned int>::max();
|
||||
if (!downloadSettings.tries.overriden) downloadSettings.tries = 0;
|
||||
if (!downloadSettings.tries.overriden) {
|
||||
downloadSettings.tries = 0;
|
||||
}
|
||||
if (!downloadSettings.connectTimeout.overriden)
|
||||
downloadSettings.connectTimeout = 1;
|
||||
}
|
||||
|
|
16
third_party/nix/src/nix/path-info.cc
vendored
16
third_party/nix/src/nix/path-info.cc
vendored
|
@ -97,15 +97,23 @@ struct CmdPathInfo : StorePathsCommand, MixJSON {
|
|||
std::cout << std::string(
|
||||
std::max(0, (int)pathLen - (int)storePath.size()), ' ');
|
||||
|
||||
if (showSize) printSize(info->narSize);
|
||||
if (showSize) {
|
||||
printSize(info->narSize);
|
||||
}
|
||||
|
||||
if (showClosureSize) printSize(store->getClosureSize(storePath).first);
|
||||
if (showClosureSize) {
|
||||
printSize(store->getClosureSize(storePath).first);
|
||||
}
|
||||
|
||||
if (showSigs) {
|
||||
std::cout << '\t';
|
||||
Strings ss;
|
||||
if (info->ultimate) ss.push_back("ultimate");
|
||||
if (info->ca != "") ss.push_back("ca:" + info->ca);
|
||||
if (info->ultimate) {
|
||||
ss.push_back("ultimate");
|
||||
}
|
||||
if (info->ca != "") {
|
||||
ss.push_back("ca:" + info->ca);
|
||||
}
|
||||
for (auto& sig : info->sigs) ss.push_back(sig);
|
||||
std::cout << concatStringsSep(" ", ss);
|
||||
}
|
||||
|
|
56
third_party/nix/src/nix/repl.cc
vendored
56
third_party/nix/src/nix/repl.cc
vendored
|
@ -123,7 +123,9 @@ void printHelp() {
|
|||
string removeWhitespace(string s) {
|
||||
s = chomp(s);
|
||||
size_t n = s.find_first_not_of(" \n\r\t");
|
||||
if (n != string::npos) s = string(s, n);
|
||||
if (n != string::npos) {
|
||||
s = string(s, n);
|
||||
}
|
||||
return s;
|
||||
}
|
||||
|
||||
|
@ -143,13 +145,17 @@ static char* completionCallback(char* s, int* match) {
|
|||
if (possible.size() == 1) {
|
||||
*match = 1;
|
||||
auto* res = strdup(possible.begin()->c_str() + strlen(s));
|
||||
if (!res) throw Error("allocation failure");
|
||||
if (!res) {
|
||||
throw Error("allocation failure");
|
||||
}
|
||||
return res;
|
||||
} else if (possible.size() > 1) {
|
||||
auto checkAllHaveSameAt = [&](size_t pos) {
|
||||
auto& first = *possible.begin();
|
||||
for (auto& p : possible) {
|
||||
if (p.size() <= pos || p[pos] != first[pos]) return false;
|
||||
if (p.size() <= pos || p[pos] != first[pos]) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
@ -161,7 +167,9 @@ static char* completionCallback(char* s, int* match) {
|
|||
if (len > 0) {
|
||||
*match = 1;
|
||||
auto* res = strdup(std::string(*possible.begin(), start, len).c_str());
|
||||
if (!res) throw Error("allocation failure");
|
||||
if (!res) {
|
||||
throw Error("allocation failure");
|
||||
}
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
@ -216,7 +224,9 @@ void NixRepl::mainLoop(const std::vector<std::string>& files) {
|
|||
for (auto& i : files) loadedFiles.push_back(i);
|
||||
|
||||
reloadFiles();
|
||||
if (!loadedFiles.empty()) std::cout << std::endl;
|
||||
if (!loadedFiles.empty()) {
|
||||
std::cout << std::endl;
|
||||
}
|
||||
|
||||
// Allow nix-repl specific settings in .inputrc
|
||||
rl_readline_name = "nix-repl";
|
||||
|
@ -236,10 +246,14 @@ void NixRepl::mainLoop(const std::vector<std::string>& files) {
|
|||
while (true) {
|
||||
// When continuing input from previous lines, don't print a prompt, just
|
||||
// align to the same number of chars as the prompt.
|
||||
if (!getLine(input, input.empty() ? "nix-repl> " : " ")) break;
|
||||
if (!getLine(input, input.empty() ? "nix-repl> " : " ")) {
|
||||
break;
|
||||
}
|
||||
|
||||
try {
|
||||
if (!removeWhitespace(input).empty() && !processLine(input)) return;
|
||||
if (!removeWhitespace(input).empty() && !processLine(input)) {
|
||||
return;
|
||||
}
|
||||
} catch (ParseError& e) {
|
||||
if (e.msg().find("unexpected $end") != std::string::npos) {
|
||||
// For parse errors on incomplete input, we continue waiting for the
|
||||
|
@ -334,7 +348,9 @@ StringSet NixRepl::completePrefix(string prefix) {
|
|||
/* This is a variable name; look it up in the current scope. */
|
||||
StringSet::iterator i = varNames.lower_bound(cur);
|
||||
while (i != varNames.end()) {
|
||||
if (string(*i, 0, cur.size()) != cur) break;
|
||||
if (string(*i, 0, cur.size()) != cur) {
|
||||
break;
|
||||
}
|
||||
completions.insert(prev + *i);
|
||||
i++;
|
||||
}
|
||||
|
@ -353,7 +369,9 @@ StringSet NixRepl::completePrefix(string prefix) {
|
|||
|
||||
for (auto& i : *v.attrs) {
|
||||
string name = i.name;
|
||||
if (string(name, 0, cur2.size()) != cur2) continue;
|
||||
if (string(name, 0, cur2.size()) != cur2) {
|
||||
continue;
|
||||
}
|
||||
completions.insert(prev + expr + "." + name);
|
||||
}
|
||||
|
||||
|
@ -375,7 +393,9 @@ static int runProgram(const string& program, const Strings& args) {
|
|||
|
||||
Pid pid;
|
||||
pid = fork();
|
||||
if (pid == -1) throw SysError("forking");
|
||||
if (pid == -1) {
|
||||
throw SysError("forking");
|
||||
}
|
||||
if (pid == 0) {
|
||||
restoreAffinity();
|
||||
execvp(program.c_str(), stringsToCharPtrs(args2).data());
|
||||
|
@ -386,7 +406,9 @@ static int runProgram(const string& program, const Strings& args) {
|
|||
}
|
||||
|
||||
bool isVarName(const string& s) {
|
||||
if (s.size() == 0) return false;
|
||||
if (s.size() == 0) {
|
||||
return false;
|
||||
}
|
||||
char c = s[0];
|
||||
if ((c >= '0' && c <= '9') || c == '-' || c == '\'') {
|
||||
return false;
|
||||
|
@ -410,14 +432,18 @@ Path NixRepl::getDerivationPath(Value& v) {
|
|||
}
|
||||
|
||||
bool NixRepl::processLine(string line) {
|
||||
if (line == "") return true;
|
||||
if (line == "") {
|
||||
return true;
|
||||
}
|
||||
|
||||
string command, arg;
|
||||
|
||||
if (line[0] == ':') {
|
||||
size_t p = line.find_first_of(" \n\r\t");
|
||||
command = string(line, 0, p);
|
||||
if (p != string::npos) arg = removeWhitespace(string(line, p));
|
||||
if (p != string::npos) {
|
||||
arg = removeWhitespace(string(line, p));
|
||||
}
|
||||
} else {
|
||||
arg = line;
|
||||
}
|
||||
|
@ -561,7 +587,9 @@ void NixRepl::reloadFiles() {
|
|||
|
||||
bool first = true;
|
||||
for (auto& i : old) {
|
||||
if (!first) std::cout << std::endl;
|
||||
if (!first) {
|
||||
std::cout << std::endl;
|
||||
}
|
||||
first = false;
|
||||
std::cout << format("Loading '%1%'...") % i << std::endl;
|
||||
loadFile(i);
|
||||
|
|
24
third_party/nix/src/nix/run.cc
vendored
24
third_party/nix/src/nix/run.cc
vendored
|
@ -94,7 +94,9 @@ struct CmdRun : InstallablesCommand {
|
|||
std::map<std::string, std::string> kept;
|
||||
for (auto& var : keep) {
|
||||
auto s = getenv(var.c_str());
|
||||
if (s) kept[var] = s;
|
||||
if (s) {
|
||||
kept[var] = s;
|
||||
}
|
||||
}
|
||||
|
||||
clearEnv();
|
||||
|
@ -118,9 +120,13 @@ struct CmdRun : InstallablesCommand {
|
|||
while (!todo.empty()) {
|
||||
Path path = todo.front();
|
||||
todo.pop();
|
||||
if (!done.insert(path).second) continue;
|
||||
if (!done.insert(path).second) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (true) unixPath.push_front(path + "/bin");
|
||||
if (true) {
|
||||
unixPath.push_front(path + "/bin");
|
||||
}
|
||||
|
||||
auto propPath = path + "/nix-support/propagated-user-env-packages";
|
||||
if (accessor->stat(propPath).type == FSAccessor::tRegular) {
|
||||
|
@ -206,9 +212,13 @@ void chrootHelper(int argc, char** argv) {
|
|||
for (auto entry : readDirectory("/")) {
|
||||
auto src = "/" + entry.name;
|
||||
auto st = lstat(src);
|
||||
if (!S_ISDIR(st.st_mode)) continue;
|
||||
if (!S_ISDIR(st.st_mode)) {
|
||||
continue;
|
||||
}
|
||||
Path dst = tmpDir + "/" + entry.name;
|
||||
if (pathExists(dst)) continue;
|
||||
if (pathExists(dst)) {
|
||||
continue;
|
||||
}
|
||||
if (mkdir(dst.c_str(), 0700) == -1)
|
||||
throw SysError("creating directory '%s'", dst);
|
||||
if (mount(src.c_str(), dst.c_str(), "", MS_BIND | MS_REC, 0) == -1)
|
||||
|
@ -216,7 +226,9 @@ void chrootHelper(int argc, char** argv) {
|
|||
}
|
||||
|
||||
char* cwd = getcwd(0, 0);
|
||||
if (!cwd) throw SysError("getting current directory");
|
||||
if (!cwd) {
|
||||
throw SysError("getting current directory");
|
||||
}
|
||||
Finally freeCwd([&]() { free(cwd); });
|
||||
|
||||
if (chroot(tmpDir.c_str()) == -1)
|
||||
|
|
4
third_party/nix/src/nix/search.cc
vendored
4
third_party/nix/src/nix/search.cc
vendored
|
@ -244,7 +244,9 @@ struct CmdSearch : SourceExprCommand, MixJSON {
|
|||
/* Fun fact: catching std::ios::failure does not work
|
||||
due to C++11 ABI shenanigans.
|
||||
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66145 */
|
||||
if (!jsonCacheFile) throw Error("error writing to %s", tmpFile);
|
||||
if (!jsonCacheFile) {
|
||||
throw Error("error writing to %s", tmpFile);
|
||||
}
|
||||
throw;
|
||||
}
|
||||
|
||||
|
|
4
third_party/nix/src/nix/show-derivation.cc
vendored
4
third_party/nix/src/nix/show-derivation.cc
vendored
|
@ -50,7 +50,9 @@ struct CmdShowDerivation : InstallablesCommand {
|
|||
JSONObject jsonRoot(std::cout, true);
|
||||
|
||||
for (auto& drvPath : drvPaths) {
|
||||
if (!isDerivation(drvPath)) continue;
|
||||
if (!isDerivation(drvPath)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto drvObj(jsonRoot.object(drvPath));
|
||||
|
||||
|
|
4
third_party/nix/src/nix/sigs.cc
vendored
4
third_party/nix/src/nix/sigs.cc
vendored
|
@ -67,7 +67,9 @@ struct CmdCopySigs : StorePathsCommand {
|
|||
continue;
|
||||
|
||||
for (auto& sig : info2->sigs)
|
||||
if (!info->sigs.count(sig)) newSigs.insert(sig);
|
||||
if (!info->sigs.count(sig)) {
|
||||
newSigs.insert(sig);
|
||||
}
|
||||
} catch (InvalidPath&) {
|
||||
}
|
||||
}
|
||||
|
|
4
third_party/nix/src/nix/upgrade-nix.cc
vendored
4
third_party/nix/src/nix/upgrade-nix.cc
vendored
|
@ -52,7 +52,9 @@ struct CmdUpgradeNix : MixDryRun, StoreCommand {
|
|||
void run(ref<Store> store) override {
|
||||
evalSettings.pureEval = true;
|
||||
|
||||
if (profileDir == "") profileDir = getProfileDir(store);
|
||||
if (profileDir == "") {
|
||||
profileDir = getProfileDir(store);
|
||||
}
|
||||
|
||||
LOG(INFO) << "upgrading Nix in profile '" << profileDir << "'";
|
||||
|
||||
|
|
12
third_party/nix/src/nix/verify.cc
vendored
12
third_party/nix/src/nix/verify.cc
vendored
|
@ -102,7 +102,9 @@ struct CmdVerify : StorePathsCommand {
|
|||
|
||||
auto doSigs = [&](StringSet sigs) {
|
||||
for (auto sig : sigs) {
|
||||
if (sigsSeen.count(sig)) continue;
|
||||
if (sigsSeen.count(sig)) {
|
||||
continue;
|
||||
}
|
||||
sigsSeen.insert(sig);
|
||||
if (validSigs < ValidPathInfo::maxSigs &&
|
||||
info->checkSignature(publicKeys, sig))
|
||||
|
@ -116,7 +118,9 @@ struct CmdVerify : StorePathsCommand {
|
|||
doSigs(info->sigs);
|
||||
|
||||
for (auto& store2 : substituters) {
|
||||
if (validSigs >= actualSigsNeeded) break;
|
||||
if (validSigs >= actualSigsNeeded) {
|
||||
break;
|
||||
}
|
||||
try {
|
||||
auto info2 = store2->queryPathInfo(info->path);
|
||||
if (info2->isContentAddressed(*store))
|
||||
|
@ -128,7 +132,9 @@ struct CmdVerify : StorePathsCommand {
|
|||
}
|
||||
}
|
||||
|
||||
if (validSigs >= actualSigsNeeded) good = true;
|
||||
if (validSigs >= actualSigsNeeded) {
|
||||
good = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (!good) {
|
||||
|
|
16
third_party/nix/src/nix/why-depends.cc
vendored
16
third_party/nix/src/nix/why-depends.cc
vendored
|
@ -145,7 +145,9 @@ struct CmdWhyDepends : SourceExprCommand {
|
|||
if (node.path == dependencyPath && !all && packagePath != dependencyPath)
|
||||
throw BailOut();
|
||||
|
||||
if (node.visited) return;
|
||||
if (node.visited) {
|
||||
return;
|
||||
}
|
||||
node.visited = true;
|
||||
|
||||
/* Sort the references by distance to `dependency` to
|
||||
|
@ -154,9 +156,13 @@ struct CmdWhyDepends : SourceExprCommand {
|
|||
std::set<std::string> hashes;
|
||||
|
||||
for (auto& ref : node.refs) {
|
||||
if (ref == node.path && packagePath != dependencyPath) continue;
|
||||
if (ref == node.path && packagePath != dependencyPath) {
|
||||
continue;
|
||||
}
|
||||
auto& node2 = graph.at(ref);
|
||||
if (node2.dist == inf) continue;
|
||||
if (node2.dist == inf) {
|
||||
continue;
|
||||
}
|
||||
refs.emplace(node2.dist, &node2);
|
||||
hashes.insert(storePathToHash(node2.path));
|
||||
}
|
||||
|
@ -228,7 +234,9 @@ struct CmdWhyDepends : SourceExprCommand {
|
|||
<< (first ? (last ? treeLast : treeConn)
|
||||
: (last ? treeNull : treeLine))
|
||||
<< hit;
|
||||
if (!all) break;
|
||||
if (!all) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
printNode(*ref.second, tailPad + (last ? treeNull : treeLine),
|
||||
|
|
|
@ -30,10 +30,14 @@ std::set<string> readCacheFile(const Path& file) {
|
|||
|
||||
std::set<std::string> runResolver(const Path& filename) {
|
||||
AutoCloseFD fd = open(filename.c_str(), O_RDONLY);
|
||||
if (!fd) throw SysError("opening '%s'", filename);
|
||||
if (!fd) {
|
||||
throw SysError("opening '%s'", filename);
|
||||
}
|
||||
|
||||
struct stat st;
|
||||
if (fstat(fd.get(), &st)) throw SysError("statting '%s'", filename);
|
||||
if (fstat(fd.get(), &st)) {
|
||||
throw SysError("statting '%s'", filename);
|
||||
}
|
||||
|
||||
if (!S_ISREG(st.st_mode)) {
|
||||
printError("file '%s' is not a regular file", filename);
|
||||
|
@ -46,7 +50,9 @@ std::set<std::string> runResolver(const Path& filename) {
|
|||
}
|
||||
|
||||
char* obj = (char*)mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd.get(), 0);
|
||||
if (!obj) throw SysError("mmapping '%s'", filename);
|
||||
if (!obj) {
|
||||
throw SysError("mmapping '%s'", filename);
|
||||
}
|
||||
|
||||
ptrdiff_t mach64_offset = 0;
|
||||
|
||||
|
@ -115,7 +121,9 @@ Path resolveSymlink(const Path& path) {
|
|||
|
||||
std::set<string> resolveTree(const Path& path, PathSet& deps) {
|
||||
std::set<string> results;
|
||||
if (deps.count(path)) return {};
|
||||
if (deps.count(path)) {
|
||||
return {};
|
||||
}
|
||||
deps.insert(path);
|
||||
for (auto& lib : runResolver(path)) {
|
||||
results.insert(lib);
|
||||
|
@ -127,10 +135,14 @@ std::set<string> resolveTree(const Path& path, PathSet& deps) {
|
|||
}
|
||||
|
||||
std::set<string> getPath(const Path& path) {
|
||||
if (hasPrefix(path, "/dev")) return {};
|
||||
if (hasPrefix(path, "/dev")) {
|
||||
return {};
|
||||
}
|
||||
|
||||
Path cacheFile = resolveCacheFile(path);
|
||||
if (pathExists(cacheFile)) return readCacheFile(cacheFile);
|
||||
if (pathExists(cacheFile)) {
|
||||
return readCacheFile(cacheFile);
|
||||
}
|
||||
|
||||
std::set<string> deps, paths;
|
||||
paths.insert(path);
|
||||
|
|
Loading…
Reference in a new issue