summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimo Teras <timo.teras@iki.fi>2010-03-10 14:55:31 +0200
committerTimo Teras <timo.teras@iki.fi>2010-03-10 14:55:31 +0200
commitb40b2f042977986ae1bbddde148a3a445a3c27fe (patch)
treee1b3ce70195697a3ccf47c252fbe61ba313bb9d6
parent73cbc387944fcae5e448f7e26202e4a6eb1da256 (diff)
downloadapk-tools-b40b2f042977986ae1bbddde148a3a445a3c27fe.tar.bz2
apk-tools-b40b2f042977986ae1bbddde148a3a445a3c27fe.tar.xz
state: check package availability always
even if we have only one package as candidate, we need to check it's availability. otherwise we can endup with bad changeset referring to unavailable package.
-rw-r--r--src/state.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/src/state.c b/src/state.c
index 731e3d1..a6f9f0a 100644
--- a/src/state.c
+++ b/src/state.c
@@ -157,6 +157,16 @@ static void ns_free(apk_name_state_t name)
name_choices_unref(ns_to_choices(name));
}
+static inline int apk_state_pkg_available(struct apk_state *state,
+ struct apk_package *pkg)
+{
+ if (pkg->filename != NULL)
+ return TRUE;
+ if (apk_db_select_repo(state->db, pkg) != NULL)
+ return TRUE;
+ return FALSE;
+}
+
struct apk_state *apk_state_new(struct apk_database *db)
{
struct apk_state *state;
@@ -263,16 +273,16 @@ int apk_state_prune_dependency(struct apk_state *state,
c->pkgs[i] = c->pkgs[c->num - 1];
c->num--;
}
- if (c->num == 0) {
- name_choices_unref(c);
- return -1;
- }
- if (c->num == 1) {
+ if (c->num == 1 && apk_state_pkg_available(state, c->pkgs[0])) {
struct apk_package *pkg = c->pkgs[0];
name_choices_unref(c);
state->name[name->id] = ns_from_pkg(pkg);
return 1;
}
+ if (c->num <= 1) {
+ name_choices_unref(c);
+ return -1;
+ }
state->name[name->id] = ns_from_choices(c);
return c->num;
@@ -301,8 +311,7 @@ int apk_state_lock_dependency(struct apk_state *state,
if (pkg->ipkg != NULL)
installed = pkg;
- else if (pkg->filename == NULL &&
- apk_db_select_repo(state->db, pkg) == NULL)
+ else if (!apk_state_pkg_available(state, pkg))
continue;
if (latest == NULL) {