From: Fabian Groffen Date: Sat, 27 Feb 2010 19:01:26 +0000 (-0000) Subject: Merged from trunk -r15449:15451 X-Git-Url: http://git.tremily.us/gitweb.cgi?a=commitdiff_plain;h=a1af5218068909cab9fb6cb5a22bbcd723c1bfe3;p=portage.git Merged from trunk -r15449:15451 | 15450 | Move cacheddir and listdir to portage.util.listdir. | | zmedico | | | 15451 | Fix broken references to | | zmedico | portage._doebuild_manifest_exempt_depend. | svn path=/main/branches/prefix/; revision=15480 --- diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index bab3e4ae0..c4724d409 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -122,6 +122,7 @@ try: 'stack_lists,unique_array,varexpand,writedict,writemsg,' + \ 'writemsg_stdout,write_atomic', 'portage.util.digraph:digraph', + 'portage.util.listdir:cacheddir,listdir', 'portage.versions', 'portage.versions:best,catpkgsplit,catsplit,cpv_getkey,' + \ 'cpv_getkey@getCPFromCPV,endversion_keys,' + \ @@ -534,145 +535,6 @@ def abssymlink(symlink): mylink=mydir+"/"+mylink return os.path.normpath(mylink) -dircache = {} -cacheHit=0 -cacheMiss=0 -cacheStale=0 -def cacheddir(my_original_path, ignorecvs, ignorelist, EmptyOnError, followSymlinks=True): - global cacheHit,cacheMiss,cacheStale - mypath = normalize_path(my_original_path) - if mypath in dircache: - cacheHit += 1 - cached_mtime, list, ftype = dircache[mypath] - else: - cacheMiss += 1 - cached_mtime, list, ftype = -1, [], [] - try: - pathstat = os.stat(mypath) - if stat.S_ISDIR(pathstat[stat.ST_MODE]): - mtime = pathstat.st_mtime - else: - raise portage.exception.DirectoryNotFound(mypath) - except EnvironmentError as e: - if e.errno == portage.exception.PermissionDenied.errno: - raise portage.exception.PermissionDenied(mypath) - del e - return [], [] - except portage.exception.PortageException: - return [], [] - # Python retuns mtime in seconds, so if it was changed in the last few seconds, it could be invalid - if mtime != cached_mtime or time.time() - mtime < 4: - if mypath in dircache: - cacheStale += 1 - try: - list = os.listdir(mypath) - except EnvironmentError as e: - if e.errno != errno.EACCES: - raise - del e - raise portage.exception.PermissionDenied(mypath) - ftype = [] - for x in list: - try: - if followSymlinks: - pathstat = os.stat(mypath+"/"+x) - else: - pathstat = os.lstat(mypath+"/"+x) - - if stat.S_ISREG(pathstat[stat.ST_MODE]): - ftype.append(0) - elif stat.S_ISDIR(pathstat[stat.ST_MODE]): - ftype.append(1) - elif stat.S_ISLNK(pathstat[stat.ST_MODE]): - ftype.append(2) - else: - ftype.append(3) - except (IOError, OSError): - ftype.append(3) - dircache[mypath] = mtime, list, ftype - - ret_list = [] - ret_ftype = [] - for x in range(0, len(list)): - if list[x] in ignorelist: - pass - elif ignorecvs: - if list[x][:2] != ".#": - ret_list.append(list[x]) - ret_ftype.append(ftype[x]) - else: - ret_list.append(list[x]) - ret_ftype.append(ftype[x]) - - writemsg("cacheddirStats: H:%d/M:%d/S:%d\n" % (cacheHit, cacheMiss, cacheStale),10) - return ret_list, ret_ftype - -_ignorecvs_dirs = ('CVS', 'SCCS', '.svn', '.git') - -def listdir(mypath, recursive=False, filesonly=False, ignorecvs=False, ignorelist=[], followSymlinks=True, - EmptyOnError=False, dirsonly=False): - """ - Portage-specific implementation of os.listdir - - @param mypath: Path whose contents you wish to list - @type mypath: String - @param recursive: Recursively scan directories contained within mypath - @type recursive: Boolean - @param filesonly; Only return files, not more directories - @type filesonly: Boolean - @param ignorecvs: Ignore CVS directories ('CVS','SCCS','.svn','.git') - @type ignorecvs: Boolean - @param ignorelist: List of filenames/directories to exclude - @type ignorelist: List - @param followSymlinks: Follow Symlink'd files and directories - @type followSymlinks: Boolean - @param EmptyOnError: Return [] if an error occurs (deprecated, always True) - @type EmptyOnError: Boolean - @param dirsonly: Only return directories. - @type dirsonly: Boolean - @rtype: List - @returns: A list of files and directories (or just files or just directories) or an empty list. - """ - - list, ftype = cacheddir(mypath, ignorecvs, ignorelist, EmptyOnError, followSymlinks) - - if list is None: - list=[] - if ftype is None: - ftype=[] - - if not (filesonly or dirsonly or recursive): - return list - - if recursive: - x=0 - while x> 8 - return retval - -======= ->>>>>>> .merge-right.r15449 def digestgen(myarchives=None, mysettings=None, overwrite=None, manifestonly=None, myportdb=None): """ diff --git a/pym/portage/dbapi/bintree.py b/pym/portage/dbapi/bintree.py index f08f150f4..18278c114 100644 --- a/pym/portage/dbapi/bintree.py +++ b/pym/portage/dbapi/bintree.py @@ -13,6 +13,7 @@ portage.proxy.lazyimport.lazyimport(globals(), 'portage.package.ebuild.doebuild:_vdb_use_conditional_atoms', 'portage.update:update_dbentries', 'portage.util:ensure_dirs,normalize_path,writemsg,writemsg_stdout', + 'portage.util.listdir:listdir', 'portage.versions:best,catpkgsplit,catsplit', ) @@ -23,7 +24,7 @@ from portage.exception import InvalidPackageName, \ from portage.const import EAPI from portage.localization import _ -from portage import dep_expand, listdir, _movefile +from portage import dep_expand, _movefile from portage import os from portage import _encodings from portage import _unicode_decode diff --git a/pym/portage/dbapi/porttree.py b/pym/portage/dbapi/porttree.py index 51e260102..7dd81f7b5 100644 --- a/pym/portage/dbapi/porttree.py +++ b/pym/portage/dbapi/porttree.py @@ -11,9 +11,11 @@ __all__ = [ import portage portage.proxy.lazyimport.lazyimport(globals(), 'portage.checksum', - 'portage.dep:dep_getkey,match_from_list,paren_reduce,use_reduce', + 'portage.dep:dep_getkey,flatten,match_from_list,paren_reduce,use_reduce', 'portage.env.loaders:KeyValuePairFileLoader', + 'portage.package.ebuild.doebuild:doebuild', 'portage.util:ensure_dirs,writemsg,writemsg_level', + 'portage.util.listdir:listdir', 'portage.versions:best,catpkgsplit,_pkgsplit@pkgsplit,ver_regexp', ) @@ -27,8 +29,8 @@ from portage.exception import PortageException, \ from portage.localization import _ from portage.manifest import Manifest -from portage import eclass_cache, auxdbkeys, doebuild, flatten, \ - listdir, dep_expand, eapi_is_supported, dep_check, \ +from portage import eclass_cache, auxdbkeys, \ + dep_expand, eapi_is_supported, dep_check, \ _eapi_is_deprecated from portage import os from portage import _encodings diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index a4348616c..0ae1e5739 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -12,7 +12,7 @@ __all__ = ["PreservedLibsRegistry", "LinkageMap", import portage portage.proxy.lazyimport.lazyimport(globals(), 'portage.checksum:_perform_md5_merge@perform_md5', - 'portage.dep:dep_getkey,isjustname,match_from_list,' + \ + 'portage.dep:dep_getkey,isjustname,flatten,match_from_list,' + \ 'use_reduce,paren_reduce,_slot_re', 'portage.elog:elog_process', 'portage.locks:lockdir,unlockdir', @@ -24,7 +24,10 @@ portage.proxy.lazyimport.lazyimport(globals(), 'portage.util:apply_secpass_permissions,ConfigProtect,ensure_dirs,' + \ 'writemsg,writemsg_level,write_atomic,atomic_ofstream,writedict,' + \ 'grabfile,grabdict,normalize_path,new_protect_filename,getlibpaths', - 'portage.versions:best,catpkgsplit,catsplit,pkgcmp,_pkgsplit@pkgsplit', + 'portage.util.digraph:digraph', + 'portage.util.listdir:dircache,listdir', + 'portage.versions:best,catpkgsplit,catsplit,cpv_getkey,pkgcmp,' + \ + '_pkgsplit@pkgsplit', ) from portage.const import CACHE_PATH, CONFIG_MEMORY_FILE, \ @@ -36,9 +39,8 @@ from portage.exception import CommandNotFound, \ FileNotFound, PermissionDenied, UnsupportedAPIException from portage.localization import _ -from portage import listdir, dep_expand, digraph, flatten, \ - env_update, \ - abssymlink, movefile, _movefile, bsd_chflags, cpv_getkey +from portage import dep_expand, env_update, \ + abssymlink, movefile, _movefile, bsd_chflags # This is a special version of the os module, wrapped for unicode support. from portage import os @@ -2077,7 +2079,6 @@ class vardbapi(dbapi): self.mtdircache.pop(pkg_dblink.cat, None) self.matchcache.pop(pkg_dblink.cat, None) self.cpcache.pop(pkg_dblink.mysplit[0], None) - from portage import dircache dircache.pop(pkg_dblink.dbcatdir, None) def match(self, origdep, use_cache=1): diff --git a/pym/portage/package/ebuild/doebuild.py b/pym/portage/package/ebuild/doebuild.py index d7259b469..b2824d4cc 100644 --- a/pym/portage/package/ebuild/doebuild.py +++ b/pym/portage/package/ebuild/doebuild.py @@ -280,7 +280,7 @@ def _doebuild_exit_status_unlink(exit_status_file): if os.path.exists(exit_status_file): os.unlink(exit_status_file) -_doebuild_manifest_exempt_depend = 0 + _doebuild_manifest_cache = None _doebuild_broken_ebuilds = set() _doebuild_broken_manifests = set() @@ -401,16 +401,13 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0, noiselevel=-1) return 1 - global _doebuild_manifest_exempt_depend - if "strict" in features and \ "digest" not in features and \ tree == "porttree" and \ mydo not in ("digest", "manifest", "help") and \ - not _doebuild_manifest_exempt_depend: + not portage._doebuild_manifest_exempt_depend: # Always verify the ebuild checksums before executing it. - global _doebuild_manifest_cache, _doebuild_broken_ebuilds, \ - _doebuild_broken_ebuilds + global _doebuild_manifest_cache, _doebuild_broken_ebuilds if myebuild in _doebuild_broken_ebuilds: return 1 @@ -508,7 +505,7 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0, if mydo in ("digest", "manifest", "help"): # Temporarily exempt the depend phase from manifest checks, in case # aux_get calls trigger cache generation. - _doebuild_manifest_exempt_depend += 1 + portage._doebuild_manifest_exempt_depend += 1 # If we don't need much space and we don't need a constant location, # we can temporarily override PORTAGE_TMPDIR with a random temp dir @@ -1023,7 +1020,7 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0, if mydo in ("digest", "manifest", "help"): # If necessary, depend phase has been triggered by aux_get calls # and the exemption is no longer needed. - _doebuild_manifest_exempt_depend -= 1 + portage._doebuild_manifest_exempt_depend -= 1 def _validate_deps(mysettings, myroot, mydo, mydbapi): diff --git a/pym/portage/util/digraph.py b/pym/portage/util/digraph.py index ef7b06fc7..dbb86a3c4 100644 --- a/pym/portage/util/digraph.py +++ b/pym/portage/util/digraph.py @@ -2,6 +2,8 @@ # Distributed under the terms of the GNU General Public License v2 # $Id$ +__all__ = ['digraph'] + from portage.util import writemsg class digraph(object): diff --git a/pym/portage/util/listdir.py b/pym/portage/util/listdir.py new file mode 100644 index 000000000..82705acc9 --- /dev/null +++ b/pym/portage/util/listdir.py @@ -0,0 +1,153 @@ +# Copyright 2010 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Id$ + +__all__ = ['cacheddir', 'listdir'] + +import errno +import stat +import time + +from portage import os +from portage.exception import DirectoryNotFound, PermissionDenied, PortageException +from portage.util import normalize_path, writemsg + +dircache = {} +cacheHit = 0 +cacheMiss = 0 +cacheStale = 0 + +def cacheddir(my_original_path, ignorecvs, ignorelist, EmptyOnError, followSymlinks=True): + global cacheHit,cacheMiss,cacheStale + mypath = normalize_path(my_original_path) + if mypath in dircache: + cacheHit += 1 + cached_mtime, list, ftype = dircache[mypath] + else: + cacheMiss += 1 + cached_mtime, list, ftype = -1, [], [] + try: + pathstat = os.stat(mypath) + if stat.S_ISDIR(pathstat[stat.ST_MODE]): + mtime = pathstat.st_mtime + else: + raise DirectoryNotFound(mypath) + except EnvironmentError as e: + if e.errno == PermissionDenied.errno: + raise PermissionDenied(mypath) + del e + return [], [] + except PortageException: + return [], [] + # Python retuns mtime in seconds, so if it was changed in the last few seconds, it could be invalid + if mtime != cached_mtime or time.time() - mtime < 4: + if mypath in dircache: + cacheStale += 1 + try: + list = os.listdir(mypath) + except EnvironmentError as e: + if e.errno != errno.EACCES: + raise + del e + raise PermissionDenied(mypath) + ftype = [] + for x in list: + try: + if followSymlinks: + pathstat = os.stat(mypath+"/"+x) + else: + pathstat = os.lstat(mypath+"/"+x) + + if stat.S_ISREG(pathstat[stat.ST_MODE]): + ftype.append(0) + elif stat.S_ISDIR(pathstat[stat.ST_MODE]): + ftype.append(1) + elif stat.S_ISLNK(pathstat[stat.ST_MODE]): + ftype.append(2) + else: + ftype.append(3) + except (IOError, OSError): + ftype.append(3) + dircache[mypath] = mtime, list, ftype + + ret_list = [] + ret_ftype = [] + for x in range(0, len(list)): + if list[x] in ignorelist: + pass + elif ignorecvs: + if list[x][:2] != ".#": + ret_list.append(list[x]) + ret_ftype.append(ftype[x]) + else: + ret_list.append(list[x]) + ret_ftype.append(ftype[x]) + + writemsg("cacheddirStats: H:%d/M:%d/S:%d\n" % (cacheHit, cacheMiss, cacheStale),10) + return ret_list, ret_ftype + +_ignorecvs_dirs = ('CVS', 'SCCS', '.svn', '.git') + +def listdir(mypath, recursive=False, filesonly=False, ignorecvs=False, ignorelist=[], followSymlinks=True, + EmptyOnError=False, dirsonly=False): + """ + Portage-specific implementation of os.listdir + + @param mypath: Path whose contents you wish to list + @type mypath: String + @param recursive: Recursively scan directories contained within mypath + @type recursive: Boolean + @param filesonly; Only return files, not more directories + @type filesonly: Boolean + @param ignorecvs: Ignore CVS directories ('CVS','SCCS','.svn','.git') + @type ignorecvs: Boolean + @param ignorelist: List of filenames/directories to exclude + @type ignorelist: List + @param followSymlinks: Follow Symlink'd files and directories + @type followSymlinks: Boolean + @param EmptyOnError: Return [] if an error occurs (deprecated, always True) + @type EmptyOnError: Boolean + @param dirsonly: Only return directories. + @type dirsonly: Boolean + @rtype: List + @returns: A list of files and directories (or just files or just directories) or an empty list. + """ + + list, ftype = cacheddir(mypath, ignorecvs, ignorelist, EmptyOnError, followSymlinks) + + if list is None: + list=[] + if ftype is None: + ftype=[] + + if not (filesonly or dirsonly or recursive): + return list + + if recursive: + x=0 + while x