solver: non preferred actions are worse then non preferred pinning

Otherwise we might start to change packages unexpectedly when not
upgrading. This also fixes some other things the solver might've
decided to do.

Add also few test cases to detect bad behaviour.
cute-signatures
Timo Teräs 2012-02-24 11:13:31 +02:00
parent e128c95fdf
commit d420d41148
4 changed files with 55 additions and 6 deletions

View File

@ -39,11 +39,13 @@ struct apk_score {
struct { struct {
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
unsigned short preference; unsigned short preference;
unsigned short non_preferred_pinnings;
unsigned short non_preferred_actions; unsigned short non_preferred_actions;
unsigned int conflicts; unsigned short conflicts;
#elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ #elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
unsigned int conflicts; unsigned short conflicts;
unsigned short non_preferred_actions; unsigned short non_preferred_actions;
unsigned short non_preferred_pinnings;
unsigned short preference; unsigned short preference;
#else #else
#error Unknown endianess. #error Unknown endianess.
@ -53,8 +55,8 @@ struct apk_score {
}; };
}; };
#define SCORE_FMT "{%d/%d/%d}" #define SCORE_FMT "{%d/%d/%d,%d}"
#define SCORE_PRINTF(s) (s)->conflicts, (s)->non_preferred_actions, (s)->preference #define SCORE_PRINTF(s) (s)->conflicts, (s)->non_preferred_actions, (s)->non_preferred_pinnings, (s)->preference
enum { enum {
DECISION_ASSIGN = 0, DECISION_ASSIGN = 0,
@ -382,13 +384,21 @@ static int get_topology_score(
preferred_repos = get_pinning_mask_repos(ss->db, preferred_pinning); preferred_repos = get_pinning_mask_repos(ss->db, preferred_pinning);
if (!(repos & preferred_repos)) if (!(repos & preferred_repos))
score.non_preferred_actions++; score.non_preferred_pinnings++;
if (ns->locked || (ns->allowed_pinning | ns->maybe_pinning) == ns->allowed_pinning) { if (ns->locked || (ns->allowed_pinning | ns->maybe_pinning) == ns->allowed_pinning) {
allowed_pinning = ns->allowed_pinning | preferred_pinning | APK_DEFAULT_PINNING_MASK; allowed_pinning = ns->allowed_pinning | preferred_pinning | APK_DEFAULT_PINNING_MASK;
allowed_repos = get_pinning_mask_repos(ss->db, allowed_pinning); allowed_repos = get_pinning_mask_repos(ss->db, allowed_pinning);
if (!(repos & allowed_repos)) if (!(repos & allowed_repos))
score.non_preferred_actions+=2; score.non_preferred_pinnings += 16;
#if 0
if (allowed_pinning & ~APK_DEFAULT_PINNING_MASK)
fprintf(stdout, PKG_VER_FMT": allow: %x, in: %x, reallyin: %x. score="SCORE_FMT"\n",
PKG_VER_PRINTF(pkg),
allowed_repos, repos, pkg->repos,
SCORE_PRINTF(&score));
#endif
} else { } else {
score_locked = FALSE; score_locked = FALSE;
} }

20
test/pinning.installed2 Normal file
View File

@ -0,0 +1,20 @@
C:Q1eVpkasfqZAukAXFYbgwt4xffZWU=
P:a
V:3
S:1
I:1
D:b
C:Q1hdUpqRv5mYgJEqW52UmVsv23ysE=
P:b
V:3
S:1
I:1
C:Q1eVpkasfqZAukAXFYbg324xAt4WU=
P:c
V:3
S:1
I:1
D:a>=3

11
test/pinning8.test Normal file
View File

@ -0,0 +1,11 @@
@ARGS
--test-repo basic.repo
--test-repo testing:pinning.repo2
--test-instdb pinning.installed2
--test-world "c@testing"
upgrade -a
@EXPECT
(1/3) Downgrading b (3 -> 2)
(2/3) Upgrading a@testing (3 -> 3.1)
(3/3) Upgrading c@testing (3 -> 3.1)
OK: 0 MiB in 3 packages

8
test/pinning9.test Normal file
View File

@ -0,0 +1,8 @@
@ARGS
--test-repo basic.repo
--test-repo testing:pinning.repo2
--test-instdb pinning.installed2
--test-world "c@testing"
add
@EXPECT
OK: 0 MiB in 3 packages