mirror of
https://github.com/privatevoid-net/nix-super.git
synced 2024-11-12 17:26:19 +02:00
Merge pull request #9063 from obsidiansystems/libfetchers-prep
Introduce `libnixflake`
This commit is contained in:
commit
7e66f0d91c
26 changed files with 233 additions and 72 deletions
4
Makefile
4
Makefile
|
@ -18,6 +18,7 @@ makefiles = \
|
||||||
src/libfetchers/local.mk \
|
src/libfetchers/local.mk \
|
||||||
src/libmain/local.mk \
|
src/libmain/local.mk \
|
||||||
src/libexpr/local.mk \
|
src/libexpr/local.mk \
|
||||||
|
src/libflake/local.mk \
|
||||||
src/libcmd/local.mk \
|
src/libcmd/local.mk \
|
||||||
src/nix/local.mk \
|
src/nix/local.mk \
|
||||||
src/libutil-c/local.mk \
|
src/libutil-c/local.mk \
|
||||||
|
@ -45,7 +46,8 @@ makefiles += \
|
||||||
tests/unit/libstore-support/local.mk \
|
tests/unit/libstore-support/local.mk \
|
||||||
tests/unit/libfetchers/local.mk \
|
tests/unit/libfetchers/local.mk \
|
||||||
tests/unit/libexpr/local.mk \
|
tests/unit/libexpr/local.mk \
|
||||||
tests/unit/libexpr-support/local.mk
|
tests/unit/libexpr-support/local.mk \
|
||||||
|
tests/unit/libflake/local.mk
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(ENABLE_FUNCTIONAL_TESTS), yes)
|
ifeq ($(ENABLE_FUNCTIONAL_TESTS), yes)
|
||||||
|
|
|
@ -65,14 +65,6 @@
|
||||||
''^src/libexpr/eval-settings\.hh$''
|
''^src/libexpr/eval-settings\.hh$''
|
||||||
''^src/libexpr/eval\.cc$''
|
''^src/libexpr/eval\.cc$''
|
||||||
''^src/libexpr/eval\.hh$''
|
''^src/libexpr/eval\.hh$''
|
||||||
''^src/libexpr/flake/config\.cc$''
|
|
||||||
''^src/libexpr/flake/flake\.cc$''
|
|
||||||
''^src/libexpr/flake/flake\.hh$''
|
|
||||||
''^src/libexpr/flake/flakeref\.cc$''
|
|
||||||
''^src/libexpr/flake/flakeref\.hh$''
|
|
||||||
''^src/libexpr/flake/lockfile\.cc$''
|
|
||||||
''^src/libexpr/flake/lockfile\.hh$''
|
|
||||||
''^src/libexpr/flake/url-name\.cc$''
|
|
||||||
''^src/libexpr/function-trace\.cc$''
|
''^src/libexpr/function-trace\.cc$''
|
||||||
''^src/libexpr/gc-small-vector\.hh$''
|
''^src/libexpr/gc-small-vector\.hh$''
|
||||||
''^src/libexpr/get-drvs\.cc$''
|
''^src/libexpr/get-drvs\.cc$''
|
||||||
|
@ -127,6 +119,14 @@
|
||||||
''^src/libfetchers/tarball\.hh$''
|
''^src/libfetchers/tarball\.hh$''
|
||||||
''^src/libfetchers/git\.cc$''
|
''^src/libfetchers/git\.cc$''
|
||||||
''^src/libfetchers/mercurial\.cc$''
|
''^src/libfetchers/mercurial\.cc$''
|
||||||
|
''^src/libflake/flake/config\.cc$''
|
||||||
|
''^src/libflake/flake/flake\.cc$''
|
||||||
|
''^src/libflake/flake/flake\.hh$''
|
||||||
|
''^src/libflake/flake/flakeref\.cc$''
|
||||||
|
''^src/libflake/flake/flakeref\.hh$''
|
||||||
|
''^src/libflake/flake/lockfile\.cc$''
|
||||||
|
''^src/libflake/flake/lockfile\.hh$''
|
||||||
|
''^src/libflake/flake/url-name\.cc$''
|
||||||
''^src/libmain/common-args\.cc$''
|
''^src/libmain/common-args\.cc$''
|
||||||
''^src/libmain/common-args\.hh$''
|
''^src/libmain/common-args\.hh$''
|
||||||
''^src/libmain/loggers\.cc$''
|
''^src/libmain/loggers\.cc$''
|
||||||
|
@ -436,8 +436,6 @@
|
||||||
''^tests/unit/libexpr/derived-path\.cc''
|
''^tests/unit/libexpr/derived-path\.cc''
|
||||||
''^tests/unit/libexpr/error_traces\.cc''
|
''^tests/unit/libexpr/error_traces\.cc''
|
||||||
''^tests/unit/libexpr/eval\.cc''
|
''^tests/unit/libexpr/eval\.cc''
|
||||||
''^tests/unit/libexpr/flake/flakeref\.cc''
|
|
||||||
''^tests/unit/libexpr/flake/url-name\.cc''
|
|
||||||
''^tests/unit/libexpr/json\.cc''
|
''^tests/unit/libexpr/json\.cc''
|
||||||
''^tests/unit/libexpr/main\.cc''
|
''^tests/unit/libexpr/main\.cc''
|
||||||
''^tests/unit/libexpr/primops\.cc''
|
''^tests/unit/libexpr/primops\.cc''
|
||||||
|
@ -446,6 +444,8 @@
|
||||||
''^tests/unit/libexpr/value/context\.cc''
|
''^tests/unit/libexpr/value/context\.cc''
|
||||||
''^tests/unit/libexpr/value/print\.cc''
|
''^tests/unit/libexpr/value/print\.cc''
|
||||||
''^tests/unit/libfetchers/public-key\.cc''
|
''^tests/unit/libfetchers/public-key\.cc''
|
||||||
|
''^tests/unit/libflake/flakeref\.cc''
|
||||||
|
''^tests/unit/libflake/url-name\.cc''
|
||||||
''^tests/unit/libstore-support/tests/derived-path\.cc''
|
''^tests/unit/libstore-support/tests/derived-path\.cc''
|
||||||
''^tests/unit/libstore-support/tests/derived-path\.hh''
|
''^tests/unit/libstore-support/tests/derived-path\.hh''
|
||||||
''^tests/unit/libstore-support/tests/nix_api_store\.hh''
|
''^tests/unit/libstore-support/tests/nix_api_store\.hh''
|
||||||
|
|
|
@ -15,7 +15,20 @@
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
EvalSettings evalSettings {
|
EvalSettings evalSettings {
|
||||||
settings.readOnlyMode
|
settings.readOnlyMode,
|
||||||
|
{
|
||||||
|
{
|
||||||
|
"flake",
|
||||||
|
[](ref<Store> store, std::string_view rest) {
|
||||||
|
experimentalFeatureSettings.require(Xp::Flakes);
|
||||||
|
// FIXME `parseFlakeRef` should take a `std::string_view`.
|
||||||
|
auto flakeRef = parseFlakeRef(std::string { rest }, {}, true, false);
|
||||||
|
debug("fetching flake search path element '%s''", rest);
|
||||||
|
auto storePath = flakeRef.resolve(store).fetchTree(store).first;
|
||||||
|
return store->toRealPath(storePath);
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static GlobalConfig::Register rEvalSettings(&evalSettings);
|
static GlobalConfig::Register rEvalSettings(&evalSettings);
|
||||||
|
|
|
@ -6,10 +6,10 @@ libcmd_DIR := $(d)
|
||||||
|
|
||||||
libcmd_SOURCES := $(wildcard $(d)/*.cc)
|
libcmd_SOURCES := $(wildcard $(d)/*.cc)
|
||||||
|
|
||||||
libcmd_CXXFLAGS += $(INCLUDE_libutil) $(INCLUDE_libstore) $(INCLUDE_libfetchers) $(INCLUDE_libexpr) $(INCLUDE_libmain)
|
libcmd_CXXFLAGS += $(INCLUDE_libutil) $(INCLUDE_libstore) $(INCLUDE_libfetchers) $(INCLUDE_libexpr) $(INCLUDE_libflake) $(INCLUDE_libmain)
|
||||||
|
|
||||||
libcmd_LDFLAGS = $(EDITLINE_LIBS) $(LOWDOWN_LIBS) $(THREAD_LDFLAGS)
|
libcmd_LDFLAGS = $(EDITLINE_LIBS) $(LOWDOWN_LIBS) $(THREAD_LDFLAGS)
|
||||||
|
|
||||||
libcmd_LIBS = libstore libutil libexpr libmain libfetchers
|
libcmd_LIBS = libutil libstore libfetchers libflake libexpr libmain
|
||||||
|
|
||||||
$(eval $(call install-file-in, $(buildprefix)$(d)/nix-cmd.pc, $(libdir)/pkgconfig, 0644))
|
$(eval $(call install-file-in, $(buildprefix)$(d)/nix-cmd.pc, $(libdir)/pkgconfig, 0644))
|
||||||
|
|
|
@ -45,8 +45,9 @@ static Strings parseNixPath(const std::string & s)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
EvalSettings::EvalSettings(bool & readOnlyMode)
|
EvalSettings::EvalSettings(bool & readOnlyMode, EvalSettings::LookupPathHooks lookupPathHooks)
|
||||||
: readOnlyMode{readOnlyMode}
|
: readOnlyMode{readOnlyMode}
|
||||||
|
, lookupPathHooks{lookupPathHooks}
|
||||||
{
|
{
|
||||||
auto var = getEnv("NIX_PATH");
|
auto var = getEnv("NIX_PATH");
|
||||||
if (var) nixPath = parseNixPath(*var);
|
if (var) nixPath = parseNixPath(*var);
|
||||||
|
|
|
@ -5,9 +5,40 @@
|
||||||
|
|
||||||
namespace nix {
|
namespace nix {
|
||||||
|
|
||||||
|
class Store;
|
||||||
|
|
||||||
struct EvalSettings : Config
|
struct EvalSettings : Config
|
||||||
{
|
{
|
||||||
EvalSettings(bool & readOnlyMode);
|
/**
|
||||||
|
* Function used to interpet look path entries of a given scheme.
|
||||||
|
*
|
||||||
|
* The argument is the non-scheme part of the lookup path entry (see
|
||||||
|
* `LookupPathHooks` below).
|
||||||
|
*
|
||||||
|
* The return value is (a) whether the entry was valid, and, if so,
|
||||||
|
* what does it map to.
|
||||||
|
*
|
||||||
|
* @todo Return (`std::optional` of) `SourceAccssor` or something
|
||||||
|
* more structured instead of mere `std::string`?
|
||||||
|
*/
|
||||||
|
using LookupPathHook = std::optional<std::string>(ref<Store> store, std::string_view);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map from "scheme" to a `LookupPathHook`.
|
||||||
|
*
|
||||||
|
* Given a lookup path value (i.e. either the whole thing, or after
|
||||||
|
* the `<key>=`) in the form of:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* <scheme>:<arbitrary string>
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* if `<scheme>` is a key in this map, then `<arbitrary string>` is
|
||||||
|
* passed to the hook that is the value in this map.
|
||||||
|
*/
|
||||||
|
using LookupPathHooks = std::map<std::string, std::function<LookupPathHook>>;
|
||||||
|
|
||||||
|
EvalSettings(bool & readOnlyMode, LookupPathHooks lookupPathHooks = {});
|
||||||
|
|
||||||
bool & readOnlyMode;
|
bool & readOnlyMode;
|
||||||
|
|
||||||
|
@ -17,6 +48,8 @@ struct EvalSettings : Config
|
||||||
|
|
||||||
static std::string resolvePseudoUrl(std::string_view url);
|
static std::string resolvePseudoUrl(std::string_view url);
|
||||||
|
|
||||||
|
LookupPathHooks lookupPathHooks;
|
||||||
|
|
||||||
Setting<bool> enableNativeCode{this, false, "allow-unsafe-native-code-during-evaluation", R"(
|
Setting<bool> enableNativeCode{this, false, "allow-unsafe-native-code-during-evaluation", R"(
|
||||||
Enable built-in functions that allow executing native code.
|
Enable built-in functions that allow executing native code.
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@
|
||||||
#include "url.hh"
|
#include "url.hh"
|
||||||
#include "fetch-to-store.hh"
|
#include "fetch-to-store.hh"
|
||||||
#include "tarball.hh"
|
#include "tarball.hh"
|
||||||
#include "flake/flakeref.hh"
|
|
||||||
#include "parser-tab.hh"
|
#include "parser-tab.hh"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -2760,14 +2759,18 @@ std::optional<std::string> EvalState::resolveLookupPathPath(const LookupPath::Pa
|
||||||
auto i = lookupPathResolved.find(value);
|
auto i = lookupPathResolved.find(value);
|
||||||
if (i != lookupPathResolved.end()) return i->second;
|
if (i != lookupPathResolved.end()) return i->second;
|
||||||
|
|
||||||
std::optional<std::string> res;
|
auto finish = [&](std::string res) {
|
||||||
|
debug("resolved search path element '%s' to '%s'", value, res);
|
||||||
|
lookupPathResolved.emplace(value, res);
|
||||||
|
return res;
|
||||||
|
};
|
||||||
|
|
||||||
if (EvalSettings::isPseudoUrl(value)) {
|
if (EvalSettings::isPseudoUrl(value)) {
|
||||||
try {
|
try {
|
||||||
auto accessor = fetchers::downloadTarball(
|
auto accessor = fetchers::downloadTarball(
|
||||||
EvalSettings::resolvePseudoUrl(value)).accessor;
|
EvalSettings::resolvePseudoUrl(value)).accessor;
|
||||||
auto storePath = fetchToStore(*store, SourcePath(accessor), FetchMode::Copy);
|
auto storePath = fetchToStore(*store, SourcePath(accessor), FetchMode::Copy);
|
||||||
res = { store->toRealPath(storePath) };
|
return finish(store->toRealPath(storePath));
|
||||||
} catch (Error & e) {
|
} catch (Error & e) {
|
||||||
logWarning({
|
logWarning({
|
||||||
.msg = HintFmt("Nix search path entry '%1%' cannot be downloaded, ignoring", value)
|
.msg = HintFmt("Nix search path entry '%1%' cannot be downloaded, ignoring", value)
|
||||||
|
@ -2775,15 +2778,17 @@ std::optional<std::string> EvalState::resolveLookupPathPath(const LookupPath::Pa
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (hasPrefix(value, "flake:")) {
|
if (auto colPos = value.find(':'); colPos != value.npos) {
|
||||||
experimentalFeatureSettings.require(Xp::Flakes);
|
auto scheme = value.substr(0, colPos);
|
||||||
auto flakeRef = parseFlakeRef(value.substr(6), {}, true, false);
|
auto rest = value.substr(colPos + 1);
|
||||||
debug("fetching flake search path element '%s''", value);
|
if (auto * hook = get(settings.lookupPathHooks, scheme)) {
|
||||||
auto storePath = flakeRef.resolve(store).fetchTree(store).first;
|
auto res = (*hook)(store, rest);
|
||||||
res = { store->toRealPath(storePath) };
|
if (res)
|
||||||
|
return finish(std::move(*res));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else {
|
{
|
||||||
auto path = absPath(value);
|
auto path = absPath(value);
|
||||||
|
|
||||||
/* Allow access to paths in the search path. */
|
/* Allow access to paths in the search path. */
|
||||||
|
@ -2800,22 +2805,17 @@ std::optional<std::string> EvalState::resolveLookupPathPath(const LookupPath::Pa
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pathExists(path))
|
if (pathExists(path))
|
||||||
res = { path };
|
return finish(std::move(path));
|
||||||
else {
|
else {
|
||||||
logWarning({
|
logWarning({
|
||||||
.msg = HintFmt("Nix search path entry '%1%' does not exist, ignoring", value)
|
.msg = HintFmt("Nix search path entry '%1%' does not exist, ignoring", value)
|
||||||
});
|
});
|
||||||
res = std::nullopt;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res)
|
debug("failed to resolve search path element '%s'", value);
|
||||||
debug("resolved search path element '%s' to '%s'", value, *res);
|
return std::nullopt;
|
||||||
else
|
|
||||||
debug("failed to resolve search path element '%s'", value);
|
|
||||||
|
|
||||||
lookupPathResolved.emplace(value, res);
|
|
||||||
return res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@ libexpr_SOURCES := \
|
||||||
$(wildcard $(d)/*.cc) \
|
$(wildcard $(d)/*.cc) \
|
||||||
$(wildcard $(d)/value/*.cc) \
|
$(wildcard $(d)/value/*.cc) \
|
||||||
$(wildcard $(d)/primops/*.cc) \
|
$(wildcard $(d)/primops/*.cc) \
|
||||||
$(wildcard $(d)/flake/*.cc) \
|
|
||||||
$(d)/lexer-tab.cc \
|
$(d)/lexer-tab.cc \
|
||||||
$(d)/parser-tab.cc
|
$(d)/parser-tab.cc
|
||||||
# Not just for this library itself, but also for downstream libraries using this library
|
# Not just for this library itself, but also for downstream libraries using this library
|
||||||
|
@ -45,8 +44,6 @@ $(eval $(call install-file-in, $(buildprefix)$(d)/nix-expr.pc, $(libdir)/pkgconf
|
||||||
|
|
||||||
$(foreach i, $(wildcard src/libexpr/value/*.hh), \
|
$(foreach i, $(wildcard src/libexpr/value/*.hh), \
|
||||||
$(eval $(call install-file-in, $(i), $(includedir)/nix/value, 0644)))
|
$(eval $(call install-file-in, $(i), $(includedir)/nix/value, 0644)))
|
||||||
$(foreach i, $(wildcard src/libexpr/flake/*.hh), \
|
|
||||||
$(eval $(call install-file-in, $(i), $(includedir)/nix/flake, 0644)))
|
|
||||||
|
|
||||||
$(d)/primops.cc: $(d)/imported-drv-to-derivation.nix.gen.hh
|
$(d)/primops.cc: $(d)/imported-drv-to-derivation.nix.gen.hh
|
||||||
|
|
||||||
|
|
|
@ -70,30 +70,6 @@ struct FetchSettings : public Config
|
||||||
Setting<bool> warnDirty{this, true, "warn-dirty",
|
Setting<bool> warnDirty{this, true, "warn-dirty",
|
||||||
"Whether to warn about dirty Git/Mercurial trees."};
|
"Whether to warn about dirty Git/Mercurial trees."};
|
||||||
|
|
||||||
Setting<std::string> flakeRegistry{this, "https://channels.nixos.org/flake-registry.json", "flake-registry",
|
|
||||||
R"(
|
|
||||||
Path or URI of the global flake registry.
|
|
||||||
|
|
||||||
When empty, disables the global flake registry.
|
|
||||||
)",
|
|
||||||
{}, true, Xp::Flakes};
|
|
||||||
|
|
||||||
Setting<bool> useRegistries{this, true, "use-registries",
|
|
||||||
"Whether to use flake registries to resolve flake references.",
|
|
||||||
{}, true, Xp::Flakes};
|
|
||||||
|
|
||||||
Setting<bool> acceptFlakeConfig{this, false, "accept-flake-config",
|
|
||||||
"Whether to accept nix configuration from a flake without prompting.",
|
|
||||||
{}, true, Xp::Flakes};
|
|
||||||
|
|
||||||
Setting<std::string> commitLockFileSummary{
|
|
||||||
this, "", "commit-lock-file-summary",
|
|
||||||
R"(
|
|
||||||
The commit summary to use when committing changed flake lock files. If
|
|
||||||
empty, the summary is generated based on the action performed.
|
|
||||||
)",
|
|
||||||
{"commit-lockfile-summary"}, true, Xp::Flakes};
|
|
||||||
|
|
||||||
Setting<bool> trustTarballsFromGitForges{
|
Setting<bool> trustTarballsFromGitForges{
|
||||||
this, true, "trust-tarballs-from-git-forges",
|
this, true, "trust-tarballs-from-git-forges",
|
||||||
R"(
|
R"(
|
||||||
|
@ -108,7 +84,6 @@ struct FetchSettings : public Config
|
||||||
`narHash` attribute is specified,
|
`narHash` attribute is specified,
|
||||||
e.g. `github:NixOS/patchelf/7c2f768bf9601268a4e71c2ebe91e2011918a70f?narHash=sha256-PPXqKY2hJng4DBVE0I4xshv/vGLUskL7jl53roB8UdU%3D`.
|
e.g. `github:NixOS/patchelf/7c2f768bf9601268a4e71c2ebe91e2011918a70f?narHash=sha256-PPXqKY2hJng4DBVE0I4xshv/vGLUskL7jl53roB8UdU%3D`.
|
||||||
)"};
|
)"};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// FIXME: don't use a global variable.
|
// FIXME: don't use a global variable.
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
#include "registry.hh"
|
#include "registry.hh"
|
||||||
#include "tarball.hh"
|
#include "tarball.hh"
|
||||||
#include "users.hh"
|
#include "users.hh"
|
||||||
|
#include "config-global.hh"
|
||||||
#include "globals.hh"
|
#include "globals.hh"
|
||||||
#include "store-api.hh"
|
#include "store-api.hh"
|
||||||
#include "local-fs-store.hh"
|
#include "local-fs-store.hh"
|
||||||
|
|
||||||
#include "fetch-settings.hh"
|
|
||||||
|
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
|
|
||||||
namespace nix::fetchers {
|
namespace nix::fetchers {
|
||||||
|
@ -149,10 +148,25 @@ void overrideRegistry(
|
||||||
flagRegistry->add(from, to, extraAttrs);
|
flagRegistry->add(from, to, extraAttrs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct RegistrySettings : Config
|
||||||
|
{
|
||||||
|
Setting<std::string> flakeRegistry{this, "https://channels.nixos.org/flake-registry.json", "flake-registry",
|
||||||
|
R"(
|
||||||
|
Path or URI of the global flake registry.
|
||||||
|
|
||||||
|
When empty, disables the global flake registry.
|
||||||
|
)",
|
||||||
|
{}, true, Xp::Flakes};
|
||||||
|
};
|
||||||
|
|
||||||
|
RegistrySettings registrySettings;
|
||||||
|
|
||||||
|
static GlobalConfig::Register rRegistrySettings(®istrySettings);
|
||||||
|
|
||||||
static std::shared_ptr<Registry> getGlobalRegistry(ref<Store> store)
|
static std::shared_ptr<Registry> getGlobalRegistry(ref<Store> store)
|
||||||
{
|
{
|
||||||
static auto reg = [&]() {
|
static auto reg = [&]() {
|
||||||
auto path = fetchSettings.flakeRegistry.get();
|
auto path = registrySettings.flakeRegistry.get();
|
||||||
if (path == "") {
|
if (path == "") {
|
||||||
return std::make_shared<Registry>(Registry::Global); // empty registry
|
return std::make_shared<Registry>(Registry::Global); // empty registry
|
||||||
}
|
}
|
||||||
|
|
12
src/libflake/flake-settings.cc
Normal file
12
src/libflake/flake-settings.cc
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
#include "flake-settings.hh"
|
||||||
|
#include "config-global.hh"
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
FlakeSettings::FlakeSettings() {}
|
||||||
|
|
||||||
|
FlakeSettings flakeSettings;
|
||||||
|
|
||||||
|
static GlobalConfig::Register rFlakeSettings(&flakeSettings);
|
||||||
|
|
||||||
|
}
|
53
src/libflake/flake-settings.hh
Normal file
53
src/libflake/flake-settings.hh
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
#pragma once
|
||||||
|
///@file
|
||||||
|
|
||||||
|
#include "types.hh"
|
||||||
|
#include "config.hh"
|
||||||
|
#include "util.hh"
|
||||||
|
|
||||||
|
#include <map>
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
namespace nix {
|
||||||
|
|
||||||
|
struct FlakeSettings : public Config
|
||||||
|
{
|
||||||
|
FlakeSettings();
|
||||||
|
|
||||||
|
Setting<bool> useRegistries{
|
||||||
|
this,
|
||||||
|
true,
|
||||||
|
"use-registries",
|
||||||
|
"Whether to use flake registries to resolve flake references.",
|
||||||
|
{},
|
||||||
|
true,
|
||||||
|
Xp::Flakes};
|
||||||
|
|
||||||
|
Setting<bool> acceptFlakeConfig{
|
||||||
|
this,
|
||||||
|
false,
|
||||||
|
"accept-flake-config",
|
||||||
|
"Whether to accept nix configuration from a flake without prompting.",
|
||||||
|
{},
|
||||||
|
true,
|
||||||
|
Xp::Flakes};
|
||||||
|
|
||||||
|
Setting<std::string> commitLockFileSummary{
|
||||||
|
this,
|
||||||
|
"",
|
||||||
|
"commit-lockfile-summary",
|
||||||
|
R"(
|
||||||
|
The commit summary to use when committing changed flake lock files. If
|
||||||
|
empty, the summary is generated based on the action performed.
|
||||||
|
)",
|
||||||
|
{},
|
||||||
|
true,
|
||||||
|
Xp::Flakes};
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO: don't use a global variable.
|
||||||
|
extern FlakeSettings flakeSettings;
|
||||||
|
|
||||||
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
#include "users.hh"
|
#include "users.hh"
|
||||||
#include "config-global.hh"
|
#include "config-global.hh"
|
||||||
#include "fetch-settings.hh"
|
#include "flake-settings.hh"
|
||||||
#include "flake.hh"
|
#include "flake.hh"
|
||||||
|
|
||||||
#include <nlohmann/json.hpp>
|
#include <nlohmann/json.hpp>
|
||||||
|
@ -51,7 +51,7 @@ void ConfigFile::apply()
|
||||||
else
|
else
|
||||||
assert(false);
|
assert(false);
|
||||||
|
|
||||||
if (!whitelist.count(baseName) && !nix::fetchSettings.acceptFlakeConfig) {
|
if (!whitelist.count(baseName) && !nix::flakeSettings.acceptFlakeConfig) {
|
||||||
bool trusted = false;
|
bool trusted = false;
|
||||||
auto trustedList = readTrustedList();
|
auto trustedList = readTrustedList();
|
||||||
auto tlname = get(trustedList, name);
|
auto tlname = get(trustedList, name);
|
|
@ -9,6 +9,7 @@
|
||||||
#include "fetchers.hh"
|
#include "fetchers.hh"
|
||||||
#include "finally.hh"
|
#include "finally.hh"
|
||||||
#include "fetch-settings.hh"
|
#include "fetch-settings.hh"
|
||||||
|
#include "flake-settings.hh"
|
||||||
#include "value-to-json.hh"
|
#include "value-to-json.hh"
|
||||||
#include "local-fs-store.hh"
|
#include "local-fs-store.hh"
|
||||||
|
|
||||||
|
@ -346,7 +347,7 @@ LockedFlake lockFlake(
|
||||||
|
|
||||||
FlakeCache flakeCache;
|
FlakeCache flakeCache;
|
||||||
|
|
||||||
auto useRegistries = lockFlags.useRegistries.value_or(fetchSettings.useRegistries);
|
auto useRegistries = lockFlags.useRegistries.value_or(flakeSettings.useRegistries);
|
||||||
|
|
||||||
auto flake = getFlake(state, topRef, useRegistries, flakeCache);
|
auto flake = getFlake(state, topRef, useRegistries, flakeCache);
|
||||||
|
|
||||||
|
@ -691,7 +692,7 @@ LockedFlake lockFlake(
|
||||||
if (lockFlags.commitLockFile) {
|
if (lockFlags.commitLockFile) {
|
||||||
std::string cm;
|
std::string cm;
|
||||||
|
|
||||||
cm = fetchSettings.commitLockFileSummary.get();
|
cm = flakeSettings.commitLockFileSummary.get();
|
||||||
|
|
||||||
if (cm == "") {
|
if (cm == "") {
|
||||||
cm = fmt("%s: %s", relPath, lockFileExists ? "Update" : "Add");
|
cm = fmt("%s: %s", relPath, lockFileExists ? "Update" : "Add");
|
||||||
|
@ -811,7 +812,7 @@ static void prim_getFlake(EvalState & state, const PosIdx pos, Value * * args, V
|
||||||
LockFlags {
|
LockFlags {
|
||||||
.updateLockFile = false,
|
.updateLockFile = false,
|
||||||
.writeLockFile = false,
|
.writeLockFile = false,
|
||||||
.useRegistries = !state.settings.pureEval && fetchSettings.useRegistries,
|
.useRegistries = !state.settings.pureEval && flakeSettings.useRegistries,
|
||||||
.allowUnlocked = !state.settings.pureEval,
|
.allowUnlocked = !state.settings.pureEval,
|
||||||
}),
|
}),
|
||||||
v);
|
v);
|
17
src/libflake/local.mk
Normal file
17
src/libflake/local.mk
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
libraries += libflake
|
||||||
|
|
||||||
|
libflake_NAME = libnixflake
|
||||||
|
|
||||||
|
libflake_DIR := $(d)
|
||||||
|
|
||||||
|
libflake_SOURCES := $(wildcard $(d)/*.cc $(d)/flake/*.cc)
|
||||||
|
|
||||||
|
# Not just for this library itself, but also for downstream libraries using this library
|
||||||
|
|
||||||
|
INCLUDE_libflake := -I $(d)
|
||||||
|
|
||||||
|
libflake_CXXFLAGS += $(INCLUDE_libutil) $(INCLUDE_libstore) $(INCLUDE_libfetchers) $(INCLUDE_libexpr) $(INCLUDE_libflake)
|
||||||
|
|
||||||
|
libflake_LDFLAGS += $(THREAD_LDFLAGS)
|
||||||
|
|
||||||
|
libflake_LIBS = libutil libstore libfetchers libexpr
|
|
@ -24,9 +24,9 @@ ifdef HOST_UNIX
|
||||||
INCLUDE_nix += -I $(d)/unix
|
INCLUDE_nix += -I $(d)/unix
|
||||||
endif
|
endif
|
||||||
|
|
||||||
nix_CXXFLAGS += $(INCLUDE_libutil) $(INCLUDE_libstore) $(INCLUDE_libfetchers) $(INCLUDE_libexpr) $(INCLUDE_libmain) -I src/libcmd -I doc/manual $(INCLUDE_nix)
|
nix_CXXFLAGS += $(INCLUDE_libutil) $(INCLUDE_libstore) $(INCLUDE_libfetchers) $(INCLUDE_libexpr) $(INCLUDE_libflake) $(INCLUDE_libmain) -I src/libcmd -I doc/manual $(INCLUDE_nix)
|
||||||
|
|
||||||
nix_LIBS = libexpr libmain libfetchers libstore libutil libcmd
|
nix_LIBS = libexpr libmain libfetchers libflake libstore libutil libcmd
|
||||||
|
|
||||||
nix_LDFLAGS = $(THREAD_LDFLAGS) $(SODIUM_LIBS) $(EDITLINE_LIBS) $(BOOST_LDFLAGS) $(LOWDOWN_LIBS)
|
nix_LDFLAGS = $(THREAD_LDFLAGS) $(SODIUM_LIBS) $(EDITLINE_LIBS) $(BOOST_LDFLAGS) $(LOWDOWN_LIBS)
|
||||||
|
|
||||||
|
|
43
tests/unit/libflake/local.mk
Normal file
43
tests/unit/libflake/local.mk
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
check: libflake-tests_RUN
|
||||||
|
|
||||||
|
programs += libflake-tests
|
||||||
|
|
||||||
|
libflake-tests_NAME := libnixflake-tests
|
||||||
|
|
||||||
|
libflake-tests_ENV := _NIX_TEST_UNIT_DATA=$(d)/data GTEST_OUTPUT=xml:$$testresults/libflake-tests.xml
|
||||||
|
|
||||||
|
libflake-tests_DIR := $(d)
|
||||||
|
|
||||||
|
ifeq ($(INSTALL_UNIT_TESTS), yes)
|
||||||
|
libflake-tests_INSTALL_DIR := $(checkbindir)
|
||||||
|
else
|
||||||
|
libflake-tests_INSTALL_DIR :=
|
||||||
|
endif
|
||||||
|
|
||||||
|
libflake-tests_SOURCES := \
|
||||||
|
$(wildcard $(d)/*.cc) \
|
||||||
|
$(wildcard $(d)/value/*.cc) \
|
||||||
|
$(wildcard $(d)/flake/*.cc)
|
||||||
|
|
||||||
|
libflake-tests_EXTRA_INCLUDES = \
|
||||||
|
-I tests/unit/libflake-support \
|
||||||
|
-I tests/unit/libstore-support \
|
||||||
|
-I tests/unit/libutil-support \
|
||||||
|
$(INCLUDE_libflake) \
|
||||||
|
$(INCLUDE_libexpr) \
|
||||||
|
$(INCLUDE_libfetchers) \
|
||||||
|
$(INCLUDE_libstore) \
|
||||||
|
$(INCLUDE_libutil) \
|
||||||
|
|
||||||
|
libflake-tests_CXXFLAGS += $(libflake-tests_EXTRA_INCLUDES)
|
||||||
|
|
||||||
|
libflake-tests_LIBS = \
|
||||||
|
libexpr-test-support libstore-test-support libutil-test-support \
|
||||||
|
libflake libexpr libfetchers libstore libutil
|
||||||
|
|
||||||
|
libflake-tests_LDFLAGS := -lrapidcheck $(GTEST_LIBS) -lgmock
|
||||||
|
|
||||||
|
ifdef HOST_WINDOWS
|
||||||
|
# Increase the default reserved stack size to 65 MB so Nix doesn't run out of space
|
||||||
|
libflake-tests_LDFLAGS += -Wl,--stack,$(shell echo $$((65 * 1024 * 1024)))
|
||||||
|
endif
|
Loading…
Reference in a new issue