diff options
author | PJ Eby <distutils-sig@python.org> | 2006-07-10 23:03:20 +0000 |
---|---|---|
committer | PJ Eby <distutils-sig@python.org> | 2006-07-10 23:03:20 +0000 |
commit | 55742ce120b051dbc90e12c468da81dbe902cfea (patch) | |
tree | 9fcd6e388e424b3d2d79556b3da925eddabe3b01 /setuptools/package_index.py | |
parent | ac7808e631535975e29298f7b41c38a6de3b26e3 (diff) | |
download | external_python_setuptools-55742ce120b051dbc90e12c468da81dbe902cfea.tar.gz external_python_setuptools-55742ce120b051dbc90e12c468da81dbe902cfea.tar.bz2 external_python_setuptools-55742ce120b051dbc90e12c468da81dbe902cfea.zip |
Allow ``file://`` URLs to be used as a package index. URLs that refer to
directories will use an internally-generated directory listing if there is
no ``index.html`` file in the directory.
(backport from trunk)
--HG--
branch : setuptools-0.6
extra : convert_revision : svn%3A6015fed2-1504-0410-9fe1-9d1591cc4771/sandbox/branches/setuptools-0.6%4050555
Diffstat (limited to 'setuptools/package_index.py')
-rwxr-xr-x | setuptools/package_index.py | 56 |
1 files changed, 28 insertions, 28 deletions
diff --git a/setuptools/package_index.py b/setuptools/package_index.py index 4c81580b..efdd02f3 100755 --- a/setuptools/package_index.py +++ b/setuptools/package_index.py @@ -1,6 +1,6 @@ """PyPI and direct package downloading""" -import sys, os.path, re, urlparse, urllib2, shutil, random, socket +import sys, os.path, re, urlparse, urllib2, shutil, random, socket, cStringIO from pkg_resources import * from distutils import log from distutils.errors import DistutilsError @@ -573,6 +573,8 @@ class PackageIndex(Environment): def open_url(self, url): + if url.startswith('file:'): + return local_open(url) try: return urllib2.urlopen(url) except urllib2.HTTPError, v: @@ -610,6 +612,7 @@ class PackageIndex(Environment): else: return filename + def scan_url(self, url): self.process_url(url, True) @@ -643,17 +646,6 @@ class PackageIndex(Environment): def warn(self, msg, *args): log.warn(msg, *args) - - - - - - - - - - - def fix_sf_url(url): scheme, server, path, param, query, frag = urlparse.urlparse(url) if server!='prdownloads.sourceforge.net': @@ -674,22 +666,30 @@ def get_sf_ip(): return random.choice(_sf_mirrors) - - - - - - - - - - - - - - - - +def local_open(url): + """Read a local path, with special support for directories""" + scheme, server, path, param, query, frag = urlparse.urlparse(url) + filename = urllib2.url2pathname(path) + if os.path.isfile(filename): + return urllib2.urlopen(url) + elif path.endswith('/') and os.path.isdir(filename): + files = [] + for f in os.listdir(filename): + if f=='index.html': + body = open(os.path.join(filename,f),'rb').read() + break + elif os.path.isdir(os.path.join(filename,f)): + f+='/' + files.append("<a href=%r>%s</a>" % (f,f)) + else: + body = ("<html><head><title>%s</title>" % url) + \ + "</head><body>%s</body></html>" % '\n'.join(files) + status, message = 200, "OK" + else: + status, message, body = 404, "Path not found", "Not found" + + return urllib2.HTTPError(url, status, message, + {'content-type':'text/html'}, cStringIO.StringIO(body)) |