britney2-ubuntu/britney2/migrationitem.py
Ivo De Decker f0ddfc253f Fix parsing of migration item name for binNMU in tpu
The parsing of migration items should also look for the suite name in the
architecture part. This fixes the parsing for migration items like
some-src/amd64_tpu and some-src/amd64_tpu/1.0-1

Signed-off-by: Ivo De Decker <ivodd@debian.org>
2018-12-11 14:37:55 +00:00

167 lines
4.7 KiB
Python

# -*- coding: utf-8 -*-
# Copyright (C) 2011 Adam D. Barratt <adsb@debian.org>
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
class MigrationItem(object):
_architectures = []
_suites = None
@classmethod
def set_architectures(cls, architectures=None):
cls._architectures = architectures or []
@classmethod
def get_architectures(cls):
return cls._architectures
@classmethod
def set_suites(cls, suites):
cls._suites = suites
@classmethod
def get_suites(cls):
return cls._suites
def __init__(self, name=None, versionned=True):
self._name = None
self._uvname = None
self._package = None
self._version = None
self._architecture = None
self._suite = None
self._versionned = versionned
if name:
self.name = name
def __str__(self):
if self._versionned and self.version is not None:
return self.name
else:
return self.uvname
def __eq__(self, other):
isequal = False
if self.uvname == other.uvname:
if self.version is None or other.version is None:
isequal = True
else:
isequal = self.version == other.version
return isequal
def __hash__(self):
return hash((self.uvname, self.version))
def __lt__(self, other):
return (self.uvname, self.version) < (other.uvname, other.version)
@property
def name(self):
return self._name
@name.setter
def name(self, value):
self._version = None
self._name = value
if value.startswith('-'):
value = value[1:]
parts = value.split('/', 3)
package = parts[0]
suite_name = self.__class__._suites.primary_source_suite.name
if '_' in package:
self._package, suite_name = package.split('_', 2)
else:
self._package = package
if self._versionned and len(parts) > 1:
if len(parts) == 3:
self._architecture = parts[1]
self._version = parts[2]
else:
self._architecture = 'source'
self._version = parts[1]
else:
if len(parts) >= 2:
self._architecture = parts[1]
else:
self._architecture = 'source'
if '_' in self._architecture:
self._architecture, suite_name = self._architecture.split('_', 2)
if self._version in self.__class__.get_architectures():
(self._architecture, self._version) = \
(self._version, self._architecture)
if '_' in self._architecture:
self._architecture, self._suite = \
self._architecture.split('_', 2)
if self.is_removal:
self._suite = self.__class__._suites.target_suite
else:
self._suite = self.__class__._suites.by_name_or_alias[suite_name]
self._canonicalise_name()
def _canonicalise_name(self):
parts = self._name.split('/', 3)
is_removal = self.is_removal
if len(parts) == 1 or self._architecture == 'source':
self._uvname = self._package
else:
self._uvname = "%s/%s" % (self._package, self._architecture)
if self._suite.suite_class.is_additional_source:
self._uvname = '%s_%s' % (self._uvname, self._suite.suite_short_name)
if is_removal:
self._uvname = '-%s' % (self._uvname)
if self._versionned:
self._name = '%s/%s' % (self._uvname, self._version)
else:
self._name = self._uvname
@property
def is_removal(self):
return self._name.startswith('-')
@property
def architecture(self):
return self._architecture
@property
def package(self):
return self._package
@property
def suite(self):
return self._suite
@suite.setter
def suite(self, value):
self._suite = self.__class__._suites[value]
self._canonicalise_name()
@property
def version(self):
return self._version
@property
def uvname(self):
return self._uvname
class UnversionnedMigrationItem(MigrationItem):
def __init__(self, name=None):
super().__init__(name=name, versionned=False)