diff options
author | Timo Teras <timo.teras@iki.fi> | 2010-03-10 14:55:31 +0200 |
---|---|---|
committer | Timo Teras <timo.teras@iki.fi> | 2010-03-10 14:55:31 +0200 |
commit | b40b2f042977986ae1bbddde148a3a445a3c27fe (patch) | |
tree | e1b3ce70195697a3ccf47c252fbe61ba313bb9d6 | |
parent | 73cbc387944fcae5e448f7e26202e4a6eb1da256 (diff) | |
download | apk-tools-b40b2f042977986ae1bbddde148a3a445a3c27fe.tar.gz apk-tools-b40b2f042977986ae1bbddde148a3a445a3c27fe.tar.bz2 apk-tools-b40b2f042977986ae1bbddde148a3a445a3c27fe.tar.xz apk-tools-b40b2f042977986ae1bbddde148a3a445a3c27fe.zip |
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.c | 23 |
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) { |