diff options
-rwxr-xr-x | EasyInstall.txt | 15 | ||||
-rw-r--r-- | pkg_resources.py | 2 | ||||
-rwxr-xr-x | pkg_resources.txt | 3 | ||||
-rwxr-xr-x | setuptools.txt | 9 | ||||
-rw-r--r-- | setuptools/__init__.py | 4 | ||||
-rwxr-xr-x | setuptools/package_index.py | 48 |
6 files changed, 72 insertions, 9 deletions
diff --git a/EasyInstall.txt b/EasyInstall.txt index 0402d9cb..1e7971d8 100755 --- a/EasyInstall.txt +++ b/EasyInstall.txt @@ -442,6 +442,19 @@ or PyPI mirror. See the ``--index-url`` option under `Command-Line Options`_, below, and also the section on the `Package Index "API"`_. +Password-Protected Sites +------------------------ + +If a site you want to download from is password-protected using HTTP "Basic" +authentication, you can specify your credentials in the URL, like so:: + + http://some_userid:some_password@some.example.com/some_path/ + +You can do this with both index page URLs and direct download URLs. As long +as any HTML pages read by easy_install use *relative* links to point to the +downloads, the same user ID and password will be used to do the downloading. + + Controlling Build Options ~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1230,6 +1243,8 @@ Release Notes/Change History * Added ``--local-snapshots-ok`` flag, to allow building eggs from projects installed using ``setup.py develop``. + + * Fixed not HTML-decoding URLs scraped from web pages 0.6c5 * Fixed ``.dll`` files on Cygwin not having executable permisions when an egg diff --git a/pkg_resources.py b/pkg_resources.py index 955e5c17..6396f08b 100644 --- a/pkg_resources.py +++ b/pkg_resources.py @@ -1052,7 +1052,7 @@ def get_default_cache(): dirname = '' for key in keys: if key in os.environ: - dirname = os.path.join(os.environ[key]) + dirname = os.path.join(dirname, os.environ[key]) else: break else: diff --git a/pkg_resources.txt b/pkg_resources.txt index a38c5f3f..a80e2e11 100755 --- a/pkg_resources.txt +++ b/pkg_resources.txt @@ -1697,6 +1697,9 @@ Release Notes/Change History * Allow ``.egg-link`` files to contain relative paths. + * Fix cache dir defaults on Windows when multiple environment vars are needed + to construct a path. + 0.6c4 * Fix "dev" versions being considered newer than release candidates. diff --git a/setuptools.txt b/setuptools.txt index 11499018..43153da7 100755 --- a/setuptools.txt +++ b/setuptools.txt @@ -1485,8 +1485,10 @@ all practical purposes, you'll probably use only the ``--formats`` option, if you use any option at all. (By the way, if you're using some other revision control system, you might -consider submitting a patch to the ``setuptools.command.sdist`` module, -so we can include support for your system.) +consider creating and publishing a `revision control plugin for setuptools`_.) + + +.. _revision control plugin for setuptools: `Adding Support for Other Revision Control Systems`_ Making your package available for EasyInstall @@ -2626,6 +2628,9 @@ Release Notes/Change History * Fix ``test`` command possibly failing if an older version of the project being tested was installed on ``sys.path`` ahead of the test source directory. + + * Fix ``find_packages()`` treating ``ez_setup`` and directories with ``.`` in + their names as packages. 0.6c5 * Fix uploaded ``bdist_rpm`` packages being described as ``bdist_egg`` diff --git a/setuptools/__init__.py b/setuptools/__init__.py index ac28ad02..c8764396 100644 --- a/setuptools/__init__.py +++ b/setuptools/__init__.py @@ -30,11 +30,11 @@ def find_packages(where='.', exclude=()): where,prefix = stack.pop(0) for name in os.listdir(where): fn = os.path.join(where,name) - if (os.path.isdir(fn) and + if ('.' not in name and os.path.isdir(fn) and os.path.isfile(os.path.join(fn,'__init__.py')) ): out.append(prefix+name); stack.append((fn,prefix+name+'.')) - for pat in exclude: + for pat in list(exclude)+['ez_setup']: from fnmatch import fnmatchcase out = [item for item in out if not fnmatchcase(item,pat)] return out diff --git a/setuptools/package_index.py b/setuptools/package_index.py index e4f96f0b..3da253a5 100755 --- a/setuptools/package_index.py +++ b/setuptools/package_index.py @@ -132,14 +132,14 @@ def find_external_links(url, page): rels = map(str.strip, rel.lower().split(',')) if 'homepage' in rels or 'download' in rels: for match in HREF.finditer(tag): - yield urlparse.urljoin(url, match.group(1)) + yield urlparse.urljoin(url, htmldecode(match.group(1))) for tag in ("<th>Home Page", "<th>Download URL"): pos = page.find(tag) if pos!=-1: match = HREF.search(page,pos) if match: - yield urlparse.urljoin(url, match.group(1)) + yield urlparse.urljoin(url, htmldecode(match.group(1))) user_agent = "Python-urllib/%s setuptools/%s" % ( urllib2.__version__, require('setuptools')[0].version @@ -200,7 +200,7 @@ class PackageIndex(Environment): if url.startswith(self.index_url) and getattr(f,'code',None)!=404: page = self.process_index(url, page) for match in HREF.finditer(page): - link = urlparse.urljoin(base, match.group(1)) + link = urlparse.urljoin(base, htmldecode(match.group(1))) self.process_url(link) def process_filename(self, fn, nested=False): @@ -262,7 +262,7 @@ class PackageIndex(Environment): # process an index page into the package-page index for match in HREF.finditer(page): - scan( urlparse.urljoin(url, match.group(1)) ) + scan( urlparse.urljoin(url, htmldecode(match.group(1))) ) pkg, ver = scan(url) # ensure this page is in the page index if pkg: @@ -611,6 +611,8 @@ class PackageIndex(Environment): self.url_ok(url, True) # raises error if not allowed return self._attempt_download(url, filename) + + def scan_url(self, url): self.process_url(url, True) @@ -652,6 +654,44 @@ class PackageIndex(Environment): def warn(self, msg, *args): log.warn(msg, *args) +# This pattern matches a character entity reference (a decimal numeric +# references, a hexadecimal numeric reference, or a named reference). +entity_sub = re.compile(r'&(#(\d+|x[\da-fA-F]+)|[\w.:-]+);?').sub + +def uchr(c): + if not isinstance(c, int): + return c + if c>255: return unichr(c) + return chr(c) + +def decode_entity(match): + what = match.group(1) + if what.startswith('#x'): + what = int(what[2:], 16) + elif what.startswith('#'): + what = int(what[1:]) + else: + from htmlentitydefs import name2codepoint + what = name2codepoint.get(what, match.group(0)) + return uchr(what) + +def htmldecode(text): + """Decode HTML entities in the given text.""" + return entity_sub(decode_entity, text) + + + + + + + + + + + + + + |