From c11b70c7f0f622f7b6c346ed20ed80ba34f6d8ee Mon Sep 17 00:00:00 2001 From: Timo Teras Date: Tue, 14 Apr 2009 09:21:30 +0300 Subject: db: track reverse dependencies This will be used later by the commit change calculator (for improved changeset calculation, ref #7). Will be also used by "apk info" to show reverse dependencies or "required by" information. --- src/apk_database.h | 4 ++++ src/database.c | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+) (limited to 'src') 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); -- cgit v1.2.3-70-g09d2