X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fselection.c;h=37c618489a03b06a42f9da4044379f261cd6f063;hb=22e701e553344eeb22f88ed0906d76c9a5e39d83;hp=9e7f9eb93cd1f5798d096fc41e7a171e6239b2d5;hpb=def5c271d0d1bd7c3ab365acba60646298892c31;p=platform%2Fupstream%2Flibsolv.git diff --git a/src/selection.c b/src/selection.c index 9e7f9eb..37c6184 100644 --- a/src/selection.c +++ b/src/selection.c @@ -53,8 +53,10 @@ selection_prune(Pool *pool, Queue *selection) Solvable *s; Repo *repo = pool_id2repo(pool, selection->elements[i + 1]); if (repo) - FOR_REPO_SOLVABLES(repo, p, s) - break; + { + FOR_REPO_SOLVABLES(repo, p, s) + break; + } } else { @@ -96,8 +98,10 @@ selection_solvables(Pool *pool, Queue *selection, Queue *pkgs) Solvable *s; Repo *repo = pool_id2repo(pool, selection->elements[i + 1]); if (repo) - FOR_REPO_SOLVABLES(repo, p, s) - queue_push(pkgs, p); + { + FOR_REPO_SOLVABLES(repo, p, s) + queue_push(pkgs, p); + } } else { @@ -551,6 +555,14 @@ selection_filelist(Pool *pool, Queue *selection, const char *name, int flags) Queue q; int type; + /* all files in the file list start with a '/' */ + if (*name != '/') + { + if (!(flags & SELECTION_GLOB)) + return 0; + if (*name != '*' && *name != '[' && *name != '?') + return 0; + } type = !(flags & SELECTION_GLOB) || strpbrk(name, "[*?") == 0 ? SEARCH_STRING : SEARCH_GLOB; if ((flags & SELECTION_NOCASE) != 0) type |= SEARCH_NOCASE; @@ -576,7 +588,7 @@ selection_filelist(Pool *pool, Queue *selection, const char *name, int flags) dataiterator_free(&di); if (!q.count) return 0; - if (q.count > 1) + if (q.count > 1) queue_push2(selection, SOLVER_SOLVABLE_ONE_OF, pool_queuetowhatprovides(pool, &q)); else queue_push2(selection, SOLVER_SOLVABLE | SOLVER_NOAUTOSET, q.elements[0]); @@ -589,19 +601,19 @@ splitrel(char *rname, char *r, int *rflagsp) { int nend = r - rname; int rflags = 0; - if (nend && *r == '=' && r[-1] == '!') + if (nend && *r == '=' && r[-1] == '!') { nend--; r++; rflags = REL_LT|REL_GT; } - for (; *r; r++) + for (; *r; r++) { - if (*r == '<') + if (*r == '<') rflags |= REL_LT; - else if (*r == '=') + else if (*r == '=') rflags |= REL_EQ; - else if (*r == '>') + else if (*r == '>') rflags |= REL_GT; else break; @@ -610,10 +622,10 @@ splitrel(char *rname, char *r, int *rflagsp) r++; while (nend && (rname[nend - 1] == ' ' || rname[nend - 1] == '\t')) nend--; - if (!*rname || !*r) + if (!*rname || !*r) return 0; *rflagsp = rflags; - rname[nend] = 0; + rname[nend] = 0; return r; } @@ -622,7 +634,7 @@ selection_rel(Pool *pool, Queue *selection, const char *name, int flags) { int ret, rflags = 0; char *r, *rname; - + /* relation case, support: * depglob rel * depglob.arch rel @@ -803,7 +815,7 @@ selection_canon(Pool *pool, Queue *selection, const char *name, int flags) return 0; rname = solv_strdup(name); /* so we can modify it */ r = rname + (r - name); - *r = 0; + *r = 0; /* split off potential arch part from version */ if ((r2 = strrchr(r + 1, '.')) != 0 && r2[1] && (archid = str2archid(pool, r2 + 1)) != 0) @@ -820,8 +832,8 @@ selection_canon(Pool *pool, Queue *selection, const char *name, int flags) solv_free(rname); return 0; } - *r = '-'; - *r2 = 0; + *r = '-'; + *r2 = 0; r = r2; if ((ret = selection_depglob(pool, selection, rname, flags)) == 0) { @@ -840,12 +852,11 @@ int selection_make(Pool *pool, Queue *selection, const char *name, int flags) { int ret = 0; - const char *r; queue_empty(selection); - if (*name == '/' && (flags & SELECTION_FILELIST)) + if ((flags & SELECTION_FILELIST) != 0) ret = selection_filelist(pool, selection, name, flags); - if (!ret && (flags & SELECTION_REL) != 0 && (r = strpbrk(name, "<=>")) != 0) + if (!ret && (flags & SELECTION_REL) != 0 && strpbrk(name, "<=>") != 0) ret = selection_rel(pool, selection, name, flags); if (!ret) ret = selection_depglob_arch(pool, selection, name, flags); @@ -860,17 +871,36 @@ selection_make(Pool *pool, Queue *selection, const char *name, int flags) return ret; } +static inline int +matchdep_str(const char *pattern, const char *string, int flags) +{ + if (flags & SELECTION_GLOB) + { + int globflags = (flags & SELECTION_NOCASE) != 0 ? FNM_CASEFOLD : 0; + return fnmatch(pattern, string, globflags) == 0 ? 1 : 0; + } + if (flags & SELECTION_NOCASE) + return strcasecmp(pattern, string) == 0 ? 1 : 0; + return strcmp(pattern, string) == 0 ? 1 : 0; +} + static int matchdep(Pool *pool, Id id, char *rname, int rflags, char *revr, int flags) { if (ISRELDEP(id)) { Reldep *rd = GETRELDEP(pool, id); - if (rd->flags == REL_AND || rd->flags == REL_OR || rd->flags == REL_WITH) + if (rd->flags == REL_AND || rd->flags == REL_OR || rd->flags == REL_WITH || rd->flags == REL_COND) { if (matchdep(pool, rd->name, rname, rflags, revr, flags)) return 1; - if (matchdep(pool, rd->evr, rname, rflags, revr, flags)) + if (rd->flags == REL_COND && ISRELDEP(rd->evr)) + { + rd = GETRELDEP(pool, rd->evr); + if (rd->flags != REL_ELSE) + return 0; + } + if (rd->flags != REL_COND && matchdep(pool, rd->evr, rname, rflags, revr, flags)) return 1; return 0; } @@ -886,14 +916,7 @@ matchdep(Pool *pool, Id id, char *rname, int rflags, char *revr, int flags) } return 1; } - if (flags & SELECTION_GLOB) - { - int globflags = (flags & SELECTION_NOCASE) != 0 ? FNM_CASEFOLD : 0; - return fnmatch(rname, pool_id2str(pool, id), globflags) == 0 ? 1 : 0; - } - if (flags & SELECTION_NOCASE) - return strcasecmp(rname, pool_id2str(pool, id)) == 0 ? 1 : 0; - return strcmp(rname, pool_id2str(pool, id)) == 0 ? 1 : 0; + return matchdep_str(rname, pool_id2str(pool, id), flags); } /* @@ -904,22 +927,25 @@ matchdep(Pool *pool, Id id, char *rname, int rflags, char *revr, int flags) int selection_make_matchdeps(Pool *pool, Queue *selection, const char *name, int flags, int keyname, int marker) { - char *rname, *r; + char *rname, *r = 0; int rflags = 0; Id p; Queue q; queue_empty(selection); rname = solv_strdup(name); - if ((r = strpbrk(rname, "<=>")) != 0) + if (!(flags & SELECTION_MATCH_DEPSTR)) { - if ((r = splitrel(rname, r, &rflags)) == 0) + if ((r = strpbrk(rname, "<=>")) != 0) { - solv_free(rname); - return 0; + if ((r = splitrel(rname, r, &rflags)) == 0) + { + solv_free(rname); + return 0; + } } } - if ((flags & SELECTION_GLOB) != 0 && !strpbrk(name, "[*?") != 0) + if ((flags & SELECTION_GLOB) != 0 && !strpbrk(rname, "[*?") != 0) flags &= ~SELECTION_GLOB; queue_init(&q); @@ -944,6 +970,12 @@ selection_make_matchdeps(Pool *pool, Queue *selection, const char *name, int fla for (i = 0; i < q.count; i++) { Id id = q.elements[i]; + if ((flags & SELECTION_MATCH_DEPSTR) != 0) + { + if (matchdep_str(rname, pool_dep2str(pool, id), flags)) + break; + continue; + } if (matchdep(pool, id, rname, rflags, r, flags)) break; } @@ -959,6 +991,56 @@ selection_make_matchdeps(Pool *pool, Queue *selection, const char *name, int fla return SELECTION_PROVIDES; } +int +selection_make_matchdepid(Pool *pool, Queue *selection, Id dep, int flags, int keyname, int marker) +{ + Id p; + Queue q; + + queue_empty(selection); + if (!dep) + return 0; + queue_init(&q); + FOR_POOL_SOLVABLES(p) + { + Solvable *s = pool->solvables + p; + int i; + + if (s->repo != pool->installed && !pool_installable(pool, s)) + { + if (!(flags & SELECTION_SOURCE_ONLY) || (s->arch != ARCH_SRC && s->arch != ARCH_NOSRC)) + continue; + if (pool_disabled_solvable(pool, s)) + continue; + } + if ((flags & SELECTION_INSTALLED_ONLY) != 0 && s->repo != pool->installed) + continue; + if ((s->arch == ARCH_SRC || s->arch == ARCH_NOSRC) && !(flags & SELECTION_SOURCE_ONLY) && !(flags & SELECTION_WITH_SOURCE)) + continue; + queue_empty(&q); + repo_lookup_deparray(s->repo, p, keyname, &q, marker); + for (i = 0; i < q.count; i++) + { + if ((flags & SELECTION_MATCH_DEPSTR) != 0) /* mis-use */ + { + if (q.elements[i] == dep) + break; + continue; + } + if (pool_match_dep(pool, q.elements[i], dep)) + break; + } + if (i < q.count) + queue_push2(selection, SOLVER_SOLVABLE | SOLVER_NOAUTOSET, p); + } + queue_free(&q); + if (!selection->count) + return 0; + if ((flags & SELECTION_FLAT) != 0) + selection_flatten(pool, selection); + return SELECTION_PROVIDES; +} + static inline int pool_is_kind(Pool *pool, Id name, Id kind) { @@ -967,19 +1049,19 @@ pool_is_kind(Pool *pool, Id name, Id kind) return 1; n = pool_id2str(pool, name); if (kind != 1) - { + { const char *kn = pool_id2str(pool, kind); int knl = strlen(kn); - return !strncmp(n, kn, knl) && n[knl] == ':' ? 1 : 0; - } - else - { - if (*n == ':') + return !strncmp(n, kn, knl) && n[knl] == ':' ? 1 : 0; + } + else + { + if (*n == ':') return 1; - while(*n >= 'a' && *n <= 'z') + while(*n >= 'a' && *n <= 'z') n++; - return *n == ':' ? 0 : 1; - } + return *n == ':' ? 0 : 1; + } } void @@ -999,8 +1081,11 @@ selection_filter(Pool *pool, Queue *sel1, Queue *sel2) if (sel1->count == 2 && (sel1->elements[0] & SOLVER_SELECTMASK) == SOLVER_SOLVABLE_ALL) { /* XXX: not 100% correct, but very useful */ + p = sel1->elements[0] & ~(SOLVER_SELECTMASK | SOLVER_SETMASK); /* job & jobflags */ queue_free(sel1); queue_init_clone(sel1, sel2); + for (i = 0; i < sel1->count; i += 2) + sel1->elements[i] = (sel1->elements[i] & (SOLVER_SELECTMASK | SOLVER_SETMASK)) | p ; return; } queue_init(&q1); @@ -1019,8 +1104,10 @@ selection_filter(Pool *pool, Queue *sel1, Queue *sel2) Solvable *s; Repo *repo = pool_id2repo(pool, sel2->elements[i + 1]); if (repo) - FOR_REPO_SOLVABLES(repo, p, s) - map_set(&m2, p); + { + FOR_REPO_SOLVABLES(repo, p, s) + map_set(&m2, p); + } } else { @@ -1082,13 +1169,15 @@ selection_filter(Pool *pool, Queue *sel1, Queue *sel2) Solvable *s; Repo *repo = pool_id2repo(pool, sel1->elements[i + 1]); if (repo) - FOR_REPO_SOLVABLES(repo, p, s) - { - if (map_tst(&m2, p)) - queue_push(&q1, p); - else - miss = 1; - } + { + FOR_REPO_SOLVABLES(repo, p, s) + { + if (map_tst(&m2, p)) + queue_push(&q1, p); + else + miss = 1; + } + } } else { @@ -1107,7 +1196,7 @@ selection_filter(Pool *pool, Queue *sel1, Queue *sel2) sel1->elements[j] = sel1->elements[i] | setflags; sel1->elements[j + 1] = sel1->elements[i + 1]; } - else if (q1.count > 1) + else if (q1.count > 1) { sel1->elements[j] = (sel1->elements[i] & ~SOLVER_SELECTMASK) | SOLVER_SOLVABLE_ONE_OF | setflags; sel1->elements[j + 1] = pool_queuetowhatprovides(pool, &q1);