From c11b70c7f0f622f7b6c346ed20ed80ba34f6d8ee Mon Sep 17 00:00:00 2001
From: Timo Teras <timo.teras@iki.fi>
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(+)

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