From 5bd0f26e12d7941e389c8ccae169b51e62fbca2b Mon Sep 17 00:00:00 2001 From: Michael Schroeder Date: Fri, 6 Nov 2020 10:25:57 +0100 Subject: [PATCH] repo_write: fix handling of nested flexarray Fixes issue #402 --- src/repo_write.c | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/src/repo_write.c b/src/repo_write.c index 2a03e580..0f9fc4fd 100644 --- a/src/repo_write.c +++ b/src/repo_write.c @@ -570,25 +570,29 @@ collect_needed_cb(void *vcbdata, Solvable *s, Repodata *data, Repokey *key, KeyV break; case REPOKEY_TYPE_FIXARRAY: case REPOKEY_TYPE_FLEXARRAY: - if (kv->entry == 0) + if (kv->entry) { - if (kv->eof != 2) - *cbdata->sp++ = 0; /* mark start */ - } - else - { - /* just finished a schema, rewind to start */ + /* finish schema, rewind to start */ Id *sp = cbdata->sp - 1; *sp = 0; while (sp[-1]) sp--; - if (kv->entry == 1 || key->type == REPOKEY_TYPE_FLEXARRAY) + if (sp[-2] >= 0) + cbdata->subschemata[sp[-2]] = repodata_schema2id(cbdata->target, sp, 1); + cbdata->sp = sp - 2; + } + if (kv->eof != 2) + { + /* start new schema */ + if (kv->entry == 0 || key->type == REPOKEY_TYPE_FLEXARRAY) { cbdata->subschemata = solv_extend(cbdata->subschemata, cbdata->nsubschemata, 1, sizeof(Id), SCHEMATA_BLOCK); - cbdata->subschemata[cbdata->nsubschemata++] = repodata_schema2id(cbdata->target, sp, 1); + *cbdata->sp++ = cbdata->nsubschemata++; } - cbdata->sp = kv->eof == 2 ? sp - 1: sp; - } + else + *cbdata->sp++ = -1; + *cbdata->sp++ = 0; + } break; default: break; -- 2.47.2