poldek: poldek/upgrade-dist.c, poldek/libpoldek.sym, poldek/pm/pm....

mis mis at pld-linux.org
Tue Jun 19 22:39:50 CEST 2007


Author: mis                          Date: Tue Jun 19 20:39:50 2007 GMT
Module: poldek                        Tag: HEAD
---- Log message:
- killed pkgdb_map*() functions; upgrade-dist multilib friendly

---- Files affected:
poldek/poldek:
   upgrade-dist.c (1.3 -> 1.4) , libpoldek.sym (1.25 -> 1.26) 
poldek/poldek/pm:
   pm.h (1.18 -> 1.19) , pkgdb.c (1.23 -> 1.24) 

---- Diffs:

================================================================
Index: poldek/poldek/upgrade-dist.c
diff -u poldek/poldek/upgrade-dist.c:1.3 poldek/poldek/upgrade-dist.c:1.4
--- poldek/poldek/upgrade-dist.c:1.3	Sat Jun 16 17:20:04 2007
+++ poldek/poldek/upgrade-dist.c	Tue Jun 19 22:39:45 2007
@@ -46,98 +46,124 @@
 #include "pm/pm.h"
 #include "install/install.h"
 
-struct map_s {
-    tn_array *avpkgs;
-    tn_hash *marked_h;
-    struct poldek_ts *ts;
-    int nmarked;
-};
-
-static
-int mapfn_mark_newer_pkg(const char *n, uint32_t e,
-                         const char *v, const char *r, void *_map_s) 
+int process_pkg(const struct pkg *dbpkg, struct poldek_ts *ts,
+                tn_hash *marked_h, int *nmarked)
 {
-    struct map_s *map_s = _map_s;
-    struct pkg  *pkg, tmpkg;
+    struct pkg *pkg, *tmpkg;
+    char pkgkey[256];
     int i, cmprc;
 
-    memset(&tmpkg, 0, sizeof(tmpkg));
-    tmpkg.name = (char*)n;
-    tmpkg.epoch = e;
-    tmpkg.ver = (char*)v;
-    tmpkg.rel = (char*)r;
-    
-    i = n_array_bsearch_idx_ex(map_s->avpkgs, &tmpkg, (tn_fn_cmp)pkg_cmp_name); 
+    i = n_array_bsearch_idx_ex(ts->ctx->ps->pkgs, dbpkg, (tn_fn_cmp)pkg_cmp_name); 
     if (i < 0) {
-        msg(3, "%-32s not found in repository\n", pkg_snprintf_s(&tmpkg));
+        msgn(3, "%-32s not found in repository", pkg_id(dbpkg));
+        return 1;
+    }
+
+    while (i < n_array_size(ts->ctx->ps->pkgs)) {
+        pkg = n_array_nth(ts->ctx->ps->pkgs, i);
+        
+        if (!ts->getop(ts, POLDEK_OP_MULTILIB))
+            break;
+            
+        if (pkg_is_kind_of(pkg, dbpkg))
+            break;
+
+        i++;
+        pkg = NULL;
+    }
+    
+    if (pkg == NULL) {
+        msgn(3, "%-32s not found in repository", pkg_id(dbpkg));
         return 1;
     }
     
-    pkg = n_array_nth(map_s->avpkgs, i);
-    cmprc = pkg_cmp_evr(pkg, &tmpkg);
-    if (poldek_VERBOSE) {
+    cmprc = pkg_cmp_evr(pkg, dbpkg);
+    if (poldek_VERBOSE > 1) {
         if (cmprc == 0) 
-            msg(3, "%-32s up to date\n", pkg_snprintf_s(&tmpkg));
+            msg(3, "%-32s up to date\n", pkg_id(dbpkg));
         
         else if (cmprc < 0)
-            msg(3, "%-32s newer than repository one\n", pkg_snprintf_s(&tmpkg));
+            msg(3, "%-32s newer than repository one\n", pkg_id(dbpkg));
         
         else 
-            msg(2, "%-32s -> %-30s\n", pkg_snprintf_s(&tmpkg),
-                pkg_id(pkg));
+            msg(2, "%-32s -> %-30s\n", pkg_id(dbpkg), pkg_id(pkg));
     }
 
-    if ((pkg = n_hash_get(map_s->marked_h, tmpkg.name))) {
-        if (pkg_is_marked(map_s->ts->pms, pkg)) {
+    if (ts->getop(ts, POLDEK_OP_MULTILIB))
+        n_snprintf(pkgkey, 250, "%s.%s", dbpkg->name, pkg_arch(dbpkg));
+    else
+        n_snprintf(pkgkey, sizeof(pkgkey), "%s", dbpkg->name);
+
+        
+    if ((tmpkg = n_hash_get(marked_h, pkgkey))) {
+        if (pkg_is_marked(ts->pms, tmpkg)) {
             logn(LOGWARN, _("%s: multiple instances installed, skipped"),
-                 tmpkg.name);
-            pkg_unmark(map_s->ts->pms, pkg);        /* display above once */
-            map_s->nmarked--;
+                 pkg_id(dbpkg));
+            pkg_unmark(ts->pms, tmpkg);        /* display above once */
+            (*nmarked)--;
         }
         return 0;
     }
 
-    pkg = n_array_nth(map_s->avpkgs, i);
     if (cmprc > 0) {
-        if (pkg_is_scored(pkg, PKG_HELD) &&
-            map_s->ts->getop(map_s->ts, POLDEK_OP_HOLD)) {
+        if (pkg_is_scored(pkg, PKG_HELD) && ts->getop(ts, POLDEK_OP_HOLD)) {
             msgn(1, _("%s: skip held package"), pkg_id(pkg));
             
         } else {
-            n_hash_insert(map_s->marked_h, tmpkg.name, pkg);
-            pkg_hand_mark(map_s->ts->pms, pkg);
-            map_s->nmarked++;
+            n_hash_insert(marked_h, pkgkey, pkg);
+            pkg_hand_mark(ts->pms, pkg);
+            (*nmarked)++;
         }
     }
+    
     return 1;
 }
 
 
 int do_poldek_ts_upgrade_dist(struct poldek_ts *ts) 
 {
-    struct map_s map_s;
-
-    map_s.ts = ts;
-    map_s.avpkgs = ts->ctx->ps->pkgs;
-    map_s.marked_h = n_hash_new(512, NULL);
-    map_s.nmarked = 0;
+    //map_s.avpkgs = ts->ctx->ps->pkgs;
+    struct pkgdb_it       it;
+    const struct pm_dbrec *dbrec;
+    tn_hash               *marked_h;
+    int                   nmarked = 0;
     
+    marked_h = n_hash_new(1024, NULL);
     msgn(1, _("Looking up packages for upgrade..."));
-    pkgdb_map_nevr(ts->db, mapfn_mark_newer_pkg, &map_s);
-    n_hash_free(map_s.marked_h);
-    
-#if 0
-    if (upg.ndberrs) {
-        logn(LOGERR, _("There are database errors (?), give up"));
-        destroy_upgrade_s(&upg);
-        return 0;
+
+    pkgdb_it_init(ts->db, &it, PMTAG_RECNO, NULL);
+    while ((dbrec = pkgdb_it_get(&it))) {
+        struct pkg t;
+        char *arch;
+        
+        if (dbrec->hdr == NULL)
+            continue;
+        
+        if (pm_dbrec_nevr(dbrec, &t.name, &t.epoch,
+                          &t.ver, &t.rel, &arch, &t.color)) {
+            struct pkg *pkg;
+            
+            pkg = pkg_new(t.name, t.epoch, t.ver, t.rel, arch, NULL);
+            pkg->color = t.color;
+                                      
+            if (process_pkg(pkg, ts, marked_h, &nmarked) < 0) {
+                pkg_free(pkg);
+                break;
+            }
+            
+            pkg_free(pkg);
+        }
+        
+        if (sigint_reached()) {
+            nmarked = 0;
+            break;
+        }
     }
-#endif
     
-    if (sigint_reached()) 
-        return 0;
+    pkgdb_it_destroy(&it);
+    n_hash_free(marked_h);
 
-    else if (map_s.nmarked == 0)
+    if (nmarked == 0)
         msgn(1, _("Nothing to do"));
 
     return in_do_poldek_ts_install(ts, NULL);

================================================================
Index: poldek/poldek/libpoldek.sym
diff -u poldek/poldek/libpoldek.sym:1.25 poldek/poldek/libpoldek.sym:1.26
--- poldek/poldek/libpoldek.sym:1.25	Sun Aug 20 20:14:58 2006
+++ poldek/poldek/libpoldek.sym	Tue Jun 19 22:39:45 2007
@@ -120,8 +120,6 @@
 pkgdb_it_get
 pkgdb_it_get_count
 pkgdb_it_init
-pkgdb_map
-pkgdb_map_nevr
 pkgdb_match_req
 pkgdb_open
 pkgdb_reopen

================================================================
Index: poldek/poldek/pm/pm.h
diff -u poldek/poldek/pm/pm.h:1.18 poldek/poldek/pm/pm.h:1.19
--- poldek/poldek/pm/pm.h:1.18	Mon Jan  8 18:22:00 2007
+++ poldek/poldek/pm/pm.h	Tue Jun 19 22:39:45 2007
@@ -81,18 +81,6 @@
 int pkgdb_match_req(struct pkgdb *db, const struct capreq *req, int strict,
                     tn_array *excloffs);
 
-int pkgdb_map(struct pkgdb *db,
-              void (*mapfn)(unsigned recno, void *header, void *arg),
-              void *arg);
-
-
-
-int pkgdb_map_nevr(struct pkgdb *db,
-                   int (*mapfn)(const char *name, uint32_t epoch,
-                                const char *ver, const char *rel, void *arg),
-                   void *arg);
-
-
 struct pm_dbrec {
     unsigned  recno;
     void      *hdr;

================================================================
Index: poldek/poldek/pm/pkgdb.c
diff -u poldek/poldek/pm/pkgdb.c:1.23 poldek/poldek/pm/pkgdb.c:1.24
--- poldek/poldek/pm/pkgdb.c:1.23	Sun Aug 20 20:14:58 2006
+++ poldek/poldek/pm/pkgdb.c	Tue Jun 19 22:39:45 2007
@@ -49,7 +49,10 @@
     db->kw = n_hash_new(16, NULL);
     while (key != NULL) {
         void *val = va_arg(ap, void*);
-        n_hash_insert(db->kw, key, val); /* pm module should free val */
+        DBGF("%s %p\n", key, val);
+        
+        if (val)
+            n_hash_insert(db->kw, key, val); /* pm module should free() val */
         key = va_arg(ap, const char*);
     }
     db->_ctx = ctx;
@@ -211,31 +214,6 @@
     return it->_get_count(it);
 }
 
-int pkgdb_map(struct pkgdb *db,
-              void (*mapfn)(unsigned recno, void *header, void *arg),
-              void *arg) 
-{
-    int n = 0;
-    struct pkgdb_it it;
-    const struct pm_dbrec *dbrec;
-
-    pkgdb_it_init(db, &it, PMTAG_RECNO, NULL);
-    while ((dbrec = pkgdb_it_get(&it))) {
-        if (dbrec->hdr) {
-            mapfn(dbrec->recno, dbrec->hdr, arg);
-            n++;
-        }
-
-        if (sigint_reached()) {
-            n = 0;
-            break;
-        }
-    }
-    
-    pkgdb_it_destroy(&it);
-    return n;
-}
-
 int pm_dbrec_nevr(const struct pm_dbrec *dbrec, char **name, int32_t *epoch,
                   char **ver, char **rel, char **arch, int *color)
 {
@@ -244,41 +222,6 @@
                                       arch, color);
 }
 
-int pkgdb_map_nevr(struct pkgdb *db,
-                   int (*mapfn)(const char *name, uint32_t epoch,
-                                 const char *ver, const char *rel, void *arg),
-                   void *arg) 
-{
-    int n = 0;
-    struct pkgdb_it it;
-    const struct pm_dbrec *dbrec;
-
-    pkgdb_it_init(db, &it, PMTAG_RECNO, NULL);
-    while ((dbrec = pkgdb_it_get(&it))) {
-        struct pkg tmpkg;
-        char *arch;
-        
-        if (dbrec->hdr == NULL)
-            continue;
-        
-        n_assert(db->_ctx->mod->hdr_nevr);
-        if (db->_ctx->mod->hdr_nevr(dbrec->hdr, &tmpkg.name, &tmpkg.epoch,
-                                    &tmpkg.ver, &tmpkg.rel, &arch, &tmpkg.color)) {
-            
-            if (mapfn(tmpkg.name, tmpkg.epoch, tmpkg.ver, tmpkg.rel, arg) < 0)
-                break;
-            n++;
-        }
-        
-        if (sigint_reached()) {
-            n = 0;
-            break;
-        }
-    }
-    
-    pkgdb_it_destroy(&it);
-    return n;
-}
 
 /* NOTICE: function doing pkg cmp hdr */
 static 
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/poldek/poldek/upgrade-dist.c?r1=1.3&r2=1.4&f=u
    http://cvs.pld-linux.org/poldek/poldek/libpoldek.sym?r1=1.25&r2=1.26&f=u
    http://cvs.pld-linux.org/poldek/poldek/pm/pm.h?r1=1.18&r2=1.19&f=u
    http://cvs.pld-linux.org/poldek/poldek/pm/pkgdb.c?r1=1.23&r2=1.24&f=u



More information about the pld-cvs-commit mailing list