[Uludag-commits] r15245 - in branches/pisi-db/pisi: . cli db

uludag-commits at pardus.org.tr uludag-commits at pardus.org.tr
1 Eyl 2007 Cmt 16:59:28 EEST


Author: faik
Date: Sat Sep  1 16:59:27 2007
New Revision: 15245

Modified:
   branches/pisi-db/pisi/api.py
   branches/pisi-db/pisi/atomicoperations.py
   branches/pisi-db/pisi/cli/commands.py
   branches/pisi-db/pisi/db/filesdb.py
Log:
cleanup rebuild-db

Delete most of the rebuild-db code. We only have filesdb as a conventional db.
Also this db file decreased in size from 120MB to 40MB by only holding
(path, pkg_name) as a key, value pair. Previous db code was holding the fileinfo
object, which can easily be taken from installdb.get_files(pkg) code if more
information is needed.

Filesdb is only for searching a path and pkg_name correlation. Unfortunately
this db is currently needed as some code in pisi - file conflict - needs
a fast has_file function. We could have not used this db and search linear
through the files.xml s like other package managers.

"The good thing about not having a db is not having a db" ...

So we currently need rebuild-db crap for recreating a filesdb. Rebuild-db
is bad because every bug of pisi is been tried to solved with this command.
If we can get rid of this, we can fix the real bugs.. but we are close..


Modified: branches/pisi-db/pisi/api.py
=================================================================
--- branches/pisi-db/pisi/api.py	(original)
+++ branches/pisi-db/pisi/api.py	Sat Sep  1 16:59:27 2007
@@ -446,60 +446,14 @@
 
 def rebuild_db(files=False):
 
-    assert not ctx.database
+    def rebuild_filesdb():
+        for pkg in list_installed():
+            ctx.ui.info(_('* Adding \'%s\' to db... ') % pkg, noln=True)
+            files = ctx.installdb.get_files(pkg)
+            ctx.filesdb.add_files(pkg, files)
+            ctx.ui.info(_('OK.'))
 
-    # Bug 2596
-    # finds and cleans duplicate package directories under '/var/lib/pisi/package'
-    # deletes the _older_ versioned package directories.
-    def clean_duplicates():
-        i_version = {} # installed versions
-        replica = []
-        for pkg in os.listdir(pisi.util.join_path(pisi.api.ctx.config.lib_dir(), 'package')):
-            (name, ver) = pisi.util.parse_package_name(pkg)
-            if i_version.has_key(name):
-                if pisi.version.Version(ver) > pisi.version.Version(i_version[name]):
-                    # found a greater version, older one is a replica
-                    replica.append(name + '-' + i_version[name])
-                    i_version[name] = ver
-                else:
-                    # found an older version which is a replica
-                    replica.append(name + '-' + ver)
-            else:
-                i_version[name] = ver
-
-        for pkg in replica:
-            pisi.util.clean_dir(pisi.util.join_path(pisi.api.ctx.config.lib_dir(), 'package', pkg))
-
-    def reload_packages(files):
-        packages = os.listdir(pisi.util.join_path(ctx.config.lib_dir(), 'package'))
-        progress = ctx.ui.Progress(len(packages))
-        processed = 0
-        for package_fn in packages:
-            if not package_fn == "scripts":
-                ctx.ui.debug('Resurrecting %s' % package_fn)
-                pisi.api.resurrect_package(package_fn, files)
-                processed += 1
-                ctx.ui.display_progress(operation = "rebuilding-db",
-                                        percent = progress.update(processed),
-                                        info = _("Rebuilding package database"))
-
-    def reload_indices():
-        index_dir = ctx.config.index_dir()
-        if os.path.exists(index_dir):  # it may have been erased, or we may be upgrading from a previous version -- exa
-            for repo in os.listdir(index_dir):
-                indexuri = pisi.util.join_path(ctx.config.lib_dir(), 'index', repo, 'uri')
-                indexuri = open(indexuri, 'r').readline()
-                pisi.api.add_repo(repo, indexuri)
-                pisi.api.rebuild_repo(repo)
-
-    # check db schema versions
-    try:
-        shelve.check_dbversion('filesdbversion', pisi.__filesdbversion__, write=False)
-    except KeyboardInterrupt:
-        raise
-    except Exception: #FIXME: what exception could we catch here, replace with that.
-        files = True # exception means the files db version was wrong
-    shelve.init_dbenv(write=True, writeversion=True)
+    ctx.filesdb.destroy()
 
     # save parameters and shutdown pisi
     options = ctx.config.options
@@ -509,9 +463,7 @@
 
     # construct new database
     init(database=True, options=options, ui=ui, comar=comar)
-    clean_duplicates()
-    reload_packages(files)
-    reload_indices()
+    rebuild_filesdb()
 
 ############# FIXME: this was a quick fix. ##############################
 
@@ -560,9 +512,6 @@
 def build(*args, **kw):
     return pisi.atomicoperations.build(*args, **kw)
 
-def resurrect_package(*args, **kw):
-    return pisi.atomicoperations.resurrect_package(*args, **kw)
-
 ########################################################################
 
 ## Deletes the cached pisi packages to keep the package cache dir within cache limits

Modified: branches/pisi-db/pisi/atomicoperations.py
=================================================================
--- branches/pisi-db/pisi/atomicoperations.py	(original)
+++ branches/pisi-db/pisi/atomicoperations.py	Sat Sep  1 16:59:27 2007
@@ -550,56 +550,3 @@
     # wrapper for build op
     import pisi.build
     return pisi.build.build(package)
-
-def virtual_install(metadata, files):
-    """Recreate the package info for rebuilddb command"""
-    # installdb
-    ctx.installdb.install(metadata.package.name,
-                          metadata.package.version,
-                          metadata.package.release,
-                          metadata.package.build,
-                          metadata.package.distribution,
-                          rebuild=True)
-
-    # filesdb
-    if files:
-        ctx.filesdb.add_files(metadata.package.name, files)
-
-    # installed packages
-    ctx.installdb.add_package(metadata.package)
-
-def resurrect_package(package_fn, write_files):
-    """Resurrect the package from xml files"""
-
-    metadata_xml = util.join_path(ctx.config.lib_dir(), 'package',
-                                  package_fn, ctx.const.metadata_xml)
-    if not os.path.exists(metadata_xml):
-        raise Error, _("Metadata XML '%s' cannot be found") % metadata_xml
-
-    metadata = pisi.metadata.MetaData()
-    metadata.read(metadata_xml)
-
-    errs = metadata.errors()
-    if errs:
-        util.print_errors(errs)
-        raise Error, _("MetaData format wrong (%s)") % package_fn
-
-    ctx.ui.info(_('* Adding \'%s\' to db... ') % (metadata.package.name), noln=True)
-
-    if write_files:
-        files_xml = util.join_path(ctx.config.lib_dir(), 'package',
-                                package_fn, ctx.const.files_xml)
-        if not os.path.exists(files_xml):
-            raise Error, _("Files XML '%s' cannot be found") % files_xml
-
-        files = pisi.files.Files()
-        files.read(files_xml)
-        if files.errors():
-            raise Error, _("Invalid %s") % ctx.const.files_xml
-    else:
-        files = None
-
-    #import pisi.atomicoperations
-    pisi.atomicoperations.virtual_install(metadata, files)
-
-    ctx.ui.info(_('OK.'))

Modified: branches/pisi-db/pisi/cli/commands.py
=================================================================
--- branches/pisi-db/pisi/cli/commands.py	(original)
+++ branches/pisi-db/pisi/cli/commands.py	Sat Sep  1 16:59:27 2007
@@ -1183,15 +1183,9 @@
         self.parser.add_option_group(group)
 
     def run(self):
-        if self.args:
-            self.init(database=True)
-            for package_fn in self.args:
-                pisi.api.resurrect_package(package_fn, ctx.get_option('files`'))
-        else:
-            self.init(database=False)
-            if ctx.ui.confirm(_('Rebuild PiSi databases?')):
-                pisi.api.rebuild_db(ctx.get_option('files'))
-
+        self.init(database=True)
+        if ctx.ui.confirm(_('Rebuild PiSi databases?')):
+            pisi.api.rebuild_db(ctx.get_option('files'))
         self.finalize()
 
 

Modified: branches/pisi-db/pisi/db/filesdb.py
=================================================================
--- branches/pisi-db/pisi/db/filesdb.py	(original)
+++ branches/pisi-db/pisi/db/filesdb.py	Sat Sep  1 16:59:27 2007
@@ -41,14 +41,19 @@
 
         self.__check_filesdb()
 
-        for f in files:
-            self.filesdb[f] = pkg
+        for f in files.list:
+            self.filesdb[f.path] = pkg
 
     def remove_files(self, pkg, files):
         for f in files:
             if self.filesdb.has_key(f):
                 del self.filesdb[f]
 
+    def destroy(self):
+        files_db = os.path.join(ctx.config.lib_dir(), ctx.const.info_dir, ctx.const.files_db)
+        if os.path.exists(files_db):
+            os.unlink(files_db)
+    
     def close(self):
         if isinstance(self.filesdb, shelve.DbfilenameShelf):
             self.filesdb.close()
@@ -64,11 +69,10 @@
         files_db = os.path.join(ctx.config.lib_dir(), ctx.const.info_dir, ctx.const.files_db)
 
         if not os.path.exists(files_db):
-            flag = "c"
+            flag = "n"
         elif os.access(files_db, os.W_OK):
             flag = "w"
         else:
             flag = "r"
 
         self.filesdb = shelve.open(files_db, flag)
-        


Uludag-commits mesaj listesiyle ilgili daha fazla bilgi