[pacman-dev] [PATCH] Show 'Required By' in -Si output

Dan McGee dan at archlinux.org
Wed Oct 7 22:53:27 EDT 2009


Just as we do in -Qi, we can compute required by information for sync
database packages. The behavior seems sane; for a given package, the -Si
required by will show all packages in *any* sync database that require it.

Implements FS#16244.

Signed-off-by: Dan McGee <dan at archlinux.org>
---
 lib/libalpm/package.c |   46 ++++++++++++++++++++++++++++++++++++----------
 src/pacman/package.c  |   13 ++++---------
 2 files changed, 40 insertions(+), 19 deletions(-)

diff --git a/lib/libalpm/package.c b/lib/libalpm/package.c
index de17166..b0b6480 100644
--- a/lib/libalpm/package.c
+++ b/lib/libalpm/package.c
@@ -556,6 +556,21 @@ unsigned short SYMEXPORT alpm_pkg_has_scriptlet(pmpkg_t *pkg)
 	return pkg->scriptlet;
 }
 
+static void find_requiredby(pmpkg_t *pkg, pmdb_t *db, alpm_list_t **reqs)
+{
+	const alpm_list_t *i;
+	for(i = _alpm_db_get_pkgcache(db); i; i = i->next) {
+		if(!i->data) {
+			continue;
+		}
+		pmpkg_t *cachepkg = i->data;
+		if(_alpm_dep_edge(cachepkg, pkg)) {
+			const char *cachepkgname = alpm_pkg_get_name(cachepkg);
+			*reqs = alpm_list_add(*reqs, strdup(cachepkgname));
+		}
+	}
+}
+
 /**
  * @brief Compute the packages requiring a given package.
  * @param pkg a package
@@ -565,18 +580,29 @@ alpm_list_t SYMEXPORT *alpm_pkg_compute_requiredby(pmpkg_t *pkg)
 {
 	const alpm_list_t *i;
 	alpm_list_t *reqs = NULL;
+	pmdb_t *db;
 
-	pmdb_t *localdb = alpm_option_get_localdb();
-	for(i = _alpm_db_get_pkgcache(localdb); i; i = i->next) {
-		if(!i->data) {
-			continue;
-		}
-		pmpkg_t *cachepkg = i->data;
-		if(_alpm_dep_edge(cachepkg, pkg)) {
-			const char *cachepkgname = alpm_pkg_get_name(cachepkg);
-			reqs = alpm_list_add(reqs, strdup(cachepkgname));
+	if(pkg->origin == PKG_FROM_FILE) {
+		/* The sane option; search locally for things that require this. */
+		db = alpm_option_get_localdb();
+		fprintf(stderr, "db name: %s\n", db->treename);
+		find_requiredby(pkg, db, &reqs);
+	} else {
+		/* We have a DB package. if it is a local package, then we should
+		 * only search the local DB; else search all known sync databases. */
+		db = pkg->origin_data.db;
+		if(db->is_local) {
+			fprintf(stderr, "db name: %s\n", db->treename);
+			find_requiredby(pkg, db, &reqs);
+		} else {
+			for(i = handle->dbs_sync; i; i = i->next) {
+				db = i->data;
+				fprintf(stderr, "db name: %s\n", db->treename);
+				find_requiredby(pkg, db, &reqs);
+			}
 		}
 	}
+
 	return(reqs);
 }
 
diff --git a/src/pacman/package.c b/src/pacman/package.c
index 3b14516..e7e2552 100644
--- a/src/pacman/package.c
+++ b/src/pacman/package.c
@@ -83,10 +83,8 @@ void dump_pkg_full(pmpkg_t *pkg, int level)
 		depstrings = alpm_list_add(depstrings, alpm_dep_compute_string(dep));
 	}
 
-	if(level>0) {
-		/* compute this here so we don't get a pause in the middle of output */
-		requiredby = alpm_pkg_compute_requiredby(pkg);
-	}
+	/* compute this here so we don't get a pause in the middle of output */
+	requiredby = alpm_pkg_compute_requiredby(pkg);
 
 	/* actual output */
 	string_display(_("Name           :"), alpm_pkg_get_name(pkg));
@@ -97,11 +95,7 @@ void dump_pkg_full(pmpkg_t *pkg, int level)
 	list_display(_("Provides       :"), alpm_pkg_get_provides(pkg));
 	list_display(_("Depends On     :"), depstrings);
 	list_display_linebreak(_("Optional Deps  :"), alpm_pkg_get_optdepends(pkg));
-	/* Only applicable if installed */
-	if(level > 0) {
-		list_display(_("Required By    :"), requiredby);
-		FREELIST(requiredby);
-	}
+	list_display(_("Required By    :"), requiredby);
 	list_display(_("Conflicts With :"), alpm_pkg_get_conflicts(pkg));
 	list_display(_("Replaces       :"), alpm_pkg_get_replaces(pkg));
 	if(level < 0) {
@@ -142,6 +136,7 @@ void dump_pkg_full(pmpkg_t *pkg, int level)
 	printf("\n");
 
 	FREELIST(depstrings);
+	FREELIST(requiredby);
 }
 
 /* Display the content of a sync package
-- 
1.6.4.4



More information about the pacman-dev mailing list