summaryrefslogtreecommitdiff
path: root/src/del.c
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2012-10-09 13:09:56 +0300
committerTimo Teräs <timo.teras@iki.fi>2012-10-09 13:09:56 +0300
commit60f9a031742eb1b7d0a45a632d360db1ad74bdb0 (patch)
treeba7cbc2758aaa162f1b1eff4eb77e0661dc8ad7c /src/del.c
parent1e18b48c584ca84f565650749f804873abeefa99 (diff)
downloadapk-tools-60f9a031742eb1b7d0a45a632d360db1ad74bdb0.tar.gz
apk-tools-60f9a031742eb1b7d0a45a632d360db1ad74bdb0.tar.bz2
apk-tools-60f9a031742eb1b7d0a45a632d360db1ad74bdb0.tar.xz
apk-tools-60f9a031742eb1b7d0a45a632d360db1ad74bdb0.zip
del: consider also reverse dependencies for provided names
So we get better error report if package is not deleted due to reverse dependency.
Diffstat (limited to 'src/del.c')
-rw-r--r--src/del.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/src/del.c b/src/del.c
index f5d41d8..7ffbf58 100644
--- a/src/del.c
+++ b/src/del.c
@@ -40,19 +40,17 @@ static int del_parse(void *pctx, struct apk_db_options *db,
return 0;
}
-static void foreach_package_reverse_dependency(
- struct apk_package *pkg,
+static void foreach_package_reverse_dependency2(
+ struct apk_package *pkg, struct apk_name_array *rdepends,
void (*cb)(struct apk_package *rdepend, void *ctx), void *ctx)
{
- struct apk_name *name;
int i, j, k;
if (pkg == NULL)
return;
- name = pkg->name;
- for (i = 0; i < name->rdepends->num; i++) {
- struct apk_name *name0 = name->rdepends->item[i];
+ for (i = 0; i < rdepends->num; i++) {
+ struct apk_name *name0 = rdepends->item[i];
for (j = 0; j < name0->providers->num; j++) {
struct apk_package *pkg0 = name0->providers->item[j].pkg;
@@ -73,6 +71,17 @@ static void foreach_package_reverse_dependency(
}
}
+static void foreach_package_reverse_dependency(
+ struct apk_package *pkg,
+ void (*cb)(struct apk_package *rdepend, void *ctx), void *ctx)
+{
+ int i;
+
+ foreach_package_reverse_dependency2(pkg, pkg->name->rdepends, cb, ctx);
+ for (i = 0; i < pkg->provides->num; i++)
+ foreach_package_reverse_dependency2(pkg, pkg->provides->item[i].name->rdepends, cb, ctx);
+}
+
static void foreach_reverse_dependency(
struct apk_name *name, int mode,
void (*cb)(struct apk_package *rdepend, void *ctx), void *ctx)
@@ -84,7 +93,7 @@ static void foreach_reverse_dependency(
if (mode == INSTALLED_PACKAGES && pkg0->ipkg == NULL)
continue;
- else if (mode == MARKED_PACKAGES && pkg0->state_int == 0)
+ if (mode == MARKED_PACKAGES && pkg0->state_int == 0)
continue;
foreach_package_reverse_dependency(pkg0, cb, ctx);
@@ -136,7 +145,7 @@ static int del_main(void *pctx, struct apk_database *db, int argc, char **argv)
struct apk_changeset changeset = {};
struct apk_solution_array *solution = NULL;
struct not_deleted_ctx ndctx = {};
- int i, r = 0;
+ int i, j, r = 0;
apk_dependency_array_copy(&ctx->world, db->world);
@@ -156,6 +165,8 @@ static int del_main(void *pctx, struct apk_database *db, int argc, char **argv)
for (i = 0; i < solution->num; i++) {
struct apk_package *pkg = solution->item[i].pkg;
pkg->name->state_ptr = pkg;
+ for (j = 0; j < pkg->provides->num; j++)
+ pkg->provides->item[j].name->state_ptr = pkg;
pkg->state_int = 1;
}
for (i = 0; i < argc; i++) {