[matter] implement "spm-repository-change" statement support, move default statements values to parser

This commit is contained in:
Fabio Erculiani
2011-08-13 11:40:42 +02:00
parent ea67974557
commit 8fd355d2a4

View File

@@ -284,34 +284,47 @@ class MatterSpec(GenericSpecFunctions):
'dependencies': {
'cb': self.valid_yes_no,
've': self.ve_string_stripper,
'default': "no",
},
'downgrade': {
'cb': self.valid_yes_no,
've': self.ve_string_stripper,
'default': "no",
},
'keep-going': {
'cb': self.valid_yes_no,
've': self.ve_string_stripper,
'default': "no",
},
'new-useflags': {
'cb': self.valid_yes_no,
've': self.ve_string_stripper,
'default': "no",
},
'removed-useflags': {
'cb': self.valid_yes_no,
've': self.ve_string_stripper,
'default': "no",
},
'rebuild': {
'cb': self.valid_yes_no,
've': self.ve_string_stripper,
'default': "no",
},
'spm-repository-change': {
'cb': self.valid_yes_no,
've': self.ve_string_stripper,
'default': "no",
},
'pkgpre': {
'cb': self.not_none,
've': self.ve_string_open_file_read,
'default': None,
},
'pkgpost': {
'cb': self.not_none,
've': self.ve_string_open_file_read,
'default': None,
},
'packages': {
'cb': self.always_valid,
@@ -434,7 +447,7 @@ class SpecParser:
self.__plugin = MatterSpec()
self.vital_parameters = self.__plugin.vital_parameters()
self.parser_data_path = self.__plugin.parser_data_path()
self._parser_data_path = self.__plugin.parser_data_path()
def _parse_line_statement(self, line_stmt):
try:
@@ -453,7 +466,7 @@ class SpecParser:
key = None
value = None
v_key, v_value = self._parse_line_statement(line)
check_dict = self.parser_data_path.get(v_key)
check_dict = self._parser_data_path.get(v_key)
if check_dict is not None:
key, value = v_key, v_value
old_key = key
@@ -463,7 +476,7 @@ class SpecParser:
if not value:
continue
# gather again... key is changed
check_dict = self.parser_data_path.get(key)
check_dict = self._parser_data_path.get(key)
if not isinstance(check_dict, dict):
continue
value = check_dict['ve'](value)
@@ -478,10 +491,20 @@ class SpecParser:
continue
else:
mydict[key] = value
self.validate_parse(mydict)
self._validate_parse(mydict)
self._extend_parse(mydict)
return mydict.copy()
def validate_parse(self, mydata):
def _extend_parse(self, mydata):
"""
Extend parsed data with default values for statements with
default option available.
"""
for statement, opts in self._parser_data_path.items():
if "default" in opts and (statement not in mydata):
mydata[statement] = opts['default']
def _validate_parse(self, mydata):
for param in self.vital_parameters:
if param not in mydata:
raise ValueError(
@@ -618,7 +641,7 @@ class PackageBuilder(object):
print_info("MATTER_PACKAGE_NAME = %s" % (self._package,))
# run pkgpre, if any
pkgpre = self._params.get("pkgpre")
pkgpre = self._params["pkgpre"]
if pkgpre is not None:
print_info(
"spawning --pkgpre: %s, name: %s" % (pkgpre, pkgpre.name))
@@ -697,7 +720,7 @@ class PackageBuilder(object):
queue.close()
# run pkgpre, if any
pkgpost = self._params.get("pkgpost")
pkgpost = self._params["pkgpost"]
if pkgpost is not None:
print_info(
"spawning --pkgpost: %s, name: %s" % (pkgpost, pkgpost.name))
@@ -775,8 +798,8 @@ class PackageBuilder(object):
portage.versions.pkgsplit(best_installed),
portage.versions.pkgsplit(best_visible))
allow_rebuild = self._params.get("rebuild", "no") == "yes"
allow_downgrade = self._params.get("downgrade", "no") == "yes"
allow_rebuild = self._params['rebuild'] == "yes"
allow_downgrade = self._params['downgrade'] == "yes"
is_rebuild = cmp_res == 0
if (cmp_res == 1) and (not allow_downgrade):
@@ -835,7 +858,7 @@ class PackageBuilder(object):
# calculate dependencies, if --dependencies is not enabled
# because we have to validate it
if (self._params.get("dependencies", "no") == "no") \
if (self._params['dependencies'] == "no") \
and (len(package_queue) > 1):
# package is pulling in dependencies, but --dependencies is not
# enabled. need to give up
@@ -846,9 +869,9 @@ class PackageBuilder(object):
return 0
# inspect use flags changes
allow_new_useflags = self._params.get("new-useflags", "no") == "yes"
allow_new_useflags = self._params['new-useflags'] == "yes"
allow_removed_useflags = \
self._params.get("removed-useflags", "no") == "yes"
self._params['removed-useflags'] == "yes"
use_flags_give_up = False
if (not allow_new_useflags) or (not allow_removed_useflags):
@@ -879,6 +902,28 @@ class PackageBuilder(object):
print_warning("cannot continue due to unmet USE flags constraint")
return 0
changing_repo_pkgs = []
for pkg in package_queue:
wanted_repo = pkg.repo
inst_atom = portage.best(vardb.match(pkg.slot_atom))
current_repo = vardb.aux_get(inst_atom, ["repository"])[0]
if current_repo != wanted_repo:
changing_repo_pkgs.append(pkg.cpv+"::"+wanted_repo)
if changing_repo_pkgs:
print_warning("")
print_warning(
"Attention, packages are moving across SPM repositories:")
for pkg_atom in changing_repo_pkgs:
print_warning(" " + pkg_atom)
print_warning("")
allow_spm_repo_change = self._params['spm-repository-change'] == "yes"
if changing_repo_pkgs and (not allow_spm_repo_change):
print_warning(
"cannot continue due to unmet SPM repository change constraint")
return 0
print_info("USE flags constraints are met for all the queued packages")
print_info("about to build the following packages:")
for dep in dep_list:
@@ -1165,12 +1210,12 @@ def matter_main(entropy_server, nsargs, cwd, specs):
for spec in specs:
spec_count += 1
keep_going = spec.get("keep-going", "no") == "yes"
keep_going = spec["keep-going"] == "yes"
local_completed = []
pkg_count = 0
tot_pkgs = len(spec["packages"])
for package in spec["packages"]:
tot_pkgs = len(spec['packages'])
for package in spec['packages']:
pkg_count += 1
builder = PackageBuilder(entropy_server, package,
spec, spec_count, tot_spec, pkg_count,
@@ -1199,7 +1244,7 @@ def matter_main(entropy_server, nsargs, cwd, specs):
print_info("")
local_completed.extend([x for x in built_packages \
if x not in local_completed])
tainted_repositories.add(spec["repository"])
tainted_repositories.add(spec['repository'])
elif rc < 0:
# ignore warning and go ahead
print_info("")
@@ -1220,7 +1265,7 @@ def matter_main(entropy_server, nsargs, cwd, specs):
if local_completed and nsargs.commit:
rc = PackageBuilder.commit(entropy_server,
spec["repository"], local_completed)
spec['repository'], local_completed)
if exit_st == 0 and rc != 0:
exit_st = rc
if not keep_going: