From e9a04922c144b267534e3335d2ff3d7bb8994b80 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Fri, 18 Jan 2013 15:05:42 -0800 Subject: Add workaround for Python 2.6.4 issue 4978 Avoid "TypeError: keywords must be strings" issue triggered by unicode_literals: http://bugs.python.org/issue4978 --- pym/_emerge/depgraph.py | 9 ++++++--- pym/_emerge/resolver/output.py | 4 +++- pym/portage/__init__.py | 9 +++++++++ pym/portage/dbapi/porttree.py | 4 ++-- pym/portage/dbapi/vartree.py | 3 ++- pym/portage/news.py | 4 +++- pym/portage/package/ebuild/doebuild.py | 7 ++++--- pym/portage/repository/config.py | 2 +- pym/repoman/checks.py | 3 ++- 9 files changed, 32 insertions(+), 13 deletions(-) diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index b5dba31dc..7a967957c 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -2971,7 +2971,8 @@ class depgraph(object): not been scheduled for replacement. """ kwargs["trees"] = self._dynamic_config._graph_trees - return self._select_atoms_highest_available(*pargs, **kwargs) + return self._select_atoms_highest_available(*pargs, + **portage._native_kwargs(kwargs)) def _select_atoms_highest_available(self, root, depstring, myuse=None, parent=None, strict=True, trees=None, priority=None): @@ -6813,7 +6814,8 @@ class depgraph(object): writemsg("\n", noiselevel=-1) for pargs, kwargs in self._dynamic_config._unsatisfied_deps_for_display: - self._show_unsatisfied_dep(*pargs, **kwargs) + self._show_unsatisfied_dep(*pargs, + **portage._native_kwargs(kwargs)) def saveNomergeFavorites(self): """Find atoms in favorites that are not in the mergelist and add them @@ -7158,7 +7160,8 @@ class depgraph(object): try: for pargs, kwargs in self._dynamic_config._unsatisfied_deps_for_display: self._show_unsatisfied_dep( - *pargs, check_autounmask_breakage=True, **kwargs) + *pargs, check_autounmask_breakage=True, + **portage._native_kwargs(kwargs)) except self._autounmask_breakage: return True return False diff --git a/pym/_emerge/resolver/output.py b/pym/_emerge/resolver/output.py index 651a4f73c..6aeadee94 100644 --- a/pym/_emerge/resolver/output.py +++ b/pym/_emerge/resolver/output.py @@ -12,6 +12,7 @@ __all__ = ( import sys +import portage from portage import os from portage.dbapi.dep_expand import dep_expand from portage.dep import cpvequal, _repo_separator, _slot_separator @@ -316,7 +317,8 @@ class Display(object): kwargs["myrepo"] = pkg.repo myfilesdict = None try: - myfilesdict = db.getfetchsizes(pkg.cpv, **kwargs) + myfilesdict = db.getfetchsizes(pkg.cpv, + **portage._native_kwargs(kwargs)) except InvalidDependString as e: # FIXME: validate SRC_URI earlier depstr, = db.aux_get(pkg.cpv, diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 3bae4deff..94ca7b90f 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -198,6 +198,15 @@ else: _native_string = _unicode_encode +if sys.hexversion >= 0x20605f0: + def _native_kwargs(kwargs): + return kwargs +else: + # Avoid "TypeError: keywords must be strings" issue triggered + # by unicode_literals: http://bugs.python.org/issue4978 + def _native_kwargs(kwargs): + return dict((_native_string(k), v) for k, v in kwargs.iteritems()) + class _unicode_func_wrapper(object): """ Wraps a function, converts arguments from unicode to bytes, diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index 321b6758a..e21e53ce6 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -155,10 +155,10 @@ class portdbapi(dbapi): # portage group. depcachedir_unshared = True else: - cache_kwargs.update({ + cache_kwargs.update(portage._native_kwargs({ 'gid' : portage_gid, 'perms' : 0o664 - }) + })) # If secpass < 1, we don't want to write to the cache # since then we won't be able to apply group permissions diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index 30add8a89..20a114bda 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -4837,7 +4837,8 @@ class dblink(object): else: kwargs['mode'] = 'w' kwargs['encoding'] = _encodings['repo.content'] - write_atomic(os.path.join(self.dbdir, fname), data, **kwargs) + write_atomic(os.path.join(self.dbdir, fname), data, + **portage._native_kwargs(kwargs)) def getelements(self,ename): if not os.path.exists(self.dbdir+"/"+ename): diff --git a/pym/portage/news.py b/pym/portage/news.py index 94ec8f164..408fb5c5f 100644 --- a/pym/portage/news.py +++ b/pym/portage/news.py @@ -13,6 +13,7 @@ import io import logging import os as _os import re +import portage from portage import OrderedDict from portage import os from portage import _encodings @@ -241,7 +242,8 @@ class NewsItem(object): for values in self.restrictions.values(): any_match = False for restriction in values: - if restriction.checkRestriction(**kwargs): + if restriction.checkRestriction( + **portage._native_kwargs(kwargs)): any_match = True if not any_match: all_match = False diff --git a/pym/portage/package/ebuild/doebuild.py b/pym/portage/package/ebuild/doebuild.py index 3e8ff0138..71a6f156f 100644 --- a/pym/portage/package/ebuild/doebuild.py +++ b/pym/portage/package/ebuild/doebuild.py @@ -135,7 +135,7 @@ def _doebuild_spawn(phase, settings, actionmap=None, **kwargs): settings['EBUILD_PHASE'] = phase try: - return spawn(cmd, settings, **kwargs) + return spawn(cmd, settings, **portage._native_kwargs(kwargs)) finally: settings.pop('EBUILD_PHASE', None) @@ -1453,14 +1453,15 @@ def spawn(mystring, mysettings, debug=0, free=0, droppriv=0, sesandbox=0, fakero mysettings["PORTAGE_SANDBOX_T"]) if keywords.get("returnpid"): - return spawn_func(mystring, env=mysettings.environ(), **keywords) + return spawn_func(mystring, env=mysettings.environ(), + **portage._native_kwargs(keywords)) proc = EbuildSpawnProcess( background=False, args=mystring, scheduler=SchedulerInterface(portage._internal_caller and global_event_loop() or EventLoop(main=False)), spawn_func=spawn_func, - settings=mysettings, **keywords) + settings=mysettings, **portage._native_kwargs(keywords)) proc.start() proc.wait() diff --git a/pym/portage/repository/config.py b/pym/portage/repository/config.py index a1c1f79ce..8a110e990 100644 --- a/pym/portage/repository/config.py +++ b/pym/portage/repository/config.py @@ -238,7 +238,7 @@ class RepoConfig(object): if self.disable_manifest: kwds['from_scratch'] = True kwds['find_invalid_path_char'] = self.find_invalid_path_char - return manifest.Manifest(*args, **kwds) + return manifest.Manifest(*args, **portage._native_kwargs(kwds)) def update(self, new_repo): """Update repository with options in another RepoConfig""" diff --git a/pym/repoman/checks.py b/pym/repoman/checks.py index 83ce2ed6e..9dd3b959d 100644 --- a/pym/repoman/checks.py +++ b/pym/repoman/checks.py @@ -819,7 +819,8 @@ class PortageInternalVariableAssignment(LineCheck): _base_check_classes = (InheritEclass, LineCheck, PhaseCheck) _constant_checks = tuple(chain((v() for k, v in globals().items() if isinstance(v, type) and issubclass(v, LineCheck) and v not in _base_check_classes), - (InheritEclass(k, **kwargs) for k, kwargs in _eclass_info.items()))) + (InheritEclass(k, **portage._native_kwargs(kwargs)) + for k, kwargs in _eclass_info.items()))) _here_doc_re = re.compile(r'.*\s<<[-]?(\w+)$') _ignore_comment_re = re.compile(r'^\s*#') -- cgit v1.2.3-1-g7c22