#!/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.1 2000-12-05 04:27:48 troup Exp $
+# Copyright (C) 2000, 2001 James Troup <james@nocrew.org>
+# $Id: claire.py,v 1.7 2001-04-03 10:02:16 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
################################################################################
-import pg, sys, os, string
+import os, pg, re, string, sys
import utils, db_access
import apt_pkg;
################################################################################
+re_strip_section_prefix = re.compile(r'.*/');
+
Cnf = None;
projectB = None;
+################################################################################
+
# Relativize an absolute symlink from 'src' -> 'dest' relative to 'root'.
# Returns fixed 'src'
def clean_symlink (src, dest, root):
################################################################################
+def fix_component_section (component, section):
+ if component == "":
+ (None, component) = utils.extract_component_from_section(section);
+
+ # 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 + '/';
+
+ return (component, section);
+
+################################################################################
+
def find_dislocated_stable(Cnf, projectB):
dislocated_files = {}
# Source
- q = projectB.query("SELECT su.suite_name, c.name, s.id FROM suite su, src_associations sa, source s, files f, component c, location l WHERE su.suite_name = 'stable' AND sa.suite = su.id AND sa.source = s.id AND f.id = s.file AND f.location = l.id AND (l.component = c.id OR (l.component = NULL AND c.name = 'non-US/main')) AND NOT (f.filename ~ '^potato/');")
+ q = projectB.query("""
+SELECT DISTINCT ON (f.id) c.name, 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 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);
+""");
for i in q.getresult():
- q = projectB.query("SELECT l.path, f.filename, f.id FROM source s, files f, location l, dsc_files df WHERE s.id = %d AND df.source = %d AND f.id = df.file AND f.location = l.id AND NOT (f.filename ~ '^potato/')" % (i[2], i[2]));
- for j in q.getresult():
- src = j[0]+j[1]
- dest = Cnf["Dir::RootDir"]+'dists/'+i[0]+'/'+i[1]+'/source/'+os.path.basename(j[1]);
- src = clean_symlink(src, dest, Cnf["Dir::RootDir"]);
- if not os.path.exists(dest):
- if Cnf.Find("Claire::Options::Verbose"):
- print src+' -> '+dest
- os.symlink(src, dest);
- dislocated_files[j[2]] = dest;
+ 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 not os.path.exists(dest):
+ 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
- q = projectB.query("SELECT su.suite_name, c.name, a.arch_string, b.package, b.version, l.path, f.filename, f.id FROM suite su, bin_associations ba, binaries b, files f, component c, architecture a, location l WHERE ba.suite = su.id AND su.suite_name = 'stable' AND ba.bin = b.id AND f.id = b.file AND f.location = l.id AND (l.component = c.id OR (l.component = NULL and c.name = 'non-US/main')) AND b.architecture = a.id AND NOT (f.filename ~ '^potato/');");
+ 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
+ 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 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);
+""");
for i in q.getresult():
+ (component, section) = fix_component_section(i[0], i[2]);
+ architecture = i[1];
+ package = i[3]
+ version = utils.re_no_epoch.sub('', i[4]);
src = i[5]+i[6]
- dest = Cnf["Dir::RootDir"]+'dists/'+i[0]+'/'+i[1]+'/binary-'+i[2]+'/'+i[3]+'_'+utils.re_no_epoch.sub('', i[4])+'.deb'
+
+ 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):
if Cnf.Find("Claire::Options::Verbose"):
apt_pkg.ParseCommandLine(Cnf,Arguments,sys.argv);
- projectB = pg.connect('projectb', 'localhost');
+ projectB = pg.connect(Cnf["DB::Name"], Cnf["DB::Host"], int(Cnf["DB::Port"]));
db_access.init(Cnf, projectB);