64ad6077b537a35a57e5200f94dae01abd0d2d90
[platform/upstream/libsolv.git] / examples / solv / patchjobs.c
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4
5 #include "pool.h"
6 #include "repo.h"
7 #include "evr.h"
8 #include "solver.h"
9
10 void
11 add_patchjobs(Pool *pool, Queue *job)
12 {
13   Id p, pp;
14   int pruneyou = 0;
15   Map installedmap, multiversionmap;
16   Solvable *s;
17
18   map_init(&multiversionmap, 0);
19   map_init(&installedmap, pool->nsolvables);
20   solver_calculate_multiversionmap(pool, job, &multiversionmap);
21   if (pool->installed)
22     FOR_REPO_SOLVABLES(pool->installed, p, s)
23       MAPSET(&installedmap, p);
24
25   /* install all patches */
26   for (p = 1; p < pool->nsolvables; p++)
27     {
28       const char *type;
29       int r;
30       Id p2;
31
32       s = pool->solvables + p;
33       if (strncmp(pool_id2str(pool, s->name), "patch:", 6) != 0)
34         continue;
35       FOR_PROVIDES(p2, pp, s->name)
36         {
37           Solvable *s2 = pool->solvables + p2;
38           if (s2->name != s->name)
39             continue;
40           r = pool_evrcmp(pool, s->evr, s2->evr, EVRCMP_COMPARE);
41           if (r < 0 || (r == 0 && p > p2))
42             break;
43         }
44       if (p2)
45         continue;
46       type = solvable_lookup_str(s, SOLVABLE_PATCHCATEGORY);
47       if (type && !strcmp(type, "optional"))
48         continue;
49       r = solvable_trivial_installable_map(s, &installedmap, 0, &multiversionmap);
50       if (r == -1)
51         continue;
52       if (solvable_lookup_bool(s, UPDATE_RESTART) && r == 0)
53         {
54           if (!pruneyou++)
55             queue_empty(job);
56         }
57       else if (pruneyou)
58         continue;
59       queue_push2(job, SOLVER_SOLVABLE, p);
60     }
61   map_free(&installedmap);
62   map_free(&multiversionmap);
63 }