]> git.pld-linux.org Git - packages/poldek.git/blob - poldek-score-reqs-marked-to-install.patch
- rel 33
[packages/poldek.git] / poldek-score-reqs-marked-to-install.patch
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         
This page took 0.044239 seconds and 4 git commands to generate.