]>
Commit | Line | Data |
---|---|---|
d9545c59 BZ |
1 | diff --git a/install3/iset.c b/install3/iset.c |
2 | index e891a13..8ecbd7f 100644 | |
3 | --- a/install3/iset.c | |
4 | +++ b/install3/iset.c | |
5 | @@ -238,6 +238,29 @@ int iset_provides(struct iset *iset, const struct capreq *cap) | |
6 | return pkg != NULL; | |
7 | } | |
8 | ||
9 | +// returns how many pkg reqs are in iset | |
10 | +int iset_reqs_score(struct iset *iset, const struct pkg *pkg) | |
11 | +{ | |
12 | + struct pkg_req_iter *it = NULL; | |
13 | + const struct capreq *req = NULL; | |
14 | + unsigned itflags = PKG_ITER_REQIN | PKG_ITER_REQDIR; // | PKG_ITER_REQDIR | PKG_ITER_REQSUG | |
15 | + int score = 0; | |
16 | + | |
17 | + n_assert(pkg->reqs); | |
18 | + | |
19 | + it = pkg_req_iter_new(pkg, itflags); | |
20 | + while ((req = pkg_req_iter_get(it))) { | |
21 | + if (iset_provides(iset, req)){ | |
22 | + score++; | |
23 | + if (capreq_versioned(req)) | |
24 | + score +=2; | |
25 | + } | |
26 | + } | |
27 | + pkg_req_iter_free(it); | |
28 | + | |
29 | + return score; | |
30 | +} | |
31 | + | |
32 | void iset_dump(struct iset *iset) | |
33 | { | |
34 | int i; | |
35 | diff --git a/install3/iset.h b/install3/iset.h | |
36 | index 3946c0e..7b3b08d 100644 | |
37 | --- a/install3/iset.h | |
38 | +++ b/install3/iset.h | |
39 | @@ -32,7 +32,11 @@ void iset_add(struct iset *iset, struct pkg *pkg, unsigned mflag); | |
40 | int iset_remove(struct iset *iset, struct pkg *pkg); | |
41 | ||
42 | int iset_provides(struct iset *iset, const struct capreq *cap); | |
43 | +// returns how many pkg reqs are in iset | |
44 | +int iset_reqs_score(struct iset *iset, const struct pkg *pkg); | |
45 | + | |
46 | int iset_has_pkg(struct iset *iset, const struct pkg *pkg); | |
47 | +// return 1st found pkg_is_kind_of from iset or null | |
48 | struct pkg *iset_has_kind_of_pkg(struct iset *iset, const struct pkg *pkg); | |
49 | ||
50 | #endif | |
51 | diff --git a/install3/requirements.c b/install3/requirements.c | |
52 | index ea9df61..37bb5e2 100644 | |
53 | --- a/install3/requirements.c | |
54 | +++ b/install3/requirements.c | |
55 | @@ -21,9 +21,8 @@ tn_array *filter_out_olders(struct i3ctx *ictx, tn_array *pkgs, | |
56 | const struct pkg *pkg) | |
57 | { | |
58 | tn_array *tmp = n_array_clone(pkgs); | |
59 | - int i; | |
60 | - | |
61 | - for (i=0; i < n_array_size(pkgs); i++) { | |
62 | + | |
63 | + for (unsigned int i=0; i < n_array_size(pkgs); i++) { | |
64 | struct pkg *p = n_array_nth(pkgs, i); | |
65 | int cmprc; | |
66 | ||
67 | @@ -49,7 +48,8 @@ static struct pkg *select_successor(int indent, struct i3ctx *ictx, | |
68 | { | |
69 | const struct pkg *selected_pkg = NULL; | |
70 | tn_array *pkgs, *tmp; | |
71 | - int i, max_score = 0, *scores; | |
72 | + int max_score = 0, *scores; | |
73 | + unsigned int i; | |
74 | int nconsidered = 0, nuncolored = 0; | |
75 | ||
76 | tracef(indent, "%s (c=%d)", pkg_id(pkg), pkg->color); | |
77 | @@ -73,13 +73,21 @@ static struct pkg *select_successor(int indent, struct i3ctx *ictx, | |
78 | selected_pkg = n_array_nth(pkgs, 0); | |
79 | goto l_end; | |
80 | } | |
81 | - | |
82 | + | |
83 | /* multilib mode */ | |
84 | scores = alloca(sizeof(*scores) * n_array_size(pkgs)); | |
85 | for (i=0; i < n_array_size(pkgs); i++) { | |
86 | struct pkg *p = n_array_nth(pkgs, i); | |
87 | scores[i] = 0; | |
88 | - | |
89 | + | |
90 | + // extra 100 points for arch compatible | |
91 | + if (pkg_is_kind_of(p, pkg) && pkg_is_arch_compat(p, pkg)) { | |
92 | + scores[i] += 100; | |
93 | + } | |
94 | + | |
95 | + // extra points for reqs marked to install | |
96 | + scores[i] += iset_reqs_score(ictx->inset, p); | |
97 | + | |
98 | if (pkg->color == 0 && p->color == 0) { /* both uncolored */ | |
99 | scores[i] += 1; | |
100 | if (pkg_is_kind_of(p, pkg)) | |
101 | @@ -93,14 +101,14 @@ static struct pkg *select_successor(int indent, struct i3ctx *ictx, | |
102 | } else if (pkg_is_colored_like(p, pkg)) { | |
103 | scores[i] += 2; | |
104 | } | |
105 | - | |
106 | + | |
107 | trace(indent, "- %d. %s -> color %d, score %d", i, pkg_id(p), | |
108 | - p->color, scores[i]); | |
109 | - | |
110 | - if (max_score < scores[i]) { | |
111 | - max_score = scores[i]; | |
112 | - selected_pkg = p; | |
113 | - } | |
114 | + p->color, scores[i]); | |
115 | + | |
116 | + if (max_score < scores[i]) { | |
117 | + max_score = scores[i]; | |
118 | + selected_pkg = p; | |
119 | + } | |
120 | ||
121 | nconsidered++; | |
122 | } | |
123 | @@ -150,9 +158,7 @@ l_end: | |
124 | /* detect which package capability has "replaces" meaning, if any */ | |
125 | static const char *get_replacemeant_capname(const struct pkg *pkg) | |
126 | { | |
127 | - int i; | |
128 | - | |
129 | - for (i=0; i < n_array_size(pkg->cnfls); i++) { | |
130 | + for (unsigned int i=0; i < n_array_size(pkg->cnfls); i++) { | |
131 | struct capreq *cnfl = n_array_nth(pkg->cnfls, i); | |
132 | ||
133 | if (capreq_versioned(cnfl) || !capreq_is_obsl(cnfl)) | |
134 | @@ -194,7 +200,7 @@ struct pkg *find_successor_by(int indent, struct i3ctx *ictx, | |
135 | { | |
136 | struct pkg *bypkg = NULL; | |
137 | tn_array *pkgs, *tmp; | |
138 | - int i, best_i; | |
139 | + unsigned int i, best_i; | |
140 | ||
141 | n_assert(tag == PS_SEARCH_OBSL || tag == PS_SEARCH_CAP); | |
142 | if ((pkgs = pkgset_search(ictx->ps, tag, pkg->name)) == NULL) { | |
143 | @@ -741,7 +747,7 @@ int i3_process_pkg_requirements(int indent, struct i3ctx *ictx, | |
144 | asks for suggested package, even though it is required. */ | |
145 | if (ts->getop(ts, POLDEK_OP_SUGGESTS) && nerrors == 0) { | |
146 | tn_array *suggests = NULL; | |
147 | - int i; | |
148 | + unsigned int i; | |
149 | ||
150 | suggests = with_suggests(indent + 2, ictx, pkg); | |
151 |