--- poldek-0.18.6.orig/conf.c 2004-09-15 16:03:02.000000000 +0000 +++ poldek-0.18.6/conf.c 2004-09-15 18:56:34.000000000 +0000 @@ -83,6 +83,7 @@ { "ftp_sysuser_as_anon_passwd", TYPE_BOOL , { 0 } }, { "vfile_external_compress", TYPE_BOOL, { 0 } }, { "promoteepoch", TYPE_BOOL, { 0 } }, + { "nodistver", TYPE_BOOL, { 0 } }, { NULL, 0, { 0 } }, }; --- poldek-0.18.6.orig/main.c 2004-09-15 16:03:02.000000000 +0000 +++ poldek-0.18.6/main.c 2004-09-15 19:32:03.000000000 +0000 @@ -247,6 +247,7 @@ #define OPT_ASK 2006 #define OPT_NOASK 2007 #define OPT_RPMOPT 2008 +#define OPT_NODISTVER 2009 #define OPT_MERGE 2101 #define OPT_SW_V016 (1 << 0) #define OPT_SW_NOASK (1 << 1) @@ -459,6 +460,8 @@ {"conf", OPT_CONF, "FILE", 0, N_("Read configuration from FILE"), 500 }, {"noconf", OPT_NOCONF, 0, 0, N_("Do not read configuration"), 500 }, +{"nodistver", OPT_NODISTVER, 0, 0, N_("Do not check distribution versions"), + 500 }, {"version", OPT_BANNER, 0, 0, N_("Display program version information and exit"), 500 }, {"log", OPT_LOG, "FILE", 0, N_("Log program messages to FILE"), 500 }, @@ -850,6 +853,12 @@ n_array_push(argsp->inst.rpmacros, arg); break; + case OPT_NODISTVER: + n_assert(argsp->inst.rpmacros); + n_array_push(argsp->inst.rpmacros, + n_strdup("_dont_compare_distversion 1")); + no_distver=1; + break; case OPT_INST_FETCH: if (arg) @@ -1385,6 +1394,15 @@ if (conf_get_bool(htcnf, "particle_install", 1)) args.inst.flags |= INSTS_PARTICLE; + if (no_distver == 0) { /* no --nodistver specified */ + if (conf_get_bool(htcnf, "nodistver", 0)) + { + n_assert(args.inst.rpmacros); + n_array_push(args.inst.rpmacros, + n_strdup("_dont_compare_distversion 1")); + no_distver = 1; + } + } if ((args.inst.flags & INSTS_GREEDY) == 0) { /* no --greedy specified */ if (conf_get_bool(htcnf, "greedy", 1)) --- poldek-0.18.6.orig/misc.h 2004-06-28 20:19:28.000000000 +0000 +++ poldek-0.18.6/misc.h 2004-09-15 17:09:29.000000000 +0000 @@ -11,6 +11,8 @@ #include #include +extern int no_distver; + const char *ngettext_n_packages_fmt(int n); void translate_argp_options(struct argp_option *arr); --- poldek-0.18.6.orig/pkg.c 2004-09-15 16:03:02.000000000 +0000 +++ poldek-0.18.6/pkg.c 2004-09-15 17:19:00.000000000 +0000 @@ -49,13 +49,13 @@ struct pkg *pkg_new(const char *name, int32_t epoch, const char *version, const char *release, const char *arch, const char *os, - const char *fn, + const char *fn, const char *dist, uint32_t size, uint32_t fsize, uint32_t btime) { struct pkg *pkg; int name_len = 0, version_len = 0, release_len = 0, - arch_len = 0, os_len = 0, fn_len = 0; + arch_len = 0, os_len = 0, fn_len = 0, dist_len = 0; char *buf; int len; @@ -85,6 +85,11 @@ len += os_len + 1; } + if(dist) { + dist_len = strlen(dist); + len += dist_len + 1; + } + if (fn && arch) { char pkg_fn[1024]; @@ -142,6 +147,14 @@ *buf++ = '\0'; } + pkg->dist=NULL; + if(dist) { + pkg->dist = buf; + memcpy(buf, dist, dist_len); + buf += dist_len; + *buf++ = '\0'; + } + pkg->fn = NULL; if (fn) { pkg->fn = buf; @@ -248,6 +261,7 @@ struct pkg *pkg; uint32_t *epoch, *size, *btime; char *name, *version, *release, *arch = NULL, *os = NULL; + char *dist = NULL; int type; headerNVR(h, (void*)&name, (void*)&version, (void*)&release); @@ -267,6 +281,13 @@ if (type != RPM_STRING_TYPE) arch = NULL; + if (!headerGetEntry(h, RPMTAG_DISTRIBUTION, &type, (void *)&dist, NULL)) { + dist = NULL; + } + + if (type != RPM_STRING_TYPE) + dist = NULL; + if (!headerGetEntry(h, RPMTAG_OS, &type, (void *)&os, NULL)) { if (verbose > 1) logn(LOGWARN, _("%s: missing OS tag"), fname); @@ -282,7 +303,7 @@ btime = NULL; pkg = pkg_new(name, epoch ? *epoch : 0, version, release, arch, os, - fname ? n_basenam(fname) : NULL, + fname ? n_basenam(fname) : NULL, dist, size ? *size : 0, fsize, btime ? *btime : 0); if (pkg == NULL) @@ -444,6 +465,19 @@ return pkg_cmp_ver(p1, p2); } +int pkg_cmp_dist_evr(const struct pkg *p1, const struct pkg *p2) +{ + int rc; + + if(p1->dist && p2->dist) + { + rc = rpmdistcmp(p1->dist, p2->dist); + if(rc != 0) + return rc; + } + + return pkg_cmp_evr(p1, p2); +} int pkg_cmp_evr(const struct pkg *p1, const struct pkg *p2) { @@ -487,6 +521,15 @@ //return rc; } +int pkg_cmp_name_dist_evr_rev(const struct pkg *p1, const struct pkg *p2) +{ + register int rc; + + if ((rc = pkg_cmp_name(p1, p2))) + return rc; + + return -pkg_cmp_dist_evr(p1, p2); +} int pkg_cmp_name_evr_rev_srcpri(const struct pkg *p1, const struct pkg *p2) { @@ -612,6 +655,15 @@ return pkg_cmp_name_evr_rev(p1, p2); } +int pkg_cmp_dist_pri(struct pkg *p1, struct pkg *p2) +{ + register int cmprc = 0; + + if ((cmprc = p1->pri - p2->pri)) + return cmprc; + + return pkg_cmp_name_dist_evr_rev(p1, p2); +} int pkg_cmp_btime(struct pkg *p1, struct pkg *p2) { @@ -1352,8 +1404,12 @@ { tn_array *arr; - arr = n_array_new(size, (tn_fn_free)pkg_free, + if(no_distver) + arr = n_array_new(size, (tn_fn_free)pkg_free, (tn_fn_cmp)pkg_cmp_name_evr_rev); + else + arr = n_array_new(size, (tn_fn_free)pkg_free, + (tn_fn_cmp)pkg_cmp_name_dist_evr_rev); n_array_ctl(arr, TN_ARRAY_AUTOSORTED); return arr; } --- poldek-0.18.6.orig/pkg.h 2004-03-22 17:31:51.000000000 +0000 +++ poldek-0.18.6/pkg.h 2004-09-15 16:11:48.000000000 +0000 @@ -107,6 +107,7 @@ char *arch; char *os; char *fn; + char *dist; tn_array *caps; /* capabilities */ tn_array *reqs; /* requirements */ @@ -144,7 +145,7 @@ struct pkg *pkg_new(const char *name, int32_t epoch, const char *version, const char *release, const char *arch, const char *os, - const char *fn, + const char *fn, const char *dist, uint32_t size, uint32_t fsize, uint32_t btime); @@ -181,6 +182,7 @@ int pkg_cmp_name_evr_rev_srcpri(const struct pkg *p1, const struct pkg *p2); int pkg_cmp_pri(struct pkg *p1, struct pkg *p2); +int pkg_cmp_dist_pri(struct pkg *p1, struct pkg *p2); int pkg_cmp_btime(struct pkg *p1, struct pkg *p2); int pkg_cmp_btime_rev(struct pkg *p1, struct pkg *p2); --- poldek-0.18.6.orig/pkgdir.c 2004-05-06 07:57:31.000000000 +0000 +++ poldek-0.18.6/pkgdir.c 2004-09-15 17:52:26.000000000 +0000 @@ -55,6 +55,7 @@ int pkgdir_v016compat = 0; /* public */ int pkgdir_redhat9_zlib_in_rpm_workaround = 0; +int no_distver = 0; #define PKGT_HAS_NAME (1 << 0) #define PKGT_HAS_EVR (1 << 1) @@ -69,6 +70,7 @@ #define PKGT_HAS_BTIME (1 << 11) #define PKGT_HAS_GROUPID (1 << 12) #define PKGT_HAS_FN (1 << 13) +#define PKGT_HAS_DIST (1 << 14) struct pkgtags_s { unsigned flags; @@ -77,6 +79,7 @@ char arch[64]; char os[64]; char fn[1024]; + char dist[64]; uint32_t size; uint32_t fsize; uint32_t btime; @@ -1093,6 +1096,7 @@ case 'A': case 'O': case 'n': + case 'D': if (!add2pkgtags(&pkgt, *line, val, pkgdir->path, offs)) { nerr++; goto l_end; @@ -1320,6 +1324,16 @@ } break; + case 'D': + if (pkgt->flags & PKGT_HAS_DIST) { + logn(LOGERR, errmg_double_tag, pathname, offs, tag); + err++; + } else { + memcpy(pkgt->dist, value, sizeof(pkgt->dist) - 1); + pkgt->dist[ sizeof(pkgt->dist) - 1 ] = '\0'; + pkgt->flags |= PKGT_HAS_DIST; + } + break; case 'S': if (pkgt->flags & PKGT_HAS_SIZE) { @@ -1393,7 +1407,7 @@ struct pkg *pkg_new_from_tags(struct pkgtags_s *pkgt) { struct pkg *pkg; - char *version, *release, *arch = NULL, *os = NULL, *fn = NULL; + char *version, *release, *arch = NULL, *os = NULL, *fn = NULL, *dist = NULL; int32_t epoch; if (!(pkgt->flags & (PKGT_HAS_NAME | PKGT_HAS_EVR))) @@ -1407,6 +1421,9 @@ if (pkgt->flags & PKGT_HAS_FN) fn = pkgt->fn; + + if (pkgt->flags & PKGT_HAS_DIST) + dist = pkgt->dist; if (*pkgt->name == '\0' || *pkgt->evr == '\0' || *pkgt->arch == '\0') return NULL; @@ -1419,7 +1436,7 @@ return NULL; } - pkg = pkg_new(pkgt->name, epoch, version, release, arch, os, fn, + pkg = pkg_new(pkgt->name, epoch, version, release, arch, os, fn, dist, pkgt->size, pkgt->fsize, pkgt->btime); pkg->groupid = pkgt->groupid; @@ -1488,7 +1505,7 @@ if (*p && parse_nevr(p, &name, &epoch, &ver, &rel)) { struct pkg *pkg = pkg_new(name, epoch, ver, rel, NULL, NULL, NULL, - 0, 0, 0); + NULL, 0, 0, 0); n_array_push(pkgs, pkg); } } --- poldek-0.18.6.orig/pkgdir_save.c 2004-05-05 16:56:43.000000000 +0000 +++ poldek-0.18.6/pkgdir_save.c 2004-09-15 19:28:21.000000000 +0000 @@ -170,6 +170,9 @@ if (pkg->fn) fprintf(stream, "n: %s\n", pkg->fn); + + if (pkg->dist && !no_distver) + fprintf(stream, "D: %s\n", pkg->dist); fprintf(stream, "F:\n"); store_pkg_fields(stream, pkg->size, pkg->fsize, pkg->btime, pkg->groupid); --- poldek-0.18.6.orig/pkgset-install.c 2004-09-15 16:03:02.000000000 +0000 +++ poldek-0.18.6/pkgset-install.c 2004-09-15 17:20:34.000000000 +0000 @@ -1995,7 +1995,7 @@ if (is_installed == 0) n_array_push(iinf->uninstalled_pkgs, pkg_new(pkg->name, pkg->epoch, pkg->ver, pkg->rel, - pkg->arch, pkg->os, NULL, + pkg->arch, pkg->os, NULL, NULL, pkg->size, pkg->fsize, pkg->btime)); } @@ -2186,10 +2186,14 @@ struct upgrade_s *upg = upgptr; struct pkg *pkg, tmpkg; uint32_t *epoch; - int i, cmprc; + int i, cmprc, type, count; recno = recno; + + if (!(headerGetEntry(h, RPMTAG_DISTRIBUTION, &type, (void *)&tmpkg.dist, + &count) && type == RPM_STRING_TYPE && count == 1)) + tmpkg.dist=NULL; if (!rpmhdr_nevr(h, &tmpkg.name, &epoch, &tmpkg.ver, &tmpkg.rel)) { logn(LOGERR, _("db package header corrupted (!?)")); @@ -2205,7 +2209,10 @@ } pkg = n_array_nth(upg->avpkgs, i); - cmprc = pkg_cmp_evr(pkg, &tmpkg); + if(no_distver) + cmprc = pkg_cmp_evr(pkg, &tmpkg); + else + cmprc = pkg_cmp_dist_evr(pkg, &tmpkg); if (verbose) { if (cmprc == 0) msg(3, "%-32s up to date\n", pkg_snprintf_s(&tmpkg)); --- poldek-0.18.6.orig/rpm.c 2004-09-15 16:03:02.000000000 +0000 +++ poldek-0.18.6/rpm.c 2004-09-15 17:24:02.000000000 +0000 @@ -519,6 +519,36 @@ return n; } +static +int hdr_pkg_cmp_dist_evr(Header h, const struct pkg *pkg) +{ + int rc; + struct pkg tmpkg; + uint32_t *epoch; + int count; + int type; + + if (!(headerGetEntry(h, RPMTAG_DISTRIBUTION, &type, (void *)&tmpkg.dist, + &count) && type == RPM_STRING_TYPE && count == 1)) + tmpkg.dist=NULL; + + headerNVR(h, (void*)&tmpkg.name, (void*)&tmpkg.ver, + (void*)&tmpkg.rel); + + if (tmpkg.name == NULL || tmpkg.ver == NULL || tmpkg.rel == NULL) { + logn(LOGERR, "headerNVR() failed"); + return 0; + } + + if (headerGetEntry(h, RPMTAG_EPOCH, &rc, (void *)&epoch, NULL)) + tmpkg.epoch = *epoch; + else + tmpkg.epoch = 0; + + rc = pkg_cmp_dist_evr(&tmpkg, pkg); + + return rc; +} static int hdr_pkg_cmp_evr(Header h, const struct pkg *pkg) @@ -566,7 +596,10 @@ } else { if (cmprc) - *cmprc = -hdr_pkg_cmp_evr(dbrec->h, pkg); + if(no_distver) + *cmprc = -hdr_pkg_cmp_evr(dbrec->h, pkg); + else + *cmprc = -hdr_pkg_cmp_dist_evr(dbrec->h, pkg); if (dbrecp) { dbrecp->recno = dbrec->recno; --- poldek-0.18.6.orig/shell/shell.c 2004-09-15 16:03:02.000000000 +0000 +++ poldek-0.18.6/shell/shell.c 2004-09-15 17:18:04.000000000 +0000 @@ -997,7 +997,10 @@ return 0; if (compare_ver == 0) - *cmprc = pkg_cmp_evr(lshpkg->pkg, shpkg->pkg); + if(no_distver) + *cmprc = pkg_cmp_evr(lshpkg->pkg, shpkg->pkg); + else + *cmprc = pkg_cmp_dist_evr(lshpkg->pkg, shpkg->pkg); else *cmprc = pkg_cmp_ver(lshpkg->pkg, shpkg->pkg); --- poldek-0.18.6.orig/test_match.c 2004-05-05 16:57:09.000000000 +0000 +++ poldek-0.18.6/test_match.c 2004-09-15 16:11:48.000000000 +0000 @@ -49,7 +49,7 @@ struct capreq *cap; pkg = pkg_new("poldek", epoch, versions[i], relases[j], - NULL, NULL, NULL, 0, 0, 0); + NULL, NULL, NULL, NULL, 0, 0, 0); cap = capreq_new("poldek", epoch, versions[i++], relases[j++], REL_EQ, 0); k = 0; @@ -83,7 +83,7 @@ struct capreq *req, *cap; int rc; - pkg = pkg_new("poldek", epoch, ver, rel, NULL, NULL, NULL, 0, 0, 0); + pkg = pkg_new("poldek", epoch, ver, rel, NULL, NULL, NULL, NULL, 0, 0, 0); cap = capreq_new("poldek", epoch, ver, rel, REL_EQ, 0); req = capreq_new_evr("poldek", n_strdup(evr), relation, 0); --- poldek-0.18.6.orig/usrset.c 2004-09-15 16:03:02.000000000 +0000 +++ poldek-0.18.6/usrset.c 2004-09-15 16:11:48.000000000 +0000 @@ -185,7 +185,7 @@ release = ""; pdef->pkg = pkg_new(name, epoch, version, release, NULL, NULL, NULL, - 0, 0, 0); + NULL, 0, 0, 0); } if (virtname)