--- /dev/null
+#!/usr/bin/env python
+
+# Check for fixable discrepancies between stable and unstable
+# Copyright (C) 2000 James Troup <james@nocrew.org>
+# $Id: andrea,v 1.1 2001-02-12 03:29:52 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
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+
+################################################################################
+
+import pg, sys
+import utils, db_access
+import apt_pkg;
+
+################################################################################
+
+Cnf = None;
+projectB = None;
+
+################################################################################
+
+def main ():
+ global Cnf, projectB;
+
+ apt_pkg.init();
+
+ Cnf = apt_pkg.newConfiguration();
+ apt_pkg.ReadConfigFileISC(Cnf,utils.which_conf_file());
+
+ Arguments = [('D',"debug","Catherine::Options::Debug", "IntVal"),
+ ('h',"help","Catherine::Options::Help"),
+ ('V',"version","Catherine::Options::Version")]
+
+ apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv);
+
+ projectB = pg.connect('projectb', 'localhost');
+ db_access.init(Cnf, projectB);
+
+ src_suite = "stable";
+ dst_suite = "unstable";
+
+ src_suite_id = db_access.get_suite_id(src_suite);
+ dst_suite_id = db_access.get_suite_id(dst_suite);
+ arch_all_id = db_access.get_architecture_id("all");
+ dsc_type_id = db_access.get_override_type_id("dsc");
+
+ for arch in Cnf.SubTree("Suite::%s::Architectures" % (src_suite)).List():
+ if arch == "source":
+ continue;
+
+ # Arch: all doesn't work; consider packages which go from
+ # arch: all to arch: any, e.g. debconf... needs more checks
+ # and thought later.
+
+ if arch == "all":
+ continue;
+ arch_id = db_access.get_architecture_id(arch);
+ q = projectB.query("""
+SELECT b_src.package, b_src.version AS stable_version
+ FROM binaries b_src, bin_associations ba, override o
+ WHERE ba.bin = b_src.id AND ba.suite = %s AND b_src.architecture = %s
+ AND o.package = b_src.package AND o.suite = %s AND o.type != %s AND NOT EXISTS
+ (SELECT b_dst.id FROM bin_associations ba2, binaries b_dst
+ WHERE ba2.bin = b_dst.id AND b_dst.package = b_src.package
+ AND (b_dst.architecture = %s OR b_dst.architecture = %s)
+ AND ba2.suite = %s AND EXISTS
+ (SELECT b2.id FROM bin_associations ba3, binaries b2
+ WHERE ba3.bin = b2.id AND ba3.suite = %s AND b2.package = b_dst.package))
+ORDER BY b_src.package;"""
+ % (src_suite_id, arch_id, dst_suite_id, dsc_type_id, arch_id, arch_all_id, dst_suite_id, dst_suite_id));
+ print
+ print arch
+ print "======"
+ print q
+
+
+#######################################################################################
+
+if __name__ == '__main__':
+ main()
+
--- /dev/null
+#!/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 $
+
+# 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
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+# "Welcome to where time stands still,
+# No one leaves and no one will."
+# - Sanitarium - Metallica / Master of the puppets
+
+################################################################################
+
+import commands, os, string, sys, tempfile;
+import utils;
+import apt_pkg;
+
+################################################################################
+
+Cnf = None;
+projectB = None;
+
+################################################################################
+
+def main ():
+ global Cnf, projectB;
+
+ apt_pkg.init();
+
+ Cnf = apt_pkg.newConfiguration();
+ apt_pkg.ReadConfigFileISC(Cnf,utils.which_conf_file());
+
+ Arguments = [('D',"debug","Catherine::Options::Debug", "IntVal"),
+ ('h',"help","Catherine::Options::Help"),
+ ('V',"version","Catherine::Options::Version"),
+ ('l',"limit", "Catherine::Options::Limit", "HasArg"),
+ ('n',"no-action","Catherine::Options::No-Action"),
+ ('v',"verbose","Catherine::Options::Verbose")];
+
+ apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv);
+
+ bin_pkgs = {};
+ miss_src = {};
+ src_pkgs = {};
+ source_binaries = {};
+
+ suite = "unstable";
+
+ 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');
+ 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);
+
+ for component in components:
+ architectures = Cnf.SubTree("Suite::%s::Architectures" % (suite)).List();
+ for architecture in architectures:
+ 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():
+ package = Packages.Section.Find('Package');
+ source = Packages.Section.Find('Source', "");
+ if source == "":
+ source = package;
+ if string.find(source, "(") != -1:
+ m = utils.re_extract_src_version.match(source)
+ source = m.group(1)
+ if not bin_pkgs.has_key(package) and not miss_src.has_key(package):
+ miss_src[package] = 1;
+ print " %s has no source [%s: %s]" % (package, source, source_binaries.get(source, "(source does not exist)"));
+ packages.close();
+
+ return;
+
+####################################################################################################
+
+if __name__ == '__main__':
+ main()