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