# -*- coding: utf-8 -*- # Copyright (C) 2011 Adam D. Barratt # 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)