libopkg: implement lightweight package listing logic
[oweals/opkg-lede.git] / libopkg / pkg_depends.c
index 6979f14b5af9d2adb1ce05e48acb090505a55ec5..3abdcd38c4436468bed71929c7114ceb3dfacdc9 100644 (file)
@@ -464,20 +464,14 @@ int pkg_replaces(pkg_t * pkg, pkg_t * replacee)
  */
 int pkg_conflicts_abstract(pkg_t * pkg, abstract_pkg_t * conflictee)
 {
-       compound_depend_t *conflicts, *conflict;
-
-       conflicts = pkg_get_ptr(pkg, PKG_CONFLICTS);
+       int i, j;
+       compound_depend_t *conflicts;
 
-       int j;
-       for (conflict = conflicts; conflict->type; conflict++) {
-               int possibility_count = conflict->possibility_count;
-               struct depend **possibilities = conflict->possibilities;
-               for (j = 0; j < possibility_count; j++) {
-                       if (possibilities[j]->pkg == conflictee) {
+       for (conflicts = pkg_get_ptr(pkg, PKG_CONFLICTS), i = 0; conflicts && conflicts[i].type; i++)
+               for (j = 0; j < conflicts[i].possibility_count; j++)
+                       if (conflicts[i].possibilities[j]->pkg == conflictee)
                                return 1;
-                       }
-               }
-       }
+
        return 0;
 }
 
@@ -487,27 +481,16 @@ int pkg_conflicts_abstract(pkg_t * pkg, abstract_pkg_t * conflictee)
  */
 int pkg_conflicts(pkg_t * pkg, pkg_t * conflictee)
 {
-       int j;
-       int possibility_count;
-       struct depend **possibilities;
-       compound_depend_t *conflicts, *conflict;
-       abstract_pkg_t **conflictee_provides, **provider, *possibility;
+       int i, j;
+       compound_depend_t *conflicts;
+       abstract_pkg_t **provider;
 
-       conflicts = pkg_get_ptr(pkg, PKG_CONFLICTS);
-       conflictee_provides = pkg_get_ptr(conflictee, PKG_PROVIDES);
-
-       for (conflict = conflicts; conflict->type; conflict++) {
-               possibility_count = conflict->possibility_count;
-               possibilities = conflict->possibilities;
-               for (j = 0; j < possibility_count; j++) {
-                       possibility = possibilities[j]->pkg;
-                       for (provider = conflictee_provides; provider && *provider; provider++) {
-                               if (possibility == *provider) {
+       for (conflicts = pkg_get_ptr(pkg, PKG_CONFLICTS), i = 0; conflicts && conflicts[i].type; i++)
+               for (j = 0; j < conflicts[i].possibility_count; j++)
+                       for (provider = pkg_get_ptr(conflictee, PKG_PROVIDES); provider && *provider; provider++)
+                               if (conflicts[i].possibilities[j]->pkg == *provider)
                                        return 1;
-                               }
-                       }
-               }
-       }
+
        return 0;
 }
 
@@ -683,9 +666,8 @@ void parse_replacelist(pkg_t *pkg, char *list)
 
        abstract_pkg_vec_insert(ab_pkg->provided_by, ab_pkg);
 
-       for (count = 1, item = strtok_r(list, ", ", &tok);
-            item;
-            count++, item = strtok_r(NULL, ", ", &tok), count++) {
+       for (count = 1, item = strtok_r(list, ", ", &tok); item;
+            count++, item = strtok_r(NULL, ", ", &tok)) {
                tmp = realloc(replaces, sizeof(abstract_pkg_t *) * (count + 1));
 
                if (!tmp)
@@ -707,8 +689,10 @@ void parse_replacelist(pkg_t *pkg, char *list)
                /* if a package pkg both replaces and conflicts old_abpkg,
                 * then add it to the replaced_by vector so that old_abpkg
                 * will be upgraded to ab_pkg automatically */
-               if (pkg_conflicts_abstract(pkg, old_abpkg))
-                       abstract_pkg_vec_insert(old_abpkg->replaced_by, ab_pkg);
+               if (pkg_conflicts_abstract(pkg, old_abpkg)) {
+                       if (!abstract_pkg_vec_contains(old_abpkg->replaced_by, ab_pkg))
+                               abstract_pkg_vec_insert(old_abpkg->replaced_by, ab_pkg);
+               }
 
                replaces = tmp;
                replaces[count - 1] = old_abpkg;