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