]> git.pld-linux.org Git - packages/poldek.git/blame - poldek-score-reqs-marked-to-install.patch
- rel .41
[packages/poldek.git] / poldek-score-reqs-marked-to-install.patch
CommitLineData
d9545c59
BZ
1diff --git a/install3/iset.c b/install3/iset.c
2index 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;
35diff --git a/install3/iset.h b/install3/iset.h
36index 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
51diff --git a/install3/requirements.c b/install3/requirements.c
52index 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
This page took 0.038128 seconds and 4 git commands to generate.