From: Michael Tremer Date: Tue, 20 Sep 2022 09:59:20 +0000 (+0000) Subject: repo: Improve SOLV file X-Git-Tag: 0.9.28~291 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=02b0ede93769ead12d9171c97e5f8d9f7434e2f2;p=pakfire.git repo: Improve SOLV file Add all addefileprovides and a meta section (as in tools_write in the libsolv examples). Signed-off-by: Michael Tremer --- diff --git a/src/libpakfire/repo.c b/src/libpakfire/repo.c index 822f97ccc..68acb8edd 100644 --- a/src/libpakfire/repo.c +++ b/src/libpakfire/repo.c @@ -887,20 +887,60 @@ PAKFIRE_EXPORT int pakfire_repo_read_solv(struct pakfire_repo* repo, FILE *f, in } PAKFIRE_EXPORT int pakfire_repo_write_solv(struct pakfire_repo* repo, FILE *f, int flags) { + Repodata* meta = NULL; + Queue addedfileprovides; + int r; + pakfire_pool_internalize(repo->pakfire); + // Initialize file provides + queue_init(&addedfileprovides); + + // Create another repodata section for meta information + meta = repo_add_repodata(repo->repo, 0); + if (!meta) { + ERROR(repo->pakfire, "Could not create meta repodata: %m\n"); + r = 1; + goto ERROR; + } + + // Set tool version + repodata_set_str(meta, SOLVID_META, REPOSITORY_TOOLVERSION, LIBSOLV_TOOLVERSION); + + // Do not propagate this + repodata_unset(meta, SOLVID_META, REPOSITORY_EXTERNAL); + + // Fetch file provides from pool + pool_addfileprovides_queue(repo->repo->pool, &addedfileprovides, 0); + if (addedfileprovides.count) + repodata_set_idarray(meta, SOLVID_META, + REPOSITORY_ADDEDFILEPROVIDES, &addedfileprovides); + else + repodata_unset(meta, SOLVID_META, REPOSITORY_ADDEDFILEPROVIDES); + + // Free some memory + pool_freeidhashes(repo->repo->pool); + + // Internalize the repository data + repodata_internalize(meta); + // Export repository data - int r = repo_write(repo->repo, f); + r = repo_write(repo->repo, f); if (r) - return r; + goto ERROR; // Flush buffers r = fflush(f); if (r) { ERROR(repo->pakfire, "Could not flush after writing repository: %m\n"); - return r; + goto ERROR; } +ERROR: + if (meta) + repodata_free(meta); + queue_free(&addedfileprovides); + return r; }