add: make repository tag pinning stronger

Previously we would not upgrade just by doing "apk add foo@tag" if
foo was already installed. It required explicit '-u'. This allows
'apk add' to explicitly prefer the newly specified pinning.
cute-signatures
Timo Teräs 2012-01-13 10:37:30 +02:00
parent 1f9a36de68
commit 2ea61da9d9
3 changed files with 21 additions and 9 deletions

View File

@ -127,7 +127,7 @@ static int add_main(void *ctx, struct apk_database *db, int argc, char **argv)
if (virtpkg == NULL) { if (virtpkg == NULL) {
apk_deps_add(&world, &dep); apk_deps_add(&world, &dep);
apk_solver_set_name_flags(dep.name, apk_solver_set_name_flags(dep.name,
actx->solver_flags, actx->solver_flags | APK_SOLVERF_PREFER_TAG,
actx->solver_flags); actx->solver_flags);
} else { } else {
apk_deps_add(&virtpkg->depends, &dep); apk_deps_add(&virtpkg->depends, &dep);

View File

@ -25,6 +25,7 @@ struct apk_changeset {
#define APK_SOLVERF_UPGRADE 0x0001 #define APK_SOLVERF_UPGRADE 0x0001
#define APK_SOLVERF_AVAILABLE 0x0002 #define APK_SOLVERF_AVAILABLE 0x0002
#define APK_SOLVERF_REINSTALL 0x0004 #define APK_SOLVERF_REINSTALL 0x0004
#define APK_SOLVERF_PREFER_TAG 0x0008
void apk_solver_set_name_flags(struct apk_name *name, void apk_solver_set_name_flags(struct apk_name *name,
unsigned short solver_flags, unsigned short solver_flags,

View File

@ -287,13 +287,21 @@ static int compare_package_preference(unsigned short solver_flags,
struct apk_package *pkgA, struct apk_package *pkgA,
struct apk_package *pkgB) struct apk_package *pkgB)
{ {
/* preferred repository pinning */ if (solver_flags & APK_SOLVERF_PREFER_TAG) {
if ((pkgA->ipkg || pkgA->filename || (pkgA->repos & preferred_repos)) && /* preferred repository pinning */
!(pkgB->ipkg || pkgB->filename || (pkgB->repos & preferred_repos))) if ((pkgA->repos & preferred_repos) && !(pkgB->repos & preferred_repos))
return 1; return 1;
if ((pkgB->ipkg || pkgA->filename || (pkgB->repos & preferred_repos)) && if ((pkgB->repos & preferred_repos) && !(pkgA->repos & preferred_repos))
!(pkgA->ipkg || pkgB->filename || (pkgA->repos & preferred_repos))) return -1;
return -1; } else {
/* preferred repository pinning */
if ((pkgA->ipkg || pkgA->filename || (pkgA->repos & preferred_repos)) &&
!(pkgB->ipkg || pkgB->filename || (pkgB->repos & preferred_repos)))
return 1;
if ((pkgB->ipkg || pkgA->filename || (pkgB->repos & preferred_repos)) &&
!(pkgA->ipkg || pkgB->filename || (pkgA->repos & preferred_repos)))
return -1;
}
if (solver_flags & APK_SOLVERF_AVAILABLE) { if (solver_flags & APK_SOLVERF_AVAILABLE) {
if (pkgA->repos != 0 && pkgB->repos == 0) if (pkgA->repos != 0 && pkgB->repos == 0)
@ -332,10 +340,13 @@ static int get_preference(struct apk_solver_state *ss,
unsigned short name_flags = ns->solver_flags_local unsigned short name_flags = ns->solver_flags_local
| ns->solver_flags_inherited | ns->solver_flags_inherited
| ss->solver_flags; | ss->solver_flags;
unsigned int preferred_repos = ns->preferred_repos | ss->db->repo_tags[0].allowed_repos; unsigned int preferred_repos = ns->preferred_repos;
unsigned short preference = 0; unsigned short preference = 0;
int i; int i;
if (preferred_repos == 0)
preferred_repos = ss->db->repo_tags[0].allowed_repos;
for (i = 0; i < name->pkgs->num; i++) { for (i = 0; i < name->pkgs->num; i++) {
struct apk_package *pkg0 = name->pkgs->item[i]; struct apk_package *pkg0 = name->pkgs->item[i];
struct apk_package_state *ps0 = pkg_to_ps(pkg0); struct apk_package_state *ps0 = pkg_to_ps(pkg0);