summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNagy Gabor <ngaba@bibl.u-szeged.hu>2008-04-21 12:16:15 +0200
committerDan McGee <dan@archlinux.org>2008-04-25 18:51:47 -0500
commit1b5a851851cce4ae53e82fdec128ff6d6f73393b (patch)
treec210d20ba980eb3047eadea173da82642b4d4839
parent423820b34c018e655aac5836873fef8dc475bd74 (diff)
downloadpacman-1b5a851851cce4ae53e82fdec128ff6d6f73393b.tar.xz
Kill compute_requiredby usage in can_remove_package()
In the can_remove_package function, we don't need to compute the whole requiredby list, we just need to find one member of it that doesn't belong to the targets list. That way we get a small speedup and remove the only usage of alpm_pkg_compute_requiredby in the backend, so that it can be tweaked for frontend usage. Signed-off-by: Nagy Gabor <ngaba@bibl.u-szeged.hu> Signed-off-by: Chantry Xavier <shiningxc@gmail.com> Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r--lib/libalpm/deps.c18
1 files changed, 10 insertions, 8 deletions
diff --git a/lib/libalpm/deps.c b/lib/libalpm/deps.c
index 24b17933..b171ccc7 100644
--- a/lib/libalpm/deps.c
+++ b/lib/libalpm/deps.c
@@ -438,7 +438,7 @@ pmdepend_t *_alpm_dep_dup(const pmdepend_t *dep)
static int can_remove_package(pmdb_t *db, pmpkg_t *pkg, alpm_list_t *targets,
int include_explicit)
{
- alpm_list_t *i, *requiredby;
+ alpm_list_t *i, *j;
if(_alpm_pkg_find(alpm_pkg_get_name(pkg), targets)) {
return(0);
@@ -460,15 +460,17 @@ static int can_remove_package(pmdb_t *db, pmpkg_t *pkg, alpm_list_t *targets,
* if checkdeps detected it would break something */
/* see if other packages need it */
- requiredby = alpm_pkg_compute_requiredby(pkg);
- for(i = requiredby; i; i = i->next) {
- pmpkg_t *reqpkg = _alpm_db_get_pkgfromcache(db, i->data);
- if(reqpkg && !_alpm_pkg_find(alpm_pkg_get_name(reqpkg), targets)) {
- FREELIST(requiredby);
- return(0);
+ for(i = _alpm_db_get_pkgcache(db); i; i = i->next) {
+ pmpkg_t *lpkg = i->data;
+ for(j = alpm_pkg_get_depends(lpkg); j; j = j->next) {
+ if(alpm_depcmp(pkg, j->data)) {
+ if(!_alpm_pkg_find(lpkg->name, targets)) {
+ return(0);
+ }
+ break;
+ }
}
}
- FREELIST(requiredby);
/* it's ok to remove */
return(1);