commit: 7820847b2f9c5fc348dbf1991fcfec9b3b4fb5c4
Author: Fabian Groffen <grobian <AT> gentoo <DOT> org>
AuthorDate: Mon Dec 13 07:45:35 2021 +0000
Commit: Fabian Groffen <grobian <AT> gentoo <DOT> org>
CommitDate: Mon Dec 13 07:45:35 2021 +0000
URL: https://gitweb.gentoo.org/proj/portage-utils.git/commit/?id=7820847b
main: turn FEATURES into a set
Signed-off-by: Fabian Groffen <grobian <AT> gentoo.org>
applets.h | 2 +-
main.c | 56 ++++++++++++++++++++++++++++++++++++--------------------
2 files changed, 37 insertions(+), 21 deletions(-)
diff --git a/applets.h b/applets.h
index fa53359..6070fe4 100644
--- a/applets.h
+++ b/applets.h
@@ -170,7 +170,7 @@ extern char *pkg_install_mask;
extern char *binhost;
extern char *pkgdir;
extern char *port_tmpdir;
-extern char *features;
+extern set *features;
extern set *ev_use;
extern char *install_mask;
extern DEFINE_ARRAY(overlays);
diff --git a/main.c b/main.c
index 1d78f07..37ba036 100644
--- a/main.c
+++ b/main.c
@@ -41,7 +41,7 @@ char *pkg_install_mask;
char *binhost;
char *pkgdir;
char *port_tmpdir;
-char *features;
+set *features;
set *ev_use;
char *install_mask;
DECLARE_ARRAY(overlays);
@@ -252,13 +252,27 @@ strincr_var(const char *name, const char *s, char
**value, size_t *value_len)
char *p;
char *nv;
char brace;
+ bool haddashstar;
- len = strlen(s);
- *value = xrealloc(*value, *value_len + len + 2);
- nv = &(*value)[*value_len];
- if (*value_len)
- *nv++ = ' ';
- memcpy(nv, s, len + 1);
+ /* find/skip any -* instances */
+ nv = (char *)s;
+ while ((p = strstr(nv, "-*")) != NULL)
+ nv = p + 2;
+
+ haddashstar = nv != (char *)s;
+
+ len = strlen(nv);
+ if (haddashstar && len < *value_len) {
+ p = *value;
+ *p = '\0'; /* in case len == 0 */
+ } else {
+ *value = xrealloc(*value,
+ (haddashstar ? (*value_len +
1) : 0) + len + 1);
+ p = &(*value)[*value_len];
+ if (*value_len > 0)
+ *p++ = ' ';
+ }
+ memcpy(p, nv, len + 1);
/* This function is mainly used by the startup code for parsing
make.conf and stacking variables remove.
@@ -275,7 +289,6 @@ strincr_var(const char *name, const char *s, char **value,
size_t *value_len)
*/
len = strlen(name);
- p = nv;
while ((p = strchr(p, '$')) != NULL) {
nv = p;
p++; /* skip $ */
@@ -293,9 +306,6 @@ strincr_var(const char *name, const char *s, char **value,
size_t *value_len)
}
}
- while ((p = strstr(nv, "-*")) != NULL)
- memset(*value, ' ', p - *value + 2);
-
remove_extra_space(*value);
*value_len = strlen(*value);
/* we should sort here */
@@ -331,13 +341,15 @@ setincr_var(const char *s, set **vals)
makeargv(s, &argc, &argv);
for (i = 1 /* skip executable name */; i < argc; i++) {
- if (argv[i][0] == '-' && *vals != NULL) {
- /* handle negation, when the respective value isn't
set, we
- * simply ignore/drop it */
- if (argv[i][1] == '*') {
- clear_set(*vals);
- } else {
- del_set(&argv[i][1], *vals, &ignore);
+ if (argv[i][0] == '-') {
+ if (*vals != NULL) {
+ /* handle negation, when the respective value
isn't set, we
+ * simply ignore/drop it */
+ if (argv[i][1] == '*') {
+ clear_set(*vals);
+ } else {
+ del_set(&argv[i][1], *vals, &ignore);
+ }
}
} else if (argv[i][0] == '$') {
/* detect ${var} or $var, simply ignore it completely,
for
@@ -368,7 +380,11 @@ set_portage_env_var(env_vars *var, const char *value,
const char *src)
{
switch (var->type) {
case _Q_BOOL:
- *var->value.b = 1;
+ *var->value.b = 0;
+ if (strcasecmp(value, "true") == 0 ||
+ strcasecmp(value, "yes") == 0 ||
+ strcmp(value, "1") == 0)
+ *var->value.b = 1;
free(var->src);
var->src = xstrdup(src);
break;
@@ -682,7 +698,7 @@ env_vars vars_to_read[] = {
_Q_EVS(ISTR, CONFIG_PROTECT, config_protect, "/etc")
_Q_EVS(ISTR, CONFIG_PROTECT_MASK, config_protect_mask, "")
_Q_EVB(BOOL, NOCOLOR, nocolor, 0)
- _Q_EVS(ISTR, FEATURES, features, "")
+ _Q_EVT(ISET, FEATURES, features, NULL)
_Q_EVT(ISET, USE, ev_use, NULL)
_Q_EVS(STR, EPREFIX, eprefix, CONFIG_EPREFIX)
_Q_EVS(STR, EMERGE_LOG_DIR, portlogdir, CONFIG_EPREFIX
"var/log")