summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2018-06-14 12:56:25 +0200
committerTimo Teräs <timo.teras@iki.fi>2018-06-14 18:55:06 +0300
commit611172b7a92d1a9e635655cfdeec5b8c0be556e7 (patch)
tree57658c9eab0dea46cd1e51d1d39c15591d8560d8
parentdafbb1c4f4c1266b31eafa967c024d6f79789842 (diff)
fetch: include install_if dependencies with --recursive
Run apk_solver_solve once with all args as dependencies instead of running apk_solver_solve for each arg. This is neccesary so the install_if calculation is done correctly.
-rw-r--r--src/fetch.c49
1 files changed, 23 insertions, 26 deletions
diff --git a/src/fetch.c b/src/fetch.c
index 66d466e3c90..9707752f416 100644
--- a/src/fetch.c
+++ b/src/fetch.c
@@ -31,6 +31,7 @@ struct fetch_ctx {
int outdir_fd, errors;
struct apk_database *db;
size_t done, total;
+ struct apk_dependency_array *world;
};
static int cup(void)
@@ -216,42 +217,37 @@ static void mark_error(struct fetch_ctx *ctx, const char *match, struct apk_name
ctx->errors++;
}
-static void mark_name_flags(struct apk_database *db, const char *match, struct apk_name *name, void *ctx)
-{
- if (!IS_ERR_OR_NULL(name))
- name->auto_select_virtual = 1;
-}
-
-static void mark_name_recursive(struct apk_database *db, const char *match, struct apk_name *name, void *ctx)
+static void mark_name_flags(struct apk_database *db, const char *match, struct apk_name *name, void *pctx)
{
- struct apk_changeset changeset = {};
+ struct fetch_ctx *ctx = (struct fetch_ctx *) pctx;
struct apk_dependency dep = (struct apk_dependency) {
.name = name,
.version = &apk_null_blob,
.result_mask = APK_DEPMASK_ANY,
};
- struct apk_dependency_array *world;
+
+ if (!IS_ERR_OR_NULL(name)) {
+ name->auto_select_virtual = 1;
+ apk_deps_add(&ctx->world, &dep);
+ } else
+ ctx->errors++;
+}
+
+static void mark_names_recursive(struct apk_database *db, struct apk_string_array *args, void *pctx)
+{
+ struct fetch_ctx *ctx = (struct fetch_ctx *) pctx;
+ struct apk_changeset changeset = {};
struct apk_change *change;
int r;
- if (!name) {
- mark_error(ctx, match, name);
- return;
- }
-
- apk_dependency_array_init(&world);
- *apk_dependency_array_add(&world) = dep;
- r = apk_solver_solve(db, 0, world, &changeset);
+ r = apk_solver_solve(db, 0, ctx->world, &changeset);
if (r == 0) {
foreach_array_item(change, changeset.changes)
mark_package(ctx, change->new_pkg);
} else {
- mark_error(ctx, match, name);
- if (apk_verbosity > 1)
- apk_solver_print_errors(db, &changeset, world);
+ apk_solver_print_errors(db, &changeset, ctx->world);
+ ctx->errors++;
}
- apk_dependency_array_free(&world);
-
apk_change_array_free(&changeset.changes);
}
@@ -308,7 +304,6 @@ static int purge_package(void *pctx, int dirfd, const char *filename)
static int fetch_main(void *pctx, struct apk_database *db, struct apk_string_array *args)
{
struct fetch_ctx *ctx = (struct fetch_ctx *) pctx;
- void *mark;
if (ctx->flags & FETCH_STDOUT) {
apk_flags &= ~APK_PROGRESS;
@@ -327,12 +322,14 @@ static int fetch_main(void *pctx, struct apk_database *db, struct apk_string_arr
ctx->db = db;
if (ctx->flags & FETCH_RECURSIVE) {
+ apk_dependency_array_init(&ctx->world);
apk_name_foreach_matching(db, args, apk_foreach_genid(), mark_name_flags, ctx);
- mark = mark_name_recursive;
+ if (ctx->errors == 0)
+ mark_names_recursive(db, args, ctx);
+ apk_dependency_array_free(&ctx->world);
} else {
- mark = mark_name;
+ apk_name_foreach_matching(db, args, apk_foreach_genid(), mark_name, ctx);
}
- apk_name_foreach_matching(db, args, apk_foreach_genid(), mark, ctx);
if (!ctx->errors)
apk_hash_foreach(&db->available.packages, fetch_package, ctx);