From 1767a569c65ad1067eac7dcd1d9665e55767e50e Mon Sep 17 00:00:00 2001
From: Xavier Chantry <chantry.xavier@gmail.com>
Date: Sun, 17 Oct 2010 00:59:53 +0200
Subject: alpm: add alpm_find_grp_pkgs

This group function is meant to help group handling from frontend : it
scans all dbs, handling ignored packages and duplicate members (the
first repo where a member is found has the priority).

Signed-off-by: Xavier Chantry <chantry.xavier@gmail.com>
---
 lib/libalpm/alpm.h |  1 +
 lib/libalpm/sync.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 43 insertions(+)

(limited to 'lib/libalpm')

diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 2f52f075..606610e7 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -255,6 +255,7 @@ off_t alpm_delta_get_size(pmdelta_t *delta);
  */
 const char *alpm_grp_get_name(const pmgrp_t *grp);
 alpm_list_t *alpm_grp_get_pkgs(const pmgrp_t *grp);
+alpm_list_t *alpm_find_grp_pkgs(alpm_list_t *dbs, const char *name);
 
 /*
  * Sync
diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c
index a2dc4905..63cd4b7c 100644
--- a/lib/libalpm/sync.c
+++ b/lib/libalpm/sync.c
@@ -375,6 +375,48 @@ int SYMEXPORT alpm_sync_target(const char *target)
 	return(sync_target(dbs_sync,target));
 }
 
+/** Find group members across a list of databases.
+ * If a member exists in several databases, only the first database is used.
+ * IgnorePkg is also handled.
+ * @param dbs the list of pmdb_t *
+ * @pram name the name of the group
+ * @return the list of pmpkg_t * (caller is responsible for alpm_list_free)
+ */
+alpm_list_t SYMEXPORT *alpm_find_grp_pkgs(alpm_list_t *dbs,
+		const char *name)
+{
+	alpm_list_t *i, *j, *pkgs = NULL, *ignorelist = NULL;
+
+	for(i = dbs; i; i = i->next) {
+		pmdb_t *db = i->data;
+		pmgrp_t *grp = alpm_db_readgrp(db, name);
+
+		if(!grp)
+			continue;
+
+		for(j = alpm_grp_get_pkgs(grp); j; j = j->next) {
+			pmpkg_t *pkg = j->data;
+
+			if(_alpm_pkg_find(ignorelist, alpm_pkg_get_name(pkg))) {
+				continue;
+			}
+			if(_alpm_pkg_should_ignore(pkg)) {
+				ignorelist = alpm_list_add(ignorelist, pkg);
+				int install = 0;
+				QUESTION(handle->trans, PM_TRANS_CONV_INSTALL_IGNOREPKG, pkg,
+						NULL, NULL, &install);
+				if(!install)
+					continue;
+			}
+			if(!_alpm_pkg_find(pkgs, alpm_pkg_get_name(pkg))) {
+				pkgs = alpm_list_add(pkgs, pkg);
+			}
+		}
+	}
+	alpm_list_free(ignorelist);
+	return(pkgs);
+}
+
 /** Compute the size of the files that will be downloaded to install a
  * package.
  * @param newpkg the new package to upgrade to
-- 
cgit v1.2.3-70-g09d2