diff options
-rw-r--r-- | src/apk_database.h | 1 | ||||
-rw-r--r-- | src/apk_package.h | 2 | ||||
-rw-r--r-- | src/database.c | 19 | ||||
-rw-r--r-- | src/package.c | 59 |
4 files changed, 55 insertions, 26 deletions
diff --git a/src/apk_database.h b/src/apk_database.h index 070b3a6..b79253d 100644 --- a/src/apk_database.h +++ b/src/apk_database.h @@ -76,6 +76,7 @@ struct apk_name { char *name; struct apk_package_array *pkgs; struct apk_name_array *rdepends; + struct apk_name_array *rinstall_if; }; struct apk_repository { diff --git a/src/apk_package.h b/src/apk_package.h index 8998c7c..ed25bd4 100644 --- a/src/apk_package.h +++ b/src/apk_package.h @@ -85,7 +85,7 @@ struct apk_package { apk_blob_t *version, *arch, *license; char *url, *description; char *filename; - struct apk_dependency_array *depends; + struct apk_dependency_array *depends, *install_if; size_t installed_size, size; unsigned repos; struct apk_checksum csum; diff --git a/src/database.c b/src/database.c index d7692cd..c1e8a6a 100644 --- a/src/database.c +++ b/src/database.c @@ -84,6 +84,7 @@ static void pkg_name_free(struct apk_name *name) free(name->name); apk_package_array_free(&name->pkgs); apk_name_array_free(&name->rdepends); + apk_name_array_free(&name->rinstall_if); free(name); } @@ -196,6 +197,7 @@ struct apk_name *apk_db_get_name(struct apk_database *db, apk_blob_t name) pn->id = db->name_id++; apk_package_array_init(&pn->pkgs); apk_name_array_init(&pn->rdepends); + apk_name_array_init(&pn->rinstall_if); apk_hash_insert_hashed(&db->available.names, pn, hash); return pn; @@ -399,16 +401,25 @@ static struct apk_db_file *apk_db_file_get(struct apk_database *db, static void apk_db_pkg_rdepends(struct apk_database *db, struct apk_package *pkg) { int i, j; + struct apk_name *rname; for (i = 0; i < pkg->depends->num; i++) { - struct apk_name *rname = pkg->depends->item[i].name; - + rname = pkg->depends->item[i].name; for (j = 0; j < rname->rdepends->num; j++) if (rname->rdepends->item[j] == pkg->name) - return; - + goto rdeps_done; *apk_name_array_add(&rname->rdepends) = pkg->name; } +rdeps_done: + for (i = 0; i < pkg->install_if->num; i++) { + rname = pkg->install_if->item[i].name; + for (j = 0; j < rname->rinstall_if->num; j++) + if (rname->rinstall_if->item[j] == pkg->name) + goto riif_done; + *apk_name_array_add(&rname->rinstall_if) = pkg->name; + } +riif_done: + return; } struct apk_package *apk_db_pkg_add(struct apk_database *db, struct apk_package *pkg) diff --git a/src/package.c b/src/package.c index ae34f79..1a5d502 100644 --- a/src/package.c +++ b/src/package.c @@ -58,8 +58,10 @@ struct apk_package *apk_pkg_new(void) struct apk_package *pkg; pkg = calloc(1, sizeof(struct apk_package)); - if (pkg != NULL) + if (pkg != NULL) { apk_dependency_array_init(&pkg->depends); + apk_dependency_array_init(&pkg->install_if); + } return pkg; } @@ -654,6 +656,9 @@ int apk_pkg_add_info(struct apk_database *db, struct apk_package *pkg, case 'I': pkg->installed_size = apk_blob_pull_uint(&value, 10); break; + case 'i': + apk_deps_parse(db, &pkg->install_if, value); + break; case 'F': case 'M': case 'R': case 'Z': /* installed db entries which are handled in database.c */ return 1; @@ -677,14 +682,15 @@ static int read_info_line(void *ctx, apk_blob_t line) const char *str; char field; } fields[] = { - { "pkgname", 'P' }, - { "pkgver", 'V' }, - { "pkgdesc", 'T' }, - { "url", 'U' }, - { "size", 'I' }, - { "license", 'L' }, - { "arch", 'A' }, - { "depend", 'D' }, + { "pkgname", 'P' }, + { "pkgver", 'V' }, + { "pkgdesc", 'T' }, + { "url", 'U' }, + { "size", 'I' }, + { "license", 'L' }, + { "arch", 'A' }, + { "depend", 'D' }, + { "install_if", 'i' }, }; struct read_info_ctx *ri = (struct read_info_ctx *) ctx; apk_blob_t l, r; @@ -789,6 +795,7 @@ void apk_pkg_free(struct apk_package *pkg) apk_pkg_uninstall(NULL, pkg); apk_dependency_array_free(&pkg->depends); + apk_dependency_array_free(&pkg->install_if); if (pkg->url) free(pkg->url); if (pkg->description) @@ -916,12 +923,30 @@ struct apk_package *apk_pkg_parse_index_entry(struct apk_database *db, apk_blob_ return ctx.pkg; } +static int write_depends(struct apk_ostream *os, const char *field, + struct apk_dependency_array *deps) +{ + int r; + + if (deps->num == 0) + return 0; + + if (os->write(os, field, 2) != 2) + return -1; + r = apk_deps_write(deps, os); + if (r < 0) + return r; + if (os->write(os, "\n", 1) != 1) + return -1; + + return 0; +} + int apk_pkg_write_index_entry(struct apk_package *info, struct apk_ostream *os) { char buf[512]; apk_blob_t bbuf = APK_BLOB_BUF(buf); - int r; apk_blob_push_blob(&bbuf, APK_BLOB_STR("C:")); apk_blob_push_csum(&bbuf, &info->csum); @@ -949,19 +974,11 @@ int apk_pkg_write_index_entry(struct apk_package *info, return -1; bbuf = apk_blob_pushed(APK_BLOB_BUF(buf), bbuf); - if (os->write(os, bbuf.ptr, bbuf.len) != bbuf.len) + if (os->write(os, bbuf.ptr, bbuf.len) != bbuf.len || + write_depends(os, "D:", info->depends) || + write_depends(os, "i:", info->install_if)) return -1; - if (info->depends->num > 0) { - if (os->write(os, "D:", 2) != 2) - return -1; - r = apk_deps_write(info->depends, os); - if (r < 0) - return r; - if (os->write(os, "\n", 1) != 1) - return -1; - } - return 0; } |