diff options
author | Xavier Chantry <chantry.xavier@gmail.com> | 2010-10-17 00:59:53 +0200 |
---|---|---|
committer | Xavier Chantry <chantry.xavier@gmail.com> | 2011-01-29 19:33:16 +0100 |
commit | 1767a569c65ad1067eac7dcd1d9665e55767e50e (patch) | |
tree | 01bbdc29ba04a114e313167f7425957cc98e110f | |
parent | fb7e1b4b9bf7d2dbcd89a4832067d89a03d71056 (diff) |
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>
-rw-r--r-- | lib/libalpm/alpm.h | 1 | ||||
-rw-r--r-- | lib/libalpm/sync.c | 42 |
2 files changed, 43 insertions, 0 deletions
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 |