#!/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;
################################################################################
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"""
################################################################################
-# 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);
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
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
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
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")
#######################################################################################
if __name__ == '__main__':
- main()
+ main();