From: Fabian Groffen Date: Wed, 22 Jul 2009 17:32:51 +0000 (-0000) Subject: Merged from trunk -r13831:13839 X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=5e3065e7d240a6781020ea2bb5ed8c00bd155183;p=portage.git Merged from trunk -r13831:13839 | 13832 | For unsatisfied USE dependencies, do not backtrack if only | | zmedico | USE have to change in order to be satisfied. Thanks to | | | Thomas Sachau fo reporting. | | 13833 | For consistency with emake, add ${MAKEOPTS} ${EXTRA_EMAKE} | | zmedico | to make arguments inside einstall. Also, force -j1 in order | | | to override any --jobs settings from MAKEOPTS. Thanks to | | | Diego Pettenò for the suggestion. | | 13834 | Use readlines() to optimize performance. Thanks to Marat | | zmedico | Radchenko for this patch from | | | bug #276813. | | 13835 | In _check_manifests(), skip uninstall operations. | | zmedico | | | 13836 | Use codecs.open for unicode support in FileLoader.load(). | | zmedico | | | 13837 | In grablines(), specify encoding=sys.getdefaultencoding() in | | zmedico | the codecs.open() parameters, since otherwise readlines | | | doesn't return unicode (at least in some cases, observed | | | with python-2.6.2). Also, fix grabfile() to return unicode | | | when it normalizes whitespace. | | 13838 | Fix Scheduler bug: the scheduler was adding prefetcher even | | volkmar | for uninstall tasks | | 13839 | Make portage.listdir() and dbapi.cp_list() return unicode. | | zmedico | | svn path=/main/branches/prefix/; revision=13847 --- diff --git a/bin/ebuild.sh b/bin/ebuild.sh index eef0d5f8c..fc43d7f5a 100755 --- a/bin/ebuild.sh +++ b/bin/ebuild.sh @@ -568,6 +568,7 @@ einstall() { mandir="${ED}usr/share/man" \ sysconfdir="${ED}etc" \ ${LOCAL_EXTRA_EINSTALL} \ + ${MAKEOPTS} ${EXTRA_EMAKE} -j1 \ "$@" install fi ${MAKE:-make} prefix="${ED}usr" \ @@ -577,6 +578,7 @@ einstall() { mandir="${ED}usr/share/man" \ sysconfdir="${ED}etc" \ ${LOCAL_EXTRA_EINSTALL} \ + ${MAKEOPTS} ${EXTRA_EMAKE} -j1 \ "$@" install || die "einstall failed" else die "no Makefile found" diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index cb5db078b..79bbaebd6 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -608,6 +608,9 @@ class Scheduler(PollScheduler): x.type_name != "ebuild": continue + if x.operation == "uninstall": + continue + if not shown_verifying_msg: shown_verifying_msg = True self._status_msg("Verifying ebuild manifests") @@ -636,6 +639,8 @@ class Scheduler(PollScheduler): # at the beginning, which annoy users, never # spawn a prefetcher for the first package. for pkg in self._mergelist[1:]: + if pkg.operation == "uninstall": + continue prefetcher = self._create_prefetcher(pkg) if prefetcher is not None: self._task_queues.fetch.add(prefetcher) diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index b05cb46e5..a92888d00 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -666,10 +666,22 @@ class depgraph(object): self._dynamic_config._runtime_pkg_mask[ dep.parent]), noiselevel=-1) else: - self._dynamic_config._runtime_pkg_mask.setdefault( - dep.parent, {})["missing dependency"] = \ - set([(dep.parent, dep.atom)]) - self._dynamic_config._need_restart = True + # Do not backtrack if only USE have to be changed in + # order to satisfy the dependency. + atom_without_use = dep.atom + if dep.atom.use: + atom_without_use = portage.dep.remove_slot(dep.atom) + if dep.atom.slot: + atom_without_use += ":" + dep.atom.slot + atom_without_use = portage.dep.Atom(atom_without_use) + dep_pkg, existing_node = \ + self._select_package(dep.root, atom_without_use, + onlydeps=dep.onlydeps) + if dep_pkg is None: + self._dynamic_config._runtime_pkg_mask.setdefault( + dep.parent, {})["missing dependency"] = \ + set([(dep.parent, dep.atom)]) + self._dynamic_config._need_restart = True return 0 # In some cases, dep_check will return deps that shouldn't diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 307a278bb..6fb82381f 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -247,6 +247,8 @@ 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, errors='replace') try: if followSymlinks: pathstat = os.stat(mypath+"/"+x) diff --git a/pym/portage/cache/flat_hash.py b/pym/portage/cache/flat_hash.py index 71ddf6023..c3c5955fb 100644 --- a/pym/portage/cache/flat_hash.py +++ b/pym/portage/cache/flat_hash.py @@ -29,7 +29,7 @@ class database(fs_template.FsBased): try: myf = codecs.open(fp, mode='r', encoding='utf_8', errors='replace') try: - d = self._parse_data(myf, cpv) + d = self._parse_data(myf.readlines(), cpv) if '_mtime_' not in d: # Backward compatibility with old cache # that uses mtime mangling. diff --git a/pym/portage/cache/metadata.py b/pym/portage/cache/metadata.py index 724dce3cc..b51bf980f 100644 --- a/pym/portage/cache/metadata.py +++ b/pym/portage/cache/metadata.py @@ -34,7 +34,6 @@ class database(flat_hash.database): def _parse_data(self, data, cpv): _hashed_re_match = self._hashed_re.match - data = list(data) d = {} for line in data: diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index e29377f72..1fd593811 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -873,6 +873,8 @@ class portdbapi(dbapi): except OSError: continue for x in file_list: + if not isinstance(x, unicode): + x = unicode(x, errors='replace') pf = None if glep55: diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index c96cf2acc..11ce804dd 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -1420,6 +1420,8 @@ class vardbapi(dbapi): returnme = [] for x in dir_list: + if not isinstance(x, unicode): + x = unicode(x, errors='replace') if self._excluded_dirs.match(x) is not None: continue ps = pkgsplit(x) @@ -1451,7 +1453,8 @@ class vardbapi(dbapi): else: def listdir(p, **kwargs): try: - return [x for x in os.listdir(p) \ + return [isinstance(x, unicode) and x or \ + unicode(x, errors='replace') for x in os.listdir(p) \ if os.path.isdir(os.path.join(p, x))] except EnvironmentError, e: if e.errno == PermissionDenied.errno: diff --git a/pym/portage/env/loaders.py b/pym/portage/env/loaders.py index 31d3b09aa..7cd2600ae 100644 --- a/pym/portage/env/loaders.py +++ b/pym/portage/env/loaders.py @@ -3,6 +3,7 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ +import codecs import os import stat from portage.localization import _ @@ -138,7 +139,7 @@ class FileLoader(DataLoader): # once, which may be expensive due to digging in child classes. func = self.lineParser for fn in RecursiveFileLoader(self.fname): - f = open(fn) + f = codecs.open(fn, mode='r', errors='replace') for line_num, line in enumerate(f): func(line, line_num, data, errors) return (data, errors) diff --git a/pym/portage/util.py b/pym/portage/util.py index c7c2387d4..fc69d7aef 100644 --- a/pym/portage/util.py +++ b/pym/portage/util.py @@ -104,7 +104,7 @@ def grabfile(myfilename, compat_level=0, recursive=0): for x in mylines: #the split/join thing removes leading and trailing whitespace, and converts any whitespace in the line #into single spaces. - myline=" ".join(x.split()) + myline = u' '.join(x.split()) if not len(myline): continue if myline[0]=="#": @@ -318,7 +318,8 @@ def grablines(myfilename,recursive=0): os.path.join(myfilename, f), recursive)) else: try: - myfile = codecs.open(myfilename, mode='r', errors='replace') + myfile = codecs.open(myfilename, mode='r', + encoding=sys.getdefaultencoding(), errors='replace') mylines = myfile.readlines() myfile.close() except IOError, e: