On Mon, May 15, 2006 at 06:48:04AM +1000, Graham Williams wrote:
> Received Sat 13 May 2006  5:51am +1000 from Michael Vogt:
> > I looked into wajigs code and it turns out that the problem is that
> > the latest apt uses MMap inside the pkgTagFile that is used on a pipe
> > from wajig. This obviously does no longer work. I'll investigate what
> > can be done about it. See #350025 for the rational of that change. 
> > 
> > There are better (and faster) ways in python-apt nowdays to read the
> > description for packages btw (no need to pipe from apt-cache
> > dumpavail). 
[..]
> Looks a bit of a problem with the new apt.  I've not had a look at the
> newer python-apt, so any specific pointers are most welcome!

I was not aware that the pkgTagFile code was used on things like
pipes, otherwise I would have not done the mmap modification in
libapt. If more applications use it this way (and break because of
it), I'll revert it.

I attach a patch that switches a bit of wajig to use more recent
python-apt code. This is only a example and should not go "as-is" into
wajig. But it is (hopefully) enough to give you a idea how things work
in newer python-apt. The apt cache needs to be put in a more central
place probably because rebuilding it is expensive. You can easily add
(pre-done) progress with apt.progress.OpTextProgress when the cache is
opened. See /usr/share/doc/python-apt/examples for more examples.

I'm happy to help with python-apt if you have questions (mail, irc
whatever you want).


Cheers,
 Michael

-- 
Linux is not The Answer. Yes is the answer. Linux is The Question. - Neo
=== modified file 'src/commands.py'
--- src/commands.py     
+++ src/commands.py     
@@ -35,6 +35,7 @@
 #
 # APT module
 #
+import apt
 import apt_pkg
 
 #
@@ -204,22 +205,15 @@
         packages = package_names
     else:
         return
-    command = "apt-cache dumpavail"
-    packages_pipe = perform.execute(command, noquiet=True, pipe=True)
-    avail = apt_pkg.ParseTagFile(packages_pipe)
-    #
-    # Record the descriptions
-    #
+
     describe_list = {}
-    #
-    # Check for information in the Available list
-    #
-    while avail.Step():
-        if (avail.Section.get("Package") in packages):
-            package_name = avail.Section.get("Package")
-            package_description = avail.Section.get("Description")
-            if not describe_list.has_key(package_name):
-                describe_list[package_name] = package_description
+    # mvo: its probably a good idea to keep the cache around in all of wajig
+    #      because getting it may be expensive
+    cache = apt.Cache()
+    for pkgname in packages:
+        if cache.has_key(pkgname):
+            describe_list[pkgname] = cache[pkgname].description
+    
     #
     # Print out the one line descriptions. Should it be sorted?
     # If not sorted it should be same order as on the command line.
@@ -251,7 +245,8 @@
 #                       "| head -1 | cut -d' ' -f2- "
 #        command += ") | sort"
 #        perform.execute(command)
-        
+
+        # mvo: apt.Package.summary may be helpful here
         for pkg in pkgs:
             # Only print that first line, but check that there
             # is a description available.
@@ -268,9 +263,19 @@
         # TODO is there a way of doing this using apt_pkg easily?
         # Otherwise "apt-cache show" seems okay if a little slower.
         #
-        package_names = perform.concat(packages)
-        command = "apt-cache show " + package_names
-        perform.execute(command)
+        #package_names = perform.concat(packages)
+        #command = "apt-cache show " + package_names
+        #perform.execute(command)
+        for pkgname in filter(lambda pkgname: cache.has_key(pkgname), 
packages):
+            pkg = cache[pkgname]
+            for ver in pkg._pkg.VersionList:
+                if ver == None or ver.FileList == None:
+                    print "no ver or ver.FileList"
+                    continue
+                f, index = ver.FileList.pop(0)
+                cache._records.Lookup((f,index))
+                print cache._records.Record
+
 
 #------------------------------------------------------------------------
 #

Reply via email to