summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimo Teräs <timo.teras@iki.fi>2021-03-19 12:05:20 +0200
committerTimo Teräs <timo.teras@iki.fi>2021-03-19 12:08:46 +0200
commit511621438d00b3df645399212ea939356db5edb6 (patch)
tree01dd0c1a3d941ad467d53bf26c0e97936284646c
parentbc0ed3774aa78dcd8b9cd97edaffdab7f60ffb4d (diff)
downloadapk-tools-511621438d00b3df645399212ea939356db5edb6.tar.gz
apk-tools-511621438d00b3df645399212ea939356db5edb6.tar.bz2
apk-tools-511621438d00b3df645399212ea939356db5edb6.tar.xz
apk-tools-511621438d00b3df645399212ea939356db5edb6.zip
del: report correctly package's provides names
The code assumed that when package is in world, it would be there by it's primary name. The code is now updated to properly print the package names that are actually present in world. fixes #10718
-rw-r--r--src/app_del.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/src/app_del.c b/src/app_del.c
index f8fd524..f4c00fc 100644
--- a/src/app_del.c
+++ b/src/app_del.c
@@ -51,6 +51,11 @@ struct not_deleted_ctx {
int header;
};
+static inline int name_in_world(struct apk_name *n)
+{
+ return n->state_int == 1;
+}
+
static void print_not_deleted_pkg(struct apk_package *pkg0, struct apk_dependency *dep0,
struct apk_package *pkg, void *pctx)
{
@@ -59,18 +64,22 @@ static void print_not_deleted_pkg(struct apk_package *pkg0, struct apk_dependenc
struct apk_dependency *d;
struct apk_provider *p;
- if (pkg0->name != ctx->name) {
- if (!ctx->header) {
- apk_msg(out, "World updated, but the following packages are not removed due to:");
- ctx->header = 1;
- }
- if (!ctx->indent.indent) {
- ctx->indent.x = printf(" %s:", ctx->name->name);
- ctx->indent.indent = ctx->indent.x + 1;
- }
+ if (!ctx->header) {
+ apk_msg(out, "World updated, but the following packages are not removed due to:");
+ ctx->header = 1;
+ }
+ if (!ctx->indent.indent) {
+ ctx->indent.x = printf(" %s:", ctx->name->name);
+ ctx->indent.indent = ctx->indent.x + 1;
+ }
+ if (name_in_world(pkg0->name)) {
apk_print_indented(&ctx->indent, APK_BLOB_STR(pkg0->name->name));
}
+ foreach_array_item(d, pkg0->provides) {
+ if (!name_in_world(d->name)) continue;
+ apk_print_indented(&ctx->indent, APK_BLOB_STR(d->name->name));
+ }
apk_pkg_foreach_reverse_dependency(pkg0, ctx->matches, print_not_deleted_pkg, pctx);
foreach_array_item(d, pkg0->install_if) {
@@ -138,6 +147,7 @@ static int del_main(void *pctx, struct apk_ctx *ac, struct apk_string_array *arg
struct not_deleted_ctx ndctx = { .out = &db->ctx->out };
struct apk_changeset changeset = {};
struct apk_change *change;
+ struct apk_dependency *d;
int r = 0;
apk_dependency_array_copy(&ctx->world, db->world);
@@ -150,6 +160,8 @@ static int del_main(void *pctx, struct apk_ctx *ac, struct apk_string_array *arg
foreach_array_item(change, changeset.changes)
if (change->new_pkg != NULL)
change->new_pkg->marked = 1;
+ foreach_array_item(d, ctx->world)
+ d->name->state_int = 1;
apk_name_foreach_matching(
db, args,
apk_foreach_genid() | APK_FOREACH_MARKED | APK_DEP_SATISFIES,