Git-Url: 
http://git.frugalware.org/gitweb/gitweb.cgi?p=pacman-g2.git;a=commitdiff;h=85b95f44591ac064b6a541774cdcd9472ba26666

commit 85b95f44591ac064b6a541774cdcd9472ba26666
Author: Michel Hermier <[email protected]>
Date:   Mon May 6 08:53:34 2013 +0200

libpacman: Make dependencies resolution all at once instead of once per 
packages (for a transaction).

diff --git a/lib/libpacman/deps.c b/lib/libpacman/deps.c
index 58bb939..67281e2 100644
--- a/lib/libpacman/deps.c
+++ b/lib/libpacman/deps.c
@@ -45,6 +45,9 @@

#include "fstringlist.h"

+static
+int _pacman_transpkg_resolvedeps (pmtrans_t *trans, pmtranspkg_t *transpkg, 
pmlist_t **data);
+
static pmgraph_t *_pacman_graph_new(void)
{
pmgraph_t *graph = _pacman_zalloc(sizeof(pmgraph_t));
@@ -453,7 +456,9 @@ int _pacman_trans_checkdeps (pmtrans_t *trans, pmlist_t 
**depmisslist) {
for (i = trans->packages; i != NULL; i = i->next) {
pmtranspkg_t *transpkg = i->data;

-               _pacman_transpkg_checkdeps (trans, transpkg, depmisslist);
+               if (_pacman_transpkg_checkdeps (trans, transpkg, depmisslist) 
!= 0) {
+                       return -1;
+               }
}
return 0;
}
@@ -554,20 +559,15 @@ void _pacman_removedeps(pmtrans_t *trans)
* dependencies (recursive) for syncpkg
*/
static
-int _pacman_resolvedeps (pmtrans_t *trans, pmpkg_t *syncpkg, pmlist_t **data)
+int _pacman_resolvedeps (pmtrans_t *trans, pmlist_t *deps, pmlist_t **data)
{
pmlist_t *i, *j;
-       pmlist_t *targ;
-       pmlist_t *deps = NULL;
-
-       targ = _pacman_list_add(NULL, syncpkg);
-       deps = _pacman_checkdeps(trans, PM_TRANS_TYPE_ADD, targ);
-       FREELISTPTR(targ);

if(deps == NULL) {
return(0);
}

+       _pacman_log(PM_LOG_FLOW1, _("resolving targets dependencies"));
for(i = deps; i; i = i->next) {
int found = 0;
pmdepmissing_t *miss = i->data;
@@ -630,10 +630,10 @@ int _pacman_resolvedeps (pmtrans_t *trans, pmpkg_t 
*syncpkg, pmlist_t **data)
FREEPKG(dummypkg);
}
if(usedep) {
-                               _pacman_log(PM_LOG_DEBUG, _("pulling dependency 
%s (needed by %s)"),
-                                         ps->name, syncpkg->name);
-                               _pacman_trans_add_pkg (trans, ps, 
PM_TRANS_TYPE_UPGRADE, 0);
-                               if(_pacman_resolvedeps(trans, ps, data)) {
+                               pmtranspkg_t *transpkg = _pacman_trans_add_pkg 
(trans, ps, PM_TRANS_TYPE_UPGRADE, 0);
+
+                               _pacman_log(PM_LOG_DEBUG, _("pulling dependency 
%s"), ps->name);
+                               if (_pacman_transpkg_resolvedeps(trans, 
transpkg, data) != 0) {
goto error;
}
} else {
@@ -661,23 +661,28 @@ error:
return(-1);
}

-int _pacman_trans_resolvedeps(pmtrans_t *trans, pmlist_t **data) {
-       pmlist_t *i;
+static
+int _pacman_transpkg_resolvedeps (pmtrans_t *trans, pmtranspkg_t *transpkg, 
pmlist_t **data) {
+       pmlist_t *deps = NULL;
+
+       if (_pacman_transpkg_checkdeps (trans, transpkg, &deps) != 0) {
+               return -1;
+       }
+       return _pacman_resolvedeps (trans, deps, data);
+}
+
+int _pacman_trans_resolvedeps (pmtrans_t *trans, pmlist_t **data) {
+       pmlist_t *deps = NULL;

if (trans == NULL) {
return(-1);
}

-       _pacman_log(PM_LOG_FLOW1, _("resolving targets dependencies"));
-       for(i = trans->packages; i; i = i->next) {
-               pmpkg_t *pkg = ((pmtranspkg_t *)i->data)->pkg_new;
-
-               if (_pacman_resolvedeps (trans, pkg, data) == -1) {
-                       /* pm_errno is set by resolvedeps */
-                       return -1;
-               }
+       if (_pacman_trans_checkdeps (trans, &deps) != 0) {
+               /* pm_errno is set by checkdeps */
+               return -1;
}
-       return 0;
+       return _pacman_resolvedeps (trans, deps, data);
}

/* vim: set ts=2 sw=2 noet: */
_______________________________________________
Frugalware-git mailing list
[email protected]
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to