From 5f209df762d039d15e330099db7153123b1b24f6 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Fri, 14 Aug 2009 20:51:39 +0000 Subject: [PATCH] Merged from trunk -r13988:13998 | 13989 | Bug #280460 - Wrap portage.os with unicode encode/decode | | zmedico | wrappers. | | 13990 | Fix unicode support for compatibility with the new wrapped | | zmedico | os module, and use _unicode_decode() and _unicode_encode() | | | where appropriate. | | 13991 | Fix breakage from previous commit. | | zmedico | | | 13992 | Avoid using the wrapped os.read(), in order to avoid | | zmedico | differing behavior between python-2.x (with wrapper) and | | | py3k (without wrapper). This sort of mismatch only applies | | | to os functions that return raw bytes under py3k, rather | | | than unicode. | | 13993 | Update imports to import portage.os (with unicode wrappers), | | zmedico | and use _unicode_encode() and _unicode_decode() where | | | appropriate. | | 13994 | Update imports to import portage.os (with unicode wrappers), | | zmedico | and use _unicode_encode() and _unicode_decode() where | | | appropriate. | | 13995 | Update imports to import portage.os (with unicode wrappers), | | zmedico | and use _unicode_encode() and _unicode_decode() where | | | appropriate. | | 13996 | Update imports to import portage.os and portage.shutil (with | | zmedico | unicode wrappers), and use _unicode_encode() where | | | appropriate. | | 13997 | Add ACCEPT_PROPERTIES variable which has default value * and | | volkmar | can be set in make.conf or /etc/portage/package.properties. | | | If ACCEPT_PROPERTIES doesn't match ebuild PROPERTIES, the | | | ebuild is masked. | | 13998 | Temporarily delete the os and shutil imports, to ensure that | | zmedico | only the wrapped versions are imported by portage internals. | svn path=/main/branches/prefix/; revision=14043 --- bin/archive-conf | 10 +- bin/clean_locks | 16 +- bin/dispatch-conf | 14 +- bin/ebuild | 17 +- bin/egencache | 2 +- bin/emaint | 3 +- bin/emerge | 11 +- bin/env-update | 2 +- bin/fixpackages | 10 +- bin/glsa-check | 2 +- bin/isolated-functions.sh | 2 +- bin/portageq | 3 +- bin/quickpkg | 4 +- bin/regenworld | 21 +- bin/repoman | 2 +- pym/_emerge/Binpkg.py | 8 +- pym/_emerge/BinpkgFetcher.py | 10 +- pym/_emerge/BinpkgPrefetcher.py | 3 +- pym/_emerge/BinpkgVerifier.py | 11 +- pym/_emerge/BlockerCache.py | 11 +- pym/_emerge/BlockerDB.py | 9 +- pym/_emerge/CompositeTask.py | 3 +- pym/_emerge/EbuildBinpkg.py | 3 +- pym/_emerge/EbuildBuild.py | 9 +- pym/_emerge/EbuildBuildDir.py | 10 +- pym/_emerge/EbuildExecuter.py | 9 +- pym/_emerge/EbuildFetcher.py | 7 +- pym/_emerge/EbuildFetchonly.py | 9 +- pym/_emerge/EbuildMerge.py | 9 +- pym/_emerge/EbuildMetadataPhase.py | 9 +- pym/_emerge/EbuildPhase.py | 11 +- pym/_emerge/EbuildProcess.py | 9 +- pym/_emerge/FakeVartree.py | 10 +- pym/_emerge/JobStatusDisplay.py | 12 +- pym/_emerge/MergeListItem.py | 3 +- pym/_emerge/MetadataRegen.py | 9 +- pym/_emerge/MiscFunctionsProcess.py | 9 +- pym/_emerge/Package.py | 9 - pym/_emerge/PackageArg.py | 9 +- pym/_emerge/PackageUninstall.py | 9 +- pym/_emerge/PackageVirtualDbapi.py | 8 +- pym/_emerge/PipeReader.py | 3 +- pym/_emerge/RepoDisplay.py | 3 +- pym/_emerge/Scheduler.py | 24 +- pym/_emerge/SpawnProcess.py | 9 +- pym/_emerge/SubProcess.py | 3 +- pym/_emerge/TaskSequence.py | 3 +- pym/_emerge/UninstallFailure.py | 9 +- pym/_emerge/actions.py | 10 +- pym/_emerge/changelog.py | 13 +- pym/_emerge/clear_caches.py | 8 - pym/_emerge/create_world_atom.py | 7 - pym/_emerge/depgraph.py | 10 +- pym/_emerge/emergelog.py | 21 +- pym/_emerge/getloadavg.py | 2 +- pym/_emerge/is_valid_package_atom.py | 8 - pym/_emerge/main.py | 23 +- pym/_emerge/search.py | 11 +- pym/_emerge/show_invalid_depstring_notice.py | 11 +- pym/_emerge/unmerge.py | 11 +- pym/_emerge/visible.py | 9 +- pym/portage/__init__.py | 242 +++++++++++++++---- pym/portage/_selinux.py | 36 ++- pym/portage/dbapi/porttree.py | 8 +- pym/portage/dbapi/vartree.py | 65 ++--- 65 files changed, 372 insertions(+), 514 deletions(-) diff --git a/bin/archive-conf b/bin/archive-conf index 887af6de9..429b22692 100755 --- a/bin/archive-conf +++ b/bin/archive-conf @@ -10,17 +10,9 @@ # Jeremy Wohl's dispatch-conf script and the portage chkcontents script. # -import os, sys - -# for an explanation on this logic, see pym/_emerge/__init__.py -import os import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) -import portage +from portage import os import dispatch_conf FIND_EXTANT_CONTENTS = "find %s -name CONTENTS" diff --git a/bin/clean_locks b/bin/clean_locks index 26add5adf..945bc2f64 100755 --- a/bin/clean_locks +++ b/bin/clean_locks @@ -3,18 +3,18 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -import os,sys,errno - +import sys, errno # for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) +from os import environ as ose +from os import path as osp +if ose.__contains__("PORTAGE_PYTHONPATH"): + sys.path.insert(0, ose["PORTAGE_PYTHONPATH"]) else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) -import portage.locks + sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp. realpath(__file__))), "pym")) +import portage from portage.const import EPREFIX +from portage import os if not sys.argv[1:] or "--help" in sys.argv or "-h" in sys.argv: import portage diff --git a/bin/dispatch-conf b/bin/dispatch-conf index 5d6e67e86..0fce21fce 100755 --- a/bin/dispatch-conf +++ b/bin/dispatch-conf @@ -17,18 +17,10 @@ if not hasattr(__builtins__, "set"): from stat import * from random import * -import atexit, commands, os, re, shutil, stat, sys +import atexit, commands, re, shutil, stat, sys -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) -import portage - -from portage import dispatch_conf, const +from portage import os +from portage import dispatch_conf from portage.process import find_binary FIND_EXTANT_CONFIGS = "find '%s' %s -name '._cfg????_%s' ! -name '.*~' ! -iname '.*.bak' -print" diff --git a/bin/ebuild b/bin/ebuild index ca8984a95..7d536a6ab 100755 --- a/bin/ebuild +++ b/bin/ebuild @@ -27,6 +27,14 @@ signal.signal(signal.SIGUSR1, debug_signal) import optparse import os +# for an explanation on this logic, see pym/_emerge/__init__.py +from os import environ as ose +from os import path as osp +if ose.__contains__("PORTAGE_PYTHONPATH"): + sys.path.insert(0, ose["PORTAGE_PYTHONPATH"]) +else: + sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp. realpath(__file__))), "pym")) + description = "See the ebuild(1) man page for more info" usage = "Usage: ebuild [command] ..." parser = optparse.OptionParser(description=description, usage=usage) @@ -56,14 +64,7 @@ if "merge" in pargs: os.environ["PORTAGE_CALLER"]="ebuild" -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) -import portage +from portage import os if not opts.ignore_default_opts: default_opts = portage.settings.get("EBUILD_DEFAULT_OPTS", "").split() diff --git a/bin/egencache b/bin/egencache index a848279f9..223428e07 100755 --- a/bin/egencache +++ b/bin/egencache @@ -21,7 +21,6 @@ except KeyboardInterrupt: import logging import optparse -import os try: import portage @@ -30,6 +29,7 @@ except ImportError: sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp.realpath(__file__))), "pym")) import portage +from portage import os from _emerge.MetadataRegen import MetadataRegen from portage.cache.cache_errors import CacheError, StatCollision from portage.util import writemsg_level diff --git a/bin/emaint b/bin/emaint index 2fbace95c..e08698e8c 100755 --- a/bin/emaint +++ b/bin/emaint @@ -1,6 +1,5 @@ #!@PORTAGE_PYTHON@ -O # vim: noet : -import os import re import signal import sys @@ -17,7 +16,7 @@ else: sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage -import portage.const, portage.exception, portage.output +from portage import os class WorldHandler(object): diff --git a/bin/emerge b/bin/emerge index ae93e4f2a..e8553f5db 100755 --- a/bin/emerge +++ b/bin/emerge @@ -26,14 +26,13 @@ def debug_signal(signum, frame): pdb.set_trace() signal.signal(signal.SIGUSR1, debug_signal) -<<<<<<< .working # for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) +from os import environ as ose +from os import path as osp +if ose.__contains__("PORTAGE_PYTHONPATH"): + sys.path.insert(0, ose["PORTAGE_PYTHONPATH"]) else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) + sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp. realpath(__file__))), "pym")) from _emerge.main import emerge_main if __name__ == "__main__": diff --git a/bin/env-update b/bin/env-update index 545367074..428ca5b88 100755 --- a/bin/env-update +++ b/bin/env-update @@ -3,7 +3,7 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -import os, sys, errno +import sys, errno def usage(status): print "Usage: env-update [--no-ldconfig]" diff --git a/bin/fixpackages b/bin/fixpackages index 381098081..2fb62a2a1 100755 --- a/bin/fixpackages +++ b/bin/fixpackages @@ -6,15 +6,7 @@ import os,sys os.environ["PORTAGE_CALLER"]="fixpackages" -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) -import portage - +from portage import os mysettings = portage.settings mytrees = portage.db mtimedb = portage.mtimedb diff --git a/bin/glsa-check b/bin/glsa-check index 45f3e95ff..7e2d18997 100755 --- a/bin/glsa-check +++ b/bin/glsa-check @@ -3,7 +3,6 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -import os import sys # for an explanation on this logic, see pym/_emerge/__init__.py @@ -15,6 +14,7 @@ else: sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os from portage.output import * from optparse import OptionGroup, OptionParser diff --git a/bin/isolated-functions.sh b/bin/isolated-functions.sh index c3821d606..be89349e6 100755 --- a/bin/isolated-functions.sh +++ b/bin/isolated-functions.sh @@ -540,7 +540,7 @@ save_ebuild_env() { ${QA_INTERCEPTORS} # portage config variables and variables set directly by portage - unset ACCEPT_LICENSE BAD BRACKET BUILD_PREFIX COLS \ + unset ACCEPT_LICENSE ACCEPT_PROPERTIES BAD BRACKET BUILD_PREFIX COLS \ DISTCC_DIR DISTDIR DOC_SYMLINKS_DIR \ EBUILD_EXIT_STATUS_FILE EBUILD_FORCE_TEST EBUILD_MASTER_PID \ ECLASSDIR ECLASS_DEPTH ENDCOL FAKEROOTKEY \ diff --git a/bin/portageq b/bin/portageq index bdcdb4d68..02ad3b196 100755 --- a/bin/portageq +++ b/bin/portageq @@ -45,6 +45,7 @@ except ImportError: import portage del pym_path +from portage import os from portage.util import writemsg, writemsg_stdout #----------------------------------------------------------------------------- @@ -613,7 +614,7 @@ def main(): args = sys.argv[2:] if args and not isinstance(args[0], unicode): for i in xrange(len(args)): - args[i] = unicode(args[i], encoding='utf_8', errors='replace') + args[i] = portage._unicode_decode(args[i]) try: if uses_root: diff --git a/bin/quickpkg b/bin/quickpkg index 01df28702..ec2f874f4 100755 --- a/bin/quickpkg +++ b/bin/quickpkg @@ -3,7 +3,7 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -import errno, signal, sys, os +import errno, signal, sys from itertools import izip # for an explanation on this logic, see pym/_emerge/__init__.py @@ -13,6 +13,8 @@ else: sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os + def quickpkg_main(options, args, eout): from portage import catsplit, dep_expand, flatten, isvalidatom, xpak from portage.dep import use_reduce, paren_reduce diff --git a/bin/regenworld b/bin/regenworld index 2c251c25b..3d7d9b9ad 100755 --- a/bin/regenworld +++ b/bin/regenworld @@ -3,18 +3,17 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -import sys, os -import portage.exception - -# for an explanation on this logic, see pym/_emerge/__init__.py -import os import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) -import portage - +# for an explanation on this logic, see pym/_emerge/__init__.py +from os import environ as ose +from os import path as osp +if ose.__contains__("PORTAGE_PYTHONPATH"): + sys.path.insert(0, ose["PORTAGE_PYTHONPATH"]) +else: + sys.path.insert(0, osp.join(osp.dirname(osp.dirname(osp. realpath(__file__))), "pym")) +import portage +from portage import os +import portage.exception import re, portage.const __candidatematcher__ = re.compile("^[0-9]+: \\*\\*\\* emerge ") diff --git a/bin/repoman b/bin/repoman index 186d38407..7abcc80f1 100755 --- a/bin/repoman +++ b/bin/repoman @@ -13,7 +13,6 @@ import errno import formatter import logging import optparse -import os import re import signal import stat @@ -44,6 +43,7 @@ else: import portage portage._disable_legacy_globals() +from portage import os from repoman.checks import run_checks from repoman import utilities diff --git a/pym/_emerge/Binpkg.py b/pym/_emerge/Binpkg.py index c538c4e09..74227e456 100644 --- a/pym/_emerge/Binpkg.py +++ b/pym/_emerge/Binpkg.py @@ -10,9 +10,9 @@ from _emerge.BinpkgVerifier import BinpkgVerifier from _emerge.EbuildMerge import EbuildMerge from _emerge.EbuildBuildDir import EbuildBuildDir from portage.util import writemsg -# for an explanation on this logic, see pym/_emerge/__init__.py +import portage +from portage import os import codecs -import os import sys if os.environ.__contains__("PORTAGE_PYTHONPATH"): sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) @@ -20,7 +20,11 @@ else: sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage from portage.output import colorize +<<<<<<< .working from portage.const import EPREFIX +======= + +>>>>>>> .merge-right.r13998 class Binpkg(CompositeTask): __slots__ = ("find_blockers", diff --git a/pym/_emerge/BinpkgFetcher.py b/pym/_emerge/BinpkgFetcher.py index 90320c017..e72799a1d 100644 --- a/pym/_emerge/BinpkgFetcher.py +++ b/pym/_emerge/BinpkgFetcher.py @@ -5,15 +5,9 @@ from _emerge.SpawnProcess import SpawnProcess import urlparse import sys - -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os + class BinpkgFetcher(SpawnProcess): __slots__ = ("pkg", "pretend", diff --git a/pym/_emerge/BinpkgPrefetcher.py b/pym/_emerge/BinpkgPrefetcher.py index a1e63fd32..4e637db03 100644 --- a/pym/_emerge/BinpkgPrefetcher.py +++ b/pym/_emerge/BinpkgPrefetcher.py @@ -5,7 +5,8 @@ from _emerge.BinpkgFetcher import BinpkgFetcher from _emerge.CompositeTask import CompositeTask from _emerge.BinpkgVerifier import BinpkgVerifier -import os +from portage import os + class BinpkgPrefetcher(CompositeTask): __slots__ = ("pkg",) + \ diff --git a/pym/_emerge/BinpkgVerifier.py b/pym/_emerge/BinpkgVerifier.py index b4a4b8f42..31599e2e2 100644 --- a/pym/_emerge/BinpkgVerifier.py +++ b/pym/_emerge/BinpkgVerifier.py @@ -5,15 +5,10 @@ from _emerge.AsynchronousTask import AsynchronousTask from portage.util import writemsg import sys -# for an explanation on this logic, see pym/_emerge/__init__.py -import codecs -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os +import codecs + class BinpkgVerifier(AsynchronousTask): __slots__ = ("logfile", "pkg",) diff --git a/pym/_emerge/BlockerCache.py b/pym/_emerge/BlockerCache.py index c13143bb2..7b797ebbd 100644 --- a/pym/_emerge/BlockerCache.py +++ b/pym/_emerge/BlockerCache.py @@ -4,19 +4,14 @@ from portage.util import writemsg from portage.data import secpass -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os + try: import cPickle as pickle except ImportError: import pickle -import os + class BlockerCache(portage.cache.mappings.MutableMapping): """This caches blockers of installed packages so that dep_check does not have to be done for every single installed package on every invocation of diff --git a/pym/_emerge/BlockerDB.py b/pym/_emerge/BlockerDB.py index 56b606a74..436793c59 100644 --- a/pym/_emerge/BlockerDB.py +++ b/pym/_emerge/BlockerDB.py @@ -2,15 +2,8 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - +from portage import os from portage import digraph from portage.sets.base import InternalPackageSet diff --git a/pym/_emerge/CompositeTask.py b/pym/_emerge/CompositeTask.py index 25de4dcf3..a9de7a1ab 100644 --- a/pym/_emerge/CompositeTask.py +++ b/pym/_emerge/CompositeTask.py @@ -3,7 +3,8 @@ # $Id$ from _emerge.AsynchronousTask import AsynchronousTask -import os +from portage import os + class CompositeTask(AsynchronousTask): __slots__ = ("scheduler",) + ("_current_task",) diff --git a/pym/_emerge/EbuildBinpkg.py b/pym/_emerge/EbuildBinpkg.py index 4f5159d78..8d742d640 100644 --- a/pym/_emerge/EbuildBinpkg.py +++ b/pym/_emerge/EbuildBinpkg.py @@ -3,7 +3,8 @@ # $Id$ from _emerge.EbuildProcess import EbuildProcess -import os +from portage import os + class EbuildBinpkg(EbuildProcess): """ This assumes that src_install() has successfully completed. diff --git a/pym/_emerge/EbuildBuild.py b/pym/_emerge/EbuildBuild.py index 18c7c59f8..58bb7769d 100644 --- a/pym/_emerge/EbuildBuild.py +++ b/pym/_emerge/EbuildBuild.py @@ -11,15 +11,8 @@ from _emerge.EbuildMerge import EbuildMerge from _emerge.EbuildFetchonly import EbuildFetchonly from _emerge.EbuildBuildDir import EbuildBuildDir from portage.util import writemsg -# for an explanation on this logic, see pym/_emerge/__init__.py -import codecs -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os from portage.output import colorize from portage.const import EPREFIX class EbuildBuild(CompositeTask): diff --git a/pym/_emerge/EbuildBuildDir.py b/pym/_emerge/EbuildBuildDir.py index abef92e7b..90bb14f14 100644 --- a/pym/_emerge/EbuildBuildDir.py +++ b/pym/_emerge/EbuildBuildDir.py @@ -3,15 +3,11 @@ # $Id$ from _emerge.SlotObject import SlotObject -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os +import sys import errno + class EbuildBuildDir(SlotObject): __slots__ = ("dir_path", "pkg", "settings", diff --git a/pym/_emerge/EbuildExecuter.py b/pym/_emerge/EbuildExecuter.py index bf05dc3b6..055a8fa47 100644 --- a/pym/_emerge/EbuildExecuter.py +++ b/pym/_emerge/EbuildExecuter.py @@ -5,14 +5,9 @@ from _emerge.EbuildPhase import EbuildPhase from _emerge.TaskSequence import TaskSequence from _emerge.CompositeTask import CompositeTask -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os + class EbuildExecuter(CompositeTask): __slots__ = ("pkg", "scheduler", "settings") + ("_tree",) diff --git a/pym/_emerge/EbuildFetcher.py b/pym/_emerge/EbuildFetcher.py index a292c6cdd..d7cf571b2 100644 --- a/pym/_emerge/EbuildFetcher.py +++ b/pym/_emerge/EbuildFetcher.py @@ -7,14 +7,11 @@ from _emerge.EbuildBuildDir import EbuildBuildDir # for an explanation on this logic, see pym/_emerge/__init__.py import os import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os import codecs -import os from portage.elog.messages import eerror + class EbuildFetcher(SpawnProcess): __slots__ = ("config_pool", "fetchonly", "fetchall", "pkg", "prefetch") + \ diff --git a/pym/_emerge/EbuildFetchonly.py b/pym/_emerge/EbuildFetchonly.py index 1b2f14345..d65e2b2b1 100644 --- a/pym/_emerge/EbuildFetchonly.py +++ b/pym/_emerge/EbuildFetchonly.py @@ -4,15 +4,10 @@ from _emerge.SlotObject import SlotObject import shutil -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os from portage.elog.messages import eerror + class EbuildFetchonly(SlotObject): __slots__ = ("fetch_all", "pkg", "pretend", "settings") diff --git a/pym/_emerge/EbuildMerge.py b/pym/_emerge/EbuildMerge.py index b0776ed76..1ac03706e 100644 --- a/pym/_emerge/EbuildMerge.py +++ b/pym/_emerge/EbuildMerge.py @@ -3,14 +3,9 @@ # $Id$ from _emerge.SlotObject import SlotObject -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os + class EbuildMerge(SlotObject): __slots__ = ("find_blockers", "logger", "ldpath_mtimes", diff --git a/pym/_emerge/EbuildMetadataPhase.py b/pym/_emerge/EbuildMetadataPhase.py index 5d9401a07..a84d722be 100644 --- a/pym/_emerge/EbuildMetadataPhase.py +++ b/pym/_emerge/EbuildMetadataPhase.py @@ -6,17 +6,12 @@ from _emerge.SubProcess import SubProcess from _emerge.PollConstants import PollConstants import sys from portage.cache.mappings import slot_dict_class -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os from itertools import izip import fcntl import codecs + class EbuildMetadataPhase(SubProcess): """ diff --git a/pym/_emerge/EbuildPhase.py b/pym/_emerge/EbuildPhase.py index 3df624859..598dcf7e3 100644 --- a/pym/_emerge/EbuildPhase.py +++ b/pym/_emerge/EbuildPhase.py @@ -6,15 +6,10 @@ from _emerge.MiscFunctionsProcess import MiscFunctionsProcess from _emerge.EbuildProcess import EbuildProcess from _emerge.CompositeTask import CompositeTask from portage.util import writemsg -# for an explanation on this logic, see pym/_emerge/__init__.py -import codecs -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os +import codecs + class EbuildPhase(CompositeTask): __slots__ = ("background", "pkg", "phase", diff --git a/pym/_emerge/EbuildProcess.py b/pym/_emerge/EbuildProcess.py index d6d7a5d78..86a63282f 100644 --- a/pym/_emerge/EbuildProcess.py +++ b/pym/_emerge/EbuildProcess.py @@ -3,14 +3,9 @@ # $Id$ from _emerge.SpawnProcess import SpawnProcess -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os + class EbuildProcess(SpawnProcess): __slots__ = ("phase", "pkg", "settings", "tree") diff --git a/pym/_emerge/FakeVartree.py b/pym/_emerge/FakeVartree.py index 2425f1303..c4eec6d68 100644 --- a/pym/_emerge/FakeVartree.py +++ b/pym/_emerge/FakeVartree.py @@ -2,17 +2,9 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -import os from itertools import izip - -# for an explanation on this logic, see pym/_emerge/__init__.py -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - +from portage import os from _emerge.Package import Package from _emerge.PackageVirtualDbapi import PackageVirtualDbapi diff --git a/pym/_emerge/JobStatusDisplay.py b/pym/_emerge/JobStatusDisplay.py index 507a5057c..6aa2d99b7 100644 --- a/pym/_emerge/JobStatusDisplay.py +++ b/pym/_emerge/JobStatusDisplay.py @@ -3,7 +3,6 @@ # $Id$ import formatter -import os import sys import time @@ -12,15 +11,8 @@ try: except ImportError: from StringIO import StringIO -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - +from portage import os from portage.output import xtermTitle from _emerge.getloadavg import getloadavg @@ -78,7 +70,7 @@ class JobStatusDisplay(object): def _write(self, s): if sys.hexversion < 0x3000000 and isinstance(s, unicode): # avoid potential UnicodeEncodeError - s = s.encode('utf_8', 'replace') + s = portage._unicode_encode(s) self.out.write(s) self.out.flush() diff --git a/pym/_emerge/MergeListItem.py b/pym/_emerge/MergeListItem.py index aab79da08..7e4556ec2 100644 --- a/pym/_emerge/MergeListItem.py +++ b/pym/_emerge/MergeListItem.py @@ -2,8 +2,7 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -import os - +from portage import os from portage.output import colorize from _emerge.Binpkg import Binpkg diff --git a/pym/_emerge/MetadataRegen.py b/pym/_emerge/MetadataRegen.py index f3be52f87..ee6eb997a 100644 --- a/pym/_emerge/MetadataRegen.py +++ b/pym/_emerge/MetadataRegen.py @@ -2,15 +2,8 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - +from portage import os from _emerge.EbuildMetadataPhase import EbuildMetadataPhase from _emerge.PollScheduler import PollScheduler diff --git a/pym/_emerge/MiscFunctionsProcess.py b/pym/_emerge/MiscFunctionsProcess.py index 305bbab77..3e2fff7cc 100644 --- a/pym/_emerge/MiscFunctionsProcess.py +++ b/pym/_emerge/MiscFunctionsProcess.py @@ -3,14 +3,9 @@ # $Id$ from _emerge.SpawnProcess import SpawnProcess -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os + class MiscFunctionsProcess(SpawnProcess): """ Spawns misc-functions.sh with an existing ebuild environment. diff --git a/pym/_emerge/Package.py b/pym/_emerge/Package.py index bdb014f8f..6371f5d05 100644 --- a/pym/_emerge/Package.py +++ b/pym/_emerge/Package.py @@ -4,16 +4,7 @@ import re from itertools import chain - -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - from portage.cache.mappings import slot_dict_class from portage.dep import paren_reduce, use_reduce, \ paren_normalize, paren_enclose diff --git a/pym/_emerge/PackageArg.py b/pym/_emerge/PackageArg.py index 29fbf44c5..f64430e14 100644 --- a/pym/_emerge/PackageArg.py +++ b/pym/_emerge/PackageArg.py @@ -3,18 +3,11 @@ # $Id$ from _emerge.DependencyArg import DependencyArg -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage + class PackageArg(DependencyArg): def __init__(self, package=None, **kwargs): DependencyArg.__init__(self, **kwargs) self.package = package self.atom = portage.dep.Atom("=" + package.cpv) self.set = (self.atom, ) - diff --git a/pym/_emerge/PackageUninstall.py b/pym/_emerge/PackageUninstall.py index d430a4709..ff1b5e189 100644 --- a/pym/_emerge/PackageUninstall.py +++ b/pym/_emerge/PackageUninstall.py @@ -4,15 +4,8 @@ import codecs import logging -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - +from portage import os from _emerge.AsynchronousTask import AsynchronousTask from _emerge.unmerge import unmerge from _emerge.UninstallFailure import UninstallFailure diff --git a/pym/_emerge/PackageVirtualDbapi.py b/pym/_emerge/PackageVirtualDbapi.py index 6049830c4..f041e1d8c 100644 --- a/pym/_emerge/PackageVirtualDbapi.py +++ b/pym/_emerge/PackageVirtualDbapi.py @@ -2,14 +2,8 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage + class PackageVirtualDbapi(portage.dbapi): """ A dbapi-like interface class that represents the state of the installed diff --git a/pym/_emerge/PipeReader.py b/pym/_emerge/PipeReader.py index d3cc18425..5b64306e7 100644 --- a/pym/_emerge/PipeReader.py +++ b/pym/_emerge/PipeReader.py @@ -2,12 +2,13 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ +from portage import os from _emerge.AbstractPollTask import AbstractPollTask from _emerge.PollConstants import PollConstants import sys -import os import fcntl import array + class PipeReader(AbstractPollTask): """ diff --git a/pym/_emerge/RepoDisplay.py b/pym/_emerge/RepoDisplay.py index 420569770..a954aebfa 100644 --- a/pym/_emerge/RepoDisplay.py +++ b/pym/_emerge/RepoDisplay.py @@ -3,7 +3,8 @@ # $Id$ from portage.output import teal -import os +from portage import os + class RepoDisplay(object): def __init__(self, roots): self._shown_repos = {} diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index e82ade829..cef4ee6ca 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -4,22 +4,13 @@ import codecs import logging -import os import sys import textwrap import time import weakref from itertools import izip - -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - +from portage import os from portage.cache.mappings import slot_dict_class from portage.elog.messages import eerror from portage.output import colorize, create_color_func, darkgreen, red @@ -480,13 +471,10 @@ class Scheduler(PollScheduler): def _append_to_log_path(self, log_path, msg): - if not isinstance(msg, unicode): - msg = unicode(msg, encoding='utf_8', errors='replace') - - f = codecs.open(log_path, mode='a', + f = codecs.open(portage._unicode_encode(log_path), mode='a', encoding='utf_8', errors='replace') try: - f.write(msg) + f.write(portage._unicode_decode(msg)) finally: f.close() @@ -498,7 +486,7 @@ class Scheduler(PollScheduler): background = self._background if background and log_path is not None: - log_file = codecs.open(log_path, mode='a', + log_file = codecs.open(portage._unicode_encode(log_path), mode='a', encoding='utf_8', errors='replace') out = log_file @@ -874,8 +862,8 @@ class Scheduler(PollScheduler): log_path = self._locate_failure_log(failed_pkg) if log_path is not None: try: - log_file = codecs.open(log_path, mode='r', - encoding='utf_8', errors='replace') + log_file = codecs.open(portage._unicode_encode(log_path), + mode='r', encoding='utf_8', errors='replace') except IOError: pass diff --git a/pym/_emerge/SpawnProcess.py b/pym/_emerge/SpawnProcess.py index 6d8a26405..e6b3cc7a0 100644 --- a/pym/_emerge/SpawnProcess.py +++ b/pym/_emerge/SpawnProcess.py @@ -6,17 +6,12 @@ from _emerge.SubProcess import SubProcess from _emerge.PollConstants import PollConstants import sys from portage.cache.mappings import slot_dict_class -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os import fcntl import errno import array + class SpawnProcess(SubProcess): """ diff --git a/pym/_emerge/SubProcess.py b/pym/_emerge/SubProcess.py index 37957c394..6bd4562d4 100644 --- a/pym/_emerge/SubProcess.py +++ b/pym/_emerge/SubProcess.py @@ -2,10 +2,11 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ +from portage import os from _emerge.AbstractPollTask import AbstractPollTask import signal -import os import errno + class SubProcess(AbstractPollTask): __slots__ = ("pid",) + \ diff --git a/pym/_emerge/TaskSequence.py b/pym/_emerge/TaskSequence.py index 3d54d90ac..44eaa332c 100644 --- a/pym/_emerge/TaskSequence.py +++ b/pym/_emerge/TaskSequence.py @@ -2,10 +2,11 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ +from portage import os from _emerge.CompositeTask import CompositeTask from _emerge.AsynchronousTask import AsynchronousTask -import os from collections import deque + class TaskSequence(CompositeTask): """ A collection of tasks that executes sequentially. Each task diff --git a/pym/_emerge/UninstallFailure.py b/pym/_emerge/UninstallFailure.py index 8b7cdfa66..ceb5a58e2 100644 --- a/pym/_emerge/UninstallFailure.py +++ b/pym/_emerge/UninstallFailure.py @@ -2,15 +2,8 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - + class UninstallFailure(portage.exception.PortageException): """ An instance of this class is raised by unmerge() when diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index d8a1f93c0..fe64d786c 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -5,7 +5,6 @@ import commands import errno import logging -import os import platform import pwd import re @@ -17,15 +16,8 @@ import textwrap import time from itertools import chain, izip -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - +from portage import os from portage import digraph from portage.cache.cache_errors import CacheError from portage.const import NEWS_LIB_PATH, EPREFIX diff --git a/pym/_emerge/changelog.py b/pym/_emerge/changelog.py index 8fb25e01e..4adb8b25b 100644 --- a/pym/_emerge/changelog.py +++ b/pym/_emerge/changelog.py @@ -3,17 +3,10 @@ # $Id$ import codecs -import os import re -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage +from portage import os def calc_changelog(ebuildpath,current,next): if ebuildpath == None or not os.path.exists(ebuildpath): @@ -26,8 +19,8 @@ def calc_changelog(ebuildpath,current,next): next = next[:-3] changelogpath = os.path.join(os.path.split(ebuildpath)[0],'ChangeLog') try: - changelog = codecs.open(changelogpath, mode='r', - encoding='utf_8', errors='replace').read() + changelog = codecs.open(portage._unicode_encode(changelogpath), + mode='r', encoding='utf_8', errors='replace').read() except SystemExit, e: raise # Needed else can't exit except: diff --git a/pym/_emerge/clear_caches.py b/pym/_emerge/clear_caches.py index 412855871..1fd667f36 100644 --- a/pym/_emerge/clear_caches.py +++ b/pym/_emerge/clear_caches.py @@ -3,14 +3,6 @@ # $Id$ import gc - -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage def clear_caches(trees): diff --git a/pym/_emerge/create_world_atom.py b/pym/_emerge/create_world_atom.py index dd4acd63d..30ade0acf 100644 --- a/pym/_emerge/create_world_atom.py +++ b/pym/_emerge/create_world_atom.py @@ -2,13 +2,6 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage def create_world_atom(pkg, args_set, root_config): diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index 1af872562..31c1848bc 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -3,21 +3,13 @@ # $Id$ import gc -import os import re import sys import textwrap from itertools import chain, izip -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - +from portage import os from portage import digraph from portage.output import bold, blue, colorize, create_color_func, darkblue, \ darkgreen, green, nc_len, red, teal, turquoise, yellow diff --git a/pym/_emerge/emergelog.py b/pym/_emerge/emergelog.py index 5d2256061..34601f772 100644 --- a/pym/_emerge/emergelog.py +++ b/pym/_emerge/emergelog.py @@ -3,31 +3,22 @@ # $Id$ import codecs -import os import sys import time -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - +from portage import os from portage.data import secpass from portage.output import xtermTitle from portage.const import EPREFIX - + _emerge_log_dir = EPREFIX + '/var/log' def emergelog(xterm_titles, mystr, short_msg=None): - if not isinstance(mystr, unicode): - mystr = unicode(mystr, encoding='utf_8', errors='replace') + mystr = portage._unicode_decode(mystr) - if short_msg is not None and not isinstance(short_msg, unicode): - short_msg = unicode(short_msg, encoding='utf_8', errors='replace') + if short_msg is not None: + short_msg = portage._unicode_decode(short_msg) if xterm_titles and short_msg: if "HOSTNAME" in os.environ: @@ -35,7 +26,7 @@ def emergelog(xterm_titles, mystr, short_msg=None): xtermTitle(short_msg) try: file_path = os.path.join(_emerge_log_dir, 'emerge.log') - mylogfile = codecs.open(file_path, mode='a', + mylogfile = codecs.open(portage._unicode_encode(file_path), mode='a', encoding='utf_8', errors='replace') portage.util.apply_secpass_permissions(file_path, uid=portage.portage_uid, gid=portage.portage_gid, diff --git a/pym/_emerge/getloadavg.py b/pym/_emerge/getloadavg.py index 81265d500..d252e8c0a 100644 --- a/pym/_emerge/getloadavg.py +++ b/pym/_emerge/getloadavg.py @@ -2,7 +2,7 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -import os +from portage import os getloadavg = getattr(os, "getloadavg", None) if getloadavg is None: diff --git a/pym/_emerge/is_valid_package_atom.py b/pym/_emerge/is_valid_package_atom.py index 2717a9080..11920be30 100644 --- a/pym/_emerge/is_valid_package_atom.py +++ b/pym/_emerge/is_valid_package_atom.py @@ -3,14 +3,6 @@ # $Id$ import re - -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage def is_valid_package_atom(x): diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py index 4565422be..5757cae87 100644 --- a/pym/_emerge/main.py +++ b/pym/_emerge/main.py @@ -6,28 +6,9 @@ import logging import signal import sys import textwrap -import os import platform - -# Portage module path logic (Prefix way) -# In principle we don't want to be dependant on the environment -# (PYTHONPATH) and/or python hardcoded default search path. -# (PYTHONPATH). Since Gentoo patches Python to include Portage's python -# modules in the default search path, any Gentoo python interpreter is -# an enemy for Portage once it is not installed in the path hardcoded -# during Python compilation. This is the case when bootstrapping -# Prefix Portage on a Gentoo Linux system, or when bootstrapping Prefix -# Portage using another Prefix instance on the same system. For this -# reason we ignore the entire search path, and allow a backdoor for -# developers via the PORTAGE_PYTHONPATH variable. -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - +from portage import os import _emerge.help import portage.xpak, commands, errno, re, time from portage.output import colorize, xtermTitle, xtermTitleReset @@ -763,7 +744,7 @@ def parse_opts(tmpcmdline, silent=False): if myargs and not isinstance(myargs[0], unicode): for i in xrange(len(myargs)): - myargs[i] = unicode(myargs[i], encoding='utf_8', errors='replace') + myargs[i] = portage._unicode_decode(myargs[i]) myfiles += myargs diff --git a/pym/_emerge/search.py b/pym/_emerge/search.py index 4db6d9fe8..1f276b47e 100644 --- a/pym/_emerge/search.py +++ b/pym/_emerge/search.py @@ -2,19 +2,10 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -import os import re from itertools import izip - -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - +from portage import os from portage.output import bold, bold as white, darkgreen, green, red from portage.util import writemsg_stdout diff --git a/pym/_emerge/show_invalid_depstring_notice.py b/pym/_emerge/show_invalid_depstring_notice.py index 9688f437a..4d374fcd0 100644 --- a/pym/_emerge/show_invalid_depstring_notice.py +++ b/pym/_emerge/show_invalid_depstring_notice.py @@ -3,18 +3,9 @@ # $Id$ import logging -import os import textwrap - -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - +from portage import os from portage.util import writemsg_level def show_invalid_depstring_notice(parent_node, depstring, error_msg): diff --git a/pym/_emerge/unmerge.py b/pym/_emerge/unmerge.py index 5bdead580..25c3e4e4f 100644 --- a/pym/_emerge/unmerge.py +++ b/pym/_emerge/unmerge.py @@ -3,20 +3,11 @@ # $Id$ import logging -import os import sys import textwrap from itertools import izip - -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage - +from portage import os from portage.output import bold, colorize, darkgreen, green from portage.sets import SETPREFIX from portage.util import cmp_sort_key diff --git a/pym/_emerge/visible.py b/pym/_emerge/visible.py index 87f5db640..4542e1c97 100644 --- a/pym/_emerge/visible.py +++ b/pym/_emerge/visible.py @@ -2,13 +2,6 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -# for an explanation on this logic, see pym/_emerge/__init__.py -import os -import sys -if os.environ.__contains__("PORTAGE_PYTHONPATH"): - sys.path.insert(0, os.environ["PORTAGE_PYTHONPATH"]) -else: - sys.path.insert(0, os.path.join(os.path.dirname(os.path.dirname(os.path.realpath(__file__))), "pym")) import portage def visible(pkgsettings, pkg): @@ -47,6 +40,8 @@ def visible(pkgsettings, pkg): try: if pkgsettings._getMissingLicenses(pkg.cpv, pkg.metadata): return False + if pkgsettings._getMissingProperties(pkg.cpv, pkg.metadata): + return False except portage.exception.InvalidDependString: return False return True diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index ad91ac6a6..4a666cab0 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -19,9 +19,7 @@ try: # ESTALE may not be defined on some systems, such as interix. errno.ESTALE = -1 import logging - import os import re - import shutil import time import types try: @@ -36,6 +34,14 @@ try: from itertools import chain, izip import platform import warnings + + # Temporarily delete these imports, to ensure that only the + # wrapped versions are imported by portage internals. + import os + del os + import shutil + del shutil + except ImportError, e: sys.stderr.write("\n\n") sys.stderr.write("!!! Failed to complete python imports. These are internal modules for\n") @@ -112,19 +118,6 @@ except ImportError, e: sys.stderr.write(" "+str(e)+"\n\n") raise - -try: - import portage._selinux as selinux -except OSError, e: - writemsg("!!! SELinux not loaded: %s\n" % str(e), noiselevel=-1) - del e -except ImportError: - pass - -# =========================================================================== -# END OF IMPORTS -- END OF IMPORTS -- END OF IMPORTS -- END OF IMPORTS -- END -# =========================================================================== - def _unicode_encode(s): if isinstance(s, unicode): s = s.encode('utf_8', 'replace') @@ -189,6 +182,23 @@ if sys.hexversion >= 0x3000000: def _unicode_module_wrapper(mod): return mod +import os +os = _unicode_module_wrapper(os) +import shutil +shutil = _unicode_module_wrapper(shutil) + +try: + import portage._selinux as selinux +except OSError, e: + writemsg("!!! SELinux not loaded: %s\n" % str(e), noiselevel=-1) + del e +except ImportError: + pass + +# =========================================================================== +# END OF IMPORTS -- END OF IMPORTS -- END OF IMPORTS -- END OF IMPORTS -- END +# =========================================================================== + def _shell_quote(s): """ Quote a string in double-quotes and use backslashes to @@ -312,8 +322,6 @@ def cacheddir(my_original_path, ignorecvs, ignorelist, EmptyOnError, followSymli raise portage.exception.PermissionDenied(mypath) ftype = [] for x in list: - if not isinstance(x, unicode): - x = unicode(x, encoding='utf_8', errors='replace') try: if followSymlinks: pathstat = os.stat(mypath+"/"+x) @@ -1132,7 +1140,7 @@ class config(object): # environment in order to prevent sandbox from sourcing /etc/profile # in it's bashrc (causing major leakage). _environ_whitelist += [ - "ACCEPT_LICENSE", "BASH_ENV", "BUILD_PREFIX", "D", + "ACCEPT_LICENSE", "ACCEPT_PROPERTIES", "BASH_ENV", "BUILD_PREFIX", "D", "DISTDIR", "DOC_SYMLINKS_DIR", "EBUILD", "EBUILD_EXIT_STATUS_FILE", "EBUILD_FORCE_TEST", "EBUILD_PHASE", "ECLASSDIR", "ECLASS_DEPTH", "EMERGE_FROM", @@ -1281,6 +1289,7 @@ class config(object): self._accept_license = None self._accept_license_str = None self._license_groups = {} + self._accept_properties = None self.virtuals = {} self.virts_p = {} @@ -1367,6 +1376,8 @@ class config(object): self._accept_license = copy.deepcopy(clone._accept_license) self._plicensedict = copy.deepcopy(clone._plicensedict) self._license_groups = copy.deepcopy(clone._license_groups) + self._accept_properties = copy.deepcopy(clone._accept_properties) + self._ppropertiesdict = copy.deepcopy(clone._ppropertiesdict) else: def check_var_directory(varname, var): @@ -1593,13 +1604,8 @@ class config(object): env = os.environ # Avoid potential UnicodeDecodeError exceptions later. - env_unicode = {} - for k, v in env.iteritems(): - if not isinstance(k, unicode): - k = unicode(k, encoding='utf_8', errors='replace') - if not isinstance(v, unicode): - v = unicode(v, encoding='utf_8', errors='replace') - env_unicode[k] = v + env_unicode = dict((_unicode_decode(k), _unicode_decode(v)) + for k, v in env.iteritems()) self.backupenv = env_unicode @@ -1702,6 +1708,7 @@ class config(object): self.pusedict = {} self.pkeywordsdict = {} self._plicensedict = {} + self._ppropertiesdict = {} self.punmaskdict = {} abs_user_config = os.path.join(config_root, USER_CONFIG_PATH) @@ -1766,6 +1773,17 @@ class config(object): self._plicensedict[cp] = cp_dict cp_dict[k] = self.expandLicenseTokens(v) + #package.properties + propdict = grabdict_package(os.path.join( + abs_user_config, "package.properties"), recursive=1) + for k, v in propdict.iteritems(): + cp = dep_getkey(k) + cp_dict = self._ppropertiesdict.get(cp) + if not cp_dict: + cp_dict = {} + self._ppropertiesdict[cp] = cp_dict + cp_dict[k] = v + self._local_repo_configs = {} self._local_repo_conf_path = \ os.path.join(abs_user_config, 'repos.conf') @@ -2167,6 +2185,7 @@ class config(object): if use is None: use = frozenset(settings['PORTAGE_USE'].split()) values['ACCEPT_LICENSE'] = self._accept_license(use, settings) + values['ACCEPT_PROPERTIES'] = self._accept_properties(use, settings) values['PORTAGE_RESTRICT'] = self._restrict(use, settings) return values @@ -2200,6 +2219,35 @@ class config(object): licenses = acceptable_licenses return ' '.join(sorted(licenses)) + def _accept_properties(self, use, settings): + """ + Generated a pruned version of ACCEPT_PROPERTIES, by intersection with + PROPERTIES. + Please, look at self._accept_license() to know why it is required. + """ + try: + properties = set(flatten( + dep.use_reduce(dep.paren_reduce( + settings['PROPERTIES']), + uselist=use))) + except exception.InvalidDependString: + properties = set() + properties.discard('||') + if settings._accept_properties: + acceptable_properties = set() + for x in settings._accept_properties: + if x == '*': + acceptable_properties.update(properties) + elif x == '-*': + acceptable_properties.clear() + elif x[1] == '-': + acceptable_properties.discard(x[1:]) + elif x in properties: + acceptable_properties.add(x) + + properties = acceptable_properties + return ' '.join(sorted(properties)) + def _restrict(self, use, settings): try: restrict = set(flatten( @@ -2438,6 +2486,8 @@ class config(object): lazy_vars = self._lazy_vars(built_use, self) env_configdict.addLazySingleton('ACCEPT_LICENSE', lazy_vars.__getitem__, 'ACCEPT_LICENSE') + env_configdict.addLazySingleton('ACCEPT_PROPERTIES', + lazy_vars.__getitem__, 'ACCEPT_PROPERTIES') env_configdict.addLazySingleton('PORTAGE_RESTRICT', lazy_vars.__getitem__, 'PORTAGE_RESTRICT') @@ -2831,6 +2881,87 @@ class config(object): ret.append(element) return ret + def _getMissingProperties(self, cpv, metadata): + """ + Take a PROPERTIES string and return a list of any properties the user may + may need to accept for the given package. The returned list will not + contain any properties that have already been accepted. This method + can throw an InvalidDependString exception. + + @param cpv: The package name (for package.properties support) + @type cpv: String + @param metadata: A dictionary of raw package metadata + @type metadata: dict + @rtype: List + @return: A list of properties that have not been accepted. + """ + if not self._accept_properties: + return [] + accept_properties = self._accept_properties + cpdict = self._ppropertiesdict.get(dep_getkey(cpv), None) + if cpdict: + accept_properties = list(self._accept_properties) + cpv_slot = "%s:%s" % (cpv, metadata["SLOT"]) + for atom in match_to_list(cpv_slot, cpdict.keys()): + accept_properties.extend(cpdict[atom]) + + properties = set(flatten(dep.use_reduce(dep.paren_reduce( + metadata["PROPERTIES"]), matchall=1))) + properties.discard('||') + + acceptable_properties = set() + for x in accept_properties: + if x == '*': + acceptable_properties.update(properties) + elif x == '-*': + acceptable_properties.clear() + elif x[:1] == '-': + acceptable_properties.discard(x[1:]) + else: + acceptable_properties.add(x) + + properties_str = metadata["PROPERTIES"] + if "?" in properties_str: + use = metadata["USE"].split() + else: + use = [] + + properties_struct = portage.dep.use_reduce( + portage.dep.paren_reduce(properties_str), uselist=use) + properties_struct = portage.dep.dep_opconvert(properties_struct) + return self._getMaskedProperties(properties_struct, acceptable_properties) + + def _getMaskedProperties(self, properties_struct, acceptable_properties): + if not properties_struct: + return [] + if properties_struct[0] == "||": + ret = [] + for element in properties_struct[1:]: + if isinstance(element, list): + if element: + ret.append(self._getMaskedProperties( + element, acceptable_properties)) + if not ret[-1]: + return [] + else: + if element in acceptable_properties: + return[] + ret.append(element) + # Return all masked properties, since we don't know which combination + # (if any) the user will decide to unmask + return flatten(ret) + + ret = [] + for element in properties_struct: + if isinstance(element, list): + if element: + ret.extend(self._getMaskedProperties(element, + acceptable_properties)) + else: + if element not in acceptable_properties: + ret.append(element) + return ret + def _accept_chost(self, cpv, metadata): """ @return True if pkg CHOST is accepted, False otherwise. @@ -2978,6 +3109,19 @@ class config(object): # repoman will accept any license self._accept_license = () + # ACCEPT_PROPERTIES works like ACCEPT_LICENSE, without groups + if self.local_config: + mysplit = [] + for curdb in mydbs: + mysplit.extend(curdb.get('ACCEPT_PROPERTIES', '').split()) + if mysplit: + self.configlist[-1]['ACCEPT_PROPERTIES'] = ' '.join(mysplit) + if tuple(mysplit) != self._accept_properties: + self._accept_properties = tuple(mysplit) + else: + # repoman will accept any property + self._accept_properties = () + for mykey in myincrementals: myflags=[] @@ -3280,10 +3424,8 @@ class config(object): raise ValueError("Invalid type being used as a value: '%s': '%s'" % (str(mykey),str(myvalue))) # Avoid potential UnicodeDecodeError exceptions later. - if not isinstance(mykey, unicode): - mykey = unicode(mykey, encoding='utf_8', errors='replace') - if not isinstance(myvalue, unicode): - myvalue = unicode(myvalue, encoding='utf_8', errors='replace') + mykey = _unicode_decode(mykey) + myvalue = _unicode_decode(myvalue) self.modifying() self.modifiedkeys.append(mykey) @@ -4991,16 +5133,14 @@ def digestcheck(myfiles, mysettings, strict=0, justmanifest=0): """ epatch will just grab all the patches out of a directory, so we have to make sure there aren't any foreign files that it might grab.""" filesdir = os.path.join(pkgdir, "files") - if isinstance(filesdir, unicode): - # Avoid UnicodeDecodeError raised from - # os.path.join when called by os.walk. - filesdir = filesdir.encode('utf_8', 'replace') for parent, dirs, files in os.walk(filesdir): + parent = _unicode_decode(parent) for d in dirs: if d.startswith(".") or d == "CVS": dirs.remove(d) for f in files: + f = _unicode_decode(f) if f.startswith("."): continue f = os.path.join(parent, f)[len(filesdir) + 1:] @@ -5254,16 +5394,14 @@ def _post_src_install_uid_fix(mysettings): (_shell_quote(mysettings["D"]),)) destdir = mysettings["D"] - if isinstance(destdir, unicode): - # Avoid UnicodeDecodeError raised from - # os.path.join when called by os.walk. - destdir = destdir.encode('utf_8', 'replace') size = 0 counted_inodes = set() for parent, dirs, files in os.walk(destdir): + parent = _unicode_decode(parent) for fname in chain(dirs, files): + fname = _unicode_decode(fname) fpath = os.path.join(parent, fname) mystat = os.lstat(fpath) if stat.S_ISREG(mystat.st_mode) and \ @@ -6204,18 +6342,11 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0, mysettings, fd_pipes=fd_pipes, returnpid=True, droppriv=droppriv) os.close(pw) # belongs exclusively to the child process now - maxbytes = 1024 - mybytes = [] - while True: - mybytes.append(os.read(pr, maxbytes)) - if not mybytes[-1]: - break - os.close(pr) - mybytes = u''.join(unicode(chunk, - encoding='utf_8', errors='replace') for chunk in mybytes) - global auxdbkeys - for k, v in izip(auxdbkeys, mybytes.splitlines()): + f = os.fdopen(pr, 'rb') + for k, v in izip(auxdbkeys, + (_unicode_decode(line).rstrip('\n') for line in f)): dbkey[k] = v + f.close() retval = os.waitpid(mypids[0], 0)[1] portage.process.spawned_pids.remove(mypids[0]) # If it got a signal, return the signal that was sent, but @@ -7752,6 +7883,7 @@ def getmaskingstatus(mycpv, settings=None, portdb=None): eapi = metadata["EAPI"] mygroups = settings._getKeywords(mycpv, metadata) licenses = metadata["LICENSE"] + properties = metadata["PROPERTIES"] slot = metadata["SLOT"] if eapi.startswith("-"): eapi = eapi[1:] @@ -7828,6 +7960,20 @@ def getmaskingstatus(mycpv, settings=None, portdb=None): except portage.exception.InvalidDependString, e: rValue.append("LICENSE: "+str(e)) + try: + missing_properties = settings._getMissingProperties(mycpv, metadata) + if missing_properties: + allowed_tokens = set(["||", "(", ")"]) + allowed_tokens.update(missing_properties) + properties_split = properties.split() + properties_split = [x for x in properties_split \ + if x in allowed_tokens] + msg = properties_split[:] + msg.append("properties") + rValue.append(" ".join(msg)) + except portage.exception.InvalidDependString, e: + rValue.append("PROPERTIES: "+srt(e)) + # Only show KEYWORDS masks for installed packages # if they're not masked for any other reason. if kmask and (not installed or not rValue): diff --git a/pym/portage/_selinux.py b/pym/portage/_selinux.py index 1b5f530ce..e3c35ec5d 100644 --- a/pym/portage/_selinux.py +++ b/pym/portage/_selinux.py @@ -2,16 +2,15 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ -import os +import portage +from portage import os +from portage import shutil import selinux -import shutil from selinux import is_selinux_enabled, getfilecon, lgetfilecon def copyfile(src, dest): - if isinstance(src, unicode): - src = src.encode('utf_8', 'replace') - if isinstance(dest, unicode): - dest = dest.encode('utf_8', 'replace') + src = portage._unicode_encode(src) + dest = portage._unicode_encode(dest) (rc, ctx) = selinux.lgetfilecon(src) if rc < 0: raise OSError("copyfile: Failed getting context of \"%s\"." % src) @@ -30,10 +29,8 @@ def getcontext(): return ctx def mkdir(target, refdir): - if isinstance(target, unicode): - target = target.encode('utf_8', 'replace') - if isinstance(refdir, unicode): - refdir = refdir.encode('utf_8', 'replace') + target = portage._unicode_encode(target) + refdir = portage._unicode_encode(refdir) (rc, ctx) = selinux.getfilecon(refdir) if rc < 0: raise OSError( @@ -47,10 +44,8 @@ def mkdir(target, refdir): setfscreatecon() def rename(src, dest): - if isinstance(src, unicode): - src = src.encode('utf_8', 'replace') - if isinstance(dest, unicode): - dest = dest.encode('utf_8', 'replace') + src = portage._unicode_encode(src) + dest = portage._unicode_encode(dest) (rc, ctx) = selinux.lgetfilecon(src) if rc < 0: raise OSError("rename: Failed getting context of \"%s\"." % src) @@ -73,13 +68,13 @@ def setexec(ctx="\n"): raise OSError("setexec: Failed setting exec() context \"%s\"." % ctx) def setfscreate(ctx="\n"): - if isinstance(ctx, unicode): - ctx = ctx.encode('utf_8', 'replace') + ctx = portage._unicode_encode(ctx) if selinux.setfscreatecon(ctx) < 0: raise OSError( "setfscreate: Failed setting fs create context \"%s\"." % ctx) def spawn(selinux_type, spawn_func, mycommand, opt_name=None, **keywords): + selinux_type = portage._unicode_encode(selinux_type) con = settype(selinux_type) setexec(con) try: @@ -88,12 +83,9 @@ def spawn(selinux_type, spawn_func, mycommand, opt_name=None, **keywords): setexec() def symlink(target, link, reflnk): - if isinstance(target, unicode): - target = target.encode('utf_8', 'replace') - if isinstance(link, unicode): - link = link.encode('utf_8', 'replace') - if isinstance(reflnk, unicode): - reflnk = reflnk.encode('utf_8', 'replace') + target = portage._unicode_encode(target) + link = portage._unicode_encode(link) + reflnk = portage._unicode_encode(reflnk) (rc, ctx) = selinux.lgetfilecon(reflnk) if rc < 0: raise OSError( diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index d9b85b18a..7ee889a7c 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -999,12 +999,14 @@ class portdbapi(dbapi): continue if local_config: metadata["USE"] = "" - if "?" in metadata["LICENSE"]: + if "?" in metadata["LICENSE"] or "?" in metadata["PROPERTIES"]: self.doebuild_settings.setcpv(cpv, mydb=metadata) metadata["USE"] = self.doebuild_settings.get("USE", "") try: if settings._getMissingLicenses(cpv, metadata): continue + if settings._getMissingProperties(cpv, metadata): + continue except InvalidDependString: continue if mydep.use: @@ -1110,12 +1112,14 @@ class portdbapi(dbapi): if not accept_chost(mycpv, metadata): continue metadata["USE"] = "" - if "?" in metadata["LICENSE"]: + if "?" in metadata["LICENSE"] or "?" in metadata["PROPERTIES"]: self.doebuild_settings.setcpv(mycpv, mydb=metadata) metadata['USE'] = self.doebuild_settings['PORTAGE_USE'] try: if self.mysettings._getMissingLicenses(mycpv, metadata): continue + if self.mysettings._getMissingProperties(mycpv, metadata): + continue except InvalidDependString: continue newlist.append(mycpv) diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index 3ada2e1a5..46afe9bda 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -34,19 +34,19 @@ from portage.localization import _ from portage import listdir, dep_expand, digraph, flatten, key_expand, \ doebuild_environment, doebuild, env_update, prepare_build_dirs, \ - abssymlink, movefile, _movefile, bsd_chflags, cpv_getkey, \ - _unicode_module_wrapper + abssymlink, movefile, _movefile, bsd_chflags, cpv_getkey + +# This is a special version of the os module, wrapped for unicode support. +from portage import os from portage.cache.mappings import slot_dict_class import codecs -import os, re, shutil, stat, errno, copy, subprocess +import re, shutil, stat, errno, copy, subprocess import logging import sys from itertools import izip -os = _unicode_module_wrapper(os) - try: import cPickle as pickle except ImportError: @@ -312,8 +312,7 @@ class LinkageMap(object): raise CommandNotFound(args[0]) else: for l in proc.stdout: - if not isinstance(l, unicode): - l = unicode(l, encoding='utf_8', errors='replace') + l = portage._unicode_decode(l) l = l[3:].rstrip("\n") if not l: continue @@ -1430,7 +1429,7 @@ class vardbapi(dbapi): now has a categories property that is generated from the available packages. """ - self.root = root[:] + self.root = portage._unicode_decode(root) #cache for category directory mtimes self.mtdircache = {} @@ -1602,8 +1601,6 @@ class vardbapi(dbapi): returnme = [] for x in dir_list: - if not isinstance(x, unicode): - x = unicode(x, encoding='utf_8', errors='replace') if self._excluded_dirs.match(x) is not None: continue ps = pkgsplit(x) @@ -1635,9 +1632,7 @@ class vardbapi(dbapi): else: def listdir(p, **kwargs): try: - return [isinstance(x, unicode) and x or \ - unicode(x, encoding='utf_8', errors='replace') \ - for x in os.listdir(p) \ + return [x for x in os.listdir(p) \ if os.path.isdir(os.path.join(p, x))] except EnvironmentError, e: if e.errno == PermissionDenied.errno: @@ -1881,11 +1876,9 @@ class vardbapi(dbapi): cache_mtime, metadata = pkg_data cache_valid = cache_mtime == mydir_mtime if cache_valid: + # Migrate old metadata to unicode. for k, v in metadata.iteritems(): - if not isinstance(v, unicode): - # Migrate old metadata to unicode. - metadata[k] = unicode(v, - encoding='utf_8', errors='replace') + metadata[k] = portage._unicode_decode(v) mydata.update(metadata) pull_me.difference_update(mydata) @@ -2061,16 +2054,12 @@ class vardbapi(dbapi): if not hasattr(pkg, "getcontents"): pkg = self._dblink(pkg) root = self.root - if not isinstance(root, unicode): - root = unicode(root, encoding='utf_8', errors='replace') root_len = len(root) - 1 new_contents = pkg.getcontents().copy() removed = 0 for filename in paths: - if not isinstance(filename, unicode): - filename = unicode(filename, - encoding='utf_8', errors='replace') + filename = portage._unicode_decode(filename) filename = normalize_path(filename) if relative_paths: relative_filename = filename @@ -2138,7 +2127,7 @@ class vardbapi(dbapi): h = self._new_hash() # Always use a constant utf_8 encoding here, since # the "default" encoding can change. - h.update(s.encode('utf_8', 'replace')) + h.update(portage._unicode_encode(s)) h = h.hexdigest() h = h[-self._hex_chars:] h = int(h, 16) @@ -3247,13 +3236,9 @@ class dblink(object): if the file is not owned by this package. """ - if not isinstance(filename, unicode): - filename = unicode(filename, - encoding='utf_8', errors='replace') + filename = portage._unicode_decode(filename) - if not isinstance(destroot, unicode): - destroot = unicode(destroot, - encoding='utf_8', errors='replace') + destroot = portage._unicode_decode(destroot) destfile = normalize_path( os.path.join(destroot, filename.lstrip(os.path.sep))) @@ -3443,8 +3428,7 @@ class dblink(object): new_contents = self.getcontents().copy() old_contents = self._installed_instance.getcontents() for f in sorted(preserve_paths): - if not isinstance(f, unicode): - f = unicode(f, encoding='utf_8', errors='replace') + f = portage._unicode_decode(f) f_abs = os.path.join(root, f.lstrip(os.sep)) contents_entry = old_contents.get(f_abs) if contents_entry is None: @@ -3874,6 +3858,11 @@ class dblink(object): not existing; we will merge these symlinks at a later time. """ + srcroot = portage._unicode_decode(srcroot) + destroot = portage._unicode_decode(destroot) + inforoot = portage._unicode_decode(inforoot) + myebuild = portage._unicode_decode(myebuild) + showMessage = self._display_merge scheduler = self._scheduler @@ -3961,17 +3950,13 @@ class dblink(object): myfilelist = [] mylinklist = [] paths_with_newlines = [] - - if isinstance(srcroot, unicode): - # Avoid UnicodeDecodeError raised from - # os.path.join when called by os.walk. - srcroot = srcroot.encode('utf_8', 'replace') - srcroot_len = len(srcroot) def onerror(e): raise for parent, dirs, files in os.walk(srcroot, onerror=onerror): + parent = portage._unicode_decode(parent) for f in files: + f = portage._unicode_decode(f) file_path = os.path.join(parent, f) relative_path = file_path[srcroot_len:] @@ -4451,7 +4436,8 @@ class dblink(object): writemsg = self._display_merge scheduler = self._scheduler - from os.path import sep, join + sep = portage.os.sep + join = portage.os.path.join srcroot = normalize_path(srcroot).rstrip(sep) + sep destroot = normalize_path(destroot).rstrip(sep) + sep @@ -4474,9 +4460,6 @@ class dblink(object): mydest = join(destroot, offset, x) # myrealdest is mydest without the $ROOT prefix (makes a difference if ROOT!="/") myrealdest = join(sep, offset, x) - if not isinstance(myrealdest, unicode): - myrealdest = unicode(myrealdest, - encoding='utf_8', errors='replace') # stat file once, test using S_* macros many times (faster that way) mystat = os.lstat(mysrc) mymode = mystat[stat.ST_MODE] -- 2.26.2