diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index f9dbd254e..d3ce4a7be 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -191,6 +191,8 @@ void initLibExpr() #endif + fetchers::initLibFetchers(); + libexprInitialised = true; } diff --git a/src/libfetchers/builtin-fetchers.hh b/src/libfetchers/builtin-fetchers.hh new file mode 100644 index 000000000..3a6ab1124 --- /dev/null +++ b/src/libfetchers/builtin-fetchers.hh @@ -0,0 +1,18 @@ +#pragma once +///@file internal header for fetcher declarations + +#include "fetchers.hh" + +namespace nix::fetchers { + +std::unique_ptr makeIndirectInputScheme(); +std::unique_ptr makePathInputScheme(); +std::unique_ptr makeFileInputScheme(); +std::unique_ptr makeTarballInputScheme(); +std::unique_ptr makeGitInputScheme(); +std::unique_ptr makeMercurialInputScheme(); +std::unique_ptr makeGitHubInputScheme(); +std::unique_ptr makeGitLabInputScheme(); +std::unique_ptr makeSourceHutInputScheme(); + +} diff --git a/src/libfetchers/fetchers.cc b/src/libfetchers/fetchers.cc index c441ffb12..926a9eeba 100644 --- a/src/libfetchers/fetchers.cc +++ b/src/libfetchers/fetchers.cc @@ -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>> inputSchemes = nullptr; +static std::vector> inputSchemes; void registerInputScheme(std::shared_ptr && inputScheme) { - if (!inputSchemes) inputSchemes = std::make_unique>>(); - 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; diff --git a/src/libfetchers/fetchers.hh b/src/libfetchers/fetchers.hh index 064d5e4ec..ef3a4ec71 100644 --- a/src/libfetchers/fetchers.hh +++ b/src/libfetchers/fetchers.hh @@ -196,6 +196,8 @@ protected: void registerInputScheme(std::shared_ptr && fetcher); +void initLibFetchers(); + struct DownloadFileResult { StorePath storePath; diff --git a/src/libfetchers/git.cc b/src/libfetchers/git.cc index a35889b19..c7cb7533d 100644 --- a/src/libfetchers/git.cc +++ b/src/libfetchers/git.cc @@ -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()); }); +std::unique_ptr makeGitInputScheme() +{ + return std::make_unique(); +} } diff --git a/src/libfetchers/github.cc b/src/libfetchers/github.cc index 2ae127bc5..f5342f3f0 100644 --- a/src/libfetchers/github.cc +++ b/src/libfetchers/github.cc @@ -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()); }); -static auto rGitLabInputScheme = OnStartup([] { registerInputScheme(std::make_unique()); }); -static auto rSourceHutInputScheme = OnStartup([] { registerInputScheme(std::make_unique()); }); +std::unique_ptr makeGitHubInputScheme() +{ + return std::make_unique(); +} +std::unique_ptr makeGitLabInputScheme() +{ + return std::make_unique(); +} + +std::unique_ptr makeSourceHutInputScheme() +{ + return std::make_unique(); +} } diff --git a/src/libfetchers/indirect.cc b/src/libfetchers/indirect.cc index f3912b82f..c73ffc9c7 100644 --- a/src/libfetchers/indirect.cc +++ b/src/libfetchers/indirect.cc @@ -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()); }); +std::unique_ptr makeIndirectInputScheme() +{ + return std::make_unique(); +} } diff --git a/src/libfetchers/mercurial.cc b/src/libfetchers/mercurial.cc index b5ea7998a..3f0e72acb 100644 --- a/src/libfetchers/mercurial.cc +++ b/src/libfetchers/mercurial.cc @@ -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()); }); +std::unique_ptr makeMercurialInputScheme() +{ + return std::make_unique(); +} } diff --git a/src/libfetchers/path.cc b/src/libfetchers/path.cc index 8e47616d0..150b89492 100644 --- a/src/libfetchers/path.cc +++ b/src/libfetchers/path.cc @@ -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()); }); +std::unique_ptr makePathInputScheme() +{ + return std::make_unique(); +} } diff --git a/src/libfetchers/tarball.cc b/src/libfetchers/tarball.cc index dac3608df..5091e18fe 100644 --- a/src/libfetchers/tarball.cc +++ b/src/libfetchers/tarball.cc @@ -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()); }); -static auto rFileInputScheme = OnStartup([] { registerInputScheme(std::make_unique()); }); +std::unique_ptr makeFileInputScheme() +{ + return std::make_unique(); +} + +std::unique_ptr makeTarballInputScheme() +{ + return std::make_unique(); +} } diff --git a/src/libutil/types.hh b/src/libutil/types.hh index 66c41fe59..1e3e4acea 100644 --- a/src/libutil/types.hh +++ b/src/libutil/types.hh @@ -32,15 +32,6 @@ typedef std::set PathSet; typedef std::vector> Headers; -/** - * Helper class to run code at startup. - */ -template -struct OnStartup -{ - OnStartup(T && t) { t(); } -}; - /** * Wrap bools to prevent string literals (i.e. 'char *') from being * cast to a bool in Attr.