X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fpool.c;h=383edb2abffd7803cd7714cf080c5b3cac1352cd;hb=2491213c77850ed26991b572809a5ca4a61fa89b;hp=279359ad3ecfbfd31f522f3f9594e1dddd15f108;hpb=0e46e80434781d1acbc4f5716827bf8688450a30;p=platform%2Fupstream%2Flibsolv.git diff --git a/src/pool.c b/src/pool.c index 279359a..383edb2 100644 --- a/src/pool.c +++ b/src/pool.c @@ -927,7 +927,7 @@ pool_addstdproviders(Pool *pool, Id d) return 1; } queue_init_buffer(&q, qbuf, sizeof(qbuf)/sizeof(*qbuf)); - dataiterator_init(&di, pool, 0, 0, SOLVABLE_FILELIST, str, SEARCH_STRING|SEARCH_FILES|SEARCH_COMPLETE_FILELIST); + dataiterator_init(&di, pool, 0, 0, SOLVABLE_FILELIST, str, SEARCH_STRING|SEARCH_FILES); for (; dataiterator_step(&di); dataiterator_skip_solvable(&di)) { Solvable *s = pool->solvables + di.solvid; @@ -1485,6 +1485,37 @@ pool_whatcontainsdep(Pool *pool, Id keyname, Id dep, Queue *q, int marker) queue_free(&qq); } +/* intersect dependencies in keyname with all provides of solvable solvid, + * return list of matching packages */ +/* this currently only works for installable packages */ +void +pool_whatmatchessolvable(Pool *pool, Id keyname, Id solvid, Queue *q, int marker) +{ + Id p; + Queue qq; + Map missc; /* cache for misses */ + int reloff; + + queue_empty(q); + queue_init(&qq); + reloff = pool->ss.nstrings; + map_init(&missc, reloff + pool->nrels); + FOR_POOL_SOLVABLES(p) + { + Solvable *s = pool->solvables + p; + if (p == solvid) + continue; /* filter out self-matches */ + if (s->repo->disabled) + continue; + if (s->repo != pool->installed && !pool_installable(pool, s)) + continue; + if (solvable_matchessolvable_int(s, keyname, marker, solvid, 0, &qq, &missc, reloff)) + queue_push(q, p); + } + map_free(&missc); + queue_free(&qq); +} + /*************************************************************************/ void @@ -1505,7 +1536,6 @@ pool_debug(Pool *pool, int type, const char *format, ...) vprintf(format, args); else vfprintf(stderr, format, args); - va_end(args); return; } vsnprintf(buf, sizeof(buf), format, args); @@ -1567,12 +1597,12 @@ pool_setdebuglevel(Pool *pool, int level) if (level > 2) mask |= SOLV_DEBUG_PROPAGATE; if (level > 3) - mask |= SOLV_DEBUG_RULE_CREATION | SOLV_DEBUG_WATCHES; + mask |= SOLV_DEBUG_RULE_CREATION; mask |= pool->debugmask & SOLV_DEBUG_TO_STDERR; /* keep bit */ pool->debugmask = mask; } -void pool_setdebugcallback(Pool *pool, void (*debugcallback)(struct _Pool *, void *data, int type, const char *str), void *debugcallbackdata) +void pool_setdebugcallback(Pool *pool, void (*debugcallback)(struct s_Pool *, void *data, int type, const char *str), void *debugcallbackdata) { pool->debugcallback = debugcallback; pool->debugcallbackdata = debugcallbackdata; @@ -1583,20 +1613,20 @@ void pool_setdebugmask(Pool *pool, int mask) pool->debugmask = mask; } -void pool_setloadcallback(Pool *pool, int (*cb)(struct _Pool *, struct _Repodata *, void *), void *loadcbdata) +void pool_setloadcallback(Pool *pool, int (*cb)(struct s_Pool *, struct s_Repodata *, void *), void *loadcbdata) { pool->loadcallback = cb; pool->loadcallbackdata = loadcbdata; } -void pool_setnamespacecallback(Pool *pool, Id (*cb)(struct _Pool *, void *, Id, Id), void *nscbdata) +void pool_setnamespacecallback(Pool *pool, Id (*cb)(struct s_Pool *, void *, Id, Id), void *nscbdata) { pool->nscallback = cb; pool->nscallbackdata = nscbdata; } void -pool_search(Pool *pool, Id p, Id key, const char *match, int flags, int (*callback)(void *cbdata, Solvable *s, struct _Repodata *data, struct _Repokey *key, struct _KeyValue *kv), void *cbdata) +pool_search(Pool *pool, Id p, Id key, const char *match, int flags, int (*callback)(void *cbdata, Solvable *s, struct s_Repodata *data, struct s_Repokey *key, struct s_KeyValue *kv), void *cbdata) { if (p) {