summaryrefslogtreecommitdiffstats
path: root/src/state.c
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 /src/state.c
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.
Diffstat (limited to 'src/state.c')
-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) {