get-with-headers: don't block indefinitely if the server had an internal error
If the server had an internal error and returned 500, there's nothing
to read, so "response.read()" blocks indefinitely. Only output the
response if there's really a response.
[ original upstream message ]
importos,stat,socketimportreimportsysimporttempfiletempprefix='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__isnotNoneexceptImportError:returnFalsedefhas_bzr114():try:importbzrlibreturn(bzrlib.__doc__isnotNoneandbzrlib.version_info[:2]>=(1,14))exceptImportError:returnFalsedefhas_cvs():re=r'Concurrent Versions System.*?server'returnmatchoutput('cvs --version 2>&1',re)andnothas_msys()defhas_cvs112():re=r'Concurrent Versions System \(CVS\) 1.12.*?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(dir='.',prefix=tempprefix,suffix='\n\r')os.close(fd)os.remove(path)returnTrueexcept(IOError,OSError):returnFalsedefhas_executablebit():try:EXECFLAGS=stat.S_IXUSR|stat.S_IXGRP|stat.S_IXOTHfh,fn=tempfile.mkstemp(dir='.',prefix=tempprefix)try:os.close(fh)m=os.stat(fn).st_mode&0777new_file_has_exec=m&EXECFLAGSos.chmod(fn,m^EXECFLAGS)exec_flags_cannot_flip=((os.stat(fn).st_mode&0777)==m)finally:os.unlink(fn)except(IOError,OSError):# we don't care, the user probably won't be able to commit anywayreturnFalsereturnnot(new_file_has_execorexec_flags_cannot_flip)defhas_icasefs():# Stolen from mercurial.utilfd,path=tempfile.mkstemp(dir='.',prefix=tempprefix)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==s1exceptOSError:returnFalsefinally:os.remove(path)defhas_inotify():try:importhgext.inotify.linux.watcherexceptImportError:returnFalsename=tempfile.mktemp(dir='.',prefix=tempprefix)sock=socket.socket(socket.AF_UNIX)try:sock.bind(name)exceptsocket.error:returnFalsesock.close()os.unlink(name)returnTruedefhas_fifo():ifgetattr(os,"mkfifo",None)isNone:returnFalsename=tempfile.mktemp(dir='.',prefix=tempprefix)try:os.mkfifo(name)os.unlink(name)returnTrueexceptOSError:returnFalsedefhas_killdaemons():returnTruedefhas_cacheable_fs():frommercurialimportutilfd,path=tempfile.mkstemp(dir='.',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 --quiet 2>&1',r'^(\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():return(matchoutput('p4 -V',r'Rev\. P4/')andmatchoutput('p4d -V',r'Rev\. P4D/'))defhas_symlink():ifgetattr(os,"symlink",None)isNone:returnFalsename=tempfile.mktemp(dir='.',prefix=tempprefix)try:os.symlink(".",name)os.unlink(name)returnTrueexcept(OSError,AttributeError):returnFalsedefhas_hardlink():frommercurialimportutilfh,fn=tempfile.mkstemp(dir='.',prefix=tempprefix)os.close(fh)name=tempfile.mktemp(dir='.',prefix=tempprefix)try:try:util.oslink(fn,name)os.unlink(name)returnTrueexceptOSError:returnFalsefinally:os.unlink(fn)defhas_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(dir='.',prefix=tempprefix)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("sh -c \"echo 'import re' 2>&1 | pyflakes\"",r"<stdin>:1: 're' imported but unused",True)defhas_pygments():try:importpygmentsreturnTrueexceptImportError:returnFalsedefhas_outer_repo():# failing for other reasons than 'no repo' imply that there is a reporeturnnotmatchoutput('hg root 2>&1',r'abort: no repository found',True)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')defhas_aix():returnsys.platform.startswith("aix")checks={"true":(lambda:True,"yak shaving"),"false":(lambda:False,"nail clipper"),"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"),"cvs112":(has_cvs112,"cvs client/server >= 1.12"),"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"),"hardlink":(has_hardlink,"hardlinks"),"icasefs":(has_icasefs,"case insensitive file system"),"inotify":(has_inotify,"inotify extension support"),"killdaemons":(has_killdaemons,'killdaemons.py 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"),"aix":(has_aix,"AIX"),}