X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fpoolid.c;h=7bcc1f6094e46562c8f5a16002170ef782fb626e;hb=refs%2Ftags%2Fupstream%2F0.6.5;hp=6dc2c1b8a082ed98e426a8dbf1a02e63e631e7cc;hpb=2a817e5ea2c58e86bc897bc4a80a945ba8b3a9cc;p=platform%2Fupstream%2Flibsolv.git diff --git a/src/poolid.c b/src/poolid.c index 6dc2c1b..7bcc1f6 100644 --- a/src/poolid.c +++ b/src/poolid.c @@ -63,9 +63,9 @@ pool_rel2id(Pool *pool, Id name, Id evr, int flags, int create) hashmask = pool->relhashmask; hashtbl = pool->relhashtbl; ran = pool->rels; - + /* extend hashtable if needed */ - if (pool->nrels * 2 > hashmask) + if ((Hashval)pool->nrels * 2 > hashmask) { solv_free(pool->relhashtbl); pool->relhashmask = hashmask = mkmask(pool->nrels + REL_BLOCK); @@ -80,7 +80,7 @@ pool_rel2id(Pool *pool, Id name, Id evr, int flags, int create) hashtbl[h] = i; } } - + /* compute hash and check for match */ h = relhash(name, evr, flags) & hashmask; hh = HASHCHAIN_START; @@ -117,16 +117,14 @@ pool_rel2id(Pool *pool, Id name, Id evr, int flags, int create) /* Id -> String * for rels (returns name only) and strings - */ + */ const char * pool_id2str(const Pool *pool, Id id) { - if (ISRELDEP(id)) + while (ISRELDEP(id)) { Reldep *rd = GETRELDEP(pool, id); - if (ISRELDEP(rd->name)) - return "REL"; - return pool->ss.stringspace + pool->ss.strings[rd->name]; + id = rd->name; } return pool->ss.stringspace + pool->ss.strings[id]; } @@ -153,18 +151,27 @@ pool_id2rel(const Pool *pool, Id id) rd = GETRELDEP(pool, id); switch (rd->flags) { - case 0: case 2: case 3: - case 5: case 6: case 7: - return rels[rd->flags]; + /* debian special cases < and > */ + /* haiku special cases <> (maybe we should use != for the others as well */ + case 0: case REL_EQ: case REL_GT | REL_EQ: + case REL_LT | REL_EQ: case REL_LT | REL_EQ | REL_GT: #if !defined(DEBIAN) && !defined(MULTI_SEMANTICS) - case 1: case 4: + case REL_LT: case REL_GT: +#endif +#if !defined(HAIKU) && !defined(MULTI_SEMANTICS) + case REL_LT | REL_GT: +#endif return rels[rd->flags]; -#else - case 1: +#if defined(DEBIAN) || defined(MULTI_SEMANTICS) + case REL_GT: return pool->disttype == DISTTYPE_DEB ? " >> " : rels[rd->flags]; - case 4: + case REL_LT: return pool->disttype == DISTTYPE_DEB ? " << " : rels[rd->flags]; #endif +#if defined(HAIKU) || defined(MULTI_SEMANTICS) + case REL_LT | REL_GT: + return pool->disttype == DISTTYPE_HAIKU ? " != " : rels[rd->flags]; +#endif case REL_AND: return " & "; case REL_OR: @@ -175,10 +182,16 @@ pool_id2rel(const Pool *pool, Id id) return " NAMESPACE "; /* actually not used in dep2str */ case REL_ARCH: return "."; + case REL_MULTIARCH: + return ":"; case REL_FILECONFLICT: return " FILECONFLICT "; case REL_COND: return " IF "; + case REL_COMPAT: + return " compat >= "; + case REL_KIND: + return " KIND "; default: break; } @@ -233,6 +246,15 @@ dep2strcpy(const Pool *pool, char *p, Id id, int oldrel) strcat(p, ")"); return; } + if (rd->flags == REL_KIND) + { + dep2strcpy(pool, p, rd->evr, rd->flags); + p += strlen(p); + *p++ = ':'; + id = rd->name; + oldrel = rd->flags; + continue; + } dep2strcpy(pool, p, rd->name, rd->flags); p += strlen(p); if (rd->flags == REL_NAMESPACE)