linux/debian/lib/python/debian_linux/config.py

224 lines
6.8 KiB
Python
Raw Normal View History

* Move most parts of debian/bin/gencontrol.py to debian/lib. * Implement subarch. * Rewrite patch handling to integrate arch and subarch specific patches. r4300: waldi | 2005-10-03 22:23:02 +0200 debian/rules.real: Remove old definitions. r4304: waldi | 2005-10-03 23:02:13 +0200 Move template reading to lib. * debian/bin/gencontrol.py - Remove RFC822 routines. - Use templates class. * debian/lib/python/debian_linux.py: Add templates class. r4738: waldi | 2005-11-07 15:51:30 +0100 debian/bin/gencontrol.py: Set TYPE. r4796: waldi | 2005-11-13 15:09:40 +0100 * debian/bin/gencontrol.py: Use config_reader. * debian/lib/python/debian_linux: Add directory. * debian/lib/python/debian_linux/__init__.py: Move from debian/lib/python/python/debian_linux.py. * debian/lib/python/debian_linux/config.py: Add config_reader and config_parser. r4797: waldi | 2005-11-13 15:45:12 +0100 * debian/bin/gencontrol.py: Move code away. For now only use imported code. * debian/lib/python/debian_linux/__init__.py: Remove utils. * debian/lib/python/debian_linux/config.py: Update. * debian/lib/python/debian_linux/debian.py: Add debian packaging specific code. * debian/lib/python/debian_linux/gencontrol.py: Add code. * debian/lib/python/debian_linux/utils.py: Add utils. r4798: waldi | 2005-11-13 15:56:37 +0100 debian/lib/python/debian_linux/gencontrol.py: Don't try to generation extra packages if the template does not exist. r4799: waldi | 2005-11-13 16:04:25 +0100 debian/lib/python/debian_linux/gencontrol.py: Begin to split methods in smaller pieces. r4800: waldi | 2005-11-13 16:26:03 +0100 debian/lib/python/debian_linux/gencontrol.py: Split more code. r4802: waldi | 2005-11-13 16:40:08 +0100 debian/lib/python/debian_linux/gencontrol.py: Also allow strings in makefile write list. r4806: waldi | 2005-11-13 16:55:48 +0100 debian/bin/gencontrol.py: Move linux-2.6 specific code from debian/lib/python/debian_linux/gencontrol.py. r4807: waldi | 2005-11-13 17:07:26 +0100 debian/bin/gencontrol.py, debian/lib/python/debian_linux/gencontrol.py: Update. r4808: waldi | 2005-11-13 17:08:53 +0100 debian/bin/gencontrol.py: Move code from debian/lib/python/debian_linux/gencontrol.py. r4810: waldi | 2005-11-13 17:10:30 +0100 debian/bin/gencontrol.py - Move code from debian/lib/python/debian_linux/gencontrol.py. - Update. r4811: waldi | 2005-11-13 17:33:47 +0100 debian/bin/gencontrol.py: Move code from debian/lib/python/debian_linux/gencontrol.py. r4812: waldi | 2005-11-13 17:36:38 +0100 debian/bin/gencontrol.py: Update. r4813: waldi | 2005-11-13 18:36:28 +0100 debian/lib/python/debian_linux/config.py: Remove old code. r4814: waldi | 2005-11-13 18:38:50 +0100 * debian/bin/gencontrol.py, debian/lib/python/debian_linux/gencontrol.py, debian/lib/python/debian_linux/utils.py: Teach package object how to work with list attributes. * debian/lib/python/debian_linux/debian.py: Don't use utils.entry. r4815: waldi | 2005-11-13 18:41:55 +0100 * debian/lib/python/debian_linux/gencontrol.py - Use utils.package. - Remove debugging code. * debian/lib/python/debian_linux/utils.py - Use utils.package. - Remove utils.entry. r4816: waldi | 2005-11-13 18:47:46 +0100 debian/lib/python/debian_linux/utils.py: Don't output empty fields. r4965: waldi | 2005-12-04 12:36:20 +0100 Rewrite config reader to support more than one section per (arch, subarch, flavour). * debian/bin/gencontrol.py, debian/lib/python/debian_linux/gencontrol.py: Explicitely Use base entries. * debian/lib/python/debian_linux/config.py - Rewrite. - Loose support for entry merging for now. r5175: waldi | 2006-01-02 20:46:46 +0100 debian/bin/gencontrol.py: Fix. r5176: waldi | 2006-01-02 21:09:17 +0100 * debian/bin/apply: Don't expect upstream version in series file names. * debian/patches-debian/series/0experimental.1: Move from debian/patches-debian/series/2.6.14+2.6.15-rc7-0experimental.1. * debian/patches-debian/series/0experimental.2: Move from debian/patches-debian/series/2.6.14+2.6.15-rc7-0experimental.2. r5177: waldi | 2006-01-02 22:31:28 +0100 First prototype of improved patch util. debian/bin/apply.py: Add. r5178: waldi | 2006-01-02 23:40:11 +0100 * debian/bin/apply.py: Finish implementation. * debian/rules.real: Use apply.py. r5179: waldi | 2006-01-03 00:15:05 +0100 * debian/bin/apply.py: Implement arch and subarch specific patches. * debian/bin/unpatch: Remove old code. * debian/rules.real: Fix patch package installation. r5180: waldi | 2006-01-03 00:16:05 +0100 debian/bin/apply: Remove. r5181: waldi | 2006-01-03 00:16:56 +0100 * debian/bin/gencontrol.py: Readd missing build target. * debian/lib/python/debian_linux/debian.py: Raise if version is not parsable. r5192: waldi | 2006-01-03 15:32:43 +0100 debian/bin/apply.py - Add version_file class. - Use correct series for deapply. r5193: waldi | 2006-01-03 15:41:53 +0100 debian/bin/apply.py - Remove extra version handling from series class. - Add check for extra version in patch setup. r5194: waldi | 2006-01-03 15:45:49 +0100 debian/bin/apply.py: Move complete reverse logic into series class. r5195: waldi | 2006-01-03 16:14:33 +0100 debian/bin/apply.py: Implement patch per arch and subarch. It is currently done by completely deapply the arch specific patches if it needs to change set of general patches. r5196: waldi | 2006-01-03 16:18:55 +0100 debian/bin/apply.py: Don't record extra version without patch. r5197: waldi | 2006-01-03 16:25:03 +0100 debian/bin/apply.py: Record shortest possible extra version in version file. r5198: waldi | 2006-01-03 16:28:00 +0100 * debian/patches-debian/series/0experimental.3-extra: Add. * debian/patches-debian/hppa-incompatible.patch: Move from debian/patches-arch/hppa.diff. * debian/patches-debian/m68k-incompatible.patch Move from debian/patches-arch/m68k.diff. * debian/patches-arch: Remove. r5200: waldi | 2006-01-03 16:30:03 +0100 debian/rules.real: Use new apply script for arch and subarch patches. r5207: waldi | 2006-01-03 17:12:52 +0100 * debian/rules.real: Remove old arch patches installation. * debian/templates/control.source.in: Remove dh-kpatches from Buld-Depends-Indep. r5208: waldi | 2006-01-03 17:21:21 +0100 debian/lib/python/debian_linux: Set svn:ignore property. r5210: waldi | 2006-01-03 17:24:09 +0100 debian/templates/control.main.in: Fix depends of patch package. r5212: waldi | 2006-01-03 17:54:18 +0100 * debian/rules: Fix clean. * debian/rules.real - Remove definition of old arch patches. - Use a variable for patch command. r5213: waldi | 2006-01-03 20:45:41 +0100 * debian/templates: Move subarch part in package names in front of flavour. * debian/lib/python/debian_linux/gencontrol.py: Fix subarch text setting. r5214: waldi | 2006-01-03 20:46:05 +0100 debian/lib/python/debian_linux/config.py: Support subarches. r5215: waldi | 2006-01-04 00:51:46 +0100 Update svn:ignore property. r5216: waldi | 2006-01-04 00:53:20 +0100 debian/bin/apply.py - Use correct length in extra check. - Check for correct length of extra entries. r5217: waldi | 2006-01-04 00:54:38 +0100 debian/rules.real - Append subarch to kernel version. - Fix base of kconfig.ml call. r5234: waldi | 2006-01-04 15:34:59 +0100 * debian/bin/gencontrol.py: Use config entry merging when needed. * lib/python/debian_linux/config.py: Readd config entry merging. r5235: waldi | 2006-01-04 16:00:38 +0100 * debian/bin/install-image: Use DEBIAN_LOCALVERSION and DEBIAN_LOCALVERSION_HEADERS. * debian/rules.real: Set LOCALVERSION for scripts. r5240: waldi | 2006-01-04 17:50:12 +0100 debian/rules.real: Fix version of subarch headers package. svn path=/dists/trunk/linux-2.6/; revision=5242
2006-01-04 19:33:32 +00:00
import os, os.path, re, sys, textwrap, ConfigParser
__all__ = 'config_reader',
_marker = object()
class config_reader(dict):
"""
Read configs in debian/arch and in the overlay directory.
"""
class schema_item_boolean(object):
def __call__(self, i):
i = i.strip().lower()
if i in ("true", "1"):
return True
if i in ("false", "0"):
return False
raise Error
class schema_item_list(object):
def __init__(self, type = "\s+"):
self.type = type
def __call__(self, i):
return [j.strip() for j in re.split(self.type, i.strip())]
schema = {
'arches': schema_item_list(),
'available': schema_item_boolean(),
'flavours': schema_item_list(),
'subarches': schema_item_list(),
}
config_name = "defines"
def __init__(self, overlay_dir = None):
self._overlay_dir = overlay_dir
self._read_base()
def __getitem__(self, key):
return self.get(key)
def _get_files(self, name):
ret = []
if self._overlay_dir is not None:
ret.append(os.path.join(self._overlay_dir, name))
ret.append(os.path.join('debian/arch', name))
return ret
def _read_arch(self, arch):
files = self._get_files("%s/%s" % (arch, self.config_name))
config = config_parser(self.schema, files)
subarches = config['base',].get('subarches', [])
flavours = config['base',].get('flavours', [])
for section in iter(config):
real = list(section)
if real[-1] in subarches:
real[0:0] = ['base', arch]
elif real[-1] in flavours:
real[0:0] = ['base', arch, 'none']
else:
real[0:] = [real.pop(), arch]
real = tuple(real)
s = self.get(real, {})
s.update(config[section])
self[tuple(real)] = s
for subarch in subarches:
if self.has_key(('base', arch, subarch)):
avail = self['base', arch, subarch].get('available', True)
else:
avail = True
if avail:
self._read_subarch(arch, subarch)
if flavours:
base = self['base', arch]
subarches.insert(0, 'none')
base['subarches'] = subarches
del base['flavours']
self['base', arch] = base
self['base', arch, 'none'] = {'flavours': flavours}
for flavour in flavours:
self._read_flavour(arch, 'none', flavour)
def _read_base(self):
files = self._get_files(self.config_name)
config = config_parser(self.schema, files)
arches = config['base',]['arches']
for section in iter(config):
real = list(section)
if real[-1] in arches:
real.insert(0, 'base')
else:
real.insert(0, real.pop())
self[tuple(real)] = config[section]
for arch in arches:
try:
avail = self['base', arch].get('available', True)
except KeyError:
avail = True
if avail:
self._read_arch(arch)
def _read_flavour(self, arch, subarch, flavour):
if not self.has_key(('base', arch, subarch, flavour)):
import warnings
warnings.warn('No config entry for flavour %s, subarch %s, arch %s' % (flavour, subarch, arch), DeprecationWarning)
self['base', arch, subarch, flavour] = {}
def _read_subarch(self, arch, subarch):
files = self._get_files("%s/%s/%s" % (arch, subarch, self.config_name))
config = config_parser(self.schema, files)
flavours = config['base',].get('flavours', [])
for section in iter(config):
real = list(section)
if real[-1] in flavours:
real[0:0] = ['base', arch, subarch]
else:
real[0:] = [real.pop(), arch, subarch]
real = tuple(real)
s = self.get(real, {})
s.update(config[section])
self[tuple(real)] = s
for flavour in flavours:
self._read_flavour(arch, subarch, flavour)
def _update(self, ret, inputkey):
for key, value in super(config_reader, self).get(tuple(inputkey), {}).iteritems():
ret[key] = value
def get(self, key, default = _marker):
if isinstance(key, basestring):
key = key,
ret = super(config_reader, self).get(tuple(key), default)
if ret == _marker:
raise KeyError, key
return ret
def merge(self, section, *args):
ret = {}
for i in xrange(0, len(args) + 1):
ret.update(self.get(tuple([section] + list(args[:i])), {}))
if section == 'base':
for i in ('abiname', 'arches', 'flavours', 'subarches'):
try:
del ret[i]
except KeyError: pass
return ret
def sections(self):
return super(config_reader, self).keys()
class config_parser(object):
__slots__ = 'configs', 'schema'
def __init__(self, schema, files):
self.configs = []
self.schema = schema
for file in files:
config = ConfigParser.ConfigParser()
config.read(file)
self.configs.append(config)
def __getitem__(self, key):
return self.items(key)
def __iter__(self):
return iter(self.sections())
def items(self, section, var = {}):
ret = {}
section = '_'.join(section)
exception = None
for config in self.configs:
try:
items = config.items(section)
except ConfigParser.NoSectionError, e:
exception = e
else:
for key, value in items:
try:
value = self.schema[key](value)
except KeyError: pass
ret[key] = value
exception = None
if exception is not None:
raise exception
return ret
def sections(self):
sections = []
for config in self.configs:
for section in config.sections():
section = tuple(section.split('_'))
if section not in sections:
sections.append(section)
return sections
if __name__ == '__main__':
import sys
config = config_reader()
sections = config.sections()
sections.sort()
for section in sections:
print "[%s]" % (section,)
items = config[section]
items_keys = items.keys()
items_keys.sort()
for item in items:
print "%s: %s" % (item, items[item])
print