Index: arg_packages.c =================================================================== RCS file: /cvsroot/poldek/poldek/arg_packages.c,v retrieving revision 1.24 retrieving revision 1.25 diff -u -r1.24 -r1.25 --- arg_packages.c 7 Jan 2006 01:13:20 -0000 1.24 +++ arg_packages.c 2 Apr 2006 19:10:36 -0000 1.25 @@ -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: uninstall.c =================================================================== RCS file: /cvsroot/poldek/poldek/uninstall.c,v retrieving revision 1.39 retrieving revision 1.40 diff -u -r1.39 -r1.40 --- uninstall.c 18 Mar 2006 17:03:48 -0000 1.39 +++ uninstall.c 2 Apr 2006 19:10:36 -0000 1.40 @@ -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; - - 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 = '#'; + char *mask = n_array_nth(masks, i); - 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++; } }