diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/apk_database.h | 4 | ||||
-rw-r--r-- | src/database.c | 20 |
2 files changed, 24 insertions, 0 deletions
diff --git a/src/apk_database.h b/src/apk_database.h index 0306997..59f1f8a 100644 --- a/src/apk_database.h +++ b/src/apk_database.h @@ -19,6 +19,9 @@ #define APK_MAX_REPOS 32 +struct apk_name; +APK_ARRAY(apk_name_array, struct apk_name *); + struct apk_db_file { struct hlist_node hash_node; struct hlist_node diri_files_list; @@ -55,6 +58,7 @@ struct apk_name { apk_hash_node hash_node; char *name; struct apk_package_array *pkgs; + struct apk_name_array *rdepends; }; struct apk_repository { diff --git a/src/database.c b/src/database.c index 976102b..5506ebb 100644 --- a/src/database.c +++ b/src/database.c @@ -329,6 +329,25 @@ static void apk_db_file_change_owner(struct apk_database *db, *after = &file->diri_files_list.next; } +static void apk_db_pkg_rdepends(struct apk_database *db, struct apk_package *pkg) +{ + int i, j; + + if (pkg->depends == NULL) + return; + + for (i = 0; i < pkg->depends->num; i++) { + struct apk_name *rname = pkg->depends->item[i].name; + + if (rname->rdepends) { + for (j = 0; j < rname->rdepends->num; j++) + if (rname->rdepends->item[j] == pkg->name) + return; + } + *apk_name_array_add(&rname->rdepends) = pkg->name; + } +} + static struct apk_package *apk_db_pkg_add(struct apk_database *db, struct apk_package *pkg) { struct apk_package *idb; @@ -339,6 +358,7 @@ static struct apk_package *apk_db_pkg_add(struct apk_database *db, struct apk_pa pkg->id = db->pkg_id++; apk_hash_insert(&db->available.packages, pkg); *apk_package_array_add(&pkg->name->pkgs) = pkg; + apk_db_pkg_rdepends(db, pkg); } else { idb->repos |= pkg->repos; apk_pkg_free(pkg); |