poldek: poldek/dbpkgset.c, poldek/pkg.c, poldek/pkgfl.c, poldek/pk...

mis mis at pld-linux.org
Sun Aug 20 23:13:25 CEST 2006


Author: mis                          Date: Sun Aug 20 21:13:24 2006 GMT
Module: poldek                        Tag: HEAD
---- Log message:
- pkg_has_path() handle dirindex; bugfixes; rpm4.4.6's dirdeps seems to work

---- Files affected:
poldek/poldek:
   dbpkgset.c (1.11 -> 1.12) , pkg.c (1.110 -> 1.111) , pkgfl.c (1.41 -> 1.42) , pkgset-req.c (1.44 -> 1.45) , pkgset.c (1.88 -> 1.89) 
poldek/poldek/pkgdir:
   pkgdir.h (1.33 -> 1.34) , pkgdir_dirindex.c (1.2 -> 1.3) , pkgdir_dirindex.h (1.1 -> 1.2) 

---- Diffs:

================================================================
Index: poldek/poldek/dbpkgset.c
diff -u poldek/poldek/dbpkgset.c:1.11 poldek/poldek/dbpkgset.c:1.12
--- poldek/poldek/dbpkgset.c:1.11	Sun May 15 17:56:03 2005
+++ poldek/poldek/dbpkgset.c	Sun Aug 20 23:13:19 2006
@@ -106,6 +106,13 @@
         path[PATH_MAX - 1] = '\0';
         n_basedirnam(path, &dirname, &basename);
         n_assert(dirname);
+        
+        if (*dirname == '\0') { /* path = "/foo" */
+            char *tmp;
+            n_strdupap("/", &tmp);
+            dirname = tmp;
+        }
+        
         n_assert(*dirname);
         if (*dirname == '/' && *(dirname + 1) != '\0')
             dirname++;

================================================================
Index: poldek/poldek/pkg.c
diff -u poldek/poldek/pkg.c:1.110 poldek/poldek/pkg.c:1.111
--- poldek/poldek/pkg.c:1.110	Sun Aug 20 20:14:58 2006
+++ poldek/poldek/pkg.c	Sun Aug 20 23:13:19 2006
@@ -727,6 +727,20 @@
 }
 
 
+static int pkg_has_path_dirindex(const struct pkg *pkg,
+                                 const char *dirname, const char *basename)
+{
+    char path[PATH_MAX];
+
+    if (pkg->pkgdir == NULL || pkg->pkgdir->dirindex == NULL)
+        return 0;
+    
+    n_snprintf(path, sizeof(path), "%s%s/%s", *dirname != '/' ? "/" : "",
+               dirname, basename);
+    
+    return pkgdir_dirindex_pkg_has_path(pkg->pkgdir->dirindex, pkg, path);
+}
+    
 int pkg_has_path(const struct pkg *pkg,
                  const char *dirname, const char *basename)
 {
@@ -734,8 +748,8 @@
     int rc = 0;
     
     if (pkg->fl == NULL || n_tuple_size(pkg->fl) == 0)
-        return 0;
-
+        return pkg_has_path_dirindex(pkg, dirname, basename);
+    
     if (*dirname == '/' && *(dirname + 1) != '\0')
         dirname++;
 
@@ -753,7 +767,10 @@
             }
         }
     }
-
+    
+    if (rc == 0)
+        rc = pkg_has_path_dirindex(pkg, dirname, basename);
+    
     return rc;
 }
 

================================================================
Index: poldek/poldek/pkgfl.c
diff -u poldek/poldek/pkgfl.c:1.41 poldek/poldek/pkgfl.c:1.42
--- poldek/poldek/pkgfl.c:1.41	Sun Aug 20 20:14:58 2006
+++ poldek/poldek/pkgfl.c	Sun Aug 20 23:13:19 2006
@@ -653,7 +653,17 @@
             char              dir[PATH_MAX];
             
             if (S_ISDIR(f->mode)) {
-                n_snprintf(dir, sizeof(dir), "%s/%s", flent->dirname, f->basename);
+                if (*flent->dirname != '/')
+                    n_snprintf(dir, sizeof(dir), "%s/%s", flent->dirname,
+                               f->basename);
+                
+                else if (*f->basename == '\0')
+                    n_snprintf(dir, sizeof(dir), "%s", flent->dirname);
+                
+                else
+                    n_snprintf(dir, sizeof(dir), "%s", f->basename);
+
+                DBGF("dir (%s) (%s) -> %s\n", flent->dirname, f->basename, dir);
                 n_hash_insert(oh, dir, NULL);
             }
         }
@@ -661,7 +671,7 @@
     
     n = 0;
     od = n_hash_keys_cp(oh);
-    
+
     if (required) {
         rd = n_array_clone(od);
         
@@ -684,17 +694,21 @@
         n_array_cfree(&od);
     else
         n += n_array_size(od);
-
+           
+    *owned = od;
     
+#if DEVEL    
     if (od) {
-        //for (i = 0; i < n_array_size(od); i++)            
-        //    printf("O %s\n", n_array_nth(od, i));
+        for (i = 0; i < n_array_size(od); i++)            
+            printf("O %s\n", n_array_nth(od, i));
     }
     
     if (rd) {
-        //for (i = 0; i < n_array_size(rd); i++)            
-        //    printf("R %s\n", n_array_nth(rd, i));
+        for (i = 0; i < n_array_size(rd); i++)            
+            printf("R %s\n", n_array_nth(rd, i));
     }
+#endif
+    
     return n;
 }
 

================================================================
Index: poldek/poldek/pkgset-req.c
diff -u poldek/poldek/pkgset-req.c:1.44 poldek/poldek/pkgset-req.c:1.45
--- poldek/poldek/pkgset-req.c:1.44	Sun Aug 20 20:29:52 2006
+++ poldek/poldek/pkgset-req.c	Sun Aug 20 23:13:19 2006
@@ -332,6 +332,7 @@
         } else {                /* n is 0 */
             tn_array *pkgs;
             if ((pkgs = pkgset_search_reqdir(ps, NULL, reqname))) {
+                n = 0;
                 while (n_array_size(pkgs)) {
                     pkgsbuf[n++] = n_array_shift(pkgs);
                     if (n == pkgsbuf_size)
@@ -339,8 +340,10 @@
                 }
                 
                 *npkgs = n;
-                matched = 1;
-                *suspkgs = pkgsbuf;
+                if (n) {
+                    matched = 1;
+                    *suspkgs = pkgsbuf;
+                }
                 n_array_free(pkgs);
             }
         }

================================================================
Index: poldek/poldek/pkgset.c
diff -u poldek/poldek/pkgset.c:1.88 poldek/poldek/pkgset.c:1.89
--- poldek/poldek/pkgset.c:1.88	Sun Aug 20 20:14:58 2006
+++ poldek/poldek/pkgset.c	Sun Aug 20 23:13:19 2006
@@ -532,7 +532,7 @@
                                const char *dir)
 {
     tn_array *tmp = pkgs_array_new(32);
-    int i;
+    int i, pkgs_passsed = 1;
     
         
     for (i=0; i < n_array_size(ps->pkgdirs); i++) {
@@ -544,15 +544,21 @@
         pkgdir_dirindex_get(pkgdir->dirindex, tmp, dir);
     }
 
-    if (pkgs == NULL)
+    if (pkgs == NULL) {
         pkgs = n_array_clone(tmp);
-
+        pkgs_passsed = 0;
+    }
+    
     for (i=0; i < n_array_size(tmp); i++) {
         struct pkg *pkg = n_array_nth(tmp, i);
         if (n_array_bsearch(ps->pkgs, pkg))
             n_array_push(pkgs, pkg_link(pkg));
     }
     n_array_free(tmp);
+
+    if (pkgs_passsed && n_array_size(pkgs) == 0)
+        n_array_cfree(&pkgs);
+    
     return pkgs;
 }
 

================================================================
Index: poldek/poldek/pkgdir/pkgdir.h
diff -u poldek/poldek/pkgdir/pkgdir.h:1.33 poldek/poldek/pkgdir/pkgdir.h:1.34
--- poldek/poldek/pkgdir/pkgdir.h:1.33	Sun Aug 20 20:14:58 2006
+++ poldek/poldek/pkgdir/pkgdir.h	Sun Aug 20 23:13:19 2006
@@ -34,6 +34,10 @@
     const struct pkgdir_dirindex *dirindex,
     const struct pkg *pkg);
 
+extern int pkgdir_dirindex_pkg_has_path(const struct pkgdir_dirindex *dirindex,
+                                        const struct pkg *pkg,
+                                        const char *path);
+
 
 struct pkgdir_module;
 struct pm_ctx;

================================================================
Index: poldek/poldek/pkgdir/pkgdir_dirindex.c
diff -u poldek/poldek/pkgdir/pkgdir_dirindex.c:1.2 poldek/poldek/pkgdir/pkgdir_dirindex.c:1.3
--- poldek/poldek/pkgdir/pkgdir_dirindex.c:1.2	Sun Aug 20 20:25:15 2006
+++ poldek/poldek/pkgdir/pkgdir_dirindex.c	Sun Aug 20 23:13:20 2006
@@ -171,16 +171,16 @@
     //   return;
     
     if (pkgfl_owned_and_required_dirs(flist->fl, &owned, &required) == 0) {
+        DBGF("%s: NULL\n", pkg_id(pkg));
         pkgflist_free(flist);
         return;
     }
-
+    DBGF("%s: %d %d\n", pkg_id(pkg), owned ? n_array_size(owned): -1,
+         required ? n_array_size(required): -1);
+    
     if (owned) {
         for (i=0; i < n_array_size(owned); i++) {
             const char *dir = n_array_nth(owned, i);
-            if (strcmp(dir, "usr/bin") == 0)
-                printf("BIN %s\n", pkg_id(pkg));
-            
             add_to_hash(index, dir, nth);
         }
         n_array_free(owned);
@@ -222,7 +222,9 @@
 
     n_strdupap(path, &tmp);
     dir = n_dirname(tmp);
-    printf("mkdir %s %s\n", path, dir);
+
+    DBGF("mkdir %s %s\n", path, dir);
+    
     if ((lock = vf_lock_mkdir(dir)) == NULL)
         return 0;
 
@@ -263,6 +265,7 @@
 
         n_buf_clean(nbuf);
         nbuf = dirarray_join(nbuf, ids, ":");
+        DBGF("%s %s\n", path,  n_buf_ptr(nbuf));
         
         tndb_put(db, path, strlen(path), n_buf_ptr(nbuf), n_buf_size(nbuf));
     }
@@ -530,12 +533,16 @@
     return dirs;
 }
 
-tn_array *pkgdir_dirindex_get(const struct pkgdir_dirindex *dirindex,
-                              tn_array *pkgs, const char *path)
+static
+int do_pkgdir_dirindex_get(const struct pkgdir_dirindex *dirindex,
+                           tn_array **pkgs_ptr, const struct pkg *pkg,
+                           const char *path)
 {
     const char  **tl, **tl_save;
+    tn_array    *pkgs = NULL;
     char        val[8192];
-    int         n, pkgs_passed = 0;
+    int         n, found;
+    
 #if DEVEL    
     static int  xx = 0;
 #endif    
@@ -543,21 +550,23 @@
     if (*path == '/')
         path++;
     
-    if (!tndb_get_str(dirindex->db, path, val, sizeof(val)))
-        return NULL;
-    
-    if (pkgs)
-        pkgs_passed = 1;
+    if (!tndb_get_str(dirindex->db, path, val, sizeof(val))) {
+        return 0;
+    }
+    DBGF("%s: FOUND\n", path);
     
     tl = tl_save = n_str_tokl_n(val, ":", &n);
     
     if (n) {
-        //if (pkgs == NULL)
-        pkgs = pkgs_array_new(n);
+        if (pkgs_ptr)
+            pkgs = *pkgs_ptr;
+        
+        if (pkgs == NULL)
+            pkgs = pkgs_array_new(n);
 
         while (*tl) {
             const char *id = *tl;
-            struct pkg *pkg;
+            struct pkg *p;
         
             tl++;
 
@@ -565,12 +574,19 @@
                 continue;
         
             id += 2;            /* skipping _KEY_PKGID */
-            pkg = n_hash_get(dirindex->idmap, id);
-            if (pkg)
-                n_array_push(pkgs, pkg);
+            if ((p = n_hash_get(dirindex->idmap, id)) == NULL)
+                continue;
+            
+            if (pkgs) 
+                n_array_push(pkgs, pkg_link(p));
+                
+            else if (p == pkg) {
+                found = 1;
+                break;
+            }
         }
 #if DEVEL        
-        if (0)
+        if (pkgs)
         {
             int i;
             xx++;
@@ -584,9 +600,38 @@
     }
 
     n_str_tokl_free(tl_save);
+
+    if (pkgs_ptr) {
+        *pkgs_ptr = pkgs;
+        found = 1;
+        n_assert(pkgs);
+        n_assert(n_array_size(pkgs));
+    }
+    
+    return found;
+}
+
+tn_array *pkgdir_dirindex_get(const struct pkgdir_dirindex *dirindex,
+                              tn_array *pkgs, const char *path)
+{
+    int pkgs_passsed = 1;
+    
+    if (pkgs == NULL) {
+        pkgs = pkgs_array_new(4);
+        pkgs_passsed = 0;
+    }
     
-    if (!pkgs_passed && pkgs && n_array_size(pkgs) == 0)
+    if (!do_pkgdir_dirindex_get(dirindex, &pkgs, NULL, path) && !pkgs_passsed)
         n_array_cfree(&pkgs);
     
-    return pkgs ? (n_array_size(pkgs) ? pkgs : NULL) : NULL;
+    DBGF("ret %p %d\n", pkgs, pkgs ? n_array_size(pkgs): -1);
+    
+    return pkgs ? (n_array_size(pkgs) ? pkgs : NULL) : NULL;  
+}
+
+int pkgdir_dirindex_pkg_has_path(const struct pkgdir_dirindex *dirindex,
+                                 const struct pkg *pkg, const char *path)
+{
+    DBGF("%s %s\n", pkg_id(pkg), path);
+    return do_pkgdir_dirindex_get(dirindex, NULL, pkg, path);
 }

================================================================
Index: poldek/poldek/pkgdir/pkgdir_dirindex.h
diff -u poldek/poldek/pkgdir/pkgdir_dirindex.h:1.1 poldek/poldek/pkgdir/pkgdir_dirindex.h:1.2
--- poldek/poldek/pkgdir/pkgdir_dirindex.h:1.1	Sun Aug 20 20:14:58 2006
+++ poldek/poldek/pkgdir/pkgdir_dirindex.h	Sun Aug 20 23:13:20 2006
@@ -17,6 +17,9 @@
 /* returns packages having path */
 tn_array *pkgdir_dirindex_get(const struct pkgdir_dirindex *dirindex,
                               tn_array *pkgs, const char *path);
+/* path belongs to pkg? */
+int pkgdir_dirindex_pkg_has_path(const struct pkgdir_dirindex *dirindex,
+                                 const struct pkg *pkg, const char *path);
 
 /* returns directories required by package */
 tn_array *pkgdir_dirindex_get_reqdirs(const struct pkgdir_dirindex *dirindex,
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/poldek/poldek/dbpkgset.c?r1=1.11&r2=1.12&f=u
    http://cvs.pld-linux.org/poldek/poldek/pkg.c?r1=1.110&r2=1.111&f=u
    http://cvs.pld-linux.org/poldek/poldek/pkgfl.c?r1=1.41&r2=1.42&f=u
    http://cvs.pld-linux.org/poldek/poldek/pkgset-req.c?r1=1.44&r2=1.45&f=u
    http://cvs.pld-linux.org/poldek/poldek/pkgset.c?r1=1.88&r2=1.89&f=u
    http://cvs.pld-linux.org/poldek/poldek/pkgdir/pkgdir.h?r1=1.33&r2=1.34&f=u
    http://cvs.pld-linux.org/poldek/poldek/pkgdir/pkgdir_dirindex.c?r1=1.2&r2=1.3&f=u
    http://cvs.pld-linux.org/poldek/poldek/pkgdir/pkgdir_dirindex.h?r1=1.1&r2=1.2&f=u



More information about the pld-cvs-commit mailing list