libfetchers: remove scheme static initializers

provide a initLibFetchers function instead that runs them explicitly.

Change-Id: Ida532e6ff18b72fdc21c9f98df7aceda6713e5df
This commit is contained in:
eldritch horrors
2024-11-15 16:15:11 +01:00
parent 8088927b90
commit c859d03013
11 changed files with 84 additions and 23 deletions
+2
View File
@@ -191,6 +191,8 @@ void initLibExpr()
#endif
fetchers::initLibFetchers();
libexprInitialised = true;
}
+18
View File
@@ -0,0 +1,18 @@
#pragma once
///@file internal header for fetcher declarations
#include "fetchers.hh"
namespace nix::fetchers {
std::unique_ptr<InputScheme> makeIndirectInputScheme();
std::unique_ptr<InputScheme> makePathInputScheme();
std::unique_ptr<InputScheme> makeFileInputScheme();
std::unique_ptr<InputScheme> makeTarballInputScheme();
std::unique_ptr<InputScheme> makeGitInputScheme();
std::unique_ptr<InputScheme> makeMercurialInputScheme();
std::unique_ptr<InputScheme> makeGitHubInputScheme();
std::unique_ptr<InputScheme> makeGitLabInputScheme();
std::unique_ptr<InputScheme> makeSourceHutInputScheme();
}
+18 -5
View File
@@ -1,4 +1,5 @@
#include "fetchers.hh"
#include "builtin-fetchers.hh"
#include "store-api.hh"
#include "source-path.hh"
#include "fetch-to-store.hh"
@@ -7,12 +8,24 @@
namespace nix::fetchers {
std::unique_ptr<std::vector<std::shared_ptr<InputScheme>>> inputSchemes = nullptr;
static std::vector<std::shared_ptr<InputScheme>> inputSchemes;
void registerInputScheme(std::shared_ptr<InputScheme> && inputScheme)
{
if (!inputSchemes) inputSchemes = std::make_unique<std::vector<std::shared_ptr<InputScheme>>>();
inputSchemes->push_back(std::move(inputScheme));
inputSchemes.push_back(std::move(inputScheme));
}
void initLibFetchers()
{
registerInputScheme(makeIndirectInputScheme());
registerInputScheme(makePathInputScheme());
registerInputScheme(makeFileInputScheme());
registerInputScheme(makeTarballInputScheme());
registerInputScheme(makeGitInputScheme());
registerInputScheme(makeMercurialInputScheme());
registerInputScheme(makeGitHubInputScheme());
registerInputScheme(makeGitLabInputScheme());
registerInputScheme(makeSourceHutInputScheme());
}
Input Input::fromURL(const std::string & url, bool requireTree)
@@ -35,7 +48,7 @@ static void fixupInput(Input & input)
Input Input::fromURL(const ParsedURL & url, bool requireTree)
{
for (auto & inputScheme : *inputSchemes) {
for (auto & inputScheme : inputSchemes) {
auto res = inputScheme->inputFromURL(url, requireTree);
if (res) {
res->scheme = inputScheme;
@@ -49,7 +62,7 @@ Input Input::fromURL(const ParsedURL & url, bool requireTree)
Input Input::fromAttrs(Attrs && attrs)
{
for (auto & inputScheme : *inputSchemes) {
for (auto & inputScheme : inputSchemes) {
auto res = inputScheme->inputFromAttrs(attrs);
if (res) {
res->scheme = inputScheme;
+2
View File
@@ -196,6 +196,8 @@ protected:
void registerInputScheme(std::shared_ptr<InputScheme> && fetcher);
void initLibFetchers();
struct DownloadFileResult
{
StorePath storePath;
+5 -1
View File
@@ -2,6 +2,7 @@
#include "fetchers.hh"
#include "cache.hh"
#include "globals.hh"
#include "builtin-fetchers.hh"
#include "processes.hh"
#include "tarfile.hh"
#include "store-api.hh"
@@ -795,6 +796,9 @@ struct GitInputScheme : InputScheme
}
};
static auto rGitInputScheme = OnStartup([] { registerInputScheme(std::make_unique<GitInputScheme>()); });
std::unique_ptr<InputScheme> makeGitInputScheme()
{
return std::make_unique<GitInputScheme>();
}
}
+14 -3
View File
@@ -2,6 +2,7 @@
#include "filetransfer.hh"
#include "cache.hh"
#include "globals.hh"
#include "builtin-fetchers.hh"
#include "store-api.hh"
#include "types.hh"
#include "url-parts.hh"
@@ -477,8 +478,18 @@ struct SourceHutInputScheme : GitArchiveInputScheme
}
};
static auto rGitHubInputScheme = OnStartup([] { registerInputScheme(std::make_unique<GitHubInputScheme>()); });
static auto rGitLabInputScheme = OnStartup([] { registerInputScheme(std::make_unique<GitLabInputScheme>()); });
static auto rSourceHutInputScheme = OnStartup([] { registerInputScheme(std::make_unique<SourceHutInputScheme>()); });
std::unique_ptr<InputScheme> makeGitHubInputScheme()
{
return std::make_unique<GitHubInputScheme>();
}
std::unique_ptr<InputScheme> makeGitLabInputScheme()
{
return std::make_unique<GitLabInputScheme>();
}
std::unique_ptr<InputScheme> makeSourceHutInputScheme()
{
return std::make_unique<SourceHutInputScheme>();
}
}
+5 -1
View File
@@ -1,4 +1,5 @@
#include "fetchers.hh"
#include "builtin-fetchers.hh"
#include "url-parts.hh"
#include "path.hh"
@@ -107,6 +108,9 @@ struct IndirectInputScheme : InputScheme
}
};
static auto rIndirectInputScheme = OnStartup([] { registerInputScheme(std::make_unique<IndirectInputScheme>()); });
std::unique_ptr<InputScheme> makeIndirectInputScheme()
{
return std::make_unique<IndirectInputScheme>();
}
}
+5 -1
View File
@@ -1,5 +1,6 @@
#include "fetchers.hh"
#include "cache.hh"
#include "builtin-fetchers.hh"
#include "processes.hh"
#include "store-api.hh"
#include "temporary-dir.hh"
@@ -330,6 +331,9 @@ struct MercurialInputScheme : InputScheme
}
};
static auto rMercurialInputScheme = OnStartup([] { registerInputScheme(std::make_unique<MercurialInputScheme>()); });
std::unique_ptr<InputScheme> makeMercurialInputScheme()
{
return std::make_unique<MercurialInputScheme>();
}
}
+5 -1
View File
@@ -1,4 +1,5 @@
#include "fetchers.hh"
#include "builtin-fetchers.hh"
#include "store-api.hh"
#include "archive.hh"
@@ -139,6 +140,9 @@ struct PathInputScheme : InputScheme
}
};
static auto rPathInputScheme = OnStartup([] { registerInputScheme(std::make_unique<PathInputScheme>()); });
std::unique_ptr<InputScheme> makePathInputScheme()
{
return std::make_unique<PathInputScheme>();
}
}
+10 -2
View File
@@ -2,6 +2,7 @@
#include "cache.hh"
#include "filetransfer.hh"
#include "globals.hh"
#include "builtin-fetchers.hh"
#include "store-api.hh"
#include "archive.hh"
#include "tarfile.hh"
@@ -307,7 +308,14 @@ struct TarballInputScheme : CurlInputScheme
}
};
static auto rTarballInputScheme = OnStartup([] { registerInputScheme(std::make_unique<TarballInputScheme>()); });
static auto rFileInputScheme = OnStartup([] { registerInputScheme(std::make_unique<FileInputScheme>()); });
std::unique_ptr<InputScheme> makeFileInputScheme()
{
return std::make_unique<TarballInputScheme>();
}
std::unique_ptr<InputScheme> makeTarballInputScheme()
{
return std::make_unique<FileInputScheme>();
}
}
-9
View File
@@ -32,15 +32,6 @@ typedef std::set<Path> PathSet;
typedef std::vector<std::pair<std::string, std::string>> Headers;
/**
* Helper class to run code at startup.
*/
template<typename T>
struct OnStartup
{
OnStartup(T && t) { t(); }
};
/**
* Wrap bools to prevent string literals (i.e. 'char *') from being
* cast to a bool in Attr.