From 907753cf3e1232bd3abba50ccaf2a617dc24982f Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Thu, 22 Mar 2012 18:04:36 +0100 Subject: [PATCH] - support distepoch handling in release, used by the M&M distros --- ext/testcase.c | 1 + src/evr.c | 23 +++++++++++++++++++++-- src/pool.h | 2 ++ 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/ext/testcase.c b/ext/testcase.c index 15579db..7081f9d 100644 --- a/ext/testcase.c +++ b/ext/testcase.c @@ -103,6 +103,7 @@ static struct poolflags2str { { POOL_FLAG_IMPLICITOBSOLETEUSESPROVIDES, "implicitobsoleteusesprovides", 0 }, { POOL_FLAG_OBSOLETEUSESCOLORS, "obsoleteusescolors", 0 }, { POOL_FLAG_NOINSTALLEDOBSOLETES, "noinstalledobsoletes", 0 }, + { POOL_FLAG_HAVEDISTEPOCH, "havedistepoch", 0 }, { 0, 0, 0 } }; diff --git a/src/evr.c b/src/evr.c index a209e65..cdd7bd8 100644 --- a/src/evr.c +++ b/src/evr.c @@ -225,8 +225,27 @@ pool_evrcmp_str(const Pool *pool, const char *evr1, const char *evr2, int mode) return 0; if (r1 && r2) { - if (mode != EVRCMP_MATCH || (s1 != ++r1 && s2 != ++r2)) - r = solv_vercmp(r1, s1, r2, s2); + r1++; + r2++; + if (mode != EVRCMP_MATCH || (s1 != r1 && s2 != r2)) + { + if (pool->havedistepoch) + { + const char *d1, *d2; + for (d1 = r1; d1 < s1; d1++) + if (*d1 == ':') + break; + for (d2 = r2; d2 < s2; d2++) + if (*d2 == ':') + break; + /* XXX: promote just in one direction? */ + r = solv_vercmp(r1, d1 ? d1 : s1, r2, d2 ? d2 : s2); + if (r == 0 && d1 < s1 && d2 < s2) + r = solv_vercmp(d1 + 1, s1, d2 + 1, s2); + } + else + r = solv_vercmp(r1, s1, r2, s2); + } } else if (mode == EVRCMP_MATCH_RELEASE) { diff --git a/src/pool.h b/src/pool.h index cbc8e1a..7b149de 100644 --- a/src/pool.h +++ b/src/pool.h @@ -122,6 +122,7 @@ struct _Pool { #ifdef LIBSOLV_INTERNAL /* flags to tell the library how the installed package manager works */ int promoteepoch; /* true: missing epoch is replaced by epoch of dependency */ + int havedistepoch; /* true: thr release part in the evr may contain a distepoch suffix */ int obsoleteusesprovides; /* true: obsoletes are matched against provides, not names */ int implicitobsoleteusesprovides; /* true: implicit obsoletes due to same name are matched against provides, not names */ int obsoleteusescolors; /* true: obsoletes check arch color */ @@ -167,6 +168,7 @@ struct _Pool { #define POOL_FLAG_IMPLICITOBSOLETEUSESPROVIDES 4 #define POOL_FLAG_OBSOLETEUSESCOLORS 5 #define POOL_FLAG_NOINSTALLEDOBSOLETES 6 +#define POOL_FLAG_HAVEDISTEPOCH 7 /* ----------------------------------------------- */ -- 2.7.4