|
|
|
@ -22,9 +22,11 @@ DEFAULT, NOTEXIST, NOTCORRECT = range(3)
|
|
|
|
|
|
|
|
|
|
class PackageAtomError(Exception):
|
|
|
|
|
'''Исключение выбрасываемое при ошибках разбора ATOM-названий.'''
|
|
|
|
|
def __init__(self, message='Package atom error', errno=DEFAULT):
|
|
|
|
|
def __init__(self, message='Package atom error', errno=DEFAULT,
|
|
|
|
|
atom_name=None):
|
|
|
|
|
self.message = message
|
|
|
|
|
self.errno = errno
|
|
|
|
|
self.atom = atom_name
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class VersionError(Exception):
|
|
|
|
@ -206,12 +208,25 @@ class Version:
|
|
|
|
|
class PackageAtomName:
|
|
|
|
|
'''Класс для хранения результата определения пакета. Для определения пакета
|
|
|
|
|
использует путь к его pkg директории.'''
|
|
|
|
|
def __init__(self, atom_dictionary):
|
|
|
|
|
def __init__(self, atom_dictionary, parser=None):
|
|
|
|
|
self._package_directory = atom_dictionary['pkg_path']
|
|
|
|
|
self._version = atom_dictionary['version']
|
|
|
|
|
if self._package_directory is None:
|
|
|
|
|
self._name = 'None'
|
|
|
|
|
else:
|
|
|
|
|
self._name = atom_dictionary.get('name',
|
|
|
|
|
os.path.basename(
|
|
|
|
|
self._package_directory))
|
|
|
|
|
self._parser = parser
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def name(self):
|
|
|
|
|
if self._package_directory is None:
|
|
|
|
|
return 'None'
|
|
|
|
|
return self._name
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def fullname(self):
|
|
|
|
|
if self._package_directory is None:
|
|
|
|
|
return 'None'
|
|
|
|
|
return os.path.basename(self._package_directory)
|
|
|
|
@ -226,7 +241,7 @@ class PackageAtomName:
|
|
|
|
|
def atom(self):
|
|
|
|
|
if self._package_directory is None:
|
|
|
|
|
return 'None'
|
|
|
|
|
return "{}/{}".format(self.category, self.name)
|
|
|
|
|
return "{}/{}".format(self.category, self.fullname)
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def version(self):
|
|
|
|
@ -243,7 +258,8 @@ class PackageAtomName:
|
|
|
|
|
return read_file(use_path).strip('\n').split(' ')
|
|
|
|
|
except FilesError:
|
|
|
|
|
raise PackageAtomError("could not read use flags for 'package'"
|
|
|
|
|
" parameter: {}".format(self.package_atom))
|
|
|
|
|
" parameter: {}".format(self.package_atom),
|
|
|
|
|
atom_name=self.package_atom)
|
|
|
|
|
|
|
|
|
|
@property
|
|
|
|
|
def pkg_path(self):
|
|
|
|
@ -258,12 +274,27 @@ class PackageAtomName:
|
|
|
|
|
return read_file(slot_path).strip('\n')
|
|
|
|
|
except FilesError:
|
|
|
|
|
raise PackageAtomError("could not read slot value for"
|
|
|
|
|
" 'package': {}".format(self.package_atom))
|
|
|
|
|
" 'package': {}".format(self.package_atom),
|
|
|
|
|
atom_name=self.package_atom)
|
|
|
|
|
|
|
|
|
|
def __eq__(self, other):
|
|
|
|
|
print('EQ')
|
|
|
|
|
print('other:', other)
|
|
|
|
|
if isinstance(other, PackageAtomName):
|
|
|
|
|
return (self._package_directory ==
|
|
|
|
|
other._package_directory)
|
|
|
|
|
result = (self._package_directory ==
|
|
|
|
|
other._package_directory)
|
|
|
|
|
print('result:', result)
|
|
|
|
|
return result
|
|
|
|
|
elif isinstance(other, str) and self._parser:
|
|
|
|
|
try:
|
|
|
|
|
other_atom = self._parser.parse_package_parameter(other)
|
|
|
|
|
print('OTHER ATOM:', other_atom)
|
|
|
|
|
result = (self._package_directory ==
|
|
|
|
|
other_atom._package_directory)
|
|
|
|
|
print('result:', result)
|
|
|
|
|
return result
|
|
|
|
|
except Exception:
|
|
|
|
|
return False
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
@ -271,6 +302,12 @@ class PackageAtomName:
|
|
|
|
|
if isinstance(other, PackageAtomName):
|
|
|
|
|
return (self._package_directory !=
|
|
|
|
|
other._package_directory)
|
|
|
|
|
elif isinstance(other, str) and self._parser:
|
|
|
|
|
try:
|
|
|
|
|
other_atom = self._parser.parse_package_parameter(other)
|
|
|
|
|
return self._package_directory != other_atom._package_directory
|
|
|
|
|
except Exception:
|
|
|
|
|
return True
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
@ -332,7 +369,7 @@ class PackageAtomParser:
|
|
|
|
|
not parsing_result.groupdict()['name']):
|
|
|
|
|
raise PackageAtomError("'package' parameter value '{}' is not"
|
|
|
|
|
" correct".format(package_atom),
|
|
|
|
|
errno=NOTCORRECT)
|
|
|
|
|
errno=NOTCORRECT, atom_name=self.atom_name)
|
|
|
|
|
|
|
|
|
|
self._atom_dictionary['category'] = parsing_result.groupdict(
|
|
|
|
|
)['category']
|
|
|
|
@ -359,7 +396,7 @@ class PackageAtomParser:
|
|
|
|
|
|
|
|
|
|
self._check_package_existance()
|
|
|
|
|
|
|
|
|
|
atom_name_object = PackageAtomName(self._atom_dictionary)
|
|
|
|
|
atom_name_object = PackageAtomName(self._atom_dictionary, parser=self)
|
|
|
|
|
self._atom_dictionary.clear()
|
|
|
|
|
return atom_name_object
|
|
|
|
|
|
|
|
|
@ -395,7 +432,8 @@ class PackageAtomParser:
|
|
|
|
|
raise PackageAtomError("Package from 'package' parameter value"
|
|
|
|
|
" '{}' does not exist".format(
|
|
|
|
|
self.package_atom),
|
|
|
|
|
errno=NOTEXIST)
|
|
|
|
|
errno=NOTEXIST,
|
|
|
|
|
atom_name=self.package_atom)
|
|
|
|
|
|
|
|
|
|
if len(glob_result) == 1:
|
|
|
|
|
# Если нашелся один пакет.
|
|
|
|
@ -430,7 +468,8 @@ class PackageAtomParser:
|
|
|
|
|
"Package from 'package' parameter value"
|
|
|
|
|
" '{}' does not exist".format(
|
|
|
|
|
self.package_atom),
|
|
|
|
|
errno=NOTEXIST)
|
|
|
|
|
errno=NOTEXIST,
|
|
|
|
|
atom_name=self.package_atom)
|
|
|
|
|
|
|
|
|
|
if len(packages) == 1:
|
|
|
|
|
# Если был найден только один кандидат -- выдаем его.
|
|
|
|
@ -454,7 +493,8 @@ class PackageAtomParser:
|
|
|
|
|
raise PackageAtomError("Package from 'package' parameter value"
|
|
|
|
|
" '{}' does not exist".format(
|
|
|
|
|
self.package_atom),
|
|
|
|
|
errno=NOTEXIST)
|
|
|
|
|
errno=NOTEXIST,
|
|
|
|
|
atom_name=self.package_atom)
|
|
|
|
|
|
|
|
|
|
def _check_use_flags_value(self, pkg_path):
|
|
|
|
|
'''Метод для проверки полученных из параметра package значений
|
|
|
|
@ -468,7 +508,8 @@ class PackageAtomParser:
|
|
|
|
|
"Package from 'package' parameter value"
|
|
|
|
|
" '{}' does not exist".format(
|
|
|
|
|
self.package_atom),
|
|
|
|
|
errno=NOTEXIST)
|
|
|
|
|
errno=NOTEXIST,
|
|
|
|
|
atom_name=self.package_atom)
|
|
|
|
|
|
|
|
|
|
def _get_slot_value(self, pkg_path):
|
|
|
|
|
'''Метод для получения значения slot из файла SLOT.'''
|
|
|
|
@ -477,7 +518,8 @@ class PackageAtomParser:
|
|
|
|
|
return read_file(slot_path).strip('\n')
|
|
|
|
|
except FilesError:
|
|
|
|
|
raise PackageAtomError("could not read slot value for"
|
|
|
|
|
" 'package': {}".format(self.package_atom))
|
|
|
|
|
" 'package': {}".format(self.package_atom),
|
|
|
|
|
atom_name=self.package_atom)
|
|
|
|
|
|
|
|
|
|
def _get_use_flags_value(self, pkg_path):
|
|
|
|
|
'''Метод для получения списка значений use-флагов из файла USE.'''
|
|
|
|
@ -486,7 +528,8 @@ class PackageAtomParser:
|
|
|
|
|
return read_file(use_path).strip('\n').split(' ')
|
|
|
|
|
except FilesError:
|
|
|
|
|
raise PackageAtomError("could not read use flags for 'package'"
|
|
|
|
|
" parameter: {}".format(self.package_atom))
|
|
|
|
|
" parameter: {}".format(self.package_atom),
|
|
|
|
|
atom_name=self.package_atom)
|
|
|
|
|
|
|
|
|
|
def _get_category_packages(self, category):
|
|
|
|
|
'''Генератор имен категорий, имеющихся в /var/db/pkg'''
|
|
|
|
@ -518,7 +561,8 @@ class PackageAtomParser:
|
|
|
|
|
|
|
|
|
|
package_atom = PackageAtomName(
|
|
|
|
|
{'pkg_path': package_path,
|
|
|
|
|
'version': version})
|
|
|
|
|
'version': version},
|
|
|
|
|
parser=self)
|
|
|
|
|
return package_atom
|
|
|
|
|
except (OSError, IOError):
|
|
|
|
|
continue
|
|
|
|
@ -533,7 +577,7 @@ class PackageAtomParser:
|
|
|
|
|
@property
|
|
|
|
|
def atom_name(self):
|
|
|
|
|
'''Метод для получения из ATOM-словаря объекта PackageAtomName.'''
|
|
|
|
|
return PackageAtomName(self._atom_dictionary)
|
|
|
|
|
return PackageAtomName(self._atom_dictionary, parser=self)
|
|
|
|
|
|
|
|
|
|
@atom_dictionary.setter
|
|
|
|
|
def set_atom_dictionary(self, atom_dictionary):
|
|
|
|
|