From b3df78ed03b3739d01220f9bf2f00ab8df61425f Mon Sep 17 00:00:00 2001 From: Timo Teräs Date: Tue, 17 Jan 2012 14:46:39 +0200 Subject: solver, upgrade: properly detect missing repository tags * upgrade needs explicit check so we don't try self-upgrade (which would print additional messages on screen) * add can fix problems, so check against the new world * merge the code in few places --- src/add.c | 7 ------- src/apk_database.h | 2 +- src/database.c | 39 ++++++++++++++++++++++++--------------- src/solver.c | 4 ++-- src/upgrade.c | 5 +++++ 5 files changed, 32 insertions(+), 25 deletions(-) (limited to 'src') diff --git a/src/add.c b/src/add.c index 34ed9a3..238a388 100644 --- a/src/add.c +++ b/src/add.c @@ -107,7 +107,6 @@ static int add_main(void *ctx, struct apk_database *db, int argc, char **argv) } apk_dep_from_pkg(&dep, db, pkg); } else { - struct apk_repository_tag *tag; apk_blob_t b = APK_BLOB_STR(argv[i]); apk_blob_pull_dep(&b, db, &dep); @@ -116,12 +115,6 @@ static int add_main(void *ctx, struct apk_database *db, int argc, char **argv) argv[i]); return -1; } - tag = &db->repo_tags[dep.repository_tag]; - if (!tag->allowed_repos) { - apk_error("Repository tag '" BLOB_FMT "' is not defined", - BLOB_PRINTF(*tag->name)); - return -1; - } } if (virtpkg == NULL) { diff --git a/src/apk_database.h b/src/apk_database.h index 485afbe..ef3aa65 100644 --- a/src/apk_database.h +++ b/src/apk_database.h @@ -130,7 +130,6 @@ struct apk_database { unsigned int local_repos; int performing_self_update : 1; int permanent : 1; - int missing_tags : 1; int compat_newfeatures : 1; int compat_notinstallable : 1; int compat_old_world : 1; @@ -195,6 +194,7 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts); void apk_db_close(struct apk_database *db); int apk_db_write_config(struct apk_database *db); int apk_db_permanent(struct apk_database *db); +int apk_db_check_world(struct apk_database *db, struct apk_dependency_array *world); struct apk_package_array *apk_db_get_pending_triggers(struct apk_database *db); struct apk_package *apk_db_pkg_add(struct apk_database *db, struct apk_package *pkg); diff --git a/src/database.c b/src/database.c index 34edf68..be88156 100644 --- a/src/database.c +++ b/src/database.c @@ -1138,7 +1138,7 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts) struct apk_bstream *bs; struct statfs stfs; apk_blob_t blob; - int i, r, fd, rr = 0; + int r, fd, rr = 0; memset(db, 0, sizeof(*db)); if (apk_flags & APK_SIMULATE) { @@ -1315,20 +1315,6 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts) goto ret_r; } - /* repository id 0 is the no-tag repo */ - for (i = 0; i < db->world->num; i++) { - struct apk_dependency *dep = &db->world->item[i]; - int tag = dep->repository_tag; - - if (tag == 0 || db->repo_tags[tag].allowed_repos != 0) - continue; - - apk_warning("The repository tag for world dependency '%s@" BLOB_FMT "' does not exist", - dep->name->name, - BLOB_PRINTF(*db->repo_tags[tag].name)); - db->missing_tags = 1; - } - if (db->compat_newfeatures) { apk_warning("This apk-tools is OLD! Some packages %s.", db->compat_notinstallable ? @@ -1554,6 +1540,29 @@ int apk_db_permanent(struct apk_database *db) return db->permanent; } +int apk_db_check_world(struct apk_database *db, struct apk_dependency_array *world) +{ + int i, bad = 0; + + if (apk_flags & APK_FORCE) + return 0; + + for (i = 0; i < world->num; i++) { + struct apk_dependency *dep = &world->item[i]; + int tag = dep->repository_tag; + + if (tag == 0 || db->repo_tags[tag].allowed_repos != 0) + continue; + + apk_warning("The repository tag for world dependency '%s@" BLOB_FMT "' does not exist", + dep->name->name, + BLOB_PRINTF(*db->repo_tags[tag].name)); + bad++; + } + + return bad; +} + struct apk_package *apk_db_get_pkg(struct apk_database *db, struct apk_checksum *csum) { diff --git a/src/solver.c b/src/solver.c index 959e56f..76edeba 100644 --- a/src/solver.c +++ b/src/solver.c @@ -1328,7 +1328,7 @@ int apk_solver_commit_changeset(struct apk_database *db, struct apk_change *change; int i, r = 0, size_diff = 0; - if (db->missing_tags && !(apk_flags & APK_FORCE)) { + if (apk_db_check_world(db, world) != 0) { apk_error("Not committing changes due to missing repository tags. Use --force to override."); return -1; } @@ -1478,7 +1478,7 @@ int apk_solver_commit(struct apk_database *db, struct apk_package_array *solution = NULL; int r; - if (db->missing_tags && !(apk_flags & APK_FORCE)) { + if (apk_db_check_world(db, world) != 0) { apk_error("Not committing changes due to missing repository tags. Use --force to override."); return -1; } diff --git a/src/upgrade.c b/src/upgrade.c index 6ce851b..497fc54 100644 --- a/src/upgrade.c +++ b/src/upgrade.c @@ -97,6 +97,11 @@ static int upgrade_main(void *ctx, struct apk_database *db, int argc, char **arg struct apk_dependency_array *world = NULL; int i, r; + if (apk_db_check_world(db, db->world) != 0) { + apk_error("Not continuing with upgrade due to missing repository tags. Use --force to override."); + return -1; + } + solver_flags = APK_SOLVERF_UPGRADE | uctx->solver_flags; if (!uctx->no_self_upgrade) { r = apk_do_self_upgrade(db, solver_flags); -- cgit v1.2.3-60-g2f50