1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2024-10-18 00:16:11 -04:00
This commit is contained in:
Eelco Dolstra 2024-10-17 21:22:20 +02:00 committed by GitHub
commit 5a6ddb58da
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 92 additions and 16 deletions

View file

@ -10,6 +10,7 @@
#include "processes.hh"
#include "git.hh"
#include "mounted-source-accessor.hh"
#include "lazy-source-accessor.hh"
#include "git-utils.hh"
#include "logging.hh"
#include "finally.hh"
@ -646,6 +647,9 @@ struct GitInputScheme : InputScheme
std::map<CanonPath, nix::ref<SourceAccessor>> mounts;
for (auto & [submodule, submoduleRev] : repo->getSubmodules(rev, exportIgnore)) {
auto submoduleAccessor = make_ref<LazySourceAccessor>([repoDir, submodule, submoduleRev, exportIgnore, store, settings(input.settings)]()
{
auto repo = GitRepo::openRepo(repoDir);
auto resolved = repo->resolveSubmoduleUrl(submodule.url);
debug("Git submodule %s: %s %s %s -> %s",
submodule.path, submodule.url, submodule.branch, submoduleRev.gitRev(), resolved);
@ -658,10 +662,12 @@ struct GitInputScheme : InputScheme
attrs.insert_or_assign("exportIgnore", Explicit<bool>{ exportIgnore });
attrs.insert_or_assign("submodules", Explicit<bool>{ true });
attrs.insert_or_assign("allRefs", Explicit<bool>{ true });
auto submoduleInput = fetchers::Input::fromAttrs(*input.settings, std::move(attrs));
auto submoduleInput = fetchers::Input::fromAttrs(*settings, std::move(attrs));
auto [submoduleAccessor, submoduleInput2] =
submoduleInput.getAccessor(store);
submoduleAccessor->setPathDisplay("«" + submoduleInput.to_string() + "»");
return submoduleAccessor;
});
mounts.insert_or_assign(submodule.path, submoduleAccessor);
}

View file

@ -0,0 +1,69 @@
#pragma once
#include "source-accessor.hh"
#include "sync.hh"
#include <variant>
namespace nix {
/**
* A wrapper `SourceAccessor` that lazily constructs an underlying
* `SourceAccessor`.
*/
struct LazySourceAccessor : SourceAccessor
{
using Fun = std::function<ref<SourceAccessor>()>;
Sync<std::variant<ref<SourceAccessor>, Fun>> next_;
LazySourceAccessor(Fun next)
: next_{{std::move(next)}}
{
}
ref<SourceAccessor> getNext()
{
auto next(next_.lock());
if (auto accessor = std::get_if<ref<SourceAccessor>>(&*next))
return *accessor;
else {
auto fun = std::get<Fun>(*next);
auto acc = fun();
*next = acc;
return acc;
}
}
std::string readFile(const CanonPath & path) override
{
return getNext()->readFile(path);
}
void readFile(const CanonPath & path, Sink & sink, std::function<void(uint64_t)> sizeCallback) override
{
return getNext()->readFile(path, sink, sizeCallback);
}
bool pathExists(const CanonPath & path) override
{
return getNext()->pathExists(path);
}
std::optional<Stat> maybeLstat(const CanonPath & path) override
{
return getNext()->maybeLstat(path);
}
DirEntries readDirectory(const CanonPath & path) override
{
return getNext()->readDirectory(path);
}
std::string readLink(const CanonPath & path) override
{
return getNext()->readLink(path);
}
};
}

View file

@ -211,6 +211,7 @@ headers = [config_h] + files(
'hilite.hh',
'json-impls.hh',
'json-utils.hh',
'lazy-source-accessor.hh',
'logging.hh',
'lru-cache.hh',
'memory-source-accessor.hh',