* [gentoo-commits] portage r14880 - in main/branches/prefix: doc/config pym/_emerge pym/portage pym/portage/sets pym/portage/tests
@ 2009-11-25 15:13 Fabian Groffen (grobian)
0 siblings, 0 replies; only message in thread
From: Fabian Groffen (grobian) @ 2009-11-25 15:13 UTC (permalink / raw
To: gentoo-commits
Author: grobian
Date: 2009-11-25 15:13:31 +0000 (Wed, 25 Nov 2009)
New Revision: 14880
Added:
main/branches/prefix/pym/portage/tests/lint/
Removed:
main/branches/prefix/pym/_emerge/visible.py
Modified:
main/branches/prefix/doc/config/sets.docbook
main/branches/prefix/pym/_emerge/Package.py
main/branches/prefix/pym/_emerge/depgraph.py
main/branches/prefix/pym/_emerge/search.py
main/branches/prefix/pym/portage/__init__.py
main/branches/prefix/pym/portage/sets/dbapi.py
Log:
Merged from trunk -r14852:14876
| 14853 | Disable backtracking in the depgraph constructor call when |
| zmedico | appropriate. |
| 14854 | Bug #293730 - Fix bad || choices triggered in some cases |
| zmedico | inside _dep_check_composite_db._visible() when --update is |
| | not enabled. |
| 14855 | Fix depgraph._prune_tree_display() to preserve uninstall |
| zmedico | tasks. Thanks to Jonathan Callen <abcd@g.o> for reporting. |
| 14856 | Fix blocker display to work properly with --tree |
| zmedico | --unordered-display. |
| 14857 | In depgraph._serialize_tasks(), ensure that unsolvable |
| zmedico | blockers can't be accidentally marked as satisfied. |
| 14858 | Tweak logic from previous commit. |
| zmedico | |
| 14859 | Optimized the code for bug #288083 and make it handle more |
| zmedico | cases. Now Package instances have 'visible' and 'masks' |
| | attributes, since this information needs to be accessed in |
| | more places now. |
| 14873 | Bug #293998 - Use OSError.errno instead of trying to |
| zmedico | subscript the exception when handling errno.EXDEV in |
| | movefile(), since exceptions do not support subscripting in |
| | python3. |
| 14874 | Add "repository" attribute to CategorySet (revert r11597). |
| zmedico | Thanks to TGL <tom.gl@free.fr> for this patch, posted on bug |
| | #291414. |
| 14875 | Bug #293614 - When the backtracking limit is reached and |
| zmedico | there is a SLOT conflict to display, hint that a larger |
| | --backtrack value might solve the conflict automatically. |
| 14876 | Add a test case which simply compiles all modules, useful |
| zmedico | for testing syntax compatibility with the current version of |
| | python. |
Modified: main/branches/prefix/doc/config/sets.docbook
===================================================================
--- main/branches/prefix/doc/config/sets.docbook 2009-11-25 12:06:52 UTC (rev 14879)
+++ main/branches/prefix/doc/config/sets.docbook 2009-11-25 15:13:31 UTC (rev 14880)
@@ -124,6 +124,7 @@
[installed category packages]
class = portage.sets.dbapi.CategorySet
multiset = true
+ repository = vartree
name_pattern = $category/*
</programlisting>
</para>
@@ -438,6 +439,13 @@
<listitem><para><varname>category</varname>: Required. The name of an existing ebuild
category which should be used to create the package set.</para>
</listitem>
+ <listitem><para><varname>repository</varname>: Optional, defaults to
+ <parameter>porttree</parameter>. It determines which repository class should
+ be used to create the package set. Valid values for this option are:
+ <parameter>porttree</parameter> (normal ebuild repository),
+ <parameter>vartree</parameter> (installed package repository)
+ and <parameter>bintree</parameter> (local binary package repository).</para>
+ </listitem>
<listitem><para><varname>only_visible</varname>: Optional, defaults to <parameter>true</parameter>.
When set to <parameter>true</parameter> the set will only include visible packages,
when set to <parameter>false</parameter> it will also include masked packages.
Modified: main/branches/prefix/pym/_emerge/Package.py
===================================================================
--- main/branches/prefix/pym/_emerge/Package.py 2009-11-25 12:06:52 UTC (rev 14879)
+++ main/branches/prefix/pym/_emerge/Package.py 2009-11-25 15:13:31 UTC (rev 14880)
@@ -9,6 +9,7 @@
from portage.cache.mappings import slot_dict_class
from portage.dep import paren_reduce, use_reduce, \
paren_normalize, paren_enclose, _slot_re
+from portage.const import EPREFIX
from _emerge.Task import Task
if sys.hexversion >= 0x3000000:
@@ -22,8 +23,8 @@
"installed", "metadata", "onlydeps", "operation",
"root_config", "type_name",
"category", "counter", "cp", "cpv_split",
- "inherited", "invalid", "iuse", "mtime",
- "pf", "pv_split", "root", "slot", "slot_atom",) + \
+ "inherited", "invalid", "iuse", "masks", "mtime",
+ "pf", "pv_split", "root", "slot", "slot_atom", "visible",) + \
("_use",)
metadata_keys = [
@@ -51,7 +52,96 @@
self.category, self.pf = portage.catsplit(self.cpv)
self.cpv_split = portage.catpkgsplit(self.cpv)
self.pv_split = self.cpv_split[1:]
+ self.masks = self._masks()
+ self.visible = self._visible(self.masks)
+ def _masks(self):
+ masks = {}
+ settings = self.root_config.settings
+
+ if self.invalid is not None:
+ masks['invalid'] = self.invalid
+
+ if not settings._accept_chost(self.cpv, self.metadata):
+ masks['CHOST'] = self.metadata['CHOST']
+
+ eapi = self.metadata["EAPI"]
+ if not portage.eapi_is_supported(eapi):
+ masks['EAPI.unsupported'] = eapi
+ if portage._eapi_is_deprecated(eapi):
+ masks['EAPI.deprecated'] = eapi
+
+ missing_keywords = settings._getMissingKeywords(
+ self.cpv, self.metadata)
+ if missing_keywords:
+ masks['KEYWORDS'] = missing_keywords
+
+ if self.built and not self.installed:
+ # we can have an old binary which has no EPREFIX information
+ if "EPREFIX" not in self.metadata or not self.metadata["EPREFIX"]:
+ masks['EPREFIX.missing'] = ''
+ if len(self.metadata["EPREFIX"].strip()) < len(EPREFIX):
+ masks['EPREFIX.tooshort'] = self.metadata["EPREFIX"].strip()
+
+ try:
+ missing_properties = settings._getMissingProperties(
+ self.cpv, self.metadata)
+ if missing_properties:
+ masks['PROPERTIES'] = missing_properties
+ except portage.exception.InvalidDependString:
+ # already recorded as 'invalid'
+ pass
+
+ mask_atom = settings._getMaskAtom(self.cpv, self.metadata)
+ if mask_atom is not None:
+ masks['package.mask'] = mask_atom
+
+ system_mask = settings._getProfileMaskAtom(
+ self.cpv, self.metadata)
+ if system_mask is not None:
+ masks['profile.system'] = system_mask
+
+ try:
+ missing_licenses = settings._getMissingLicenses(
+ self.cpv, self.metadata)
+ if missing_licenses:
+ masks['LICENSE'] = missing_licenses
+ except portage.exception.InvalidDependString:
+ # already recorded as 'invalid'
+ pass
+
+ if not masks:
+ masks = None
+
+ return masks
+
+ def _visible(self, masks):
+
+ if masks is not None:
+
+ if 'EAPI.unsupported' in masks:
+ return False
+
+ if self.built and not self.installed and ( \
+ 'EPREFIX.missing' in masks or \
+ 'EPREFIX.tooshort' in masks):
+ return False
+
+ if not self.installed and ( \
+ 'invalid' in masks or \
+ 'CHOST' in masks or \
+ 'EAPI.deprecated' in masks or \
+ 'KEYWORDS' in masks or \
+ 'PROPERTIES' in masks):
+ return False
+
+ if 'package.mask' in masks or \
+ 'profile.system' in masks or \
+ 'LICENSE' in masks:
+ return False
+
+ return True
+
def _invalid_metadata(self, msg_type, msg):
if self.invalid is None:
self.invalid = {}
Modified: main/branches/prefix/pym/_emerge/depgraph.py
===================================================================
--- main/branches/prefix/pym/_emerge/depgraph.py 2009-11-25 12:06:52 UTC (rev 14879)
+++ main/branches/prefix/pym/_emerge/depgraph.py 2009-11-25 15:13:31 UTC (rev 14880)
@@ -49,7 +49,6 @@
from _emerge.SetArg import SetArg
from _emerge.show_invalid_depstring_notice import show_invalid_depstring_notice
from _emerge.UnmergeDepPriority import UnmergeDepPriority
-from _emerge.visible import visible
if sys.hexversion >= 0x3000000:
basestring = str
@@ -74,6 +73,7 @@
self.roots = {}
# All Package instances
self._pkg_cache = {}
+ self._highest_license_masked = {}
for myroot in trees:
self.trees[myroot] = {}
# Create a RootConfig instance that references
@@ -538,6 +538,14 @@
msg.append("satisfy simultaneously. If such a conflict exists in ")
msg.append("the dependencies of two different packages, then those ")
msg.append("packages can not be installed simultaneously.")
+ backtrack_opt = self._frozen_config.myopts.get('--backtrack')
+ if not self._dynamic_config._allow_backtracking and \
+ (backtrack_opt is None or \
+ (backtrack_opt > 0 and backtrack_opt < 30)):
+ msg.append(" You may want to try a larger value of the ")
+ msg.append("--backtrack option, such as --backtrack=30, ")
+ msg.append("in order to see if that will solve this conflict ")
+ msg.append("automatically.")
from formatter import AbstractFormatter, DumbWriter
f = AbstractFormatter(DumbWriter(sys.stderr, maxcol=72))
@@ -989,6 +997,7 @@
self._dynamic_config._slot_pkg_map[pkg.root][pkg.slot_atom] = pkg
self._dynamic_config.mydbapi[pkg.root].cpv_inject(pkg)
self._dynamic_config._filtered_trees[pkg.root]["porttree"].dbapi._clear_cache()
+ self._check_masks(pkg)
if not pkg.installed:
# Allow this package to satisfy old-style virtuals in case it
@@ -1047,6 +1056,17 @@
dep_stack.append(pkg)
return 1
+ def _check_masks(self, pkg):
+
+ slot_key = (pkg.root, pkg.slot_atom)
+
+ # Check for upgrades in the same slot that are
+ # masked due to a LICENSE change in a newer
+ # version that is not masked for any other reason.
+ other_pkg = self._frozen_config._highest_license_masked.get(slot_key)
+ if other_pkg is not None and pkg < other_pkg:
+ self._dynamic_config._masked_license_updates.add(other_pkg)
+
def _add_parent_atom(self, pkg, parent_atom):
parent_atoms = self._dynamic_config._parent_atoms.get(pkg)
if parent_atoms is None:
@@ -2350,7 +2370,7 @@
pkg, existing = ret
if pkg is not None:
settings = pkg.root_config.settings
- if visible(settings, pkg) and not (pkg.installed and \
+ if pkg.visible and not (pkg.installed and \
settings._getMissingKeywords(pkg.cpv, pkg.metadata)):
self._dynamic_config._visible_pkgs[pkg.root].cpv_inject(pkg)
return ret
@@ -2425,13 +2445,10 @@
# here, packages that have been masked since they
# were installed can be automatically downgraded
# to an unmasked version.
- try:
- if not visible(pkgsettings, pkg):
- continue
- except portage.exception.InvalidDependString:
- if not installed:
- continue
+ if not pkg.visible:
+ continue
+
# Enable upgrade or downgrade to a version
# with visible KEYWORDS when the installed
# version is masked by KEYWORDS, but never
@@ -2463,7 +2480,7 @@
except portage.exception.PackageNotFound:
continue
else:
- if not visible(pkgsettings, pkg_eb):
+ if not pkg_eb.visible:
continue
# Calculation of USE for unbuilt ebuilds is relatively
@@ -2762,6 +2779,14 @@
installed=installed, metadata=metadata, onlydeps=onlydeps,
root_config=root_config, type_name=type_name)
self._frozen_config._pkg_cache[pkg] = pkg
+
+ if not pkg.visible and \
+ 'LICENSE' in pkg.masks and len(pkg.masks) == 1:
+ slot_key = (pkg.root, pkg.slot_atom)
+ other_pkg = self._frozen_config._highest_license_masked.get(slot_key)
+ if other_pkg is None or pkg > other_pkg:
+ self._frozen_config._highest_license_masked[slot_key] = pkg
+
return pkg
def _validate_blockers(self):
@@ -2806,35 +2831,11 @@
# packages masked by license, since the user likely wants
# to adjust ACCEPT_LICENSE.
if pkg in final_db:
- if pkg_in_graph and not visible(pkgsettings, pkg):
+ if not pkg.visible and \
+ (pkg_in_graph or 'LICENSE' in pkg.masks):
self._dynamic_config._masked_installed.add(pkg)
- elif pkgsettings._getMissingLicenses(pkg.cpv, pkg.metadata):
- self._dynamic_config._masked_installed.add(pkg)
- elif pkg_in_graph or complete or deep:
- # Check for upgrades in the same slot that are
- # masked due to a LICENSE change in a newer
- # version that is not masked for any other reason.
- # Only do this for packages that are already in
- # the graph, or complete or deep graphs, since
- # otherwise it is likely a waste of time.
- got_mask = False
- for db, pkg_type, built, installed, db_keys in dbs:
- if installed:
- continue
- if got_mask:
- break
- for upgrade_pkg in self._iter_match_pkgs(
- root_config, pkg_type, pkg.slot_atom):
- if upgrade_pkg <= pkg:
- break
- if not visible(pkgsettings,
- upgrade_pkg, ignore=('LICENSE',)):
- continue
- if pkgsettings._getMissingLicenses(
- upgrade_pkg.cpv, upgrade_pkg.metadata):
- self._dynamic_config._masked_license_updates.add(upgrade_pkg)
- got_mask = True
- break
+ else:
+ self._check_masks(pkg)
blocker_atoms = None
blockers = None
@@ -3759,7 +3760,9 @@
for blocker in blocker_nodes:
if not myblocker_uninstalls.child_nodes(blocker):
myblocker_uninstalls.remove(blocker)
- solved_blockers.add(blocker)
+ if blocker not in \
+ self._dynamic_config._unsolvable_blockers:
+ solved_blockers.add(blocker)
retlist.append(node)
@@ -3772,9 +3775,8 @@
# it serves as an indicator that blocking packages
# will be temporarily installed simultaneously.
for blocker in solved_blockers:
- retlist.append(Blocker(atom=blocker.atom,
- root=blocker.root, eapi=blocker.eapi,
- satisfied=True))
+ blocker.satisfied = True
+ retlist.append(blocker)
unsolvable_blockers = set(self._dynamic_config._unsolvable_blockers.leaf_nodes())
for node in myblocker_uninstalls.root_nodes():
@@ -4053,8 +4055,13 @@
unsatisfied_blockers = []
ordered_nodes = []
for x in mylist:
- if isinstance(x, Blocker) and not x.satisfied:
- unsatisfied_blockers.append(x)
+ if isinstance(x, Blocker):
+ counters.blocks += 1
+ if x.satisfied:
+ ordered_nodes.append(x)
+ counters.blocks_satisfied += 1
+ else:
+ unsatisfied_blockers.append(x)
else:
ordered_nodes.append(x)
@@ -4096,10 +4103,6 @@
else:
blocker_style = "PKG_BLOCKER"
addl = "%s %s " % (colorize(blocker_style, "B"), fetch)
- if ordered:
- counters.blocks += 1
- if x.satisfied:
- counters.blocks_satisfied += 1
resolved = portage.dep_expand(
str(x.atom).lstrip("!"), mydb=vardb, settings=pkgsettings)
if "--columns" in self._frozen_config.myopts and "--quiet" in self._frozen_config.myopts:
@@ -4650,7 +4653,7 @@
else:
seen_nodes.add(node)
- if isinstance(node, Package):
+ if isinstance(node, (Blocker, Package)):
display_list.append((node, depth, True))
else:
depth = -1
@@ -4738,7 +4741,7 @@
del display_list[i]
continue
if ordered and isinstance(node, Package) \
- and node.operation == 'merge':
+ and node.operation in ('merge', 'uninstall'):
last_merge_depth = depth
continue
if depth >= last_merge_depth or \
@@ -4990,8 +4993,7 @@
continue
raise
- if "merge" == pkg.operation and \
- not visible(root_config.settings, pkg):
+ if "merge" == pkg.operation and not pkg.visible:
if skip_masked:
masked_tasks.append(Dependency(root=pkg.root, parent=pkg))
else:
@@ -5263,13 +5265,8 @@
arg = None
if arg:
return False
- if pkg.installed:
- try:
- if not visible(
- self._depgraph._frozen_config.pkgsettings[pkg.root], pkg):
- return False
- except portage.exception.InvalidDependString:
- pass
+ if pkg.installed and not pkg.visible:
+ return False
in_graph = self._depgraph._dynamic_config._slot_pkg_map[
self._root].get(pkg.slot_atom)
if in_graph is None:
@@ -5278,7 +5275,10 @@
# conflicts).
highest_visible, in_graph = self._depgraph._select_package(
self._root, pkg.slot_atom)
- if pkg != highest_visible:
+ # Note: highest_visible is not necessarily the real highest
+ # visible, especially when --update is not enabled, so use
+ # < operator instead of !=.
+ if pkg < highest_visible:
return False
elif in_graph != pkg:
# Mask choices for packages that would trigger a slot
@@ -5419,7 +5419,7 @@
backtrack_max = myopts.get('--backtrack', 5)
runtime_pkg_mask = None
- allow_backtracking = True
+ allow_backtracking = backtrack_max > 0
backtracked = 0
frozen_config = _frozen_depgraph_config(settings, trees,
myopts, spinner)
Modified: main/branches/prefix/pym/_emerge/search.py
===================================================================
--- main/branches/prefix/pym/_emerge/search.py 2009-11-25 12:06:52 UTC (rev 14879)
+++ main/branches/prefix/pym/_emerge/search.py 2009-11-25 15:13:31 UTC (rev 14880)
@@ -11,7 +11,6 @@
from portage.util import writemsg_stdout
from _emerge.Package import Package
-from _emerge.visible import visible
class search(object):
@@ -111,9 +110,10 @@
pkg_type = "installed"
elif built:
pkg_type = "binary"
- return visible(self.settings,
- Package(type_name=pkg_type, root_config=self.root_config,
- cpv=cpv, built=built, installed=installed, metadata=metadata))
+ return Package(type_name=pkg_type,
+ root_config=self.root_config,
+ cpv=cpv, built=built, installed=installed,
+ metadata=metadata).visible
def _xmatch(self, level, atom):
"""
Deleted: main/branches/prefix/pym/_emerge/visible.py
===================================================================
--- main/branches/prefix/pym/_emerge/visible.py 2009-11-25 12:06:52 UTC (rev 14879)
+++ main/branches/prefix/pym/_emerge/visible.py 2009-11-25 15:13:31 UTC (rev 14880)
@@ -1,51 +0,0 @@
-# Copyright 1999-2009 Gentoo Foundation
-# Distributed under the terms of the GNU General Public License v2
-# $Id$
-
-import portage
-
-def visible(pkgsettings, pkg, ignore=None):
- """
- Check if a package is visible. This can raise an InvalidDependString
- exception if LICENSE is invalid.
- TODO: optionally generate a list of masking reasons
- @rtype: Boolean
- @returns: True if the package is visible, False otherwise.
- """
- if not pkg.metadata["SLOT"]:
- return False
- if not pkg.installed:
- if pkg.invalid:
- return False
- if not pkgsettings._accept_chost(pkg.cpv, pkg.metadata):
- return False
- if pkg.built and not pkg.installed:
- # we can have an old binary which has no EPREFIX information
- if "EPREFIX" not in pkg.metadata or not pkg.metadata["EPREFIX"]:
- return False
- if len(pkg.metadata["EPREFIX"].strip()) < len(pkgsettings["EPREFIX"]):
- return False
- eapi = pkg.metadata["EAPI"]
- if not portage.eapi_is_supported(eapi):
- return False
- if not pkg.installed:
- if portage._eapi_is_deprecated(eapi):
- return False
- if pkgsettings._getMissingKeywords(pkg.cpv, pkg.metadata):
- return False
- try:
- if pkgsettings._getMissingProperties(pkg.cpv, pkg.metadata):
- return False
- except portage.exception.InvalidDependString:
- return False
- if pkgsettings._getMaskAtom(pkg.cpv, pkg.metadata):
- return False
- if pkgsettings._getProfileMaskAtom(pkg.cpv, pkg.metadata):
- return False
- try:
- if pkgsettings._getMissingLicenses(pkg.cpv, pkg.metadata):
- if ignore is None or 'LICENSE' not in ignore:
- return False
- except portage.exception.InvalidDependString:
- return False
- return True
Modified: main/branches/prefix/pym/portage/__init__.py
===================================================================
--- main/branches/prefix/pym/portage/__init__.py 2009-11-25 12:06:52 UTC (rev 14879)
+++ main/branches/prefix/pym/portage/__init__.py 2009-11-25 15:13:31 UTC (rev 14880)
@@ -7546,10 +7546,8 @@
else:
ret=os.rename(src,dest)
renamefailed=0
- except SystemExit as e:
- raise
- except Exception as e:
- if e[0]!=errno.EXDEV:
+ except OSError as e:
+ if e.errno != errno.EXDEV:
# Some random error.
print(_("!!! Failed to move %(src)s to %(dest)s") % {"src": src, "dest": dest})
print("!!!",e)
Modified: main/branches/prefix/pym/portage/sets/dbapi.py
===================================================================
--- main/branches/prefix/pym/portage/sets/dbapi.py 2009-11-25 12:06:52 UTC (rev 14879)
+++ main/branches/prefix/pym/portage/sets/dbapi.py 2009-11-25 15:13:31 UTC (rev 14880)
@@ -232,6 +232,13 @@
myatoms.append(cp)
self._setAtoms(myatoms)
+ def _builderGetRepository(cls, options, repositories):
+ repository = options.get("repository", "porttree")
+ if not repository in repositories:
+ raise SetConfigError(_("invalid repository class '%s'") % repository)
+ return repository
+ _builderGetRepository = classmethod(_builderGetRepository)
+
def _builderGetVisible(cls, options):
return get_boolean(options, "only_visible", True)
_builderGetVisible = classmethod(_builderGetVisible)
@@ -244,9 +251,10 @@
if not category in settings.categories:
raise SetConfigError(_("invalid category name '%s'") % category)
+ repository = cls._builderGetRepository(options, trees.keys())
visible = cls._builderGetVisible(options)
- return CategorySet(category, dbapi=trees["porttree"].dbapi, only_visible=visible)
+ return CategorySet(category, dbapi=trees[repository].dbapi, only_visible=visible)
singleBuilder = classmethod(singleBuilder)
def multiBuilder(cls, options, settings, trees):
@@ -260,6 +268,7 @@
else:
categories = settings.categories
+ repository = cls._builderGetRepository(options, trees.keys())
visible = cls._builderGetVisible(options)
name_pattern = options.get("name_pattern", "$category/*")
@@ -267,7 +276,7 @@
raise SetConfigError(_("name_pattern doesn't include $category placeholder"))
for cat in categories:
- myset = CategorySet(cat, trees["porttree"].dbapi, only_visible=visible)
+ myset = CategorySet(cat, trees[repository].dbapi, only_visible=visible)
myname = name_pattern.replace("$category", cat)
myname = myname.replace("${category}", cat)
rValue[myname] = myset
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2009-11-25 15:13 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-11-25 15:13 [gentoo-commits] portage r14880 - in main/branches/prefix: doc/config pym/_emerge pym/portage pym/portage/sets pym/portage/tests Fabian Groffen (grobian)
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox