]> git.decadent.org.uk Git - dak.git/blobdiff - claire.py
Add new top level directories
[dak.git] / claire.py
index 1de00b68e09b3429fb860065fc7fcbc67e2f3b10..c0055a70866a14752d2e7ee058eb4d31e5028230 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, 2001  James Troup <james@nocrew.org>
-# $Id: claire.py,v 1.10 2001-11-04 20:41:37 troup Exp $
+# Copyright (C) 2000, 2001, 2002, 2003  James Troup <james@nocrew.org>
+# $Id: claire.py,v 1.19 2003-09-07 13:52:11 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
 
 ################################################################################
 
-# "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'
+#  _   _ ____
+# | \ | | __ )_
+# |  \| |  _ (_)
+# | |\  | |_) |   This has been obsoleted since the release of woody.
+# |_| \_|____(_)
+#
 
 ################################################################################
 
-import os, pg, re, string, sys
-import utils, db_access
+import os, pg, re, sys;
+import utils, db_access;
 import apt_pkg;
 
 ################################################################################
@@ -41,7 +44,7 @@ projectB = None;
 
 def usage (exit_code=0):
     print """Usage: claire [OPTIONS]
-Create compatability symlinks from legacy locations to the pool.
+Create compatibility symlinks from legacy locations to the pool.
 
   -v, --verbose              explain what is being done
   -h, --help                 show this help and exit"""
@@ -50,30 +53,17 @@ Create compatability symlinks from legacy locations to the pool.
 
 ################################################################################
 
-# Relativize an absolute symlink from 'src' -> 'dest' relative to 'root'.
-# Returns fixed 'src'
-def clean_symlink (src, dest, root):
-    src = string.replace(src, root, '', 1);
-    dest = string.replace(dest, root, '', 1);
-    dest = os.path.dirname(dest);
-    new_src = '';
-    for i in xrange(len(string.split(dest, '/'))):
-        new_src = new_src + '../';
-    return new_src + src
-
-################################################################################
-
 def fix_component_section (component, section):
     if component == "":
         component = utils.extract_component_from_section(section)[1];
 
     # FIXME: ugly hacks to work around override brain damage
     section = re_strip_section_prefix.sub('', section);
-    section = string.replace(string.lower(section), 'non-us', '');
+    section = section.lower().replace('non-us', '');
     if section == "main" or section == "contrib" or section == "non-free":
         section = '';
     if section != '':
-        section = section + '/';
+        section += '/';
 
     return (component, section);
 
@@ -82,6 +72,8 @@ def fix_component_section (component, section):
 def find_dislocated_stable(Cnf, projectB):
     dislocated_files = {}
 
+    codename = Cnf["Suite::Stable::Codename"];
+
     # Source
     q = projectB.query("""
 SELECT DISTINCT ON (f.id) c.name, sec.section, l.path, f.filename, f.id
@@ -90,33 +82,33 @@ SELECT DISTINCT ON (f.id) c.name, sec.section, l.path, f.filename, f.id
     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 ~ '^%s/')
       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 o.suite = su.id
-      AND NOT EXISTS (SELECT l.path FROM location l WHERE l.component IS NOT NULL AND f.location = l.id);
-""");
+""" % (codename));
+# Only needed if you have files in legacy-mixed locations
+#  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 ~ '^%s/') AND o.suite = su.id
+#        AND NOT EXISTS (SELECT 1 FROM location l WHERE l.component IS NOT NULL AND f.location = l.id);
     for i in q.getresult():
-        src = i[2]+i[3]
         (component, section) = fix_component_section(i[0], i[1]);
-        dest = "%sdists/%s/%s/source/%s%s" % (Cnf["Dir::RootDir"], Cnf.get("Suite::Stable::CodeName", "stable"), component, section, os.path.basename(i[3]));
-        src = clean_symlink(src, dest, Cnf["Dir::RootDir"]);
+        if Cnf.FindB("Dinstall::LegacyStableHasNoSections"):
+            section="";
+        dest = "%sdists/%s/%s/source/%s%s" % (Cnf["Dir::Root"], codename, component, section, os.path.basename(i[3]));
         if not os.path.exists(dest):
+           src = i[2]+i[3];
+           src = utils.clean_symlink(src, dest, Cnf["Dir::Root"]);
             if Cnf.Find("Claire::Options::Verbose"):
                 print src+' -> '+dest
             os.symlink(src, dest);
         dislocated_files[i[4]] = dest;
 
     # Binary
-    architectures = Cnf.SubTree("Suite::Stable::Architectures").List();
-    for arch in [ "source", "all" ]:
-        if architectures.count(arch):
-            architectures.remove(arch);
+    architectures = filter(utils.real_arch, Cnf.ValueList("Suite::Stable::Architectures"));
     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
@@ -124,36 +116,39 @@ SELECT DISTINCT ON (f.id) c.name, a.arch_string, sec.section, b.package,
          location l, override o, section sec, suite su
     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 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,
-         location l, override o, section sec, suite su
-    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 o.suite = su.id AND NOT EXISTS
-        (SELECT l.path FROM location l WHERE l.component IS NOT NULL AND f.location = l.id);
-""");
+      AND sec.id = o.section AND NOT (f.filename ~ '^%s/')
+      AND b.architecture = a.id AND l.component = c.id AND o.suite = su.id""" %
+                       (codename));
+# Only needed if you have files in legacy-mixed locations
+#  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,
+#           location l, override o, section sec, suite su
+#      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 ~ '^%s/')
+#        AND b.architecture = a.id AND o.suite = su.id AND NOT EXISTS
+#          (SELECT 1 FROM location l WHERE l.component IS NOT NULL AND f.location = l.id);
     for i in q.getresult():
         (component, section) = fix_component_section(i[0], i[2]);
+        if Cnf.FindB("Dinstall::LegacyStableHasNoSections"):
+            section="";
         architecture = i[1];
-        package = i[3]
+        package = i[3];
         version = utils.re_no_epoch.sub('', i[4]);
-        src = i[5]+i[6]
+        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"]);
+        dest = "%sdists/%s/%s/binary-%s/%s%s_%s.deb" % (Cnf["Dir::Root"], codename, component, architecture, section, package, version);
+        src = utils.clean_symlink(src, dest, Cnf["Dir::Root"]);
         if not os.path.exists(dest):
             if Cnf.Find("Claire::Options::Verbose"):
-                print src+' -> '+dest
+                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);
+                dest = "%sdists/%s/%s/binary-%s/%s%s_%s.deb" % (Cnf["Dir::Root"], codename, component, arch, section, package, version);
                 if not os.path.exists(dest):
                     if Cnf.Find("Claire::Options::Verbose"):
                         print src+' -> '+dest
@@ -166,15 +161,13 @@ 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 = [('h',"help","Claire::Options::Help"),
                  ('v',"verbose","Claire::Options::Verbose")];
     for i in ["help", "verbose" ]:
-        Cnf["Claire::Options::%s" % (i)] = "";
+       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")
@@ -191,5 +184,5 @@ def main ():
 #######################################################################################
 
 if __name__ == '__main__':
-    main()
+    main();