run-tests: use a list comprehension instead of map
[ original upstream message ]
#!/usr/bin/env python"""Test the running system for features availability. Exit with zeroif all features are there, non-zero otherwise. If a feature name isprefixed with "no-", the absence of feature is tested."""importoptparseimportosimportreimportsysimporttempfiletempprefix='hg-hghave-'defmatchoutput(cmd,regexp,ignorestatus=False):"""Return True if cmd executes successfully and its output is matched by the supplied regular expression. """r=re.compile(regexp)fh=os.popen(cmd)s=fh.read()try:ret=fh.close()exceptIOError:# Happen in Windows test environmentret=1return(ignorestatusorretisNone)andr.search(s)defhas_baz():returnmatchoutput('baz --version 2>&1',r'baz Bazaar version')defhas_bzr():try:importbzrlibreturnbzrlib.__doc__!=NoneexceptImportError:returnFalsedefhas_bzr114():try:importbzrlibreturn(bzrlib.__doc__!=Noneandbzrlib.version_info[:2]>=(1,14))exceptImportError:returnFalsedefhas_cvs():re=r'Concurrent Versions System.*?server'returnmatchoutput('cvs --version 2>&1',re)andnothas_msys()defhas_darcs():returnmatchoutput('darcs --version',r'2\.[2-9]',True)defhas_mtn():returnmatchoutput('mtn --version',r'monotone',True)andnotmatchoutput('mtn --version',r'monotone 0\.',True)defhas_eol_in_paths():try:fd,path=tempfile.mkstemp(prefix=tempprefix,suffix='\n\r')os.close(fd)os.remove(path)returnTrueexcept:returnFalsedefhas_executablebit():fd,path=tempfile.mkstemp(prefix=tempprefix)os.close(fd)try:s=os.lstat(path).st_modeos.chmod(path,s|0100)return(os.lstat(path).st_mode&0100!=0)finally:os.remove(path)defhas_icasefs():# Stolen from mercurial.utilfd,path=tempfile.mkstemp(prefix=tempprefix,dir='.')os.close(fd)try:s1=os.stat(path)d,b=os.path.split(path)p2=os.path.join(d,b.upper())ifpath==p2:p2=os.path.join(d,b.lower())try:s2=os.stat(p2)returns2==s1except:returnFalsefinally:os.remove(path)defhas_inotify():try:importhgext.inotify.linux.watcherreturnTrueexceptImportError:returnFalsedefhas_fifo():returnhasattr(os,"mkfifo")defhas_cacheable_fs():frommercurialimportutilfd,path=tempfile.mkstemp(prefix=tempprefix)os.close(fd)try:returnutil.cachestat(path).cacheable()finally:os.remove(path)defhas_lsprof():try:import_lsprofreturnTrueexceptImportError:returnFalsedefhas_gettext():returnmatchoutput('msgfmt --version','GNU gettext-tools')defhas_git():returnmatchoutput('git --version 2>&1',r'^git version')defhas_docutils():try:fromdocutils.coreimportpublish_cmdlinereturnTrueexceptImportError:returnFalsedefgetsvnversion():m=matchoutput('svn --version 2>&1',r'^svn,\s+version\s+(\d+)\.(\d+)')ifnotm:return(0,0)return(int(m.group(1)),int(m.group(2)))defhas_svn15():returngetsvnversion()>=(1,5)defhas_svn13():returngetsvnversion()>=(1,3)defhas_svn():returnmatchoutput('svn --version 2>&1',r'^svn, version')and \matchoutput('svnadmin --version 2>&1',r'^svnadmin, version')defhas_svn_bindings():try:importsvn.coreversion=svn.core.SVN_VER_MAJOR,svn.core.SVN_VER_MINORifversion<(1,4):returnFalsereturnTrueexceptImportError:returnFalsedefhas_p4():returnmatchoutput('p4 -V',r'Rev\. P4/')andmatchoutput('p4d -V',r'Rev\. P4D/')defhas_symlink():returnhasattr(os,"symlink")# FIXME: should also check file system and osdefhas_tla():returnmatchoutput('tla --version 2>&1',r'The GNU Arch Revision')defhas_gpg():returnmatchoutput('gpg --version 2>&1',r'GnuPG')defhas_unix_permissions():d=tempfile.mkdtemp(prefix=tempprefix,dir=".")try:fname=os.path.join(d,'foo')forumaskin(077,007,022):os.umask(umask)f=open(fname,'w')f.close()mode=os.stat(fname).st_modeos.unlink(fname)ifmode&0777!=~umask&0666:returnFalsereturnTruefinally:os.rmdir(d)defhas_pyflakes():returnmatchoutput('echo "import re" 2>&1 | pyflakes',r"<stdin>:1: 're' imported but unused",True)defhas_pygments():try:importpygmentsreturnTrueexceptImportError:returnFalsedefhas_outer_repo():returnmatchoutput('hg root 2>&1',r'')defhas_ssl():try:importsslimportOpenSSLOpenSSL.SSL.ContextreturnTrueexceptImportError:returnFalsedefhas_windows():returnos.name=='nt'defhas_system_sh():returnos.name!='nt'defhas_serve():returnos.name!='nt'# gross approximationdefhas_tic():returnmatchoutput('test -x "`which tic`"','')defhas_msys():returnos.getenv('MSYSTEM')checks={"baz":(has_baz,"GNU Arch baz client"),"bzr":(has_bzr,"Canonical's Bazaar client"),"bzr114":(has_bzr114,"Canonical's Bazaar client >= 1.14"),"cacheable":(has_cacheable_fs,"cacheable filesystem"),"cvs":(has_cvs,"cvs client/server"),"darcs":(has_darcs,"darcs client"),"docutils":(has_docutils,"Docutils text processing library"),"eol-in-paths":(has_eol_in_paths,"end-of-lines in paths"),"execbit":(has_executablebit,"executable bit"),"fifo":(has_fifo,"named pipes"),"gettext":(has_gettext,"GNU Gettext (msgfmt)"),"git":(has_git,"git command line client"),"gpg":(has_gpg,"gpg client"),"icasefs":(has_icasefs,"case insensitive file system"),"inotify":(has_inotify,"inotify extension support"),"lsprof":(has_lsprof,"python lsprof module"),"mtn":(has_mtn,"monotone client (>= 1.0)"),"outer-repo":(has_outer_repo,"outer repo"),"p4":(has_p4,"Perforce server and client"),"pyflakes":(has_pyflakes,"Pyflakes python linter"),"pygments":(has_pygments,"Pygments source highlighting library"),"serve":(has_serve,"platform and python can manage 'hg serve -d'"),"ssl":(has_ssl,"python >= 2.6 ssl module and python OpenSSL"),"svn":(has_svn,"subversion client and admin tools"),"svn13":(has_svn13,"subversion client and admin tools >= 1.3"),"svn15":(has_svn15,"subversion client and admin tools >= 1.5"),"svn-bindings":(has_svn_bindings,"subversion python bindings"),"symlink":(has_symlink,"symbolic links"),"system-sh":(has_system_sh,"system() uses sh"),"tic":(has_tic,"terminfo compiler"),"tla":(has_tla,"GNU Arch tla client"),"unix-permissions":(has_unix_permissions,"unix-style permissions"),"windows":(has_windows,"Windows"),"msys":(has_msys,"Windows with MSYS"),}deflist_features():forname,featureinchecks.iteritems():desc=feature[1]printname+':',descdeftest_features():failed=0forname,featureinchecks.iteritems():check,_=featuretry:check()exceptException,e:print"feature %s failed: %s"%(name,e)failed+=1returnfailedparser=optparse.OptionParser("%prog [options] [features]")parser.add_option("--test-features",action="store_true",help="test available features")parser.add_option("--list-features",action="store_true",help="list available features")parser.add_option("-q","--quiet",action="store_true",help="check features silently")if__name__=='__main__':options,args=parser.parse_args()ifoptions.list_features:list_features()sys.exit(0)ifoptions.test_features:sys.exit(test_features())quiet=options.quietfailures=0deferror(msg):globalfailuresifnotquiet:sys.stderr.write(msg+'\n')failures+=1forfeatureinargs:negate=feature.startswith('no-')ifnegate:feature=feature[3:]iffeaturenotinchecks:error('skipped: unknown feature: '+feature)continuecheck,desc=checks[feature]try:available=check()exceptException,e:error('hghave check failed: '+feature)continueifnotnegateandnotavailable:error('skipped: missing feature: '+desc)elifnegateandavailable:error('skipped: system supports %s'%desc)iffailures!=0:sys.exit(1)