]> git.decadent.org.uk Git - dak.git/blobdiff - rene
sync
[dak.git] / rene
diff --git a/rene b/rene
index 52d0ee1c1d5a4cc9562f6f969ad6ed2bbbac3205..04d89a5cb1cb623fbe47679a732b599859ee391f 100755 (executable)
--- a/rene
+++ b/rene
@@ -2,7 +2,7 @@
 
 # Check for obsolete binary packages
 # Copyright (C) 2000, 2001  James Troup <james@nocrew.org>
-# $Id: rene,v 1.3 2001-04-13 20:17:35 troup Exp $
+# $Id: rene,v 1.7 2001-07-25 15:51:15 troup Exp $
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -33,66 +33,6 @@ import apt_pkg;
 Cnf = None;
 projectB = None;
 
-def bar():
-
-    suite = "unstable";
-    suite_id = db_access.get_suite_id(suite);
-
-    components = Cnf.SubTree("Suite::%s::Components" % (suite)).List();
-    for component in components:
-        filename = "%s/dists/%s/%s/source/Sources.gz" % (Cnf["Dir::RootDir"], suite, component);
-        print "Processing %s..." % (filename);
-        # apt_pkg.ParseTagFile needs a real file handle and can't handle a GzipFile instance...
-        temp_filename = tempfile.mktemp();
-        fd = os.open(temp_filename, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0700);
-        os.close(fd);
-        (result, output) = commands.getstatusoutput("gunzip -c %s > %s" % (filename, temp_filename));
-        if (result != 0):
-            sys.stderr.write("Gunzip invocation failed!\n%s\n" % (output));
-            sys.exit(result);
-        sources = utils.open_file(temp_filename, 'r');
-        Sources = apt_pkg.ParseTagFile(sources);
-        while Sources.Step():
-            source = Sources.Section.Find('Package');
-            architecture = Sources.Section.Find('Architecture');
-            if architecture == "any" or architecture == "all":
-                continue;
-            architectures = {};
-            for arch in string.split(architecture):
-                architectures[string.strip(arch)] = "";
-            binaries = Sources.Section.Find('Binary');
-            for binary in string.split(binaries, ','):
-                binary = string.strip(binary);
-                q = projectB.query("SELECT a.arch_string, b.version FROM binaries b, bin_associations ba, architecture a WHERE ba.suite = %s AND ba.bin = b.id AND b.architecture = a.id AND b.package = '%s'" % (suite_id, binary));
-                ql = q.getresult();
-                if ql == []:
-                    utils.warn("%s lists %s as a binary, but it doesn't seem to exist in %s?" % (source, binary, suite));
-                # Loop around twice; first to get the latest 'valid' version
-                versions = [];
-                for i in q.getresult():
-                    arch = i[0];
-                    version = i[1];
-                    if architectures.has_key(arch):
-                        versions.append(version);
-                versions.sort(apt_pkg.VersionCompare);
-                if versions != []:
-                    latest_version = versions.pop()
-                else:
-                    latest_version = None;
-                # ... then to check for 'invalid' architectures
-                for i in q.getresult():
-                    arch = i[0];
-                    version = i[1];
-                    if not architectures.has_key(arch):
-                        print "[%s]: %s appears for %s (vs. '%s')" % (source, binary, arch, architecture),
-                        if apt_pkg.VersionCompare(latest_version, version) != -1:
-                            print "- out of date.", 
-                        else:
-                            print "- current.",
-                        print "[%s vs %s (%s)]" % (latest_version, version, arch);
-        sources.close();
-        os.unlink(temp_filename);
-
 ################################################################################
 
 def main ():
@@ -120,11 +60,11 @@ def main ():
     source_binaries = {};
 
     suite = "unstable";
+    suite_id = db_access.get_suite_id(suite);
 
     components = Cnf.SubTree("Suite::%s::Components" % (suite)).List();
     for component in components:
         filename = "%s/dists/%s/%s/source/Sources.gz" % (Cnf["Dir::RootDir"], suite, component);
-        print "Processing %s..." % (filename);
         # apt_pkg.ParseTagFile needs a real file handle and can't handle a GzipFile instance...
         temp_filename = tempfile.mktemp();
         fd = os.open(temp_filename, os.O_RDWR|os.O_CREAT|os.O_EXCL, 0700);
@@ -137,17 +77,59 @@ def main ():
         Sources = apt_pkg.ParseTagFile(sources);
         while Sources.Step():
             source = Sources.Section.Find('Package');
+            architecture = Sources.Section.Find('Architecture');
+            binaries = Sources.Section.Find('Binary');
+
+            # Check for packages built on architectures they shouldn't be.
+            if architecture != "any" and architecture != "all":
+                architectures = {};
+                for arch in string.split(architecture):
+                    architectures[string.strip(arch)] = "";
+                for binary in string.split(binaries, ','):
+                    binary = string.strip(binary);
+                    q = projectB.query("SELECT a.arch_string, b.version FROM binaries b, bin_associations ba, architecture a WHERE ba.suite = %s AND ba.bin = b.id AND b.architecture = a.id AND b.package = '%s'" % (suite_id, binary));
+                    ql = q.getresult();
+                    if ql == []:
+                        utils.warn("%s lists %s as a binary, but it doesn't seem to exist in %s?" % (source, binary, suite));
+                    # Loop around twice; first to get the latest 'valid' version
+                    versions = [];
+                    for i in q.getresult():
+                        arch = i[0];
+                        version = i[1];
+                        if architectures.has_key(arch):
+                            versions.append(version);
+                    versions.sort(apt_pkg.VersionCompare);
+                    if versions != []:
+                        latest_version = versions.pop()
+                    else:
+                        latest_version = None;
+                    # ... then to check for 'invalid' architectures
+                    for i in q.getresult():
+                        arch = i[0];
+                        version = i[1];
+                        if not architectures.has_key(arch):
+                            print "[%s]: %s appears for %s (vs. '%s')" % (source, binary, arch, architecture),
+                            if not latest_version:
+                                print "** mwaap, mwapp!  Ignore me **";
+                                continue;
+                            if apt_pkg.VersionCompare(latest_version, version) != -1:
+                                print "- out of date.", 
+                            else:
+                                print "- current.",
+                            print "[%s vs %s (%s)]" % (latest_version, version, arch);
+            
+            # Check for duplicated packages and build indices for checking "no source" later
             source_index = component + '/' + source;
             if src_pkgs.has_key(source):
                 print " %s is a duplicated source package (%s and %s)" % (source, source_index, src_pkgs[source]);
             src_pkgs[source] = source_index;
-            binaries = Sources.Section.Find('Binary');
             for binary in string.split(binaries, ','):
                 binary = string.strip(binary);
                 if bin_pkgs.has_key(binary):
                     print " %s is duplicated in %s and %s" % (binary, source, bin_pkgs[binary]);
                 bin_pkgs[binary] = source;
             source_binaries[source] = binaries;
+
         sources.close();
         os.unlink(temp_filename);
 
@@ -157,7 +139,6 @@ def main ():
             if [ "source", "all" ].count(architecture) != 0:
                 continue;
             filename = "%s/dists/%s/%s/binary-%s/Packages" % (Cnf["Dir::RootDir"], suite, component, architecture);
-            print "Processing %s..." % (filename);
             packages = utils.open_file(filename, 'r');
             Packages = apt_pkg.ParseTagFile(packages);
             while Packages.Step():
@@ -173,6 +154,22 @@ def main ():
                     print " %s has no source [%s: %s]" % (package, source, source_binaries.get(source, "(source does not exist)"));
             packages.close();
 
+    # Check for packages in experimental obsoleted by versions in unstable
+    #
+    # [If melanie was callable from python, we could auto-remove these
+    #  packages...]
+
+    suite_id = db_access.get_suite_id("unstable");
+    q = projectB.query("""
+SELECT s.source, s.version AS experimental, s2.version AS unstable 
+  FROM src_associations sa, source s, source s2, src_associations sa2 
+  WHERE sa.suite = 1 AND sa2.suite = %d AND sa.source = s.id 
+   AND sa2.source = s2.id AND s.source = s2.source 
+   AND versioncmp(s.version, s2.version) < 0""" % (suite_id));
+    ql = q.getresult();
+    if ql != []:
+        print
+        print q
 
 ####################################################################################################