]> git.decadent.org.uk Git - dak.git/blobdiff - claire.py
added upgrade-report and installation-report pseudo packages
[dak.git] / claire.py
index e5711969f7c2d760efc61fd72ff8076bd99de181..d0d82d06989d1e89c8d9e00b94e6769e0f253882 100755 (executable)
--- a/claire.py
+++ b/claire.py
@@ -1,8 +1,8 @@
 #!/usr/bin/env python
 
 # 'Fix' stable to make debian-cd and dpkg -BORGiE users happy
-# Copyright (C) 2000  James Troup <james@nocrew.org>
-# $Id: claire.py,v 1.4 2001-02-27 06:10:42 ajt Exp $
+# Copyright (C) 2000, 2001  James Troup <james@nocrew.org>
+# $Id: claire.py,v 1.12 2001-11-19 20:42:40 rmurray 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
@@ -18,6 +18,8 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
+################################################################################
+
 # "Look around... leaves are brown... and the sky's a hazy shade of winter,
 #  Look around... leaves are brown... there's a patch of snow on the ground."
 #                                         -- Simon & Garfunkel / 'A Hazy Shade'
@@ -37,6 +39,17 @@ projectB = None;
 
 ################################################################################
 
+def usage (exit_code=0):
+    print """Usage: claire [OPTIONS]
+Create compatability symlinks from legacy locations to the pool.
+
+  -v, --verbose              explain what is being done
+  -h, --help                 show this help and exit"""
+
+    sys.exit(exit_code)
+
+################################################################################
+
 # Relativize an absolute symlink from 'src' -> 'dest' relative to 'root'.
 # Returns fixed 'src'
 def clean_symlink (src, dest, root):
@@ -52,7 +65,7 @@ def clean_symlink (src, dest, root):
 
 def fix_component_section (component, section):
     if component == "":
-        (None, component) = utils.extract_component_from_section(section);
+        component = utils.extract_component_from_section(section)[1];
 
     # FIXME: ugly hacks to work around override brain damage
     section = re_strip_section_prefix.sub('', section);
@@ -78,14 +91,14 @@ SELECT DISTINCT ON (f.id) c.name, sec.section, l.path, f.filename, f.id
       AND f2.id = s.file AND f2.location = l2.id AND df.source = s.id
       AND f.id = df.file AND f.location = l.id AND o.package = s.source
       AND sec.id = o.section AND NOT (f.filename ~ '^potato/')
-      AND l.component = c.id
+      AND l.component = c.id AND o.suite = su.id
 UNION SELECT DISTINCT ON (f.id) null, sec.section, l.path, f.filename, f.id
     FROM component c, override o, section sec, source s, files f, location l,
          dsc_files df, suite su, src_associations sa, files f2, location l2
     WHERE su.suite_name = 'stable' AND sa.suite = su.id AND sa.source = s.id
       AND f2.id = s.file AND f2.location = l2.id AND df.source = s.id
       AND f.id = df.file AND f.location = l.id AND o.package = s.source
-      AND sec.id = o.section AND NOT (f.filename ~ '^potato/')
+      AND sec.id = o.section AND NOT (f.filename ~ '^potato/') AND o.suite = su.id
       AND NOT EXISTS (SELECT l.path FROM location l WHERE l.component IS NOT NULL AND f.location = l.id);
 """);
     for i in q.getresult():
@@ -99,10 +112,11 @@ UNION SELECT DISTINCT ON (f.id) null, sec.section, l.path, f.filename, f.id
             os.symlink(src, dest);
         dislocated_files[i[4]] = dest;
 
-    #return dislocated_files;
-
-    # TODO later when there's something to test it with!
     # Binary
+    architectures = Cnf.SubTree("Suite::Stable::Architectures").List();
+    for arch in [ "source", "all" ]:
+        if architectures.count(arch):
+            architectures.remove(arch);
     q = projectB.query("""
 SELECT DISTINCT ON (f.id) c.name, a.arch_string, sec.section, b.package,
                           b.version, l.path, f.filename, f.id
@@ -111,7 +125,7 @@ SELECT DISTINCT ON (f.id) c.name, a.arch_string, sec.section, b.package,
     WHERE su.suite_name = 'stable' AND ba.suite = su.id AND ba.bin = b.id
       AND f.id = b.file AND f.location = l.id AND o.package = b.package
       AND sec.id = o.section AND NOT (f.filename ~ '^potato/')
-      AND b.architecture = a.id AND l.component = c.id
+      AND b.architecture = a.id AND l.component = c.id AND o.suite = su.id
 UNION SELECT DISTINCT ON (f.id) null, a.arch_string, sec.section, b.package,
                           b.version, l.path, f.filename, f.id
     FROM architecture a, bin_associations ba, binaries b, component c, files f,
@@ -119,7 +133,7 @@ UNION SELECT DISTINCT ON (f.id) null, a.arch_string, sec.section, b.package,
     WHERE su.suite_name = 'stable' AND ba.suite = su.id AND ba.bin = b.id
       AND f.id = b.file AND f.location = l.id AND o.package = b.package
       AND sec.id = o.section AND NOT (f.filename ~ '^potato/')
-      AND b.architecture = a.id AND NOT EXISTS
+      AND b.architecture = a.id AND o.suite = su.id AND NOT EXISTS
         (SELECT l.path FROM location l WHERE l.component IS NOT NULL AND f.location = l.id);
 """);
     for i in q.getresult():
@@ -128,7 +142,7 @@ UNION SELECT DISTINCT ON (f.id) null, a.arch_string, sec.section, b.package,
         package = i[3]
         version = utils.re_no_epoch.sub('', i[4]);
         src = i[5]+i[6]
-       
+
         dest = "%sdists/%s/%s/binary-%s/%s%s_%s.deb" % (Cnf["Dir::RootDir"], Cnf.get("Suite::Stable::CodeName", "stable"), component, architecture, section, package, version);
         src = clean_symlink(src, dest, Cnf["Dir::RootDir"]);
         if not os.path.exists(dest):
@@ -136,6 +150,14 @@ UNION SELECT DISTINCT ON (f.id) null, a.arch_string, sec.section, b.package,
                 print src+' -> '+dest
             os.symlink(src, dest);
         dislocated_files[i[7]] = dest;
+        # Add per-arch symlinks for arch: all debs
+        if architecture == "all":
+            for arch in architectures:
+                dest = "%sdists/%s/%s/binary-%s/%s%s_%s.deb" % (Cnf["Dir::RootDir"], Cnf.get("Suite::Stable::CodeName", "stable"), component, arch, section, package, version);
+                if not os.path.exists(dest):
+                    if Cnf.Find("Claire::Options::Verbose"):
+                        print src+' -> '+dest
+                    os.symlink(src, dest);
 
     return dislocated_files
 
@@ -144,19 +166,21 @@ UNION SELECT DISTINCT ON (f.id) null, a.arch_string, sec.section, b.package,
 def main ():
     global Cnf, projectB;
 
-    apt_pkg.init();
-    
-    Cnf = apt_pkg.newConfiguration();
-    apt_pkg.ReadConfigFileISC(Cnf,utils.which_conf_file());
+    Cnf = utils.get_conf()
 
-    Arguments = [('d',"debug","Claire::Options::Debug", "IntVal"),
-                 ('h',"help","Claire::Options::Help"),
-                 ('v',"verbose","Claire::Options::Verbose"),
-                 ('V',"version","Claire::Options::Version")];
+    Arguments = [('h',"help","Claire::Options::Help"),
+                 ('v',"verbose","Claire::Options::Verbose")];
+    for i in ["help", "verbose" ]:
+       if not Cnf.has_key("Claire::Options::%s" % (i)):
+           Cnf["Claire::Options::%s" % (i)] = "";
 
     apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv);
+    Options = Cnf.SubTree("Claire::Options")
+
+    if Options["Help"]:
+       usage();
 
-    projectB = pg.connect('projectb', 'localhost');
+    projectB = pg.connect(Cnf["DB::Name"], Cnf["DB::Host"], int(Cnf["DB::Port"]));
 
     db_access.init(Cnf, projectB);