diff options
Diffstat (limited to 'third_party/nix/src/libexpr/primops')
-rw-r--r-- | third_party/nix/src/libexpr/primops/context.cc | 13 | ||||
-rw-r--r-- | third_party/nix/src/libexpr/primops/fetchGit.cc | 32 | ||||
-rw-r--r-- | third_party/nix/src/libexpr/primops/fetchMercurial.cc | 20 | ||||
-rw-r--r-- | third_party/nix/src/libexpr/primops/fromTOML.cc | 26 |
4 files changed, 36 insertions, 55 deletions
diff --git a/third_party/nix/src/libexpr/primops/context.cc b/third_party/nix/src/libexpr/primops/context.cc index fb8879ead16d..841a45c61c03 100644 --- a/third_party/nix/src/libexpr/primops/context.cc +++ b/third_party/nix/src/libexpr/primops/context.cc @@ -97,13 +97,12 @@ static void prim_getContext(EvalState& state, const Pos& pos, Value** args, ContextInfo{isPath, isAllOutputs, output.empty() ? Strings{} : Strings{std::move(output)}}); } else { - if (isPath) { + if (isPath) iter->second.path = true; - } else if (isAllOutputs) { + else if (isAllOutputs) iter->second.allOutputs = true; - } else { + else iter->second.outputs.emplace_back(std::move(output)); - } } } @@ -117,9 +116,8 @@ static void prim_getContext(EvalState& state, const Pos& pos, Value** args, if (info.second.path) { mkBool(*state.allocAttr(infoVal, sPath), true); } - if (info.second.allOutputs) { + if (info.second.allOutputs) mkBool(*state.allocAttr(infoVal, sAllOutputs), true); - } if (!info.second.outputs.empty()) { auto& outputsVal = *state.allocAttr(infoVal, state.sOutputs); state.mkList(outputsVal, info.second.outputs.size()); @@ -149,10 +147,9 @@ static void prim_appendContext(EvalState& state, const Pos& pos, Value** args, auto sAllOutputs = state.symbols.Create("allOutputs"); for (const auto& attr_iter : *args[1]->attrs) { const Attr* i = &attr_iter.second; // TODO(tazjin): get rid of this - if (!state.store->isStorePath(i->name)) { + 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); } diff --git a/third_party/nix/src/libexpr/primops/fetchGit.cc b/third_party/nix/src/libexpr/primops/fetchGit.cc index 839094b72b53..7262a291559f 100644 --- a/third_party/nix/src/libexpr/primops/fetchGit.cc +++ b/third_party/nix/src/libexpr/primops/fetchGit.cc @@ -30,9 +30,8 @@ std::regex revRegex("^[0-9a-fA-F]{40}$"); GitInfo exportGit(ref<Store> store, const std::string& uri, std::optional<std::string> ref, std::string rev, const std::string& name) { - if (evalSettings.pureEval && rev == "") { + if (evalSettings.pureEval && rev == "") throw Error("in pure evaluation mode, 'fetchGit' requires a Git revision"); - } if (!ref && rev == "" && absl::StartsWith(uri, "/") && pathExists(uri + "/.git")) { @@ -91,9 +90,8 @@ GitInfo exportGit(ref<Store> store, const std::string& uri, ref = "HEAD"s; } - if (rev != "" && !std::regex_match(rev, revRegex)) { + if (rev != "" && !std::regex_match(rev, revRegex)) throw Error("invalid Git revision '%s'", rev); - } deletePath(getCacheDir() + "/nix/git"); @@ -106,13 +104,12 @@ GitInfo exportGit(ref<Store> store, const std::string& uri, } Path localRefFile; - if (ref->compare(0, 5, "refs/") == 0) { + if (ref->compare(0, 5, "refs/") == 0) localRefFile = cacheDir + "/" + *ref; - } else { + else localRefFile = cacheDir + "/refs/heads/" + *ref; - } - bool doFetch = 0; + bool doFetch; time_t now = time(0); /* If a rev was specified, we need to fetch if it's not in the repo. */ @@ -130,10 +127,9 @@ GitInfo exportGit(ref<Store> store, const std::string& uri, } else { /* If the local ref is older than ‘tarball-ttl’ seconds, do a git fetch to update the local ref to the remote ref. */ - struct stat st {}; + struct stat st; doFetch = stat(localRefFile.c_str(), &st) != 0 || - static_cast<uint64_t>(st.st_mtime) + settings.tarballTtl <= - static_cast<uint64_t>(now); + (uint64_t)st.st_mtime + settings.tarballTtl <= (uint64_t)now; } if (doFetch) { DLOG(INFO) << "fetching Git repository '" << uri << "'"; @@ -229,24 +225,22 @@ static void prim_fetchGit(EvalState& state, const Pos& pos, Value** args, for (auto& attr_iter : *args[0]->attrs) { auto& attr = attr_iter.second; std::string n(attr.name); - if (n == "url") { + if (n == "url") url = state.coerceToString(*attr.pos, *attr.value, context, false, false); - } else if (n == "ref") { + else if (n == "ref") ref = state.forceStringNoCtx(*attr.value, *attr.pos); - } else if (n == "rev") { + else if (n == "rev") rev = state.forceStringNoCtx(*attr.value, *attr.pos); - } else if (n == "name") { + else if (n == "name") name = state.forceStringNoCtx(*attr.value, *attr.pos); - } else { + else throw EvalError("unsupported argument '%s' to 'fetchGit', at %s", attr.name, *attr.pos); - } } - if (url.empty()) { + if (url.empty()) throw EvalError(format("'url' argument required, at %1%") % pos); - } } else { url = state.coerceToString(pos, *args[0], context, false, false); diff --git a/third_party/nix/src/libexpr/primops/fetchMercurial.cc b/third_party/nix/src/libexpr/primops/fetchMercurial.cc index 05a3d66ae7ca..3ece094e6a8d 100644 --- a/third_party/nix/src/libexpr/primops/fetchMercurial.cc +++ b/third_party/nix/src/libexpr/primops/fetchMercurial.cc @@ -28,11 +28,10 @@ std::regex commitHashRegex("^[0-9a-fA-F]{40}$"); HgInfo exportMercurial(ref<Store> store, const std::string& uri, std::string rev, const std::string& name) { - if (evalSettings.pureEval && rev == "") { + if (evalSettings.pureEval && rev == "") throw Error( "in pure evaluation mode, 'fetchMercurial' requires a Mercurial " "revision"); - } if (rev == "" && absl::StartsWith(uri, "/") && pathExists(uri + "/.hg")) { bool clean = runProgram("hg", true, @@ -91,10 +90,9 @@ HgInfo exportMercurial(ref<Store> store, const std::string& uri, /* If we haven't pulled this repo less than ‘tarball-ttl’ seconds, do so now. */ time_t now = time(0); - struct stat st {}; + struct stat st; if (stat(stampFile.c_str(), &st) != 0 || - static_cast<uint64_t>(st.st_mtime) + settings.tarballTtl <= - static_cast<uint64_t>(now)) { + (uint64_t)st.st_mtime + settings.tarballTtl <= (uint64_t)now) { /* Except that if this is a commit hash that we already have, we don't have to pull again. */ if (!(std::regex_match(rev, commitHashRegex) && pathExists(cacheDir) && @@ -200,22 +198,20 @@ static void prim_fetchMercurial(EvalState& state, const Pos& pos, Value** args, for (auto& attr_iter : *args[0]->attrs) { auto& attr = attr_iter.second; std::string n(attr.name); - if (n == "url") { + if (n == "url") url = state.coerceToString(*attr.pos, *attr.value, context, false, false); - } else if (n == "rev") { + else if (n == "rev") rev = state.forceStringNoCtx(*attr.value, *attr.pos); - } else if (n == "name") { + else if (n == "name") name = state.forceStringNoCtx(*attr.value, *attr.pos); - } else { + else throw EvalError("unsupported argument '%s' to 'fetchMercurial', at %s", attr.name, *attr.pos); - } } - if (url.empty()) { + if (url.empty()) throw EvalError(format("'url' argument required, at %1%") % pos); - } } else { url = state.coerceToString(pos, *args[0], context, false, false); diff --git a/third_party/nix/src/libexpr/primops/fromTOML.cc b/third_party/nix/src/libexpr/primops/fromTOML.cc index e3d2a4940769..389ac080677a 100644 --- a/third_party/nix/src/libexpr/primops/fromTOML.cc +++ b/third_party/nix/src/libexpr/primops/fromTOML.cc @@ -30,12 +30,10 @@ static void prim_fromTOML(EvalState& state, const Pos& pos, Value** args, if (auto i2 = i.second->as_table_array()) { size_t size2 = i2->get().size(); state.mkList(v2, size2); - for (size_t j = 0; j < size2; ++j) { + for (size_t j = 0; j < size2; ++j) visit(*((*v2.list)[j] = state.allocValue()), i2->get()[j]); - } - } else { + } else visit(v2, i.second); - } } } @@ -44,9 +42,8 @@ static void prim_fromTOML(EvalState& state, const Pos& pos, Value** args, state.mkList(v, size); - for (size_t i = 0; i < size; ++i) { + for (size_t i = 0; i < size; ++i) visit(*((*v.list)[i] = state.allocValue()), t2->get()[i]); - } } // Handle cases like 'a = [[{ a = true }]]', which IMHO should be @@ -58,28 +55,25 @@ static void prim_fromTOML(EvalState& state, const Pos& pos, Value** args, state.mkList(v, size); - for (size_t j = 0; j < size; ++j) { + for (size_t j = 0; j < size; ++j) visit(*((*v.list)[j] = state.allocValue()), t2->get()[j]); - } } else if (t->is_value()) { - if (auto val = t->as<int64_t>()) { + if (auto val = t->as<int64_t>()) mkInt(v, val->get()); - } else if (auto val = t->as<NixFloat>()) { + else if (auto val = t->as<NixFloat>()) mkFloat(v, val->get()); - } else if (auto val = t->as<bool>()) { + else if (auto val = t->as<bool>()) mkBool(v, val->get()); - } else if (auto val = t->as<std::string>()) { + else if (auto val = t->as<std::string>()) mkString(v, val->get()); - } else { + else throw EvalError("unsupported value type in TOML"); - } } - else { + else abort(); - } }; try { |