]> git.decadent.org.uk Git - dak.git/blobdiff - rene
oops, sorry fernaNda...
[dak.git] / rene
diff --git a/rene b/rene
index b6f079befdbdfc4f0a10b6b73d33b8650b8f8e7f..2d12ec31a905e479143832d934fb4f89f617a29e 100755 (executable)
--- a/rene
+++ b/rene
@@ -1,8 +1,8 @@
 #!/usr/bin/env python
 
 # Check for obsolete binary packages
-# Copyright (C) 2000  James Troup <james@nocrew.org>
-# $Id: rene,v 1.1 2001-02-12 03:29:52 troup Exp $
+# Copyright (C) 2000, 2001  James Troup <james@nocrew.org>
+# $Id: rene,v 1.6 2001-06-20 18:46:35 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
@@ -24,8 +24,8 @@
 
 ################################################################################
 
-import commands, os, string, sys, tempfile;
-import utils;
+import commands, pg, os, string, sys, tempfile;
+import utils, db_access;
 import apt_pkg;
 
 ################################################################################
@@ -51,6 +51,8 @@ def main ():
                  ('v',"verbose","Catherine::Options::Verbose")];
 
     apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv);
+    projectB = pg.connect(Cnf["DB::Name"], Cnf["DB::Host"], int(Cnf["DB::Port"]));
+    db_access.init(Cnf, projectB);
 
     bin_pkgs = {};
     miss_src = {};
@@ -58,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);
@@ -75,17 +77,56 @@ 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 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);
 
@@ -95,7 +136,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():
@@ -111,7 +151,22 @@ def main ():
                     print " %s has no source [%s: %s]" % (package, source, source_binaries.get(source, "(source does not exist)"));
             packages.close();
 
-    return;
+    # 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
 
 ####################################################################################################