fetch: fix --recursive mode to work with pure virtual packages
The virtual package provider still needs to be explicitly given on command line.cute-signatures
parent
6542d4ca2c
commit
0fe3f3964b
|
@ -100,6 +100,7 @@ struct apk_name {
|
||||||
struct apk_name_array *rdepends;
|
struct apk_name_array *rdepends;
|
||||||
struct apk_name_array *rinstall_if;
|
struct apk_name_array *rinstall_if;
|
||||||
unsigned is_dependency : 1;
|
unsigned is_dependency : 1;
|
||||||
|
unsigned auto_select_virtual: 1;
|
||||||
unsigned int foreach_genid;
|
unsigned int foreach_genid;
|
||||||
union {
|
union {
|
||||||
struct apk_solver_name_state ss;
|
struct apk_solver_name_state ss;
|
||||||
|
|
13
src/fetch.c
13
src/fetch.c
|
@ -216,6 +216,11 @@ static void mark_error(struct fetch_ctx *ctx, const char *match, struct apk_name
|
||||||
ctx->errors++;
|
ctx->errors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mark_name_flags(struct apk_database *db, const char *match, struct apk_name *name, void *ctx)
|
||||||
|
{
|
||||||
|
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_recursive(struct apk_database *db, const char *match, struct apk_name *name, void *ctx)
|
||||||
{
|
{
|
||||||
struct apk_changeset changeset = {};
|
struct apk_changeset changeset = {};
|
||||||
|
@ -299,7 +304,7 @@ 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)
|
static int fetch_main(void *pctx, struct apk_database *db, struct apk_string_array *args)
|
||||||
{
|
{
|
||||||
struct fetch_ctx *ctx = (struct fetch_ctx *) pctx;
|
struct fetch_ctx *ctx = (struct fetch_ctx *) pctx;
|
||||||
void *mark = (ctx->flags & FETCH_RECURSIVE) ? mark_name_recursive : mark_name;
|
void *mark;
|
||||||
|
|
||||||
if (ctx->flags & FETCH_STDOUT) {
|
if (ctx->flags & FETCH_STDOUT) {
|
||||||
apk_flags &= ~APK_PROGRESS;
|
apk_flags &= ~APK_PROGRESS;
|
||||||
|
@ -318,6 +323,12 @@ static int fetch_main(void *pctx, struct apk_database *db, struct apk_string_arr
|
||||||
|
|
||||||
ctx->db = db;
|
ctx->db = db;
|
||||||
|
|
||||||
|
if (ctx->flags & FETCH_RECURSIVE) {
|
||||||
|
apk_name_foreach_matching(db, args, apk_foreach_genid(), mark_name_flags, ctx);
|
||||||
|
mark = mark_name_recursive;
|
||||||
|
} else {
|
||||||
|
mark = mark_name;
|
||||||
|
}
|
||||||
apk_name_foreach_matching(db, args, apk_foreach_genid(), mark, ctx);
|
apk_name_foreach_matching(db, args, apk_foreach_genid(), mark, ctx);
|
||||||
if (!ctx->errors)
|
if (!ctx->errors)
|
||||||
apk_hash_foreach(&db->available.packages, fetch_package, ctx);
|
apk_hash_foreach(&db->available.packages, fetch_package, ctx);
|
||||||
|
|
|
@ -640,7 +640,9 @@ static void select_package(struct apk_solver_state *ss, struct apk_name *name)
|
||||||
!p->pkg->ss.tag_ok))
|
!p->pkg->ss.tag_ok))
|
||||||
continue;
|
continue;
|
||||||
/* Virtual packages cannot be autoselected */
|
/* Virtual packages cannot be autoselected */
|
||||||
if (p->version == &apk_null_blob && p->pkg->name->ss.requirers == 0)
|
if (p->version == &apk_null_blob &&
|
||||||
|
p->pkg->name->auto_select_virtual == 0 &&
|
||||||
|
p->pkg->name->ss.requirers == 0)
|
||||||
continue;
|
continue;
|
||||||
if (compare_providers(ss, p, &chosen) > 0)
|
if (compare_providers(ss, p, &chosen) > 0)
|
||||||
chosen = *p;
|
chosen = *p;
|
||||||
|
|
Loading…
Reference in New Issue