2 * Copyright (c) 2012, Novell Inc.
4 * This program is licensed under the BSD license, read LICENSE.BSD
5 * for further information
21 #include "repo_cudf.h"
24 parseonedep(Pool *pool, char *p)
26 char *n, *ne, *e, *ee;
30 while (*p == ' ' || *p == '\t' || *p == '\n')
34 if (!strcmp(p, "!true"))
36 if (!strcmp(p, "!false"))
37 return pool_str2id(pool, p, 1);
39 /* find end of name */
40 while (*p && *p != ' ' && *p != '\t' && *p != '\n' && *p != '|')
43 while (*p == ' ' || *p == '\t' || *p == '\n')
48 if (*p == '>' || *p == '<' || *p == '=' || *p == '!')
57 flags |= REL_LT | REL_GT | REL_EQ;
59 if (flags && *p == '=')
65 while (*p == ' ' || *p == '\t' || *p == '\n')
68 while (*p && *p != ' ' && *p != '\t' && *p != '\n' && *p != '|')
71 while (*p == ' ' || *p == '\t' || *p == '\n')
74 name = pool_strn2id(pool, n, ne - n, 1);
77 evr = pool_strn2id(pool, e, ee - e, 1);
78 name = pool_rel2id(pool, name, evr, flags, 1);
82 Id id = parseonedep(pool, p + 1);
84 name = pool_rel2id(pool, name, id, REL_OR, 1);
89 makedeps(Repo *repo, char *deps, unsigned int olddeps, Id marker)
91 Pool *pool = repo->pool;
95 while ((p = strchr(deps, ',')) != 0)
98 olddeps = makedeps(repo, deps, olddeps, marker);
102 id = parseonedep(pool, deps);
105 return repo_addid_dep(repo, olddeps, id, marker);
109 copydeps(Pool *pool, Repo *repo, Offset fromoff, Repo *fromrepo)
117 from = fromrepo->idarraydata + fromoff;
118 for (ida = from, cc = 0; *ida; ida++, cc++)
122 off = repo_reserve_ids(repo, 0, cc);
123 memcpy(repo->idarraydata + off, from, (cc + 1) * sizeof(Id));
124 repo->idarraysize += cc + 1;
129 copysolvabledata(Pool *pool, Solvable *s, Repo *repo)
131 Repo *srepo = s->repo;
134 s->provides = copydeps(pool, repo, s->provides, srepo);
135 s->requires = copydeps(pool, repo, s->requires, srepo);
136 s->conflicts = copydeps(pool, repo, s->conflicts, srepo);
137 s->obsoletes = copydeps(pool, repo, s->obsoletes, srepo);
138 s->recommends = copydeps(pool, repo, s->recommends, srepo);
139 s->suggests = copydeps(pool, repo, s->suggests, srepo);
140 s->supplements = copydeps(pool, repo, s->supplements, srepo);
141 s->enhances = copydeps(pool, repo, s->enhances, srepo);
144 #define KEEP_VERSION 1
145 #define KEEP_PACKAGE 2
146 #define KEEP_FEATURE 3
149 finishpackage(Pool *pool, Solvable *s, int keep, Queue *job)
158 sid = pool_rel2id(pool, s->name, s->evr, REL_EQ, 1);
159 s->provides = repo_addid_dep(s->repo, s->provides, sid, 0);
160 if (!job || !pool->installed || s->repo != pool->installed)
162 if (keep == KEEP_VERSION)
163 queue_push2(job, SOLVER_INSTALL|SOLVER_SOLVABLE_NAME, sid);
164 else if (keep == KEEP_PACKAGE)
165 queue_push2(job, SOLVER_INSTALL|SOLVER_SOLVABLE_NAME, s->name);
166 else if (keep == KEEP_FEATURE)
168 for (idp = s->repo->idarraydata + s->provides; (id = *idp) != 0; idp++)
170 if (id != sid) /* skip self-provides */
171 queue_push2(job, SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES, id);
177 repo_add_cudf(Repo *repo, Repo *installedrepo, FILE *fp, Queue *job, int flags)
189 xrepo = repo ? repo : installedrepo;
194 buf = solv_malloc(4096);
199 while (fgets(buf + bufl, bufa - bufl, fp) > 0)
201 bufl += strlen(buf + bufl);
202 if (bufl && buf[bufl - 1] != '\n')
204 if (bufa - bufl < 256)
207 buf = solv_realloc(buf, bufa);
213 if (c == ' ' || c == '\t')
215 /* continuation line */
226 if (s && !repo && !isinstalled)
228 repo_free_solvable(repo, s - pool->solvables, 1);
232 finishpackage(pool, s, keep, job);
239 p = strchr(buf, ':');
243 while (*p == ' ' || *p == '\t')
249 if (!strcmp(buf, "request"))
254 if (!strcmp(buf, "package"))
256 s = pool_id2solvable(pool, repo_add_solvable(xrepo));
265 if (!strcmp(buf, "install"))
268 Offset off = makedeps(xrepo, p, 0, 0);
269 for (idp = xrepo->idarraydata + off; (id = *idp) != 0; idp++)
270 queue_push2(job, SOLVER_INSTALL|SOLVER_SOLVABLE_PROVIDES, id);
272 else if (!strcmp(buf, "remove"))
275 Offset off = makedeps(xrepo, p, 0, 0);
276 for (idp = xrepo->idarraydata + off; (id = *idp) != 0; idp++)
277 queue_push2(job, SOLVER_ERASE|SOLVER_SOLVABLE_PROVIDES, id);
279 else if (!strcmp(buf, "upgrade"))
282 Offset off = makedeps(xrepo, p, 0, 0);
283 for (idp = xrepo->idarraydata + off; (id = *idp) != 0; idp++)
284 queue_push2(job, SOLVER_INSTALL|SOLVER_ORUPDATE|SOLVER_SOLVABLE_PROVIDES, id);
289 continue; /* we ignore the preamble for now */
293 if (!strcmp(buf, "conflicts"))
295 s->conflicts = makedeps(s->repo, p, s->conflicts, 0);
299 if (!strcmp(buf, "depends"))
301 s->requires = makedeps(s->repo, p, s->requires, 0);
306 if (!strcmp(buf, "keep"))
310 if (!strcmp(p, "version"))
312 else if (!strcmp(p, "package"))
314 else if (!strcmp(p, "feature"))
320 if (!strcmp(buf, "installed"))
322 if (!strcmp(p, "true"))
327 repo_free_solvable(repo, s - pool->solvables, 1);
330 else if (s->repo != installedrepo)
332 copysolvabledata(pool, s, installedrepo);
333 s->repo->nsolvables--;
334 s->repo = installedrepo;
335 if (s - pool->solvables < s->repo->start)
336 s->repo->start = s - pool->solvables;
337 if (s - pool->solvables >= s->repo->end)
338 s->repo->end = s - pool->solvables + 1;
339 s->repo->nsolvables++;
346 if (!strcmp(buf, "package"))
348 s->name = pool_str2id(pool, p, 1);
351 if (!strcmp(buf, "provides"))
353 s->provides = makedeps(s->repo, p, s->provides, 0);
358 if (!strcmp(buf, "depends"))
360 s->recommends = makedeps(s->repo, p, s->recommends, 0);
365 if (!strcmp(buf, "version"))
367 s->evr = pool_str2id(pool, p, 1);
373 if (s && !repo && !isinstalled)
375 repo_free_solvable(repo, s - pool->solvables, 1);
379 finishpackage(pool, s, keep, job);