]> git.decadent.org.uk Git - dak.git/blobdiff - claire.py
* katie.py (in_override_p): when searching for a source override, and the...
[dak.git] / claire.py
index 7a8dc908b5b7757fee909083c4b409d3d62400a5..70e42f37935f7568a1d9eb515b56d1e74f7f9da0 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.2 2001-01-25 06:00:07 troup Exp $
+# Copyright (C) 2000, 2001, 2002  James Troup <james@nocrew.org>
+# $Id: claire.py,v 1.17 2002-06-08 00:15:57 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
@@ -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,26 +39,37 @@ projectB = None;
 
 ################################################################################
 
+def usage (exit_code=0):
+    print """Usage: claire [OPTIONS]
+Create compatibility 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):
     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
+    new_src = '../' * len(string.split(dest, '/'));
+    return new_src + src;
 
 ################################################################################
 
 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);
     section = string.replace(string.lower(section), 'non-us', '');
+    if section == "main" or section == "contrib" or section == "non-free":
+        section = '';
     if section != '':
         section = section + '/';
 
@@ -67,6 +80,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
@@ -75,32 +90,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 l.component = c.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 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 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, 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 l.path 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/stable/%s/source/%s%s" % (Cnf["Dir::RootDir"], 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 = 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;
 
-    return dislocated_files;
-
-    # TODO later when there's something to test it with!
     # Binary
+    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
@@ -108,32 +124,43 @@ 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
-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 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 l.path 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]
-       
-        dest = "%sdists/stable/%s/binary-%s/%s%s_%s.deb" % (Cnf["Dir::RootDir"], component, architecture, section, package, version);
-        src = clean_symlink(src, dest, Cnf["Dir::RootDir"]);
+        src = i[5]+i[6];
+
+        dest = "%sdists/%s/%s/binary-%s/%s%s_%s.deb" % (Cnf["Dir::Root"], codename, component, architecture, section, package, version);
+        src = 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::Root"], codename, 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
 
@@ -142,19 +169,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);
 
@@ -163,5 +192,5 @@ def main ():
 #######################################################################################
 
 if __name__ == '__main__':
-    main()
+    main();