poldek: poldek/pm/mod.h, poldek/pm/pkgdb.c, poldek/pm/pm.h, poldek...

mis mis at pld-linux.org
Thu Jan 31 02:39:19 CET 2008


Author: mis                          Date: Thu Jan 31 01:39:19 2008 GMT
Module: poldek                        Tag: HEAD
---- Log message:
- pset backend: with --justdn upgrade an index only 

---- Files affected:
poldek/poldek/pm:
   mod.h (1.15 -> 1.16) , pkgdb.c (1.27 -> 1.28) , pm.h (1.23 -> 1.24) 
poldek/poldek/pm/pset:
   mod.c (1.8 -> 1.9) , pm_pset.h (1.11 -> 1.12) , pset.c (1.28 -> 1.29) 
poldek/poldek:
   poldek_ts.c (1.71 -> 1.72) 

---- Diffs:

================================================================
Index: poldek/poldek/pm/mod.h
diff -u poldek/poldek/pm/mod.h:1.15 poldek/poldek/pm/mod.h:1.16
--- poldek/poldek/pm/mod.h:1.15	Sat Jul 14 00:33:11 2007
+++ poldek/poldek/pm/mod.h	Thu Jan 31 02:39:14 2008
@@ -36,7 +36,7 @@
                     const char *path, mode_t mode, tn_hash *kw);
     void (*dbclose)(void *dbh);
 
-    void (*dbtxbegin)(void *dbh);
+    void (*dbtxbegin)(void *dbh, struct poldek_ts *ts);
     int  (*dbtxcommit)(void *dbh);
 
     void (*dbfree)(void *dbh);

================================================================
Index: poldek/poldek/pm/pkgdb.c
diff -u poldek/poldek/pm/pkgdb.c:1.27 poldek/poldek/pm/pkgdb.c:1.28
--- poldek/poldek/pm/pkgdb.c:1.27	Wed Jan 23 22:57:12 2008
+++ poldek/poldek/pm/pkgdb.c	Thu Jan 31 02:39:14 2008
@@ -140,11 +140,12 @@
     free(db);
 }
 
-int pkgdb_tx_begin(struct pkgdb *db)
+int pkgdb_tx_begin(struct pkgdb *db, struct poldek_ts *ts)
 {
+    if (db->_txcnt == 0 && db->_ctx->mod->dbtxbegin)
+        db->_ctx->mod->dbtxbegin(db->dbh, ts);
+    
     db->_txcnt++;
-    if (db->_ctx->mod->dbtxbegin)
-        db->_ctx->mod->dbtxbegin(db->dbh);
     return db->_txcnt;
 }
 

================================================================
Index: poldek/poldek/pm/pm.h
diff -u poldek/poldek/pm/pm.h:1.23 poldek/poldek/pm/pm.h:1.24
--- poldek/poldek/pm/pm.h:1.23	Tue Jan 22 10:37:18 2008
+++ poldek/poldek/pm/pm.h	Thu Jan 31 02:39:14 2008
@@ -71,7 +71,7 @@
 void pkgdb_close(struct pkgdb *db);
 void pkgdb_free(struct pkgdb *db);
 
-int pkgdb_tx_begin(struct pkgdb *db);
+int pkgdb_tx_begin(struct pkgdb *db, struct poldek_ts *ts);
 int pkgdb_tx_commit(struct pkgdb *db);
 
 struct poldek_ts;

================================================================
Index: poldek/poldek/pm/pset/mod.c
diff -u poldek/poldek/pm/pset/mod.c:1.8 poldek/poldek/pm/pset/mod.c:1.9
--- poldek/poldek/pm/pset/mod.c:1.8	Sat Jul 14 00:33:11 2007
+++ poldek/poldek/pm/pset/mod.c	Thu Jan 31 02:39:14 2008
@@ -18,10 +18,10 @@
     
     pm_pset_opendb,
     pm_pset_closedb,
-    NULL,
-    pm_pset_commitdb,
+    pm_pset_tx_begin,
+    pm_pset_tx_commit,
     pm_pset_freedb,
-
+    
     pm_pset_db_it_init,
     
     NULL,

================================================================
Index: poldek/poldek/pm/pset/pm_pset.h
diff -u poldek/poldek/pm/pset/pm_pset.h:1.11 poldek/poldek/pm/pset/pm_pset.h:1.12
--- poldek/poldek/pm/pset/pm_pset.h:1.11	Sat Jul 14 00:33:11 2007
+++ poldek/poldek/pm/pset/pm_pset.h	Thu Jan 31 02:39:14 2008
@@ -28,7 +28,8 @@
 void pm_pset_closedb(void *dbh);
 void pm_pset_freedb(void *dbh);
 
-int pm_pset_commitdb(void *dbh);
+void pm_pset_tx_begin(void *dbh, struct poldek_ts *ts);
+int pm_pset_tx_commit(void *dbh);
 
 int pm_pset_db_it_init(struct pkgdb_it *it, int tag, const char *arg);
 

================================================================
Index: poldek/poldek/pm/pset/pset.c
diff -u poldek/poldek/pm/pset/pset.c:1.28 poldek/poldek/pm/pset/pset.c:1.29
--- poldek/poldek/pm/pset/pset.c:1.28	Sun Jan 27 15:09:53 2008
+++ poldek/poldek/pm/pset/pset.c	Thu Jan 31 02:39:14 2008
@@ -61,13 +61,14 @@
 
 
 struct pm_psetdb {
-    struct pkgset  *ps;
-    char           *tsdir;       /* transaction temp directory */
-    tn_array       *pkgs_added;
-    tn_array       *paths_added;
-    tn_array       *paths_removed;
-    int            _recno;
-    struct pm_pset *pm;
+    struct poldek_ts *ts;
+    struct pkgset    *ps;
+    char             *tsdir;       /* transaction temp directory */
+    tn_array         *pkgs_added;
+    tn_array         *paths_added;
+    tn_array         *paths_removed;
+    int              _recno;
+    struct pm_pset   *pm;
 };
 
 void *pm_pset_init(void) 
@@ -210,6 +211,7 @@
 
     pkgset_setup(ps, PSET_VRFY_MERCY);
     db = n_malloc(sizeof(*db));
+    db->ts = NULL;
     db->ps = ps;
     db->pkgs_added = pkgs_array_new(32);
     db->paths_added = n_array_new(32, free, NULL);
@@ -359,7 +361,7 @@
     return ec == 0;
 }
 
-/* remeber! don't touch any member */
+/* remember! don't touch any member */
 struct psetdb_it {
     int                  tag;
     int                  i;
@@ -574,31 +576,37 @@
     return arr;
 }
 
+static char *mktsdir(const char *cachedir)
+{
+    char tsdir[PATH_MAX];
+    n_snprintf(tsdir, sizeof(tsdir), "%s/tsXXXXXX", cachedir);
+    
+#ifdef HAVE_MKDTEMP
+    if (mkdtemp(tsdir) == NULL) {
+        logn(LOGERR, "mkdtemp %s: %m", tsdir);
+        return NULL;
+    }
+#else
+#error "mkdtemp is needed"        
+#endif        
+
+    return n_strdup(tsdir);
+}
+
 static int do_pkgtslink(struct pm_psetdb *db, const char *cachedir,
                          struct pkg *pkg, const char *pkgpath)
 {
     char tspath[PATH_MAX];
     
     if (db->tsdir == NULL) {
-        char tsdir[PATH_MAX];
-        n_snprintf(tsdir, sizeof(tsdir), "%s/tsXXXXXX", cachedir);
-#ifdef HAVE_MKDTEMP
-        if (mkdtemp(tsdir) == NULL) {
-            logn(LOGERR, "mkdtemp %s: %m", tsdir);
+        if ((db->tsdir = mktsdir(cachedir)) == NULL)
             return 0;
-        }
-#else
-#error "mkdtemp is needed"        
-#endif        
-        db->tsdir = n_strdup(tsdir);
     }
-    
     n_snprintf(tspath, sizeof(tspath), "%s/%s", db->tsdir, n_basenam(pkgpath));
 
-
     if (pkg_file_url_type(pkg) == VFURL_PATH) {
         if (symlink(pkgpath, tspath) != 0) {
-            logn(LOGERR, "%s: symlink failed: %m\n", pkgpath);
+            logn(LOGERR, "%s: symlink failed: %m", pkgpath);
             return 0;
         }
     } else {
@@ -607,6 +615,7 @@
                 return 0;
         }
     }
+
     n_array_push(db->paths_added, n_strdup(tspath));
     return 1;
 }
@@ -707,9 +716,6 @@
         tmp = n_array_bsearch(pkgdir->pkgs, pkg);
         DBGF("after in %p(%p) %s\n", pkg, tmp, pkg_snprintf_s(pkg));
             
-        if (ts->getop(ts, POLDEK_OP_JUSTDB))
-            continue;
-        
         if (!do_pkgtslink(db, ts->cachedir, pkg, path))
             return 0;
         
@@ -756,24 +762,35 @@
             pkgdir_remove_package(pkgdir, tmp);
 
             DBGF("un %p(%p) %s\n", pkg, tmp, pkg_snprintf_s(pkg));
-            if (ts->getop(ts, POLDEK_OP_JUSTDB))
-                continue;
-            n_array_push(db->paths_removed, n_strdup(path));
             
+            n_array_push(db->paths_removed, n_strdup(path));
             msgn(2, "Removing %s", path);
         }
     }
     return 1;
 }
 
+void pm_pset_tx_begin(void *dbh, struct poldek_ts *ts) 
+{
+    struct pm_psetdb *db = dbh;
+
+    n_assert(db->ts == NULL);
+    db->ts = ts;
+}
+
+
 /* TODO: transaction like behaviour */
-int pm_pset_commitdb(void *dbh) 
+int pm_pset_tx_commit(void *dbh) 
 {
     struct pm_psetdb *db = dbh;
+    struct poldek_ts *ts = db->ts;
     struct pkgdir *pkgdir;
     char dstpath[PATH_MAX];
     int i, rc = 1, nchanges;
 
+    n_assert(db->ts);
+    db->ts = NULL;
+    
     nchanges = n_array_size(db->paths_removed) + n_array_size(db->paths_added);
     if (nchanges == 0)
         return 1;
@@ -782,39 +799,57 @@
     n_assert(n_array_size(db->ps->pkgdirs) == 1);
     pkgdir = n_array_nth(db->ps->pkgdirs, 0);
     msgn(0, "Operating on %s", pkgdir->path);
+
     for (i=0; i < n_array_size(db->paths_removed); i++) {
         const char *path = n_array_nth(db->paths_removed, i);
+        
+        msgn_f(0, "%%add %s", n_basenam(path));
         msgn_f(0, "%%rm %s\n", path);
         msgn_tty(1, "rm %s\n", path);
-        if (unlink(path) == 0) {
-            nchanges++;
-            
-        } else {
-            logn(LOGERR, "%s: unlink failed: %m", path);
-            rc = 0;
-            break;
+        
+        if (!ts->getop(ts, POLDEK_OP_JUSTDB)) {
+            if (unlink(path) != 0) {
+                logn(LOGERR, "%s: unlink failed: %m", path);
+                rc = 0;
+                break;
+            }
         }
+        nchanges++;
     }
 
     if (rc) {
         for (i=0; i < n_array_size(db->paths_added); i++) {
             const char *path = n_array_nth(db->paths_added, i);
-            n_snprintf(dstpath, sizeof(dstpath), "%s%s", pkgdir->path,
-                       n_basenam(path));
+            int n;
+            
+            n = n_snprintf(dstpath, sizeof(dstpath), "%s", pkgdir->path);
+            n_snprintf(&dstpath[n], sizeof(dstpath) - n, "%s%s",
+                       dstpath[n-1] == '/' ? "":"/", n_basenam(path));
+
+            msgn_f(0, "%%del %s", n_basenam(path));
             msgn_f(0, "%%cp %s %s\n", path, dstpath);
             msgn_tty(1, "cp %s %s\n", n_basenam(path), dstpath);
-            if (!do_cp(path, dstpath)) {
-                rc = 0;
-                break;
+            
+            if (!ts->getop(ts, POLDEK_OP_JUSTDB)) {
+                if (!do_cp(path, dstpath)) {
+                    rc = 0;
+                    break;
+                }
+                unlink(path);
             }
-            unlink(path);
             nchanges++;
         }
     }
     
-    if (nchanges && rc && pkgdir_type_info(pkgdir->type) & PKGDIR_CAP_SAVEABLE)
+    if (nchanges == 0 || !rc)
+        return rc;
+    
+    if (pkgdir_type_info(pkgdir->type) & PKGDIR_CAP_SAVEABLE)
         rc = pkgdir_save(pkgdir, 0);
     
+    else if (ts->getop(ts, POLDEK_OP_JUSTDB))
+        logn(LOGWARN, "--justdb makes no sense for non-db repository");
+    
     return rc;
 }
 

================================================================
Index: poldek/poldek/poldek_ts.c
diff -u poldek/poldek/poldek_ts.c:1.71 poldek/poldek/poldek_ts.c:1.72
--- poldek/poldek/poldek_ts.c:1.71	Sun Jan 27 17:01:55 2008
+++ poldek/poldek/poldek_ts.c	Thu Jan 31 02:39:14 2008
@@ -928,7 +928,7 @@
     if (ts->db == NULL)
         return 0;
 
-    pkgdb_tx_begin(ts->db);
+    pkgdb_tx_begin(ts->db, ts);
     rc = do_poldek_ts_upgrade_dist(ts);
     if (rc && !ts->getop(ts, POLDEK_OP_RPMTEST))
         pkgdb_tx_commit(ts->db);
@@ -964,7 +964,7 @@
     if (ts->db == NULL)
         return 0;
     
-    pkgdb_tx_begin(ts->db);
+    pkgdb_tx_begin(ts->db, ts);
     DBGF("0 arg_packages_size=%d\n", arg_packages_size(ts->aps));
 
     if (ts->ctx->_depsolver == 3) { /* hope, soon */
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/pm/mod.h?r1=1.15&r2=1.16&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/pm/pkgdb.c?r1=1.27&r2=1.28&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/pm/pm.h?r1=1.23&r2=1.24&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/pm/pset/mod.c?r1=1.8&r2=1.9&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/pm/pset/pm_pset.h?r1=1.11&r2=1.12&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/pm/pset/pset.c?r1=1.28&r2=1.29&f=u
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/poldek/poldek/poldek_ts.c?r1=1.71&r2=1.72&f=u



More information about the pld-cvs-commit mailing list