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

commit 4ee314b335d02aa49a39dbdae2493c8c33a99222
Author: Michel Hermier <[email protected]>
Date:   Sat May 4 14:55:07 2013 +0200

libpacman: Rework a little around depends.

diff --git a/lib/libpacman/deps.c b/lib/libpacman/deps.c
index 841d274..1bd1c8d 100644
--- a/lib/libpacman/deps.c
+++ b/lib/libpacman/deps.c
@@ -341,78 +341,73 @@ void _pacman_sortbydeps(pmtrans_t *trans, int mode)
trans->_packages = newtargs;
}

-/* Returns a pmlist_t* of missing_t pointers.
+/* Returns a pmlist_t* of missing_t pointers in **baddeps.
*
* dependencies can include versions with depmod operators.
*/
-pmlist_t *_pacman_checkdeps(pmtrans_t *trans, unsigned char op, pmlist_t 
*packages)
-{
+static
+int _pacman_transpkg_checkdeps(pmtrans_t *trans, pmtranspkg_t *transpkg, 
pmlist_t **baddeps) {
pmdepend_t depend;
-       pmlist_t *i, *j, *k;
-       pmlist_t *baddeps = NULL;
+       pmlist_t *j, *k;
pmdepmissing_t *miss = NULL;
pmdb_t *db = trans->handle->db_local;
+       const char *pkg_name = __pacman_transpkg_name (transpkg);

if(db == NULL) {
-               return(NULL);
+               return -1;
}

-       for (i = packages; i; i = i->next) {
-               pmpkg_t *tp = i->data;
-               const char *pkg_name = tp->name;
-
-               if(op & PM_TRANS_TYPE_ADD) {
+               if (transpkg->type & PM_TRANS_TYPE_ADD) {
/* DEPENDENCIES -- look for unsatisfied dependencies */
-                       for(j = _pacman_pkg_getinfo(tp, PM_PKG_DEPENDS); j; j = 
j->next) {
+                       for(j = _pacman_pkg_getinfo (transpkg->pkg_new, 
PM_PKG_DEPENDS); j; j = j->next) {
/* split into name/version pairs */
_pacman_splitdep((char *)j->data, &depend);
if(_pacman_trans_is_depend_satisfied(trans, &depend) != 0) {
_pacman_log(PM_LOG_DEBUG, _("checkdeps: found %s as a dependency for %s"),
depend.name, pkg_name);
miss = _pacman_depmiss_new(pkg_name, PM_DEP_TYPE_DEPEND, depend.mod, 
depend.name, depend.version);
-                                       if(!_pacman_depmiss_isin(miss, 
baddeps)) {
-                                               baddeps = 
_pacman_list_add(baddeps, miss);
+                                       if (!_pacman_depmiss_isin(miss, 
*baddeps)) {
+                                               *baddeps = 
_pacman_list_add(*baddeps, miss);
} else {
FREE(miss);
}
}
}
}
-               if(op == PM_TRANS_TYPE_UPGRADE) {
+               if (transpkg->type == PM_TRANS_TYPE_UPGRADE) {
/* PM_TRANS_TYPE_UPGRADE handles the backwards dependencies, ie, the packages
* listed in the requiredby field.
*/
pmpkg_t *oldpkg;

if((oldpkg = _pacman_db_get_pkgfromcache(db, pkg_name)) == NULL) {
-                               continue;
+                               return;
}
for(j = _pacman_pkg_getinfo(oldpkg, PM_PKG_REQUIREDBY); j; j = j->next) {
pmtranspkg_t *requiredtranspkg = __pacman_trans_get_trans_pkg (trans, (const 
char *)j->data);
pmpkg_t *p;
-                               int found = 0;

if (requiredtranspkg != NULL &&
requiredtranspkg->type & PM_TRANS_TYPE_ADD) {
/* this package is also in the upgrade list, so don't worry about it */
-                                       continue;
+                                       return;
}

if((p = _pacman_db_get_pkgfromcache(db, j->data)) == NULL) {
/* hmmm... package isn't installed.. */
-                                       continue;
+                                       return;
}

for(k = _pacman_pkg_getinfo(p, PM_PKG_DEPENDS); k; k = k->next) {
/* don't break any existing dependencies (possible provides) */
_pacman_splitdep(k->data, &depend);
-                                       if (_pacman_pkg_is_depend_satisfied 
(oldpkg, &depend) == 0 && _pacman_pkg_is_depend_satisfied (tp, &depend) != 0) {
+                                       if (_pacman_pkg_is_depend_satisfied 
(oldpkg, &depend) == 0 && _pacman_pkg_is_depend_satisfied (transpkg->pkg_new, 
&depend) != 0) {
_pacman_log(PM_LOG_DEBUG, _("checkdeps: updated '%s' won't satisfy a dependency 
of '%s'"),
oldpkg->name, p->name);
miss = _pacman_depmiss_new(p->name, PM_DEP_TYPE_DEPEND, depend.mod,
depend.name, depend.version);
-                                               if(!_pacman_depmiss_isin(miss, 
baddeps)) {
-                                                       baddeps = 
_pacman_list_add(baddeps, miss);
+                                               if (!_pacman_depmiss_isin(miss, 
*baddeps)) {
+                                                       *baddeps = 
_pacman_list_add(*baddeps, miss);
} else {
FREE(miss);
}
@@ -420,9 +415,9 @@ pmlist_t *_pacman_checkdeps(pmtrans_t *trans, unsigned char 
op, pmlist_t *packag
}
}
}
-               if(op == PM_TRANS_TYPE_REMOVE) {
+               if (transpkg->type == PM_TRANS_TYPE_REMOVE) {
/* check requiredby fields */
-                       for(j = _pacman_pkg_getinfo(tp, PM_PKG_REQUIREDBY); j; 
j = j->next) {
+                       for (j = _pacman_pkg_getinfo (transpkg->pkg_local, 
PM_PKG_REQUIREDBY); j; j = j->next) {
pmtranspkg_t *requiredtranspkg = __pacman_trans_get_trans_pkg (trans, (const 
char *)j->data);
int found = 0;

@@ -444,17 +439,37 @@ pmlist_t *_pacman_checkdeps(pmtrans_t *trans, unsigned 
char op, pmlist_t *packag
if(!found) {
_pacman_log(PM_LOG_DEBUG, _("checkdeps: found %s which requires %s"), (char 
*)j->data, pkg_name);
miss = _pacman_depmiss_new (pkg_name, PM_DEP_TYPE_REQUIRED, PM_DEP_MOD_ANY, 
j->data, NULL);
-                                       if (!_pacman_depmiss_isin(miss, 
baddeps)) {
-                                               baddeps = 
_pacman_list_add(baddeps, miss);
+                                       if (!_pacman_depmiss_isin(miss, 
*baddeps)) {
+                                               *baddeps = 
_pacman_list_add(*baddeps, miss);
} else {
FREE(miss);
}
}
}
}
-       }
+       return 0;
+}
+
+/* Returns a pmlist_t* of missing_t pointers.
+ *
+ * dependencies can include versions with depmod operators.
+ */
+pmlist_t *_pacman_checkdeps(pmtrans_t *trans, unsigned char op, pmlist_t 
*packages) {
+       pmlist_t *i, *ret = NULL;

-       return(baddeps);
+       for (i = packages; i; i = i->next) {
+               pmtranspkg_t transpkg;
+               transpkg.type = op;
+               if (op & PM_TRANS_TYPE_ADD) {
+                       transpkg.pkg_new = i->data;
+                       transpkg.pkg_local = 
_pacman_db_get_pkgfromcache(trans->handle->db_local, i->data);
+               } else {
+                       transpkg.pkg_new = NULL;
+                       transpkg.pkg_local = i->data;
+               }
+               _pacman_transpkg_checkdeps(trans, &transpkg, &ret);
+       }
+       return ret;
}

/* return a new pmlist_t target list containing all packages in the original
@@ -529,8 +544,6 @@ void _pacman_removedeps(pmtrans_t *trans)

/* populates *trans with packages that need to be installed to satisfy all
* dependencies (recursive) for syncpkg
- *
- * make sure *trail are already initialized
*/
int _pacman_resolvedeps(pmtrans_t *trans, pmpkg_t *syncpkg, pmlist_t **data)
{
@@ -643,4 +656,19 @@ error:
return(-1);
}

+int _pacman_trans_resolvedeps(pmtrans_t *trans, pmlist_t **data) {
+       pmlist_t *i;
+
+       _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;
+               }
+       }
+       return 0;
+}
+
/* vim: set ts=2 sw=2 noet: */
diff --git a/lib/libpacman/deps.h b/lib/libpacman/deps.h
index 2d1b558..89a1521 100644
--- a/lib/libpacman/deps.h
+++ b/lib/libpacman/deps.h
@@ -53,7 +53,7 @@ void _pacman_sortbydeps(pmtrans_t *trans, int mode);
pmlist_t *_pacman_checkdeps(pmtrans_t *trans, unsigned char op, pmlist_t 
*packages);
int _pacman_splitdep(const char *depstr, pmdepend_t *depend);
void _pacman_removedeps(pmtrans_t *trans);
-int _pacman_resolvedeps(pmtrans_t *trans, pmpkg_t *syncpkg, pmlist_t **data);
+int _pacman_trans_resolvedeps(pmtrans_t *trans, pmlist_t **data);

#endif /* _PACMAN_DEPS_H */

diff --git a/lib/libpacman/trans.c b/lib/libpacman/trans.c
index 064b140..a106cb9 100644
--- a/lib/libpacman/trans.c
+++ b/lib/libpacman/trans.c
@@ -583,14 +583,10 @@ int _pacman_sync_prepare (pmtrans_t *trans, pmlist_t 
**data)
if(!(trans->flags & PM_TRANS_FLAG_NODEPS)) {
/* Resolve targets dependencies */
EVENT(trans, PM_TRANS_EVT_RESOLVEDEPS_START, NULL, NULL);
-               _pacman_log(PM_LOG_FLOW1, _("resolving targets dependencies"));
-               for(i = trans->packages; i; i = i->next) {
-                       pmpkg_t *spkg = ((pmsyncpkg_t *)i->data)->pkg_new;
-                       if (_pacman_resolvedeps (trans, spkg, data) == -1) {
-                               /* pm_errno is set by resolvedeps */
-                               ret = -1;
-                               goto cleanup;
-                       }
+               if (_pacman_trans_resolvedeps (trans, data) == -1) {
+                       /* pm_errno is set by resolvedeps */
+                       ret = -1;
+                       goto cleanup;
}

for (i = trans->_packages; i; i = i->next) {
_______________________________________________
Frugalware-git mailing list
[email protected]
http://frugalware.org/mailman/listinfo/frugalware-git

Reply via email to