mirror of
https://github.com/NixOS/nix
synced 2024-10-18 00:16:11 -04:00
Merge 353b2298b5
into 1cd48008f0
This commit is contained in:
commit
5a6ddb58da
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
69
src/libutil/lazy-source-accessor.hh
Normal file
69
src/libutil/lazy-source-accessor.hh
Normal 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);
|
||||
}
|
||||
};
|
||||
|
||||
}
|
|
@ -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',
|
||||
|
|
Loading…
Reference in a new issue