mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-11 13:27:06 +09:00
Update Python debian_linux module from linux and use it in gencontrol.py
svn path=/dists/trunk/linux-tools/; revision=19890
This commit is contained in:
272
debian/lib/python/debian_linux/debian.py
vendored
272
debian/lib/python/debian_linux/debian.py
vendored
@@ -1,4 +1,10 @@
|
||||
import itertools, os.path, re, utils
|
||||
import collections
|
||||
import itertools
|
||||
import os.path
|
||||
import re
|
||||
|
||||
from . import utils
|
||||
|
||||
|
||||
class Changelog(list):
|
||||
_rules = r"""
|
||||
@@ -26,7 +32,7 @@ class Changelog(list):
|
||||
def __init__(self, distribution, source, version):
|
||||
self.distribution, self.source, self.version = distribution, source, version
|
||||
|
||||
def __init__(self, dir = '', version = None):
|
||||
def __init__(self, dir='', version=None):
|
||||
if version is None:
|
||||
version = Version
|
||||
f = file(os.path.join(dir, "debian/changelog"))
|
||||
@@ -45,6 +51,7 @@ class Changelog(list):
|
||||
v = Version(match.group('version'))
|
||||
self.append(self.Entry(match.group('distribution'), match.group('source'), v))
|
||||
|
||||
|
||||
class Version(object):
|
||||
_version_rules = ur"""
|
||||
^
|
||||
@@ -59,7 +66,7 @@ class Version(object):
|
||||
)
|
||||
(?:
|
||||
-
|
||||
(?P<debian>[^-]+)
|
||||
(?P<revision>[^-]+)
|
||||
)?
|
||||
$
|
||||
"""
|
||||
@@ -68,37 +75,45 @@ $
|
||||
def __init__(self, version):
|
||||
match = self._version_re.match(version)
|
||||
if match is None:
|
||||
raise RuntimeError, "Invalid debian version"
|
||||
raise RuntimeError(u"Invalid debian version")
|
||||
self.epoch = None
|
||||
if match.group("epoch") is not None:
|
||||
self.epoch = int(match.group("epoch"))
|
||||
self.upstream = match.group("upstream")
|
||||
self.debian = match.group("debian")
|
||||
self.revision = match.group("revision")
|
||||
|
||||
def __str__(self):
|
||||
def __unicode__(self):
|
||||
return self.complete
|
||||
|
||||
@property
|
||||
def complete(self):
|
||||
if self.epoch is not None:
|
||||
return "%d:%s" % (self.epoch, self.complete_noepoch)
|
||||
return u"%d:%s" % (self.epoch, self.complete_noepoch)
|
||||
return self.complete_noepoch
|
||||
|
||||
@property
|
||||
def complete_noepoch(self):
|
||||
if self.debian is not None:
|
||||
return "%s-%s" % (self.upstream, self.debian)
|
||||
if self.revision is not None:
|
||||
return u"%s-%s" % (self.upstream, self.revision)
|
||||
return self.upstream
|
||||
|
||||
@property
|
||||
def debian(self):
|
||||
from warnings import warn
|
||||
warn(u"debian argument was replaced by revision", DeprecationWarning, stacklevel=2)
|
||||
return self.revision
|
||||
|
||||
|
||||
class VersionLinux(Version):
|
||||
_version_linux_rules = ur"""
|
||||
^
|
||||
(?P<version>
|
||||
\d+\.\d+
|
||||
)
|
||||
(?:
|
||||
(?P<update>
|
||||
\.\d+
|
||||
|
|
||||
)?
|
||||
(?:
|
||||
~
|
||||
(?P<modifier>
|
||||
.+?
|
||||
@@ -111,7 +126,17 @@ class VersionLinux(Version):
|
||||
)
|
||||
)?
|
||||
-
|
||||
(?:[^-]+)
|
||||
\d+
|
||||
(\.\d+)?
|
||||
(?:
|
||||
(?P<revision_experimental>
|
||||
~experimental\.\d+
|
||||
)
|
||||
|
|
||||
(?P<revision_other>
|
||||
[^-]+
|
||||
)
|
||||
)?
|
||||
$
|
||||
"""
|
||||
_version_linux_re = re.compile(_version_linux_rules, re.X)
|
||||
@@ -120,125 +145,159 @@ $
|
||||
super(VersionLinux, self).__init__(version)
|
||||
match = self._version_linux_re.match(version)
|
||||
if match is None:
|
||||
raise RuntimeError, "Invalid debian linux version"
|
||||
raise RuntimeError(u"Invalid debian linux version")
|
||||
d = match.groupdict()
|
||||
self.linux_modifier = d['modifier']
|
||||
self.linux_version = d['version']
|
||||
if d['modifier'] is not None:
|
||||
self.linux_upstream = '-'.join((d['version'], d['modifier']))
|
||||
assert not d['update']
|
||||
self.linux_upstream = u'-'.join((d['version'], d['modifier']))
|
||||
else:
|
||||
self.linux_upstream = d['version']
|
||||
self.linux_upstream_full = self.linux_upstream + (d['update'] or u'')
|
||||
self.linux_dfsg = d['dfsg']
|
||||
|
||||
class PackageFieldList(list):
|
||||
def __init__(self, value = None):
|
||||
self.extend(value)
|
||||
self.linux_revision_experimental = match.group('revision_experimental') and True
|
||||
self.linux_revision_other = match.group('revision_other') and True
|
||||
|
||||
def __str__(self):
|
||||
return ' '.join(self)
|
||||
|
||||
def _extend(self, value):
|
||||
if value is not None:
|
||||
self.extend([j.strip() for j in re.split('\s', value.strip())])
|
||||
class PackageArchitecture(collections.MutableSet):
|
||||
__slots__ = '_data'
|
||||
|
||||
def __init__(self, value=None):
|
||||
self._data = set()
|
||||
if value:
|
||||
self.extend(value)
|
||||
|
||||
def __contains__(self, value):
|
||||
return self._data.__contains__(value)
|
||||
|
||||
def __iter__(self):
|
||||
return self._data.__iter__()
|
||||
|
||||
def __len__(self):
|
||||
return self._data.__len__()
|
||||
|
||||
def __unicode__(self):
|
||||
return u' '.join(sorted(self))
|
||||
|
||||
def add(self, value):
|
||||
self._data.add(value)
|
||||
|
||||
def discard(self, value):
|
||||
self._data.discard(value)
|
||||
|
||||
def extend(self, value):
|
||||
if isinstance(value, str):
|
||||
self._extend(value)
|
||||
if isinstance(value, basestring):
|
||||
for i in re.split('\s', value.strip()):
|
||||
self.add(i)
|
||||
else:
|
||||
super(PackageFieldList, self).extend(value)
|
||||
raise RuntimeError
|
||||
|
||||
|
||||
class PackageDescription(object):
|
||||
__slots__ = "short", "long"
|
||||
|
||||
def __init__(self, value = None):
|
||||
def __init__(self, value=None):
|
||||
self.short = []
|
||||
self.long = []
|
||||
if value is not None:
|
||||
self.short, long = value.split("\n", 1)
|
||||
short, long = value.split(u"\n", 1)
|
||||
self.append(long)
|
||||
else:
|
||||
self.short = None
|
||||
self.append_short(short)
|
||||
|
||||
def __str__(self):
|
||||
ret = self.short + '\n'
|
||||
w = utils.TextWrapper(width = 74, fix_sentence_endings = True)
|
||||
pars = []
|
||||
def __unicode__(self):
|
||||
wrap = utils.TextWrapper(width=74, fix_sentence_endings=True).wrap
|
||||
short = u', '.join(self.short)
|
||||
long_pars = []
|
||||
for i in self.long:
|
||||
pars.append('\n '.join(w.wrap(i)))
|
||||
return self.short + '\n ' + '\n .\n '.join(pars)
|
||||
long_pars.append(wrap(i))
|
||||
long = u'\n .\n '.join([u'\n '.join(i) for i in long_pars])
|
||||
return short + u'\n ' + long
|
||||
|
||||
def append(self, str):
|
||||
str = str.strip()
|
||||
if str:
|
||||
self.long.extend(str.split("\n.\n"))
|
||||
self.long.extend(str.split(u"\n.\n"))
|
||||
|
||||
def append_short(self, str):
|
||||
for i in [i.strip() for i in str.split(u",")]:
|
||||
if i:
|
||||
self.short.append(i)
|
||||
|
||||
def extend(self, desc):
|
||||
if isinstance(desc, PackageDescription):
|
||||
self.short.extend(desc.short)
|
||||
self.long.extend(desc.long)
|
||||
else:
|
||||
raise TypeError
|
||||
|
||||
|
||||
class PackageRelation(list):
|
||||
def __init__(self, value = None):
|
||||
if value is not None:
|
||||
self.extend(value)
|
||||
def __init__(self, value=None, override_arches=None):
|
||||
if value:
|
||||
self.extend(value, override_arches)
|
||||
|
||||
def __str__(self):
|
||||
return ', '.join([str(i) for i in self])
|
||||
def __unicode__(self):
|
||||
return u', '.join((unicode(i) for i in self))
|
||||
|
||||
def _match(self, value):
|
||||
def _search_value(self, value):
|
||||
for i in self:
|
||||
if i._match(value):
|
||||
if i._search_value(value):
|
||||
return i
|
||||
return None
|
||||
|
||||
def append(self, value):
|
||||
def append(self, value, override_arches=None):
|
||||
if isinstance(value, basestring):
|
||||
value = PackageRelationGroup(value)
|
||||
value = PackageRelationGroup(value, override_arches)
|
||||
elif not isinstance(value, PackageRelationGroup):
|
||||
raise ValueError, "got %s" % type(value)
|
||||
j = self._match(value)
|
||||
raise ValueError(u"got %s" % type(value))
|
||||
j = self._search_value(value)
|
||||
if j:
|
||||
j._updateArches(value)
|
||||
j._update_arches(value)
|
||||
else:
|
||||
super(PackageRelation, self).append(value)
|
||||
|
||||
def extend(self, value):
|
||||
def extend(self, value, override_arches=None):
|
||||
if isinstance(value, basestring):
|
||||
value = [j.strip() for j in re.split(',', value.strip())]
|
||||
elif not isinstance(value, (list, tuple)):
|
||||
raise ValueError, "got %s" % type(value)
|
||||
value = (j.strip() for j in re.split(u',', value.strip()))
|
||||
for i in value:
|
||||
self.append(i)
|
||||
self.append(i, override_arches)
|
||||
|
||||
|
||||
class PackageRelationGroup(list):
|
||||
def __init__(self, value = None):
|
||||
if value is not None:
|
||||
self.extend(value)
|
||||
def __init__(self, value=None, override_arches=None):
|
||||
if value:
|
||||
self.extend(value, override_arches)
|
||||
|
||||
def __str__(self):
|
||||
return ' | '.join([str(i) for i in self])
|
||||
def __unicode__(self):
|
||||
return u' | '.join((unicode(i) for i in self))
|
||||
|
||||
def _match(self, value):
|
||||
def _search_value(self, value):
|
||||
for i, j in itertools.izip(self, value):
|
||||
if i.name != j.name or i.version != j.version:
|
||||
return None
|
||||
return self
|
||||
|
||||
def _updateArches(self, value):
|
||||
def _update_arches(self, value):
|
||||
for i, j in itertools.izip(self, value):
|
||||
if i.arches:
|
||||
for arch in j.arches:
|
||||
if arch not in i.arches:
|
||||
i.arches.append(arch)
|
||||
|
||||
def append(self, value):
|
||||
def append(self, value, override_arches=None):
|
||||
if isinstance(value, basestring):
|
||||
value = PackageRelationEntry(value)
|
||||
value = PackageRelationEntry(value, override_arches)
|
||||
elif not isinstance(value, PackageRelationEntry):
|
||||
raise ValueError
|
||||
super(PackageRelationGroup, self).append(value)
|
||||
|
||||
def extend(self, value):
|
||||
def extend(self, value, override_arches=None):
|
||||
if isinstance(value, basestring):
|
||||
value = [j.strip() for j in re.split('\|', value.strip())]
|
||||
elif not isinstance(value, (list, tuple)):
|
||||
raise ValueError
|
||||
value = (j.strip() for j in re.split('\|', value.strip()))
|
||||
for i in value:
|
||||
self.append(i)
|
||||
self.append(i, override_arches)
|
||||
|
||||
|
||||
class PackageRelationEntry(object):
|
||||
__slots__ = "name", "operator", "version", "arches"
|
||||
@@ -246,9 +305,31 @@ class PackageRelationEntry(object):
|
||||
_re = re.compile(r'^(\S+)(?: \((<<|<=|=|!=|>=|>>)\s*([^)]+)\))?(?: \[([^]]+)\])?$')
|
||||
|
||||
class _operator(object):
|
||||
OP_LT = 1; OP_LE = 2; OP_EQ = 3; OP_NE = 4; OP_GE = 5; OP_GT = 6
|
||||
operators = { '<<': OP_LT, '<=': OP_LE, '=': OP_EQ, '!=': OP_NE, '>=': OP_GE, '>>': OP_GT }
|
||||
operators_neg = { OP_LT: OP_GE, OP_LE: OP_GT, OP_EQ: OP_NE, OP_NE: OP_EQ, OP_GE: OP_LT, OP_GT: OP_LE }
|
||||
OP_LT = 1
|
||||
OP_LE = 2
|
||||
OP_EQ = 3
|
||||
OP_NE = 4
|
||||
OP_GE = 5
|
||||
OP_GT = 6
|
||||
|
||||
operators = {
|
||||
u'<<': OP_LT,
|
||||
u'<=': OP_LE,
|
||||
u'=': OP_EQ,
|
||||
u'!=': OP_NE,
|
||||
u'>=': OP_GE,
|
||||
u'>>': OP_GT,
|
||||
}
|
||||
|
||||
operators_neg = {
|
||||
OP_LT: OP_GE,
|
||||
OP_LE: OP_GT,
|
||||
OP_EQ: OP_NE,
|
||||
OP_NE: OP_EQ,
|
||||
OP_GE: OP_LT,
|
||||
OP_GT: OP_LE,
|
||||
}
|
||||
|
||||
operators_text = dict([(b, a) for a, b in operators.iteritems()])
|
||||
|
||||
__slots__ = '_op',
|
||||
@@ -259,27 +340,30 @@ class PackageRelationEntry(object):
|
||||
def __neg__(self):
|
||||
return self.__class__(self.operators_text[self.operators_neg[self._op]])
|
||||
|
||||
def __str__(self):
|
||||
def __unicode__(self):
|
||||
return self.operators_text[self._op]
|
||||
|
||||
def __init__(self, value = None):
|
||||
if isinstance(value, basestring):
|
||||
self.parse(value)
|
||||
else:
|
||||
def __init__(self, value=None, override_arches=None):
|
||||
if not isinstance(value, basestring):
|
||||
raise ValueError
|
||||
|
||||
def __str__(self):
|
||||
self.parse(value)
|
||||
|
||||
if override_arches:
|
||||
self.arches = list(override_arches)
|
||||
|
||||
def __unicode__(self):
|
||||
ret = [self.name]
|
||||
if self.operator is not None and self.version is not None:
|
||||
ret.extend([' (', str(self.operator), ' ', self.version, ')'])
|
||||
ret.extend((u' (', unicode(self.operator), u' ', self.version, u')'))
|
||||
if self.arches:
|
||||
ret.extend([' [', ' '.join(self.arches), ']'])
|
||||
return ''.join(ret)
|
||||
ret.extend((u' [', u' '.join(self.arches), u']'))
|
||||
return u''.join(ret)
|
||||
|
||||
def parse(self, value):
|
||||
match = self._re.match(value)
|
||||
if match is None:
|
||||
raise RuntimeError, "Can't parse dependency %s" % value
|
||||
raise RuntimeError(u"Can't parse dependency %s" % value)
|
||||
match = match.groups()
|
||||
self.name = match[0]
|
||||
if match[1] is not None:
|
||||
@@ -292,16 +376,17 @@ class PackageRelationEntry(object):
|
||||
else:
|
||||
self.arches = []
|
||||
|
||||
|
||||
class Package(dict):
|
||||
_fields = utils.SortedDict((
|
||||
('Package', str),
|
||||
('Source', str),
|
||||
('Architecture', PackageFieldList),
|
||||
('Section', str),
|
||||
('Priority', str),
|
||||
('Maintainer', str),
|
||||
('Uploaders', str),
|
||||
('Standards-Version', str),
|
||||
_fields = collections.OrderedDict((
|
||||
('Package', unicode),
|
||||
('Source', unicode),
|
||||
('Architecture', PackageArchitecture),
|
||||
('Section', unicode),
|
||||
('Priority', unicode),
|
||||
('Maintainer', unicode),
|
||||
('Uploaders', unicode),
|
||||
('Standards-Version', unicode),
|
||||
('Build-Depends', PackageRelation),
|
||||
('Build-Depends-Indep', PackageRelation),
|
||||
('Provides', PackageRelation),
|
||||
@@ -310,6 +395,7 @@ class Package(dict):
|
||||
('Recommends', PackageRelation),
|
||||
('Suggests', PackageRelation),
|
||||
('Replaces', PackageRelation),
|
||||
('Breaks', PackageRelation),
|
||||
('Conflicts', PackageRelation),
|
||||
('Description', PackageDescription),
|
||||
))
|
||||
@@ -319,13 +405,14 @@ class Package(dict):
|
||||
cls = self._fields[key]
|
||||
if not isinstance(value, cls):
|
||||
value = cls(value)
|
||||
except KeyError: pass
|
||||
except KeyError:
|
||||
pass
|
||||
super(Package, self).__setitem__(key, value)
|
||||
|
||||
def iterkeys(self):
|
||||
keys = set(self.keys())
|
||||
for i in self._fields.iterkeys():
|
||||
if self.has_key(i):
|
||||
if i in self:
|
||||
keys.remove(i)
|
||||
yield i
|
||||
for i in keys:
|
||||
@@ -338,4 +425,3 @@ class Package(dict):
|
||||
def itervalues(self):
|
||||
for i in self.iterkeys():
|
||||
yield self[i]
|
||||
|
||||
|
||||
Reference in New Issue
Block a user