2 * Copyright (c) 2013, SUSE Inc.
4 * This program is licensed under the BSD license, read LICENSE.BSD
5 * for further information
19 #include "repo_autopattern.h"
27 if (*p == '%' && p[1] && p[2])
29 int d1 = p[1], d2 = p[2];
30 if (d1 >= '0' && d1 <= '9')
32 else if (d1 >= 'a' && d1 <= 'f')
34 else if (d1 >= 'A' && d1 <= 'F')
38 if (d2 >= '0' && d2 <= '9')
40 else if (d2 >= 'a' && d2 <= 'f')
42 else if (d2 >= 'A' && d2 <= 'F')
46 if (d1 != -1 && d2 != -1)
59 repo_add_autopattern(Repo *repo, int flags)
61 Pool *pool = repo->pool;
67 Id autopattern_id = 0;
73 pattern_id = pool_str2id(pool, "pattern()", 9);
74 FOR_REPO_SOLVABLES(repo, p, s)
76 const char *n = pool_id2str(pool, s->name);
77 if (!strncmp("pattern:", n, 8))
81 Id prv, *prvp = repo->idarraydata + s->provides;
82 while ((prv = *prvp++) != 0) /* go through all provides */
85 Reldep *rd = GETRELDEP(pool, prv);
86 if (rd->name == pattern_id && rd->flags == REL_EQ)
88 queue_push2(&q2, p, rd->evr);
94 for (i = 0; i < q2.count; i += 2)
100 unsigned long long num;
102 s = pool->solvables + q2.elements[i];
103 /* construct new name */
104 newname = pool_tmpjoin(pool, "pattern:", pool_id2str(pool, q2.elements[i + 1]), 0);
106 name = pool_str2id(pool, newname, 0);
109 /* check if we already have that pattern */
110 for (j = 0; j < q.count; j++)
112 s2 = pool->solvables + q.elements[j];
113 if (s2->name == name && s2->arch == s->arch && s2->evr == s->evr)
117 continue; /* yes, do not add again */
121 name = pool_str2id(pool, newname, 1);
124 repo_internalize(repo); /* to make that the lookups work */
125 data = repo_add_repodata(repo, flags);
127 s2 = pool_id2solvable(pool, repo_add_solvable(repo));
128 s = pool->solvables + q2.elements[i]; /* re-calc pointer */
132 s2->vendor = s->vendor;
133 /* add link requires */
134 s2->requires = repo_addid_dep(repo, s2->requires, pool_rel2id(pool, s->name, s->evr, REL_EQ, 1) , 0);
135 /* add autopattern provides */
137 autopattern_id = pool_str2id(pool, "autopattern()", 1);
138 s2->provides = repo_addid_dep(repo, s2->provides, pool_rel2id(pool, autopattern_id, s->name, REL_EQ, 1), 0);
139 /* add self provides */
140 s2->provides = repo_addid_dep(repo, s2->provides, pool_rel2id(pool, s2->name, s2->evr, REL_EQ, 1), 0);
141 if ((num = solvable_lookup_num(s, SOLVABLE_INSTALLTIME, 0)) != 0)
142 repodata_set_num(data, s2 - pool->solvables, SOLVABLE_INSTALLTIME, num);
143 if ((num = solvable_lookup_num(s, SOLVABLE_BUILDTIME, 0)) != 0)
144 repodata_set_num(data, s2 - pool->solvables, SOLVABLE_BUILDTIME, num);
145 if ((str = solvable_lookup_str(s, SOLVABLE_SUMMARY)) != 0)
146 repodata_set_str(data, s2 - pool->solvables, SOLVABLE_SUMMARY, str);
147 if ((str = solvable_lookup_str(s, SOLVABLE_DESCRIPTION)) != 0)
148 repodata_set_str(data, s2 - pool->solvables, SOLVABLE_DESCRIPTION, str);
149 /* fill in stuff from provides */
150 prvp = repo->idarraydata + s->provides;
151 while ((prv = *prvp++) != 0) /* go through all provides */
156 Reldep *rd = GETRELDEP(pool, prv);
157 if (rd->flags != REL_EQ)
162 pn = pool_id2str(pool, prv);
163 if (strncmp("pattern-", pn, 8) != 0)
168 newname = pool_tmpjoin(pool, pool_id2str(pool, evr), 0, 0);
171 if (!strncmp(pn, "pattern-category(", 17) && evr)
176 if (l > 17 + 9 || pn[l - 1] != ')')
178 strncpy(lang, pn + 17, l - 17 - 1);
179 lang[l - 17 - 1] = 0;
180 langtag = SOLVABLE_CATEGORY;
181 if (*lang && strcmp(lang, "en") != 0)
182 langtag = pool_id2langid(pool, SOLVABLE_CATEGORY, lang, 1);
183 repodata_set_str(data, s2 - pool->solvables, langtag, newname);
185 else if (!strcmp(pn, "pattern-includes()") && evr)
186 repodata_add_poolstr_array(data, s2 - pool->solvables, SOLVABLE_INCLUDES, pool_tmpjoin(pool, "pattern:", newname, 0));
187 else if (!strcmp(pn, "pattern-extends()") && evr)
188 repodata_add_poolstr_array(data, s2 - pool->solvables, SOLVABLE_EXTENDS, pool_tmpjoin(pool, "pattern:", newname, 0));
189 else if (!strcmp(pn, "pattern-icon()") && evr)
190 repodata_set_str(data, s2 - pool->solvables, SOLVABLE_ICON, newname);
191 else if (!strcmp(pn, "pattern-order()") && evr)
192 repodata_set_str(data, s2 - pool->solvables, SOLVABLE_ORDER, newname);
193 else if (!strcmp(pn, "pattern-visible()") && !evr)
194 repodata_set_void(data, s2 - pool->solvables, SOLVABLE_ISVISIBLE);
199 if (data && !(flags & REPO_NO_INTERNALIZE))
200 repodata_internalize(data);
201 else if (!data && !(flags & REPO_NO_INTERNALIZE))
202 repo_internalize(repo);