forked from lix-project/lix
950b46821f
The attributes previously stored in TreeInfo (narHash, revCount, lastModified) are now stored in Input. This makes it less arbitrary what attributes are stored where. As a result, the lock file format has changed. An entry like "info": { "lastModified": 1585405475, "narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE=" }, "locked": { "owner": "NixOS", "repo": "nixpkgs", "rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be", "type": "github" }, is now stored as "locked": { "owner": "NixOS", "repo": "nixpkgs", "rev": "b88ff468e9850410070d4e0ccd68c7011f15b2be", "type": "github", "lastModified": 1585405475, "narHash": "sha256-bESW0n4KgPmZ0luxvwJ+UyATrC6iIltVCsGdLiphVeE=" }, The 'Input' class is now a dumb set of attributes. All the fetcher implementations subclass InputScheme, not Input. This simplifies the API. Also, fix substitution of flake inputs. This was broken since lazy flake fetching started using fetchTree internally.
85 lines
3.1 KiB
C++
85 lines
3.1 KiB
C++
#include "primops.hh"
|
|
#include "eval-inline.hh"
|
|
#include "store-api.hh"
|
|
#include "hash.hh"
|
|
#include "fetchers.hh"
|
|
#include "url.hh"
|
|
|
|
namespace nix {
|
|
|
|
static void prim_fetchGit(EvalState & state, const Pos & pos, Value * * args, Value & v)
|
|
{
|
|
std::string url;
|
|
std::optional<std::string> ref;
|
|
std::optional<Hash> rev;
|
|
std::string name = "source";
|
|
bool fetchSubmodules = false;
|
|
PathSet context;
|
|
|
|
state.forceValue(*args[0]);
|
|
|
|
if (args[0]->type == tAttrs) {
|
|
|
|
state.forceAttrs(*args[0], pos);
|
|
|
|
for (auto & attr : *args[0]->attrs) {
|
|
string n(attr.name);
|
|
if (n == "url")
|
|
url = state.coerceToString(*attr.pos, *attr.value, context, false, false);
|
|
else if (n == "ref")
|
|
ref = state.forceStringNoCtx(*attr.value, *attr.pos);
|
|
else if (n == "rev")
|
|
rev = Hash(state.forceStringNoCtx(*attr.value, *attr.pos), htSHA1);
|
|
else if (n == "name")
|
|
name = state.forceStringNoCtx(*attr.value, *attr.pos);
|
|
else if (n == "submodules")
|
|
fetchSubmodules = state.forceBool(*attr.value, *attr.pos);
|
|
else
|
|
throw EvalError("unsupported argument '%s' to 'fetchGit', at %s", attr.name, *attr.pos);
|
|
}
|
|
|
|
if (url.empty())
|
|
throw EvalError(format("'url' argument required, at %1%") % pos);
|
|
|
|
} else
|
|
url = state.coerceToString(pos, *args[0], context, false, false);
|
|
|
|
// FIXME: git externals probably can be used to bypass the URI
|
|
// whitelist. Ah well.
|
|
state.checkURI(url);
|
|
|
|
if (evalSettings.pureEval && !rev)
|
|
throw Error("in pure evaluation mode, 'fetchGit' requires a Git revision");
|
|
|
|
fetchers::Attrs attrs;
|
|
attrs.insert_or_assign("type", "git");
|
|
attrs.insert_or_assign("url", url.find("://") != std::string::npos ? url : "file://" + url);
|
|
if (ref) attrs.insert_or_assign("ref", *ref);
|
|
if (rev) attrs.insert_or_assign("rev", rev->gitRev());
|
|
if (fetchSubmodules) attrs.insert_or_assign("submodules", fetchers::Explicit<bool>{true});
|
|
auto input = fetchers::Input::fromAttrs(std::move(attrs));
|
|
|
|
// FIXME: use name?
|
|
auto [tree, input2] = input.fetch(state.store);
|
|
|
|
state.mkAttrs(v, 8);
|
|
auto storePath = state.store->printStorePath(tree.storePath);
|
|
mkString(*state.allocAttr(v, state.sOutPath), storePath, PathSet({storePath}));
|
|
// Backward compatibility: set 'rev' to
|
|
// 0000000000000000000000000000000000000000 for a dirty tree.
|
|
auto rev2 = input2.getRev().value_or(Hash(htSHA1));
|
|
mkString(*state.allocAttr(v, state.symbols.create("rev")), rev2.gitRev());
|
|
mkString(*state.allocAttr(v, state.symbols.create("shortRev")), rev2.gitShortRev());
|
|
// Backward compatibility: set 'revCount' to 0 for a dirty tree.
|
|
mkInt(*state.allocAttr(v, state.symbols.create("revCount")),
|
|
input2.getRevCount().value_or(0));
|
|
mkBool(*state.allocAttr(v, state.symbols.create("submodules")), fetchSubmodules);
|
|
v.attrs->sort();
|
|
|
|
if (state.allowedPaths)
|
|
state.allowedPaths->insert(tree.actualPath);
|
|
}
|
|
|
|
static RegisterPrimOp r("fetchGit", 1, prim_fetchGit);
|
|
|
|
}
|