'get_operator,isjustname,isspecific,isvalidatom,' + \
'match_from_list,match_to_list',
'portage.eclass_cache',
+ 'portage.env.loaders',
'portage.exception',
'portage.getbinpkg',
'portage.locks',
self.module_priority = ["user","default"]
self.modules = {}
- self.modules["user"] = getconfig(
- os.path.join(config_root, MODULES_FILE_PATH))
+ modules_loader = portage.env.loaders.KeyValuePairFileLoader(
+ os.path.join(config_root, MODULES_FILE_PATH), None, None)
+ modules_dict, modules_errors = modules_loader.load()
+ self.modules["user"] = modules_dict
if self.modules["user"] is None:
self.modules["user"] = {}
self.modules["default"] = {
if portage.dep._dep_check_strict:
raise portage.exception.ParseError(
_("invalid atom: '%s'") % x)
+ else:
+ # Only real Atom instances are allowed past this point.
+ continue
else:
if x.blocker and x.blocker.overlap.forbid and \
eapi in ("0", "1") and portage.dep._dep_check_strict:
preferred_in_graph = []
preferred_any_slot = []
preferred_non_installed = []
+ unsat_use_in_graph = []
+ unsat_use_installed = []
+ unsat_use_non_installed = []
other = []
# Alias the trees we'll be checking availability against
continue
all_available = True
+ all_use_satisfied = True
versions = {}
for atom in atoms:
if atom[:1] == "!":
continue
- avail_pkg = mydbapi.match(atom)
+ # Ignore USE dependencies here since we don't want USE
+ # settings to adversely affect || preference evaluation.
+ avail_pkg = mydbapi.match(atom.without_use)
if avail_pkg:
avail_pkg = avail_pkg[-1] # highest (ascending order)
avail_slot = "%s:%s" % (dep_getkey(atom),
mydbapi.aux_get(avail_pkg, ["SLOT"])[0])
if not avail_pkg:
all_available = False
+ all_use_satisfied = False
break
+ if atom.use:
+ avail_pkg_use = mydbapi.match(atom)
+ if not avail_pkg_use:
+ all_use_satisfied = False
+ else:
+ # highest (ascending order)
+ avail_pkg_use = avail_pkg_use[-1]
+ if avail_pkg_use != avail_pkg:
+ avail_pkg = avail_pkg_use
+ avail_slot = "%s:%s" % (dep_getkey(atom),
+ mydbapi.aux_get(avail_pkg, ["SLOT"])[0])
+
versions[avail_slot] = avail_pkg
this_choice = (atoms, versions, all_available)
not slot_atom.startswith("virtual/"):
all_installed_slots = False
break
- if all_installed:
- if all_installed_slots:
- preferred_installed.append(this_choice)
+ if graph_db is None:
+ if all_use_satisfied:
+ if all_installed:
+ if all_installed_slots:
+ preferred_installed.append(this_choice)
+ else:
+ preferred_any_slot.append(this_choice)
+ else:
+ preferred_non_installed.append(this_choice)
else:
- preferred_any_slot.append(this_choice)
- elif graph_db is None:
- preferred_non_installed.append(this_choice)
+ if all_installed_slots:
+ unsat_use_installed.append(this_choice)
+ else:
+ unsat_use_non_installed.append(this_choice)
else:
all_in_graph = True
for slot_atom in versions:
not slot_atom.startswith("virtual/"):
all_in_graph = False
break
+ circular_atom = None
if all_in_graph:
if parent is None or priority is None:
- preferred_in_graph.append(this_choice)
+ pass
elif priority.buildtime:
# Check if the atom would result in a direct circular
# dependency and try to avoid that if it seems likely
# buildtime deps that aren't already satisfied by an
# installed package.
cpv_slot_list = [parent]
- circular_atom = None
for atom in atoms:
if "!" == atom[:1]:
continue
if match_from_list(atom, cpv_slot_list):
circular_atom = atom
break
- if circular_atom is None:
+ if circular_atom is not None:
+ other.append(this_choice)
+ else:
+ if all_use_satisfied:
+ if all_in_graph:
preferred_in_graph.append(this_choice)
+ elif all_installed:
+ if all_installed_slots:
+ preferred_installed.append(this_choice)
+ else:
+ preferred_any_slot.append(this_choice)
else:
- other.append(this_choice)
+ preferred_non_installed.append(this_choice)
else:
- preferred_in_graph.append(this_choice)
- else:
- preferred_non_installed.append(this_choice)
+ if all_in_graph:
+ unsat_use_in_graph.append(this_choice)
+ elif all_installed_slots:
+ unsat_use_installed.append(this_choice)
+ else:
+ unsat_use_non_installed.append(this_choice)
else:
other.append(this_choice)
+ # unsat_use_* must come after preferred_non_installed
+ # for correct ordering in cases like || ( foo[a] foo[b] ).
preferred = preferred_in_graph + preferred_installed + \
- preferred_any_slot + preferred_non_installed + other
+ preferred_any_slot + preferred_non_installed + \
+ unsat_use_in_graph + unsat_use_installed + unsat_use_non_installed + \
+ other
for allow_masked in (False, True):
for atoms, versions, all_available in preferred:
def tar_contents(contents, root, tar, protect=None, onProgress=None):
os = _os_merge
+
+ try:
+ for x in contents:
+ _unicode_encode(x,
+ encoding=_encodings['merge'],
+ errors='strict')
+ except UnicodeEncodeError:
+ # The package appears to have been merged with a
+ # different value of sys.getfilesystemencoding(),
+ # so fall back to utf_8 if appropriate.
+ try:
+ for x in contents:
+ _unicode_encode(x,
+ encoding=_encodings['fs'],
+ errors='strict')
+ except UnicodeEncodeError:
+ pass
+ else:
+ os = portage.os
+
from portage.util import normalize_path
import tarfile
root = normalize_path(root).rstrip(os.path.sep) + os.path.sep
tar.addfile(tarinfo)
else:
f = open(_unicode_encode(path,
- encoding=_encodings['merge'], errors='strict'), 'rb')
+ encoding=object.__getattribute__(os, '_encoding'),
+ errors='strict'), 'rb')
try:
tar.addfile(tarinfo, f)
finally:
import codecs
import errno
import logging
+import re
import shlex
import stat
import string
(self.infile, str(e)), noiselevel=-1)
return (newfile, StringIO())
+_invalid_var_name_re = re.compile(r'^\d|\W')
+
def getconfig(mycfg, tolerant=0, allow_sourcing=False, expand=True):
if isinstance(expand, dict):
# Some existing variable definitions have been
return mykeys
key = _unicode_decode(key)
val = _unicode_decode(val)
+
+ if _invalid_var_name_re.search(key) is not None:
+ if not tolerant:
+ raise Exception(_(
+ "ParseError: Invalid variable name '%s': line %s") % \
+ (key, lex.lineno - 1))
+ writemsg(_("!!! Invalid variable name '%s': line %s in %s\n") \
+ % (key, lex.lineno - 1, mycfg), noiselevel=-1)
+ continue
+
if expand:
mykeys[key] = varexpand(val, expand_map)
expand_map[key] = mykeys[key]