You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
4.8 KiB
108 lines
4.8 KiB
9 months ago
|
From 7d8f9cfcdf7725fef2c99ecb2dedcdff1e9506d7 Mon Sep 17 00:00:00 2001
|
||
|
From: Jaroslav Rohel <jrohel@redhat.com>
|
||
|
Date: Wed, 13 Apr 2022 12:26:10 +0200
|
||
|
Subject: [PATCH 26/34] context: Substitute all repository config options
|
||
|
(RhBug:2076853)
|
||
|
|
||
|
It also solves the problem: Substitution of variables in `baseurl`
|
||
|
does not work in microdnf and PackageKit unless `metalink` or `mirrorlist`
|
||
|
is set at the same time.
|
||
|
---
|
||
|
libdnf/dnf-repo.cpp | 34 +++++++++++++++++++++++++---------
|
||
|
1 file changed, 25 insertions(+), 9 deletions(-)
|
||
|
|
||
|
diff --git a/libdnf/dnf-repo.cpp b/libdnf/dnf-repo.cpp
|
||
|
index 710045fb..9d42e3e3 100644
|
||
|
--- a/libdnf/dnf-repo.cpp
|
||
|
+++ b/libdnf/dnf-repo.cpp
|
||
|
@@ -83,6 +83,7 @@ typedef struct
|
||
|
LrHandle *repo_handle;
|
||
|
LrResult *repo_result;
|
||
|
LrUrlVars *urlvars;
|
||
|
+ bool unit_test_mode; /* ugly hack for unit tests */
|
||
|
} DnfRepoPrivate;
|
||
|
|
||
|
G_DEFINE_TYPE_WITH_PRIVATE(DnfRepo, dnf_repo, G_TYPE_OBJECT)
|
||
|
@@ -847,8 +848,11 @@ dnf_repo_conf_reset(libdnf::ConfigRepo &config)
|
||
|
|
||
|
/* Loads repository configuration from GKeyFile */
|
||
|
static void
|
||
|
-dnf_repo_conf_from_gkeyfile(libdnf::ConfigRepo &config, const char *repoId, GKeyFile *gkeyFile)
|
||
|
+dnf_repo_conf_from_gkeyfile(DnfRepo *repo, const char *repoId, GKeyFile *gkeyFile)
|
||
|
{
|
||
|
+ DnfRepoPrivate *priv = GET_PRIVATE(repo);
|
||
|
+ auto & config = *priv->repo->getConfig();
|
||
|
+
|
||
|
// Reset to the initial state before reloading the configuration.
|
||
|
dnf_repo_conf_reset(config);
|
||
|
|
||
|
@@ -883,20 +887,31 @@ dnf_repo_conf_from_gkeyfile(libdnf::ConfigRepo &config, const char *repoId, GKey
|
||
|
// list can be ['value1', 'value2, value3'] therefore we first join
|
||
|
// to have 'value1, value2, value3'
|
||
|
g_autofree gchar * tmp_strval = g_strjoinv(",", list);
|
||
|
+
|
||
|
+ // Substitute vars.
|
||
|
+ g_autofree gchar *subst_value = dnf_repo_substitute(repo, tmp_strval);
|
||
|
+
|
||
|
+ if (strcmp(key, "baseurl") == 0 && strstr(tmp_strval, "file://$testdatadir") != NULL) {
|
||
|
+ priv->unit_test_mode = true;
|
||
|
+ }
|
||
|
+
|
||
|
try {
|
||
|
- optionItem.newString(libdnf::Option::Priority::REPOCONFIG, tmp_strval);
|
||
|
+ optionItem.newString(libdnf::Option::Priority::REPOCONFIG, subst_value);
|
||
|
} catch (const std::exception & ex) {
|
||
|
- g_debug("Invalid configuration value: %s = %s in %s; %s", key, value.c_str(), repoId, ex.what());
|
||
|
+ g_debug("Invalid configuration value: %s = %s in %s; %s", key, subst_value, repoId, ex.what());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} else {
|
||
|
-
|
||
|
// process other (non list) options
|
||
|
+
|
||
|
+ // Substitute vars.
|
||
|
+ g_autofree gchar *subst_value = dnf_repo_substitute(repo, value.c_str());
|
||
|
+
|
||
|
try {
|
||
|
- optionItem.newString(libdnf::Option::Priority::REPOCONFIG, value);
|
||
|
+ optionItem.newString(libdnf::Option::Priority::REPOCONFIG, subst_value);
|
||
|
} catch (const std::exception & ex) {
|
||
|
- g_debug("Invalid configuration value: %s = %s in %s; %s", key, value.c_str(), repoId, ex.what());
|
||
|
+ g_debug("Invalid configuration value: %s = %s in %s; %s", key, subst_value, repoId, ex.what());
|
||
|
}
|
||
|
|
||
|
}
|
||
|
@@ -950,7 +965,7 @@ dnf_repo_set_keyfile_data(DnfRepo *repo, gboolean reloadFromGKeyFile, GError **e
|
||
|
|
||
|
// Reload repository configuration from keyfile.
|
||
|
if (reloadFromGKeyFile) {
|
||
|
- dnf_repo_conf_from_gkeyfile(*conf, repoId, priv->keyfile);
|
||
|
+ dnf_repo_conf_from_gkeyfile(repo, repoId, priv->keyfile);
|
||
|
dnf_repo_apply_setopts(*conf, repoId);
|
||
|
}
|
||
|
|
||
|
@@ -996,8 +1011,9 @@ dnf_repo_set_keyfile_data(DnfRepo *repo, gboolean reloadFromGKeyFile, GError **e
|
||
|
g_autofree gchar *url = NULL;
|
||
|
url = lr_prepend_url_protocol(baseurls[0]);
|
||
|
if (url != NULL && strncasecmp(url, "file://", 7) == 0) {
|
||
|
- if (g_strstr_len(url, -1, "$testdatadir") == NULL)
|
||
|
+ if (!priv->unit_test_mode) {
|
||
|
priv->kind = DNF_REPO_KIND_LOCAL;
|
||
|
+ }
|
||
|
g_free(priv->location);
|
||
|
g_free(priv->keyring);
|
||
|
priv->location = dnf_repo_substitute(repo, url + 7);
|
||
|
@@ -1224,7 +1240,7 @@ dnf_repo_setup(DnfRepo *repo, GError **error) try
|
||
|
auto repoId = priv->repo->getId().c_str();
|
||
|
|
||
|
auto conf = priv->repo->getConfig();
|
||
|
- dnf_repo_conf_from_gkeyfile(*conf, repoId, priv->keyfile);
|
||
|
+ dnf_repo_conf_from_gkeyfile(repo, repoId, priv->keyfile);
|
||
|
dnf_repo_apply_setopts(*conf, repoId);
|
||
|
|
||
|
auto sslverify = conf->sslverify().getValue();
|
||
|
--
|
||
|
2.31.1
|
||
|
|