2013-12-29 16:09:47 +01:00
|
|
|
from exceptions import PackageError
|
|
|
|
|
|
|
|
|
|
|
|
class PackageList(object):
|
|
|
|
|
2013-12-29 16:48:55 +01:00
|
|
|
def __init__(self, data, manifest_vars, default_target, source_lists):
|
|
|
|
self.manifest_vars = manifest_vars
|
|
|
|
self.source_lists = source_lists
|
|
|
|
self.default_target = default_target
|
2013-12-29 16:09:47 +01:00
|
|
|
self.remote = {}
|
|
|
|
self.local = set()
|
2013-12-29 16:48:55 +01:00
|
|
|
if 'remote' in data:
|
|
|
|
for package in data['remote']:
|
2013-12-29 16:09:47 +01:00
|
|
|
target = None
|
|
|
|
if isinstance(package, dict):
|
2013-12-29 16:48:55 +01:00
|
|
|
name = package['name'].format(**self.manifest_vars)
|
2013-12-29 16:09:47 +01:00
|
|
|
if 'target' in package:
|
2013-12-29 16:48:55 +01:00
|
|
|
target = package['target'].format(**self.manifest_vars)
|
2013-12-29 16:09:47 +01:00
|
|
|
else:
|
2013-12-29 16:48:55 +01:00
|
|
|
name = package.format(**self.manifest_vars)
|
2013-12-29 16:09:47 +01:00
|
|
|
self.add(name, target)
|
2013-12-29 16:48:55 +01:00
|
|
|
if 'local' in data:
|
|
|
|
for package_path in data['local']:
|
2013-12-29 16:09:47 +01:00
|
|
|
self.local.add(package_path)
|
|
|
|
|
|
|
|
def add(self, name, target=None):
|
|
|
|
if target is None:
|
|
|
|
target = self.default_target
|
2013-12-29 16:48:55 +01:00
|
|
|
name = name.format(**self.manifest_vars)
|
|
|
|
target = target.format(**self.manifest_vars)
|
2013-12-29 16:09:47 +01:00
|
|
|
if name in self.remote:
|
|
|
|
if self.remote[name] != target:
|
|
|
|
msg = ('The package {name} was already added to the package list, '
|
|
|
|
'but with another target release ({target})').format(name=name, target=self.remote[name])
|
|
|
|
raise PackageError(msg)
|
|
|
|
return
|
|
|
|
|
2013-12-29 16:48:55 +01:00
|
|
|
if not self.source_lists.target_exists(target):
|
2013-12-29 16:09:47 +01:00
|
|
|
msg = ('The target release {target} was not found in the sources list').format(target=target)
|
|
|
|
raise PackageError(msg)
|
|
|
|
self.remote[name] = target
|