summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2012-01-17 14:46:39 +0200
committerTimo Teräs <timo.teras@iki.fi>2012-01-17 14:48:22 +0200
commitb3df78ed03b3739d01220f9bf2f00ab8df61425f (patch)
tree3e06ec9de1b517fba8bdee5c3a234193e0a775b9
parenteaaba3ee893c7fb3c5a258f0609d8ab6e4637804 (diff)
downloadapk-tools-b3df78ed03b3739d01220f9bf2f00ab8df61425f.tar.gz
apk-tools-b3df78ed03b3739d01220f9bf2f00ab8df61425f.tar.bz2
apk-tools-b3df78ed03b3739d01220f9bf2f00ab8df61425f.tar.xz
apk-tools-b3df78ed03b3739d01220f9bf2f00ab8df61425f.zip
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
-rw-r--r--src/add.c7
-rw-r--r--src/apk_database.h2
-rw-r--r--src/database.c39
-rw-r--r--src/solver.c4
-rw-r--r--src/upgrade.c5
5 files changed, 32 insertions, 25 deletions
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);