poldek: poldek/arg_packages.c, poldek/arg_packages.h, poldek/conf....
mis
mis at pld-linux.org
Sun Apr 2 21:10:42 CEST 2006
Author: mis Date: Sun Apr 2 19:10:41 2006 GMT
Module: poldek Tag: HEAD
---- Log message:
- fixed (implemented multilib support in fact) #5767 and (related) #5772
- multilib mode triggered automaticaly by rpm's %_transaction_color
- code cleanups
---- Files affected:
poldek/poldek:
arg_packages.c (1.24 -> 1.25) , arg_packages.h (1.8 -> 1.9) , conf.c (1.80 -> 1.81) , conf.h (1.15 -> 1.16) , lib_init.c (1.73 -> 1.74) , pkg.c (1.108 -> 1.109) , poldek_intern.h (1.7 -> 1.8) , poldek_ts.c (1.55 -> 1.56) , uninstall.c (1.39 -> 1.40)
---- Diffs:
================================================================
Index: poldek/poldek/arg_packages.c
diff -u poldek/poldek/arg_packages.c:1.24 poldek/poldek/arg_packages.c:1.25
--- poldek/poldek/arg_packages.c:1.24 Sat Jan 7 02:13:20 2006
+++ poldek/poldek/arg_packages.c Sun Apr 2 21:10:36 2006
@@ -42,6 +42,8 @@
#include "pkgset.h"
#include "pm/pm.h"
+extern int poldek_conf_MULTILIB;
+
#define ARG_PACKAGES_SETUPDONE (1 << 0)
/* @VIRTUAL [DEFAULT_MASK [EVR]] */
@@ -227,36 +229,6 @@
// n_hash_size(aps->resolved_caps);
}
-#if 0 /* XXX: disabled, #5702 */
-/* tries to convert N-[E:]V-R to N#[E:]V-R */
-static char *mask2evrhashedmask(const char *mask)
-{
- const char *name, *ver, *rel, *p;
- char nmask[1024], e[32] = "", *tmp;
- int32_t epoch = 0;
- int n;
-
- n_strdupap(mask, &tmp);
- if (!poldek_util_parse_nevr(tmp, &name, &epoch, &ver, &rel))
- return NULL;
-
- p = ver; /* check if it is really version */
- while (*p) {
- if (isdigit(*p))
- break;
- p++;
- }
-
- if (*p == '\0') /* no digits => part of name propably */
- return NULL;
-
- if (epoch)
- snprintf(e, sizeof(e), "%d:", epoch);
- n = n_snprintf(nmask, sizeof(nmask), "%s#%s%s-%s", name, e, ver, rel);
- return n_strdupl(nmask, n);
-}
-#endif
-
tn_array *arg_packages_get_masks(struct arg_packages *aps, int hashed)
{
tn_array *masks;
@@ -264,19 +236,11 @@
masks = n_array_clone(aps->package_masks);
for (i=0; i < n_array_size(aps->package_masks); i++) {
- const char *mask;
-
- mask = n_array_nth(aps->package_masks, i);
- if (hashed && strchr(mask, '-') && strchr(mask, '*') == NULL) {
-#if 0 /* XXX: disabled so smart NEVR parsing, #5702 */
- char *nmask;
- if ((nmask = mask2evrhashedmask(mask)))
- mask = nmask;
-#endif
- }
+ const char *mask = n_array_nth(aps->package_masks, i);
n_array_push(masks, n_strdup(mask));
}
-
+
+ hashed = 0; /* disabled for a while */
for (i=0; i < n_array_size(aps->packages); i++) {
struct pkg *pkg = n_array_nth(aps->packages, i);
char mask[1024], e[32] = "";
@@ -284,9 +248,13 @@
if (pkg->epoch)
snprintf(e, sizeof(e), "%d:", pkg->epoch);
-
+
n = n_snprintf(mask, sizeof(mask), "%s%s%s%s-%s", pkg->name,
- hashed ? "#" : "-", e, pkg->ver, pkg->rel);
+ hashed ? "#" : "-", e, pkg->ver, pkg->rel);
+
+ if (0 && poldek_conf_MULTILIB && pkg_arch(pkg))
+ n += n_snprintf(&mask[n], sizeof(mask) - n, ".%s", pkg_arch(pkg));
+
n_array_push(masks, n_strdupl(mask, n));
}
================================================================
Index: poldek/poldek/arg_packages.h
diff -u poldek/poldek/arg_packages.h:1.8 poldek/poldek/arg_packages.h:1.9
--- poldek/poldek/arg_packages.h:1.8 Wed May 25 17:54:02 2005
+++ poldek/poldek/arg_packages.h Sun Apr 2 21:10:36 2006
@@ -15,6 +15,7 @@
void arg_packages_clean(struct arg_packages *aps);
int arg_packages_size(struct arg_packages *aps);
+
tn_array *arg_packages_get_masks(struct arg_packages *aps, int hashed);
int arg_packages_add_pkgmask(struct arg_packages *aps, const char *mask);
================================================================
Index: poldek/poldek/conf.c
diff -u poldek/poldek/conf.c:1.80 poldek/poldek/conf.c:1.81
--- poldek/poldek/conf.c:1.80 Sat Mar 18 16:27:47 2006
+++ poldek/poldek/conf.c Sun Apr 2 21:10:36 2006
@@ -1319,7 +1319,7 @@
return default_v;
if (sscanf(vs, "%d", &v) != 1) {
- logn(LOGERR, _("invalid value ('%s') of option '%s'"), vs, name);
+ logn(LOGERR, _("invalid value ('%s') of integer option '%s'"), vs, name);
v = default_v;
}
@@ -1336,7 +1336,7 @@
return default_v;
if ((bool = poldek_util_parse_bool(v)) < 0) {
- logn(LOGERR, _("invalid value ('%s') of option '%s'"), v, name);
+ logn(LOGERR, _("invalid value ('%s') of boolean option '%s'"), v, name);
bool = default_v;
}
================================================================
Index: poldek/poldek/conf.h
diff -u poldek/poldek/conf.h:1.15 poldek/poldek/conf.h:1.16
--- poldek/poldek/conf.h:1.15 Tue Nov 1 20:14:19 2005
+++ poldek/poldek/conf.h Sun Apr 2 21:10:36 2006
@@ -29,6 +29,7 @@
const char *poldek_conf_get(const tn_hash *htconf, const char *name, int *is_multi);
int poldek_conf_get_bool(const tn_hash *htconf, const char *name, int default_v);
+int poldek_conf_get_bool3(const tn_hash *htconf, const char *name, int default_v);
int poldek_conf_get_int(const tn_hash *htconf, const char *name, int default_v);
tn_array *poldek_conf_get_multi(const tn_hash *htconf, const char *name);
================================================================
Index: poldek/poldek/lib_init.c
diff -u poldek/poldek/lib_init.c:1.73 poldek/poldek/lib_init.c:1.74
--- poldek/poldek/lib_init.c:1.73 Tue Nov 1 20:17:04 2005
+++ poldek/poldek/lib_init.c Sun Apr 2 21:10:36 2006
@@ -98,6 +98,7 @@
int op;
int _defaultv;
int defaultv;
+ int optype;
};
static tn_array *default_op_map = NULL; /* see build_default_op_map() */
@@ -665,18 +666,25 @@
p_st_destroy(&pst);
}
+int default_op_map_ent_cmp(struct default_op_map_ent *e1,
+ struct default_op_map_ent *e2)
+{
+ return strcmp(e1->name, e2->name);
+}
+
static tn_array *build_default_op_map(void)
{
struct poldek_conf_tag *tags = NULL;
tn_array *op_map;
int i = 0;
- struct default_op_map_ent *ent, addon[] = {
- { 0, "(!no)hold", POLDEK_OP_HOLD, 1, 1 },
- { 0, "(!no)ingore", POLDEK_OP_IGNORE, 1, 1 },
- { 0, NULL, 0, 0, 0 }
+ struct default_op_map_ent *ent;
+ struct default_op_map_ent addon[] = {
+ { 0, "(!no)hold", POLDEK_OP_HOLD, 1, 1, CONF_TYPE_BOOLEAN },
+ { 0, "(!no)ingore", POLDEK_OP_IGNORE, 1, 1, CONF_TYPE_BOOLEAN },
+ { 0, NULL, 0, 0, 0, 0 }
};
- op_map = n_array_new(32, free, NULL);
+ op_map = n_array_new(32, free, (tn_fn_cmp)default_op_map_ent_cmp);
while (poldek_conf_sections[i].name) {
if (n_str_eq(poldek_conf_sections[i].name, "global")) {
@@ -704,13 +712,16 @@
ent->_defaultv = poldek_util_parse_bool(tags[i].defaultv);
ent->defaultv = ent->_defaultv;
n_assert(ent->defaultv == 0 || ent->defaultv == 1);
+ ent->optype = CONF_TYPE_BOOLEAN;
} else if (tags[i].flags & CONF_TYPE_BOOLEAN3) {
ent->_defaultv = poldek_util_parse_bool3(tags[i].defaultv);
n_assert(ent->_defaultv == 0 || ent->_defaultv == 1 ||
ent->_defaultv == 2);
- ent->defaultv = -1;
+ ent->defaultv = ent->_defaultv;
+ ent->optype = CONF_TYPE_BOOLEAN3;
+
} else {
n_assert(0);
}
@@ -726,6 +737,7 @@
ent->name = addon[i].name;
ent->op = addon[i].op;
ent->_defaultv = ent->defaultv = addon[i].defaultv;
+ ent->optype = addon[i].optype;
n_array_push(op_map, ent);
i++;
}
@@ -734,7 +746,8 @@
struct default_op_map_ent *ent = n_array_nth(op_map, i);
DBGF("%s %d\n", ent->name, ent->_defaultv);
}
-#endif
+#endif
+ n_array_sort(op_map);
return op_map;
}
@@ -750,30 +763,45 @@
return;
htcnf = poldek_conf_get_section_ht(ctx->htconf, "global");
- i = 0;
+
DBGF("ts %p, tsctx %p\n", ts, ctx->ts);
+ DBGF("default_op_map size = %d\n", n_array_size(default_op_map));
- for (i=0; i<n_array_size(default_op_map); i++) {
+ for (i=0; i < n_array_size(default_op_map); i++) {
struct default_op_map_ent *ent = n_array_nth(default_op_map, i);
+
+ DBGF("op[%d] %s (config %d)\n", i, ent->name, ent->config);
if (ent->config == 0) /* omit non-config options */
continue;
+
n_assert(ent->defaultv >= 0);
if (poldek_ts_op_touched(ts, ent->op)) { /* modified by cmdl opts */
- DBGF(" - ldconfig %s(%d) = %d\n", ent->name, ent->op,
+ DBGF(" %d. - ldconfig %s(%d) = %d\n", i, ent->name, ent->op,
ts->getop(ts, ent->op));
} else {
+ int v;
+ if (ent->optype == CONF_TYPE_BOOLEAN)
+ v = poldek_conf_get_bool(htcnf, ent->name, ent->defaultv);
- int v = poldek_conf_get_bool(htcnf, ent->name, ent->defaultv);
+ else if (ent->optype == CONF_TYPE_BOOLEAN3)
+ v = poldek_conf_get_bool3(htcnf, ent->name, ent->defaultv);
+ else
+ n_assert(0);
- DBGF(" + ldconfig %s(%d) = %d\n", ent->name, ent->op, v);
+ if (ent->optype == CONF_TYPE_BOOLEAN3 && v == 2) { /* auto */
+ if (ent->defaultv != 0 && ent->defaultv != 1)
+ continue;
+ v = ent->defaultv;
+ }
+
+ n_assert(v == 0 || v == 1);
+ DBGF(" %d. + ldconfig %s(%d) = %d\n", i, ent->name, ent->op, v);
poldek_ts_xsetop(ts, ent->op, v, 0);
}
-
- i++;
}
if (ts->getop(ts, POLDEK_OP_CONFIRM_INST) && poldek_VERBOSE < 1)
@@ -1252,19 +1280,21 @@
v = 1;
break;
- case POLDEK_OP_MULTILIB: /* NFY */
- v = 0;
+ case POLDEK_OP_MULTILIB: /* do not touch, will
+ be determined later */
break;
default:
n_assert(0);
}
+ DBGF("auto %s = %d\n", ent->name, v);
ent->defaultv = v;
}
- poldek_ts_xsetop(ts, ent->op, v, 0);
+ if (v != 2)
+ poldek_ts_xsetop(ts, ent->op, v, 0);
}
-
+ DBGF("default_op_map size = %d\n", n_array_size(default_op_map));
return 1;
}
@@ -1351,6 +1381,54 @@
return 1;
}
+static void __setup_multilib(struct poldek_ctx *ctx)
+{
+ struct default_op_map_ent *ent, tmp;
+ char scolor[64];
+ int color, multilib = 2;
+
+
+ if (!pm_conf_get(ctx->pmctx, "%{_transaction_color}", scolor, sizeof(scolor)))
+ return;
+
+ if (sscanf(scolor, "%u", &color) != 1)
+ return;
+
+ if (ctx->htconf) {
+ tn_hash *htcnf = poldek_conf_get_section_ht(ctx->htconf, "global");
+ multilib = poldek_conf_get_bool3(htcnf, "multilib", 2);
+ }
+
+ if (color && multilib == 0) {
+ logn(LOGWARN, _("RPM works in multilib mode, while poldek not"));
+ return;
+
+ } else if (!color && multilib == 1) {
+ logn(LOGWARN, _("poldek works in multilib mode, while rpm not"));
+ return;
+ }
+
+ if (multilib == 2) { /* auto */
+ ctx->_rpm_tscolor = color;
+
+ tmp.name = "multilib";
+ ent = n_array_bsearch(default_op_map, &tmp);
+ n_assert(ent);
+
+ ent->defaultv = 0;
+ if (color)
+ ent->defaultv = 1;
+
+ if (color)
+ msgn(2, "Enabling multilib mode, rpm's transaction color = %d",
+ color);
+
+ DBGF("multilib(auto) = %d\n", ent->defaultv);
+ poldek_ts_xsetop(ctx->ts, ent->op, ent->defaultv, 0);
+ }
+}
+
+
/* */
static int setup_pm(struct poldek_ctx *ctx)
@@ -1362,7 +1440,8 @@
if (strcmp(pm, "rpm") == 0) {
ctx->pmctx = pm_new(pm);
pm_configure(ctx->pmctx, "macros", ctx->ts->rpmacros);
-
+ __setup_multilib(ctx);
+
} else if (strcmp(pm, "pset") == 0) {
n_array_sort_ex(ctx->dest_sources, (tn_fn_cmp)source_cmp_no);
if (n_array_size(ctx->dest_sources) == 0) {
================================================================
Index: poldek/poldek/pkg.c
diff -u poldek/poldek/pkg.c:1.108 poldek/poldek/pkg.c:1.109
--- poldek/poldek/pkg.c:1.108 Sat Mar 18 17:29:00 2006
+++ poldek/poldek/pkg.c Sun Apr 2 21:10:36 2006
@@ -215,7 +215,6 @@
len += len + 1; /* for id (nvr) */
-
if (poldek_conf_MULTILIB && arch) {
arch_len = strlen(arch);
len += arch_len + 1;
@@ -356,7 +355,7 @@
{
#if ENABLE_TRACE
if (strcmp(pkg->name, "poldek") == 0) {
- DBGF_F("%p %s (pdir %s, na->refcnt=%d), refcnt=%d (%p)\n",
+ DBGF("%p %s (pdir %s, na->refcnt=%d), refcnt=%d (%p)\n",
pkg, pkg_snprintf_s(pkg),
pkg->pkgdir ? pkgdir_idstr(pkg->pkgdir) : "<none>",
pkg->na ? pkg->na->_refcnt : -1,
================================================================
Index: poldek/poldek/poldek_intern.h
diff -u poldek/poldek/poldek_intern.h:1.7 poldek/poldek/poldek_intern.h:1.8
--- poldek/poldek/poldek_intern.h:1.7 Fri Oct 21 01:11:22 2005
+++ poldek/poldek/poldek_intern.h Sun Apr 2 21:10:36 2006
@@ -27,7 +27,7 @@
unsigned ps_setup_flags;
struct pkgset *ps;
struct pm_ctx *pmctx;
-
+ int _rpm_tscolor; /* rpm transaction color */
// tn_array *inst_pkgs; /* array of installed packages */
// time_t ts_instpkgs; /* inst_pkgs timestamp */
================================================================
Index: poldek/poldek/poldek_ts.c
diff -u poldek/poldek/poldek_ts.c:1.55 poldek/poldek/poldek_ts.c:1.56
--- poldek/poldek/poldek_ts.c:1.55 Wed Oct 26 16:41:05 2005
+++ poldek/poldek/poldek_ts.c Sun Apr 2 21:10:36 2006
@@ -1036,6 +1036,7 @@
if (rc && !ts->getop(ts, POLDEK_OP_RPMTEST))
pkgdb_tx_commit(ts->db);
+
pkgdb_free(ts->db);
ts->db = NULL;
return rc;
================================================================
Index: poldek/poldek/uninstall.c
diff -u poldek/poldek/uninstall.c:1.39 poldek/poldek/uninstall.c:1.40
--- poldek/poldek/uninstall.c:1.39 Sat Mar 18 18:03:48 2006
+++ poldek/poldek/uninstall.c Sun Apr 2 21:10:36 2006
@@ -227,6 +227,7 @@
MEMINF("START");
DBGF("%s\n", pkg_id(pkg));
+ msg_i(3, indent, "%s\n", pkg_id(pkg));
for (i=0; i < n_array_size(pkg->reqs); i++) {
struct capreq *req = n_array_nth(pkg->reqs, i);
@@ -235,7 +236,7 @@
DBGF("req %s\n", capreq_snprintf_s(req));
- if (pkg_satisfies_req(pkg, req, 1)) { /* self match, should be handled
+ if (pkg_satisfies_req(pkg, req, 1)) { /* XXX: self match, should be handled
at lower level; TOFIX */
DBGF("%s: satisfied by itself\n", capreq_snprintf_s(req));
@@ -243,7 +244,7 @@
uctx->uninst_set->dbpkgs)) {
DBGF("%s: satisfied by db\n", capreq_snprintf_s(req));
- msg_i(3, indent, "%s: satisfied by db\n", capreq_snprintf_s(req));
+ msg_i(3, indent, " %s: satisfied by db\n", capreq_snprintf_s(req));
} else if (!uctx->ts->getop(uctx->ts, POLDEK_OP_FOLLOW)) {
logn(LOGERR, _("%s (cap %s) is required by %s"),
@@ -402,7 +403,8 @@
static
int do_resolve_package(struct uninstall_ctx *uctx, struct poldek_ts *ts,
- const char *mask, const struct capreq *cr)
+ const char *mask, const struct capreq *cr,
+ const char *arch)
{
tn_array *dbpkgs;
int i, nmatches = 0;
@@ -446,6 +448,12 @@
pkg_evr_match_req(dbpkg, cr, POLDEK_MA_PROMOTE_REQEPOCH))
matched = 1;
}
+
+ if (matched && arch) {
+ const char *dbarch = pkg_arch(dbpkg);
+ matched = n_str_eq(arch, dbarch ? dbarch : "none");
+ }
+
}
if (matched) {
@@ -459,7 +467,7 @@
}
static int resolve_package(struct uninstall_ctx *uctx, struct poldek_ts *ts,
- const char *mask)
+ const char *mask, const char *arch)
{
char *p;
struct capreq *cr, *cr_evr;
@@ -491,7 +499,7 @@
}
}
- if (do_resolve_package(uctx, ts, mask, cr))
+ if (do_resolve_package(uctx, ts, mask, cr, arch))
resolved = 1;
if (cr_evr)
@@ -500,6 +508,58 @@
return resolved;
}
+static int resolve_mask(struct uninstall_ctx *uctx, struct poldek_ts *ts,
+ const char *mask)
+{
+ char *p, *tmp;
+ const char *n, *v, *r;
+ char nmask[256];
+ int32_t e = 0;
+ int matched = 0;
+
+ msgn(2, "Trying %s\n", mask);
+ if (resolve_package(uctx, ts, mask, NULL))
+ return 1;
+
+ if ((p = strchr(mask, '-')) == NULL) /* try N-[E:]V */
+ return 0;
+
+ /* try N-[E:]V-R */
+ n_strdupap(mask, &tmp);
+ p = strrchr(tmp, '-');
+ *p = '#';
+
+ msgn(2, " Trying %s\n", tmp);
+
+ if (resolve_package(uctx, ts, tmp, NULL))
+ return 1;
+
+ n_strdupap(mask, &tmp);
+ if (poldek_util_parse_nevr(tmp, &n, &e, &v, &r)) {
+ if (e)
+ n_snprintf(nmask, sizeof(nmask), "%s#%d:%s-%s", n, e, v, r);
+ else
+ n_snprintf(nmask, sizeof(nmask), "%s#%s-%s", n, v, r);
+
+ msgn(2, " Trying %s\n", nmask);
+ DBGF("try %s => %s (%s, %s, %s)\n", mask, nmask, n, v, r);
+ matched = resolve_package(uctx, ts, nmask, NULL);
+
+ if (!matched && (p = strchr(r, '.'))) { /* try N-[E:]-V-R.ARCH */
+ *p = '\0';
+ p++;
+
+ if (e)
+ n_snprintf(nmask, sizeof(nmask), "%s#%d:%s-%s", n, e, v, r);
+ else
+ n_snprintf(nmask, sizeof(nmask), "%s#%s-%s", n, v, r);
+ msgn(2, " Trying %s (arch=%s)\n", nmask, p);
+ matched = resolve_package(uctx, ts, nmask, p);
+ }
+ }
+
+ return matched;
+}
static int resolve_packages(struct uninstall_ctx *uctx, struct poldek_ts *ts)
{
@@ -509,51 +569,11 @@
masks = poldek_ts_get_args_asmasks(ts, 1);
for (i=0; i < n_array_size(masks); i++) {
- char *mask = n_array_nth(masks, i);
- int matched = 0;
+ char *mask = n_array_nth(masks, i);
- msgn(2, "Trying %s\n", mask);
- if (resolve_package(uctx, ts, mask)) {
- matched = 1;
-
- } else {
- char *p;
-
- if ((p = strchr(mask, '-'))) { /* try N-[E:]V */
- char *tmp;
- n_strdupap(mask, &tmp);
-
- p = strrchr(tmp, '-');
- *p = '#';
-
- msgn(2, " Trying %s\n", tmp);
-
- if (resolve_package(uctx, ts, tmp)) {
- matched = 1;
-
- } else { /* try N-[E:]V-R */
- const char *n, *v, *r;
- char nmask[256];
- int32_t e = 0;
-
- n_strdupap(mask, &tmp);
- if (poldek_util_parse_nevr(tmp, &n, &e, &v, &r)) {
- if (e)
- n_snprintf(nmask, sizeof(nmask), "%s#%d:%s-%s", n, e, v, r);
- else
- n_snprintf(nmask, sizeof(nmask), "%s#%s-%s", n, v, r);
-
- msgn(2, " Trying %s\n", nmask);
- DBGF("try %s => %s (%s, %s, %s)\n", mask, nmask, n, v, r);
- matched = resolve_package(uctx, ts, nmask);
- }
- }
- }
-
- if (!matched) {
- logn(LOGERR, _("%s: no such package"), mask);
- nerr++;
- }
+ if (!resolve_mask(uctx, ts, mask)) {
+ logn(LOGERR, _("%s: no such package"), mask);
+ nerr++;
}
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/poldek/poldek/arg_packages.c?r1=1.24&r2=1.25&f=u
http://cvs.pld-linux.org/poldek/poldek/arg_packages.h?r1=1.8&r2=1.9&f=u
http://cvs.pld-linux.org/poldek/poldek/conf.c?r1=1.80&r2=1.81&f=u
http://cvs.pld-linux.org/poldek/poldek/conf.h?r1=1.15&r2=1.16&f=u
http://cvs.pld-linux.org/poldek/poldek/lib_init.c?r1=1.73&r2=1.74&f=u
http://cvs.pld-linux.org/poldek/poldek/pkg.c?r1=1.108&r2=1.109&f=u
http://cvs.pld-linux.org/poldek/poldek/poldek_intern.h?r1=1.7&r2=1.8&f=u
http://cvs.pld-linux.org/poldek/poldek/poldek_ts.c?r1=1.55&r2=1.56&f=u
http://cvs.pld-linux.org/poldek/poldek/uninstall.c?r1=1.39&r2=1.40&f=u
More information about the pld-cvs-commit
mailing list