opkg: using active list to list upgradeable pkgs
authorticktock35 <ticktock35@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>
Mon, 15 Dec 2008 05:34:03 +0000 (05:34 +0000)
committerticktock35 <ticktock35@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358>
Mon, 15 Dec 2008 05:34:03 +0000 (05:34 +0000)
git-svn-id: http://opkg.googlecode.com/svn/trunk@177 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358

libopkg/active_list.c
libopkg/active_list.h
libopkg/opkg.c
libopkg/opkg_cmd.c
libopkg/opkg_upgrade.c
libopkg/opkg_upgrade.h

index 08e1bd7ad72e2bb87fcab6e328d40f6bfc56b24a..e100101d2f69a7642d3ff91db645892e6fc33160 100644 (file)
@@ -18,6 +18,8 @@
 
 #include "active_list.h"
 #include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
 
 
 void active_list_init(struct active_list *ptr) {
@@ -103,3 +105,15 @@ void active_list_add(struct active_list *head, struct active_list *node) {
     list_add_tail(&node->node, &head->node);
     node->depended  = head;
 }
+
+struct active_list * active_list_head_new() {
+    struct active_list * head = calloc(1, sizeof(struct active_list));
+    active_list_init(head);
+    return head;
+}
+
+void active_list_head_delete(struct active_list *head) {
+    active_list_clear(head);
+    free(head);
+}
+
index 262164abac886cdae9f54e1fd051566bd1a137e3..28e909a6c80378c4fba247dd9f74044f90ba6a7e 100644 (file)
@@ -26,6 +26,9 @@ struct active_list {
     struct active_list *depended;
 };
 
+
+struct active_list * active_list_head_new();
+void active_list_head_delete(struct active_list *);
 void active_list_init(struct active_list *ptr);
 void active_list_clear(struct active_list *head);
 void active_list_add_depend(struct active_list *node, struct active_list *depend);
index 857ed7433ff8347180b11fd2fc85c20c65b81a64..28e2c8c656f6ac1747bd9a4f6d0561a80e0f0c63 100644 (file)
@@ -940,8 +940,11 @@ opkg_list_packages (opkg_t *opkg, opkg_package_callback_t callback, void *user_d
 int
 opkg_list_upgradable_packages (opkg_t *opkg, opkg_package_callback_t callback, void *user_data)
 {
-    pkg_vec_t *all;
-    int i;
+    struct active_list *head;
+    struct active_list *node;
+    pkg_t *old=NULL, *new = NULL;
+    static opkg_package_t* package=NULL;
+
 
     opkg_assert (opkg);
     opkg_assert (callback);
@@ -949,23 +952,15 @@ opkg_list_upgradable_packages (opkg_t *opkg, opkg_package_callback_t callback, v
     /* ensure all data is valid */
     pkg_info_preinstall_check (opkg->conf);
 
-    all = opkg_upgrade_all_list_get (opkg->conf);
-    for (i = 0; i < all->len; i++)
-    {
-        pkg_t *old, *new;
-        opkg_package_t *package;
-
-        old = all->pkgs[i];
-
+    head  =  prepare_upgrade_list(opkg->conf);
+    for (node=active_list_next(head, head); node; active_list_next(head,node)) {
+        old = list_entry(node, pkg_t, list);
         new = pkg_hash_fetch_best_installation_candidate_by_name(opkg->conf, old->name, NULL);
-
         package = pkg_clone (new);
         callback (opkg, package, user_data);
         opkg_package_free (package);
     }
-
-    pkg_vec_free (all);
-
+    active_list_head_delete(head);
     return 0;
 }
 
index 56649ea6dfd4808a36dccf484a1b9dabd5cc334f..2bb93727248a7e208a73f58ff8ede3dde6d87fd5 100644 (file)
@@ -786,12 +786,12 @@ static int opkg_list_installed_cmd(opkg_conf_t *conf, int argc, char **argv)
 
 static int opkg_list_upgradable_cmd(opkg_conf_t *conf, int argc, char **argv) 
 {
-    pkg_vec_t *all = opkg_upgrade_all_list_get(conf);
+    struct active_list *head = prepare_upgrade_list(conf);
+    struct active_list *node=NULL;
     pkg_t *_old_pkg, *_new_pkg;
     char *old_v, *new_v;
-    int i;
-    for (i=0;i<all->len;i++) {
-        _old_pkg = all->pkgs[i];
+    for (node = active_list_next(head, head); node;node = active_list_next(head,node)) {
+        _old_pkg = list_entry(node, pkg_t, list);
         _new_pkg = pkg_hash_fetch_best_installation_candidate_by_name(conf, _old_pkg->name, NULL);
         old_v = pkg_version_str_alloc(_old_pkg);
         new_v = pkg_version_str_alloc(_new_pkg);
@@ -800,7 +800,7 @@ static int opkg_list_upgradable_cmd(opkg_conf_t *conf, int argc, char **argv)
         free(old_v);
         free(new_v);
     }
-    pkg_vec_free(all);
+    active_list_head_delete(head);
     return 0;
 }
 
index d01497975aad7425ef5d437f1b6cfe16f51f931a..a837f32c0e6944fb9aa27b566c0bdd2c9d4a7afc 100644 (file)
@@ -78,17 +78,15 @@ int opkg_upgrade_pkg(opkg_conf_t *conf, pkg_t *old)
     return opkg_install_pkg(conf, new,1);
 }
 
-
-
-pkg_vec_t *opkg_upgrade_all_list_get(opkg_conf_t *conf) {
-    pkg_vec_t *all, *ans;
+struct active_list * prepare_upgrade_list (opkg_conf_t *conf) {
+    pkg_vec_t *all;
+    struct active_list * head = active_list_head_new();
     int i;
 
     /* ensure all data is valid */
     pkg_info_preinstall_check (conf);
 
     all = pkg_vec_alloc ();
-    ans = pkg_vec_alloc ();
     pkg_hash_fetch_all_installed (&conf->pkg_hash, all);
     for (i = 0; i < all->len; i++)
     {
@@ -103,9 +101,10 @@ pkg_vec_t *opkg_upgrade_all_list_get(opkg_conf_t *conf) {
 
         cmp = pkg_compare_versions(old, new);
 
-        if ( cmp < 0 )
-            pkg_vec_insert(ans, old);
+        if ( cmp < 0 ) {
+           active_list_add(head, &old->list); 
+        }
     }
     pkg_vec_free (all);
-    return ans;
+    return head;
 }
index 1523ceecc9973effdc8ca273bf9c68e32d2c4e6c..ac4952dd891f0a1fc42fde8028a816290a15c667 100644 (file)
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    General Public License for more details.
 */
+#ifndef OPKG_UPGRADE_H
+#define OPKG_UPGRADE_H
 
+#include "active_list.h"
 int opkg_upgrade_pkg(opkg_conf_t *conf, pkg_t *old);
-pkg_vec_t *opkg_upgrade_all_list_get(opkg_conf_t *conf);
+struct active_list * prepare_upgrade_list (opkg_conf_t *conf);
+
+#endif