1
1
Fork 0
mirror of https://github.com/NixOS/nix.git synced 2025-11-09 03:56:01 +01:00

Merge pull request #13734 from xokdvium/get-uri-correct

libstore: Correct getUri methods for all stores
This commit is contained in:
Jörg Thalheim 2025-08-11 20:16:08 +02:00 committed by GitHub
commit dfb78af184
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 84 additions and 50 deletions

View file

@ -1,6 +1,5 @@
#include "nix/expr/eval-profiler-settings.hh" #include "nix/expr/eval-profiler-settings.hh"
#include "nix/util/configuration.hh" #include "nix/util/configuration.hh"
#include "nix/util/logging.hh" /* Needs to be included before config-impl.hh */
#include "nix/util/config-impl.hh" #include "nix/util/config-impl.hh"
#include "nix/util/abstract-setting-to-json.hh" #include "nix/util/abstract-setting-to-json.hh"

View file

@ -6,21 +6,27 @@ namespace nix {
TEST(LegacySSHStore, constructConfig) TEST(LegacySSHStore, constructConfig)
{ {
LegacySSHStoreConfig config{ initLibStore(/*loadConfig=*/false);
auto config = make_ref<LegacySSHStoreConfig>(
"ssh", "ssh",
"localhost", "me@localhost:2222",
StoreConfig::Params{ StoreConfig::Params{
{ {
"remote-program", "remote-program",
// TODO #11106, no more split on space // TODO #11106, no more split on space
"foo bar", "foo bar",
}, },
}}; });
EXPECT_EQ( EXPECT_EQ(
config.remoteProgram.get(), config->remoteProgram.get(),
(Strings{ (Strings{
"foo", "foo",
"bar", "bar",
})); }));
auto store = config->openStore();
EXPECT_EQ(store->getUri(), "ssh://me@localhost:2222?remote-program=foo%20bar");
} }
} // namespace nix } // namespace nix

View file

@ -1,9 +1,6 @@
// FIXME: Odd failures for templates that are causing the PR to break #include <gtest/gtest.h>
// for now with discussion with @Ericson2314 to comment out.
#if 0
# include <gtest/gtest.h>
# include "nix/store/local-overlay-store.hh" #include "nix/store/local-overlay-store.hh"
namespace nix { namespace nix {
@ -31,4 +28,3 @@ TEST(LocalOverlayStore, constructConfig_rootPath)
} }
} // namespace nix } // namespace nix
#endif

View file

@ -1,15 +1,12 @@
// FIXME: Odd failures for templates that are causing the PR to break #include <gtest/gtest.h>
// for now with discussion with @Ericson2314 to comment out.
#if 0
# include <gtest/gtest.h>
# include "nix/store/local-store.hh" #include "nix/store/local-store.hh"
// Needed for template specialisations. This is not good! When we // Needed for template specialisations. This is not good! When we
// overhaul how store configs work, this should be fixed. // overhaul how store configs work, this should be fixed.
# include "nix/util/args.hh" #include "nix/util/args.hh"
# include "nix/util/config-impl.hh" #include "nix/util/config-impl.hh"
# include "nix/util/abstract-setting-to-json.hh" #include "nix/util/abstract-setting-to-json.hh"
namespace nix { namespace nix {
@ -37,4 +34,3 @@ TEST(LocalStore, constructConfig_rootPath)
} }
} // namespace nix } // namespace nix
#endif

View file

@ -5,6 +5,7 @@
#include "nix/store/tests/nix_api_store.hh" #include "nix/store/tests/nix_api_store.hh"
#include "nix/util/tests/string_callback.hh" #include "nix/util/tests/string_callback.hh"
#include "nix/util/url.hh"
#include "store-tests-config.hh" #include "store-tests-config.hh"
@ -23,7 +24,13 @@ TEST_F(nix_api_store_test, nix_store_get_uri)
std::string str; std::string str;
auto ret = nix_store_get_uri(ctx, store, OBSERVE_STRING(str)); auto ret = nix_store_get_uri(ctx, store, OBSERVE_STRING(str));
ASSERT_EQ(NIX_OK, ret); ASSERT_EQ(NIX_OK, ret);
ASSERT_STREQ("local", str.c_str()); auto expectedStoreURI = "local?"
+ nix::encodeQuery({
{"log", nixLogDir},
{"state", nixStateDir},
{"store", nixStoreDir},
});
ASSERT_EQ(expectedStoreURI, str);
} }
TEST_F(nix_api_util_context, nix_store_get_storedir_default) TEST_F(nix_api_util_context, nix_store_get_storedir_default)

View file

@ -1,32 +1,38 @@
// FIXME: Odd failures for templates that are causing the PR to break #include <gtest/gtest.h>
// for now with discussion with @Ericson2314 to comment out.
#if 0
# include <gtest/gtest.h>
# include "nix/store/ssh-store.hh" #include "nix/store/ssh-store.hh"
#include "nix/util/config-impl.hh"
#include "nix/util/abstract-setting-to-json.hh"
namespace nix { namespace nix {
TEST(SSHStore, constructConfig) TEST(SSHStore, constructConfig)
{ {
SSHStoreConfig config{ initLibStore(/*loadConfig=*/false);
"ssh",
"localhost", auto config = make_ref<SSHStoreConfig>(
"ssh-ng",
"me@localhost:2222",
StoreConfig::Params{ StoreConfig::Params{
{ {
"remote-program", "remote-program",
// TODO #11106, no more split on space // TODO #11106, no more split on space
"foo bar", "foo bar",
}, },
}, });
};
EXPECT_EQ( EXPECT_EQ(
config.remoteProgram.get(), config->remoteProgram.get(),
(Strings{ (Strings{
"foo", "foo",
"bar", "bar",
})); }));
auto store = config->openStore();
EXPECT_EQ(store->getUri(), "ssh-ng://me@localhost:2222?remote-program=foo%20bar");
config->resetOverridden();
store = config->openStore();
EXPECT_EQ(store->getUri(), "ssh-ng://me@localhost:2222");
} }
TEST(MountedSSHStore, constructConfig) TEST(MountedSSHStore, constructConfig)
@ -51,5 +57,4 @@ TEST(MountedSSHStore, constructConfig)
})); }));
} }
} } // namespace nix
#endif

View file

@ -1,9 +1,6 @@
// FIXME: Odd failures for templates that are causing the PR to break #include <gtest/gtest.h>
// for now with discussion with @Ericson2314 to comment out.
#if 0
# include <gtest/gtest.h>
# include "nix/store/uds-remote-store.hh" #include "nix/store/uds-remote-store.hh"
namespace nix { namespace nix {
@ -20,4 +17,3 @@ TEST(UDSRemoteStore, constructConfigWrongScheme)
} }
} // namespace nix } // namespace nix
#endif

View file

@ -18,6 +18,11 @@ namespace nix {
typedef enum { smEnabled, smRelaxed, smDisabled } SandboxMode; typedef enum { smEnabled, smRelaxed, smDisabled } SandboxMode;
template<>
SandboxMode BaseSetting<SandboxMode>::parse(const std::string & str) const;
template<>
std::string BaseSetting<SandboxMode>::to_string() const;
struct MaxBuildJobsSetting : public BaseSetting<unsigned int> struct MaxBuildJobsSetting : public BaseSetting<unsigned int>
{ {
MaxBuildJobsSetting( MaxBuildJobsSetting(

View file

@ -126,6 +126,19 @@ struct StoreConfig : public StoreDirConfig
return ""; return "";
} }
/**
* Get overridden store reference query parameters.
*/
StringMap getQueryParams() const
{
auto queryParams = std::map<std::string, AbstractConfig::SettingInfo>{};
getSettings(queryParams, /*overriddenOnly=*/true);
StringMap res;
for (const auto & [name, info] : queryParams)
res.insert({name, info.value});
return res;
}
/** /**
* An experimental feature this type store is gated, if it is to be * An experimental feature this type store is gated, if it is to be
* experimental. * experimental.

View file

@ -90,7 +90,9 @@ ref<LegacySSHStore::Connection> LegacySSHStore::openConnection()
std::string LegacySSHStore::getUri() std::string LegacySSHStore::getUri()
{ {
return *Config::uriSchemes().begin() + "://" + config->authority.to_string(); return ParsedURL{
.scheme = *Config::uriSchemes().begin(), .authority = config->authority, .query = config->getQueryParams()}
.to_string();
} }
std::map<StorePath, UnkeyedValidPathInfo> LegacySSHStore::queryPathInfosUncached(const StorePathSet & paths) std::map<StorePath, UnkeyedValidPathInfo> LegacySSHStore::queryPathInfosUncached(const StorePathSet & paths)

View file

@ -16,6 +16,7 @@
#include "nix/store/posix-fs-canonicalise.hh" #include "nix/store/posix-fs-canonicalise.hh"
#include "nix/util/posix-source-accessor.hh" #include "nix/util/posix-source-accessor.hh"
#include "nix/store/keys.hh" #include "nix/store/keys.hh"
#include "nix/util/url.hh"
#include "nix/util/users.hh" #include "nix/util/users.hh"
#include "nix/store/store-open.hh" #include "nix/store/store-open.hh"
#include "nix/store/store-registration.hh" #include "nix/store/store-registration.hh"
@ -440,7 +441,13 @@ LocalStore::~LocalStore()
std::string LocalStore::getUri() std::string LocalStore::getUri()
{ {
return "local"; std::ostringstream oss;
oss << *config->uriSchemes().begin();
auto queryParams = config->getQueryParams();
if (!queryParams.empty())
oss << "?";
oss << encodeQuery(queryParams);
return std::move(oss).str();
} }
int LocalStore::getSchema() int LocalStore::getSchema()

View file

@ -43,7 +43,9 @@ struct SSHStore : virtual RemoteStore
std::string getUri() override std::string getUri() override
{ {
return *Config::uriSchemes().begin() + "://" + host; return ParsedURL{
.scheme = *Config::uriSchemes().begin(), .authority = config->authority, .query = config->getQueryParams()}
.to_string();
} }
// FIXME extend daemon protocol, move implementation to RemoteStore // FIXME extend daemon protocol, move implementation to RemoteStore
@ -66,8 +68,6 @@ protected:
ref<RemoteStore::Connection> openConnection() override; ref<RemoteStore::Connection> openConnection() override;
std::string host;
std::vector<std::string> extraRemoteProgramArgs; std::vector<std::string> extraRemoteProgramArgs;
SSHMaster master; SSHMaster master;

View file

@ -15,7 +15,7 @@ bool GlobalConfig::set(const std::string & name, const std::string & value)
return false; return false;
} }
void GlobalConfig::getSettings(std::map<std::string, SettingInfo> & res, bool overriddenOnly) void GlobalConfig::getSettings(std::map<std::string, SettingInfo> & res, bool overriddenOnly) const
{ {
for (auto & config : configRegistrations()) for (auto & config : configRegistrations())
config->getSettings(res, overriddenOnly); config->getSettings(res, overriddenOnly);

View file

@ -85,7 +85,7 @@ void AbstractConfig::reapplyUnknownSettings()
set(s.first, s.second); set(s.first, s.second);
} }
void Config::getSettings(std::map<std::string, SettingInfo> & res, bool overriddenOnly) void Config::getSettings(std::map<std::string, SettingInfo> & res, bool overriddenOnly) const
{ {
for (const auto & opt : _settings) for (const auto & opt : _settings)
if (!opt.second.isAlias && (!overriddenOnly || opt.second.setting->overridden) if (!opt.second.isAlias && (!overriddenOnly || opt.second.setting->overridden)

View file

@ -17,7 +17,7 @@ struct GlobalConfig : public AbstractConfig
bool set(const std::string & name, const std::string & value) override; bool set(const std::string & name, const std::string & value) override;
void getSettings(std::map<std::string, SettingInfo> & res, bool overriddenOnly = false) override; void getSettings(std::map<std::string, SettingInfo> & res, bool overriddenOnly = false) const override;
void resetOverridden() override; void resetOverridden() override;

View file

@ -12,8 +12,10 @@
* instantiation. * instantiation.
*/ */
#include "nix/util/util.hh"
#include "nix/util/configuration.hh" #include "nix/util/configuration.hh"
#include "nix/util/args.hh" #include "nix/util/args.hh"
#include "nix/util/logging.hh"
namespace nix { namespace nix {

View file

@ -73,7 +73,7 @@ public:
* - res: map to store settings in * - res: map to store settings in
* - overriddenOnly: when set to true only overridden settings will be added to `res` * - overriddenOnly: when set to true only overridden settings will be added to `res`
*/ */
virtual void getSettings(std::map<std::string, SettingInfo> & res, bool overriddenOnly = false) = 0; virtual void getSettings(std::map<std::string, SettingInfo> & res, bool overriddenOnly = false) const = 0;
/** /**
* Parses the configuration in `contents` and applies it * Parses the configuration in `contents` and applies it
@ -160,7 +160,7 @@ public:
void addSetting(AbstractSetting * setting); void addSetting(AbstractSetting * setting);
void getSettings(std::map<std::string, SettingInfo> & res, bool overriddenOnly = false) override; void getSettings(std::map<std::string, SettingInfo> & res, bool overriddenOnly = false) const override;
void resetOverridden() override; void resetOverridden() override;