Hello community,

here is the log from the commit of package python3-pip for openSUSE:Factory 
checked in at 2016-02-29 09:14:31
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python3-pip (Old)
 and      /work/SRC/openSUSE:Factory/.python3-pip.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python3-pip"

Changes:
--------
--- /work/SRC/openSUSE:Factory/python3-pip/python3-pip.changes  2016-01-26 
10:15:19.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.python3-pip.new/python3-pip.changes     
2016-02-29 09:16:06.000000000 +0100
@@ -1,0 +2,16 @@
+Sat Feb 27 16:34:29 UTC 2016 - a...@gmx.de
+
+- update to version 8.0.3:
+  * Make install --quiet really quiet. See #3418.
+  * Fix a bug when removing packages in python 3: disable INI-style
+    parsing of the entry_point.txt file to allow entry point names
+    with colons (PR #3434)
+  * Normalize generated script files path in RECORD files. (PR #3448)
+  * Fix bug introduced in 8.0.0 where subcommand output was not shown,
+    even when the user specified -v / --verbose. #3486.
+  * Enable python -W with respect to PipDeprecationWarning. (PR #3455)
+  * Upgrade distlib to 0.2.2 (fix #3467):
+  * Improved support for Jython when quoting executables in output
+    scripts.
+
+-------------------------------------------------------------------

Old:
----
  pip-8.0.2.tar.gz

New:
----
  pip-8.0.3.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python3-pip.spec ++++++
--- /var/tmp/diff_new_pack.w62nE7/_old  2016-02-29 09:16:07.000000000 +0100
+++ /var/tmp/diff_new_pack.w62nE7/_new  2016-02-29 09:16:07.000000000 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           python3-pip
-Version:        8.0.2
+Version:        8.0.3
 Release:        0
 Url:            http://www.pip-installer.org
 Summary:        Pip installs packages. Python packages. An easy_install 
replacement

++++++ pip-8.0.2.tar.gz -> pip-8.0.3.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/CHANGES.txt new/pip-8.0.3/CHANGES.txt
--- old/pip-8.0.2/CHANGES.txt   2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/CHANGES.txt   2016-02-25 18:18:32.000000000 +0100
@@ -1,3 +1,22 @@
+**8.0.3 (2016-02-25)**
+
+* Make ``install --quiet`` really quiet. See :issue:`3418`.
+
+* Fix a bug when removing packages in python 3: disable INI-style parsing of 
the
+  entry_point.txt file to allow entry point names with colons (:pull:`3434`)
+
+* Normalize generated script files path in RECORD files. (:pull:`3448`)
+
+* Fix bug introduced in 8.0.0 where subcommand output was not shown,
+  even when the user specified ``-v`` / ``--verbose``. :issue:`3486`.
+
+* Enable python -W with respect to PipDeprecationWarning. (:pull:`3455`)
+
+* Upgrade distlib to 0.2.2 (fix :issue:`3467`):
+
+  * Improved support for Jython when quoting executables in output scripts.
+
+
 **8.0.2 (2016-01-21)**
 
 * Stop attempting to trust the system CA trust store because it's extremely
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/PKG-INFO new/pip-8.0.3/PKG-INFO
--- old/pip-8.0.2/PKG-INFO      2016-01-22 00:49:26.000000000 +0100
+++ new/pip-8.0.3/PKG-INFO      2016-02-25 18:18:39.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: pip
-Version: 8.0.2
+Version: 8.0.3
 Summary: The PyPA recommended tool for installing Python packages.
 Home-page: https://pip.pypa.io/
 Author: The pip developers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/__init__.py 
new/pip-8.0.3/pip/__init__.py
--- old/pip-8.0.2/pip/__init__.py       2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/__init__.py       2016-02-25 18:18:32.000000000 +0100
@@ -30,7 +30,7 @@
 cmdoptions = pip.cmdoptions
 
 # The version as used in the setup.py and the docs conf.py
-__version__ = "8.0.2"
+__version__ = "8.0.3"
 
 
 logger = logging.getLogger(__name__)
@@ -197,10 +197,6 @@
     if args is None:
         args = sys.argv[1:]
 
-    # Enable our Deprecation Warnings
-    for deprecation_warning in deprecation.DEPRECATIONS:
-        warnings.simplefilter("default", deprecation_warning)
-
     # Configure our deprecation warnings to be sent through loggers
     deprecation.install_warning_logger()
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/__init__.py 
new/pip-8.0.3/pip/_vendor/distlib/__init__.py
--- old/pip-8.0.2/pip/_vendor/distlib/__init__.py       2016-01-22 
00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/__init__.py       2016-02-25 
18:18:32.000000000 +0100
@@ -1,12 +1,12 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (C) 2012-2014 Vinay Sajip.
+# Copyright (C) 2012-2016 Vinay Sajip.
 # Licensed to the Python Software Foundation under a contributor agreement.
 # See LICENSE.txt and CONTRIBUTORS.txt.
 #
 import logging
 
-__version__ = '0.2.1'
+__version__ = '0.2.2'
 
 class DistlibException(Exception):
     pass
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/compat.py 
new/pip-8.0.3/pip/_vendor/distlib/compat.py
--- old/pip-8.0.2/pip/_vendor/distlib/compat.py 2016-01-22 00:49:22.000000000 
+0100
+++ new/pip-8.0.3/pip/_vendor/distlib/compat.py 2016-02-25 18:18:32.000000000 
+0100
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (C) 2013-2014 Vinay Sajip.
+# Copyright (C) 2013-2016 Vinay Sajip.
 # Licensed to the Python Software Foundation under a contributor agreement.
 # See LICENSE.txt and CONTRIBUTORS.txt.
 #
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/database.py 
new/pip-8.0.3/pip/_vendor/distlib/database.py
--- old/pip-8.0.2/pip/_vendor/distlib/database.py       2016-01-22 
00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/database.py       2016-02-25 
18:18:32.000000000 +0100
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (C) 2012-2014 The Python Software Foundation.
+# Copyright (C) 2012-2016 The Python Software Foundation.
 # See LICENSE.txt and CONTRIBUTORS.txt.
 #
 """PEP 376 implementation."""
@@ -20,7 +20,7 @@
 from . import DistlibException, resources
 from .compat import StringIO
 from .version import get_scheme, UnsupportedVersionError
-from .metadata import Metadata, METADATA_FILENAME
+from .metadata import Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME
 from .util import (parse_requirement, cached_property, parse_name_and_version,
                    read_exports, write_exports, CSVReader, CSVWriter)
 
@@ -132,13 +132,17 @@
                 if not r or r.path in seen:
                     continue
                 if self._include_dist and entry.endswith(DISTINFO_EXT):
-                    metadata_path = posixpath.join(entry, METADATA_FILENAME)
-                    pydist = finder.find(metadata_path)
-                    if not pydist:
+                    possible_filenames = [METADATA_FILENAME, 
WHEEL_METADATA_FILENAME]
+                    for metadata_filename in possible_filenames:
+                        metadata_path = posixpath.join(entry, 
metadata_filename)
+                        pydist = finder.find(metadata_path)
+                        if pydist:
+                            break
+                    else:
                         continue
 
-                    metadata = Metadata(fileobj=pydist.as_stream(),
-                                        scheme='legacy')
+                    with contextlib.closing(pydist.as_stream()) as stream:
+                        metadata = Metadata(fileobj=stream, scheme='legacy')
                     logger.debug('Found %s', r.path)
                     seen.add(r.path)
                     yield new_dist_class(r.path, metadata=metadata,
@@ -532,6 +536,9 @@
             metadata = env._cache.path[path].metadata
         elif metadata is None:
             r = finder.find(METADATA_FILENAME)
+            # Temporary - for Wheel 0.23 support
+            if r is None:
+                r = finder.find(WHEEL_METADATA_FILENAME)
             # Temporary - for legacy support
             if r is None:
                 r = finder.find('METADATA')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/locators.py 
new/pip-8.0.3/pip/_vendor/distlib/locators.py
--- old/pip-8.0.2/pip/_vendor/distlib/locators.py       2016-01-22 
00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/locators.py       2016-02-25 
18:18:32.000000000 +0100
@@ -14,7 +14,7 @@
 import re
 try:
     import threading
-except ImportError:
+except ImportError:  # pragma: no cover
     import dummy_threading as threading
 import zlib
 
@@ -36,7 +36,7 @@
 HASHER_HASH = re.compile('^(\w+)=([a-f0-9]+)')
 CHARSET = re.compile(r';\s*charset\s*=\s*(.*)\s*$', re.I)
 HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml')
-DEFAULT_INDEX = 'http://python.org/pypi'
+DEFAULT_INDEX = 'https://pypi.python.org/pypi'
 
 def get_all_distribution_names(url=None):
     """
@@ -354,7 +354,7 @@
                         else:
                             logger.debug('skipping pre-release '
                                          'version %s of %s', k, matcher.name)
-                except Exception:
+                except Exception:  # pragma: no cover
                     logger.warning('error matching %s with %r', matcher, k)
                     pass # slist.append(k)
             if len(slist) > 1:
@@ -763,18 +763,18 @@
                             encoding = m.group(1)
                         try:
                             data = data.decode(encoding)
-                        except UnicodeError:
+                        except UnicodeError:  # pragma: no cover
                             data = data.decode('latin-1')    # fallback
                         result = Page(data, final_url)
                         self._page_cache[final_url] = result
                 except HTTPError as e:
                     if e.code != 404:
                         logger.exception('Fetch failed: %s: %s', url, e)
-                except URLError as e:
+                except URLError as e:  # pragma: no cover
                     logger.exception('Fetch failed: %s: %s', url, e)
                     with self._lock:
                         self._bad_hosts.add(host)
-                except Exception as e:
+                except Exception as e:  # pragma: no cover
                     logger.exception('Fetch failed: %s: %s', url, e)
                 finally:
                     self._page_cache[url] = result   # even if None (failure)
@@ -812,7 +812,7 @@
         self.recursive = kwargs.pop('recursive', True)
         super(DirectoryLocator, self).__init__(**kwargs)
         path = os.path.abspath(path)
-        if not os.path.isdir(path):
+        if not os.path.isdir(path):  # pragma: no cover
             raise DistlibException('Not a directory: %r' % path)
         self.base_dir = path
 
@@ -1083,7 +1083,7 @@
         """
         try:
             matcher = self.scheme.matcher(reqt)
-        except UnsupportedVersionError:
+        except UnsupportedVersionError:  # pragma: no cover
             # XXX compat-mode if cannot read the version
             name = reqt.split()[0]
             matcher = self.scheme.matcher(name)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/metadata.py 
new/pip-8.0.3/pip/_vendor/distlib/metadata.py
--- old/pip-8.0.2/pip/_vendor/distlib/metadata.py       2016-01-22 
00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/metadata.py       2016-02-25 
18:18:32.000000000 +0100
@@ -50,7 +50,8 @@
 # to 1.2 once PEP 345 is supported everywhere
 PKG_INFO_PREFERRED_VERSION = '1.1'
 
-_LINE_PREFIX = re.compile('\n       \|')
+_LINE_PREFIX_1_2 = re.compile('\n       \|')
+_LINE_PREFIX_PRE_1_2 = re.compile('\n        ')
 _241_FIELDS = ('Metadata-Version', 'Name', 'Version', 'Platform',
                'Summary', 'Description',
                'Keywords', 'Home-page', 'Author', 'Author-email',
@@ -295,7 +296,10 @@
         return 'UNKNOWN'
 
     def _remove_line_prefix(self, value):
-        return _LINE_PREFIX.sub('\n', value)
+        if self.metadata_version in ('1.0', '1.1'):
+            return _LINE_PREFIX_PRE_1_2.sub('\n', value)
+        else:
+            return _LINE_PREFIX_1_2.sub('\n', value)
 
     def __getattr__(self, name):
         if name in _ATTR2FIELD:
@@ -374,7 +378,10 @@
                 continue
             if field not in _LISTFIELDS:
                 if field == 'Description':
-                    values = values.replace('\n', '\n       |')
+                    if self.metadata_version in ('1.0', '1.1'):
+                        values = values.replace('\n', '\n        ')
+                    else:
+                        values = values.replace('\n', '\n       |')
                 values = [values]
 
             if field in _LISTTUPLEFIELDS:
@@ -548,7 +555,7 @@
             ('description', 'Description'),
             ('keywords', 'Keywords'),
             ('platform', 'Platform'),
-            ('classifier', 'Classifier'),
+            ('classifiers', 'Classifier'),
             ('download_url', 'Download-URL'),
         )
 
@@ -617,6 +624,7 @@
 
 
 METADATA_FILENAME = 'pydist.json'
+WHEEL_METADATA_FILENAME = 'metadata.json'
 
 
 class Metadata(object):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/resources.py 
new/pip-8.0.3/pip/_vendor/distlib/resources.py
--- old/pip-8.0.2/pip/_vendor/distlib/resources.py      2016-01-22 
00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/resources.py      2016-02-25 
18:18:32.000000000 +0100
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (C) 2013 Vinay Sajip.
+# Copyright (C) 2013-2016 Vinay Sajip.
 # Licensed to the Python Software Foundation under a contributor agreement.
 # See LICENSE.txt and CONTRIBUTORS.txt.
 #
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/scripts.py 
new/pip-8.0.3/pip/_vendor/distlib/scripts.py
--- old/pip-8.0.2/pip/_vendor/distlib/scripts.py        2016-01-22 
00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/scripts.py        2016-02-25 
18:18:32.000000000 +0100
@@ -63,6 +63,22 @@
 '''
 
 
+def _enquote_executable(executable):
+    if ' ' in executable:
+        # make sure we quote only the executable in case of env
+        # for example /usr/bin/env "/dir with spaces/bin/jython"
+        # instead of "/usr/bin/env /dir with spaces/bin/jython"
+        # otherwise whole
+        if executable.startswith('/usr/bin/env '):
+            env, _executable = executable.split(' ', 1)
+            if ' ' in _executable and not _executable.startswith('"'):
+                executable = '%s "%s"' % (env, _executable)
+        else:
+            if not executable.startswith('"'):
+                executable = '"%s"' % executable
+    return executable
+
+
 class ScriptMaker(object):
     """
     A class to copy or create scripts from source scripts or callable
@@ -85,8 +101,11 @@
         self.variants = set(('', 'X.Y'))
         self._fileop = fileop or FileOperator(dry_run)
 
+        self._is_nt = os.name == 'nt' or (
+            os.name == 'java' and os._name == 'nt')
+
     def _get_alternate_executable(self, executable, options):
-        if options.get('gui', False) and os.name == 'nt':
+        if options.get('gui', False) and self._is_nt:  # pragma: no cover
             dn, fn = os.path.split(executable)
             fn = fn.replace('python', 'pythonw')
             executable = os.path.join(dn, fn)
@@ -124,10 +143,10 @@
             enquote = False     # assume this will be taken care of
         elif not sysconfig.is_python_build():
             executable = get_executable()
-        elif in_venv():
+        elif in_venv():  # pragma: no cover
             executable = os.path.join(sysconfig.get_path('scripts'),
                             'python%s' % sysconfig.get_config_var('EXE'))
-        else:
+        else:  # pragma: no cover
             executable = os.path.join(
                 sysconfig.get_config_var('BINDIR'),
                'python%s%s' % (sysconfig.get_config_var('VERSION'),
@@ -141,14 +160,14 @@
         executable = os.path.normcase(executable)
         # If the user didn't specify an executable, it may be necessary to
         # cater for executable paths with spaces (not uncommon on Windows)
-        if enquote and ' ' in executable:
-            executable = '"%s"' % executable
+        if enquote:
+            executable = _enquote_executable(executable)
         # Issue #51: don't use fsencode, since we later try to
         # check that the shebang is decodable using utf-8.
         executable = executable.encode('utf-8')
         # in case of IronPython, play safe and enable frames support
         if (sys.platform == 'cli' and '-X:Frames' not in post_interp
-            and '-X:FullFrames' not in post_interp):
+            and '-X:FullFrames' not in post_interp):  # pragma: no cover
             post_interp += b' -X:Frames'
         shebang = b'#!' + executable + post_interp + b'\n'
         # Python parser starts to read a script using UTF-8 until
@@ -158,7 +177,7 @@
         # UTF-8.
         try:
             shebang.decode('utf-8')
-        except UnicodeDecodeError:
+        except UnicodeDecodeError:  # pragma: no cover
             raise ValueError(
                 'The shebang (%r) is not decodable from utf-8' % shebang)
         # If the script is encoded to a custom encoding (use a
@@ -167,7 +186,7 @@
         if encoding != 'utf-8':
             try:
                 shebang.decode(encoding)
-            except UnicodeDecodeError:
+            except UnicodeDecodeError:  # pragma: no cover
                 raise ValueError(
                     'The shebang (%r) is not decodable '
                     'from the script encoding (%r)' % (shebang, encoding))
@@ -184,11 +203,11 @@
         return self.manifest % base
 
     def _write_script(self, names, shebang, script_bytes, filenames, ext):
-        use_launcher = self.add_launchers and os.name == 'nt'
+        use_launcher = self.add_launchers and self._is_nt
         linesep = os.linesep.encode('utf-8')
         if not use_launcher:
             script_bytes = shebang + linesep + script_bytes
-        else:
+        else:  # pragma: no cover
             if ext == 'py':
                 launcher = self._get_launcher('t')
             else:
@@ -200,7 +219,7 @@
             script_bytes = launcher + shebang + linesep + zip_data
         for name in names:
             outname = os.path.join(self.target_dir, name)
-            if use_launcher:
+            if use_launcher:  # pragma: no cover
                 n, e = os.path.splitext(outname)
                 if e.startswith('.py'):
                     outname = n
@@ -223,7 +242,7 @@
                     except Exception:
                         pass    # still in use - ignore error
             else:
-                if os.name == 'nt' and not outname.endswith('.' + ext):
+                if self._is_nt and not outname.endswith('.' + ext):  # pragma: 
no cover
                     outname = '%s.%s' % (outname, ext)
                 if os.path.exists(outname) and not self.clobber:
                     logger.warning('Skipping existing file %s', outname)
@@ -269,15 +288,13 @@
         # script.
         try:
             f = open(script, 'rb')
-        except IOError:
+        except IOError:  # pragma: no cover
             if not self.dry_run:
                 raise
             f = None
         else:
-            encoding, lines = detect_encoding(f.readline)
-            f.seek(0)
             first_line = f.readline()
-            if not first_line:
+            if not first_line:  # pragma: no cover
                 logger.warning('%s: %s is an empty file (skipping)',
                                self.get_command_name(),  script)
                 return
@@ -298,8 +315,10 @@
             logger.info('copying and adjusting %s -> %s', script,
                         self.target_dir)
             if not self._fileop.dry_run:
+                encoding, lines = detect_encoding(f.readline)
+                f.seek(0)
                 shebang = self._get_shebang(encoding, post_interp)
-                if b'pythonw' in first_line:
+                if b'pythonw' in first_line:  # pragma: no cover
                     ext = 'pyw'
                 else:
                     ext = 'py'
@@ -316,7 +335,7 @@
     def dry_run(self, value):
         self._fileop.dry_run = value
 
-    if os.name == 'nt':
+    if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'):  # pragma: 
no cover
         # Executable launcher support.
         # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/util.py 
new/pip-8.0.3/pip/_vendor/distlib/util.py
--- old/pip-8.0.2/pip/_vendor/distlib/util.py   2016-01-22 00:49:22.000000000 
+0100
+++ new/pip-8.0.3/pip/_vendor/distlib/util.py   2016-02-25 18:18:32.000000000 
+0100
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2012-2014 The Python Software Foundation.
+# Copyright (C) 2012-2016 The Python Software Foundation.
 # See LICENSE.txt and CONTRIBUTORS.txt.
 #
 import codecs
@@ -20,6 +20,8 @@
 import sys
 import tarfile
 import tempfile
+import textwrap
+
 try:
     import threading
 except ImportError:
@@ -28,8 +30,8 @@
 
 from . import DistlibException
 from .compat import (string_types, text_type, shutil, raw_input, StringIO,
-                     cache_from_source, urlopen, httplib, xmlrpclib, splittype,
-                     HTTPHandler, HTTPSHandler as BaseHTTPSHandler,
+                     cache_from_source, urlopen, urljoin, httplib, xmlrpclib,
+                     splittype, HTTPHandler, HTTPSHandler as BaseHTTPSHandler,
                      BaseConfigurator, valid_ident, Container, configparser,
                      URLError, match_hostname, CertificateError, ZipFile)
 
@@ -199,8 +201,8 @@
     data = stream.read()
     stream = StringIO(data)
     try:
-        data = json.load(stream)
-        result = data['extensions']['python.exports']['exports']
+        jdata = json.load(stream)
+        result = jdata['extensions']['python.exports']['exports']
         for group, entries in result.items():
             for k, v in entries.items():
                 s = '%s = %s' % (k, v)
@@ -210,11 +212,22 @@
         return result
     except Exception:
         stream.seek(0, 0)
+
+    def read_stream(cp, stream):
+        if hasattr(cp, 'read_file'):
+            cp.read_file(stream)
+        else:
+            cp.readfp(stream)
+
     cp = configparser.ConfigParser()
-    if hasattr(cp, 'read_file'):
-        cp.read_file(stream)
-    else:
-        cp.readfp(stream)
+    try:
+        read_stream(cp, stream)
+    except configparser.MissingSectionHeaderError:
+        stream.close()
+        data = textwrap.dedent(data)
+        stream = StringIO(data)
+        read_stream(cp, stream)
+
     result = {}
     for key in cp.sections():
         result[key] = entries = {}
@@ -758,16 +771,17 @@
         logger.exception('Failed to get external data for %s: %s', url, e)
     return result
 
+_external_data_base_url = 'https://www.red-dove.com/pypi/projects/'
 
 def get_project_data(name):
-    url = ('https://www.red-dove.com/pypi/projects/'
-           '%s/%s/project.json' % (name[0].upper(), name))
+    url = '%s/%s/project.json' % (name[0].upper(), name)
+    url = urljoin(_external_data_base_url, url)
     result = _get_external_data(url)
     return result
 
 def get_package_data(name, version):
-    url = ('https://www.red-dove.com/pypi/projects/'
-           '%s/%s/package-%s.json' % (name[0].upper(), name, version))
+    url = '%s/%s/package-%s.json' % (name[0].upper(), name, version)
+    url = urljoin(_external_data_base_url, url)
     return _get_external_data(url)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/version.py 
new/pip-8.0.3/pip/_vendor/distlib/version.py
--- old/pip-8.0.2/pip/_vendor/distlib/version.py        2016-01-22 
00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/_vendor/distlib/version.py        2016-02-25 
18:18:32.000000000 +0100
@@ -1,11 +1,11 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (C) 2012-2014 The Python Software Foundation.
+# Copyright (C) 2012-2016 The Python Software Foundation.
 # See LICENSE.txt and CONTRIBUTORS.txt.
 #
 """
-Implementation of a flexible versioning scheme providing support for PEP-386,
-distribute-compatible and semantic versioning.
+Implementation of a flexible versioning scheme providing support for PEP-440,
+setuptools-compatible and semantic versioning.
 """
 
 import logging
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/distlib/wheel.py 
new/pip-8.0.3/pip/_vendor/distlib/wheel.py
--- old/pip-8.0.2/pip/_vendor/distlib/wheel.py  2016-01-22 00:49:22.000000000 
+0100
+++ new/pip-8.0.3/pip/_vendor/distlib/wheel.py  2016-02-25 18:18:32.000000000 
+0100
@@ -1,6 +1,6 @@
 # -*- coding: utf-8 -*-
 #
-# Copyright (C) 2013-2014 Vinay Sajip.
+# Copyright (C) 2013-2016 Vinay Sajip.
 # Licensed to the Python Software Foundation under a contributor agreement.
 # See LICENSE.txt and CONTRIBUTORS.txt.
 #
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/_vendor/vendor.txt 
new/pip-8.0.3/pip/_vendor/vendor.txt
--- old/pip-8.0.2/pip/_vendor/vendor.txt        2016-01-22 00:49:22.000000000 
+0100
+++ new/pip-8.0.3/pip/_vendor/vendor.txt        2016-02-25 18:18:32.000000000 
+0100
@@ -1,4 +1,4 @@
-distlib==0.2.1
+distlib==0.2.2
 html5lib==1.0b8
 six==1.10.0
 colorama==0.3.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/index.py new/pip-8.0.3/pip/index.py
--- old/pip-8.0.2/pip/index.py  2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/index.py  2016-02-25 18:18:32.000000000 +0100
@@ -19,7 +19,7 @@
 from pip.utils import (
     cached_property, splitext, normalize_path,
     ARCHIVE_EXTENSIONS, SUPPORTED_EXTENSIONS, canonicalize_name)
-from pip.utils.deprecation import RemovedInPip9Warning
+from pip.utils.deprecation import RemovedInPip9Warning, RemovedInPip10Warning
 from pip.utils.logging import indent_log
 from pip.exceptions import (
     DistributionNotFound, BestVersionAlreadyInstalled, InvalidWheelFilename,
@@ -1019,7 +1019,7 @@
     fmt_ctl_no_binary(fmt_ctl)
     warnings.warn(
         '--no-use-wheel is deprecated and will be removed in the future. '
-        ' Please use --no-binary :all: instead.', DeprecationWarning,
+        ' Please use --no-binary :all: instead.', RemovedInPip10Warning,
         stacklevel=2)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/req/req_install.py 
new/pip-8.0.3/pip/req/req_install.py
--- old/pip-8.0.2/pip/req/req_install.py        2016-01-22 00:49:22.000000000 
+0100
+++ new/pip-8.0.3/pip/req/req_install.py        2016-02-25 18:18:32.000000000 
+0100
@@ -727,7 +727,11 @@
 
         # find console_scripts
         if dist.has_metadata('entry_points.txt'):
-            config = configparser.SafeConfigParser()
+            if six.PY2:
+                options = {}
+            else:
+                options = {"delimiters": ('=', )}
+            config = configparser.SafeConfigParser(**options)
             config.readfp(
                 FakeFile(dist.get_metadata_lines('entry_points.txt'))
             )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/utils/__init__.py 
new/pip-8.0.3/pip/utils/__init__.py
--- old/pip-8.0.2/pip/utils/__init__.py 2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/utils/__init__.py 2016-02-25 18:18:32.000000000 +0100
@@ -635,6 +635,31 @@
                     on_returncode='raise',
                     command_level=std_logging.DEBUG, command_desc=None,
                     extra_environ=None, spinner=None):
+    # This function's handling of subprocess output is confusing and I
+    # previously broke it terribly, so as penance I will write a long comment
+    # explaining things.
+    #
+    # The obvious thing that affects output is the show_stdout=
+    # kwarg. show_stdout=True means, let the subprocess write directly to our
+    # stdout. Even though it is nominally the default, it is almost never used
+    # inside pip (and should not be used in new code without a very good
+    # reason); as of 2016-02-22 it is only used in a few places inside the VCS
+    # wrapper code. Ideally we should get rid of it entirely, because it
+    # creates a lot of complexity here for a rarely used feature.
+    #
+    # Most places in pip set show_stdout=False. What this means is:
+    # - We connect the child stdout to a pipe, which we read.
+    # - By default, we hide the output but show a spinner -- unless the
+    #   subprocess exits with an error, in which case we show the output.
+    # - If the --verbose option was passed (= loglevel is DEBUG), then we show
+    #   the output unconditionally. (But in this case we don't want to show
+    #   the output a second time if it turns out that there was an error.)
+    #
+    # stderr is always merged with stdout (even if show_stdout=True).
+    if show_stdout:
+        stdout = None
+    else:
+        stdout = subprocess.PIPE
     if command_desc is None:
         cmd_parts = []
         for part in cmd:
@@ -648,24 +673,28 @@
         env.update(extra_environ)
     try:
         proc = subprocess.Popen(
-            cmd, stderr=subprocess.STDOUT, stdin=None, stdout=subprocess.PIPE,
+            cmd, stderr=subprocess.STDOUT, stdin=None, stdout=stdout,
             cwd=cwd, env=env)
     except Exception as exc:
         logger.critical(
             "Error %s while executing command %s", exc, command_desc,
         )
         raise
-    all_output = []
-    while True:
-        line = console_to_str(proc.stdout.readline())
-        if not line:
-            break
-        line = line.rstrip()
-        all_output.append(line + '\n')
-        if show_stdout:
-            logger.debug(line)
-        if spinner is not None:
-            spinner.spin()
+    if stdout is not None:
+        all_output = []
+        while True:
+            line = console_to_str(proc.stdout.readline())
+            if not line:
+                break
+            line = line.rstrip()
+            all_output.append(line + '\n')
+            if logger.getEffectiveLevel() <= std_logging.DEBUG:
+                # Show the line immediately
+                logger.debug(line)
+            else:
+                # Update the spinner
+                if spinner is not None:
+                    spinner.spin()
     proc.wait()
     if spinner is not None:
         if proc.returncode:
@@ -674,7 +703,7 @@
             spinner.finish("done")
     if proc.returncode:
         if on_returncode == 'raise':
-            if all_output:
+            if logger.getEffectiveLevel() > std_logging.DEBUG:
                 logger.info(
                     'Complete output from command %s:', command_desc,
                 )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/utils/deprecation.py 
new/pip-8.0.3/pip/utils/deprecation.py
--- old/pip-8.0.2/pip/utils/deprecation.py      2016-01-22 00:49:22.000000000 
+0100
+++ new/pip-8.0.3/pip/utils/deprecation.py      2016-02-25 18:18:32.000000000 
+0100
@@ -11,23 +11,20 @@
     pass
 
 
-class RemovedInPip9Warning(PipDeprecationWarning, DeprecationWarning):
+class Pending(object):
     pass
 
 
-class RemovedInPip10Warning(PipDeprecationWarning, PendingDeprecationWarning):
+class RemovedInPip9Warning(PipDeprecationWarning):
     pass
 
 
-class Python26DeprecationWarning(
-    PipDeprecationWarning, PendingDeprecationWarning
-):
+class RemovedInPip10Warning(PipDeprecationWarning, Pending):
     pass
 
 
-DEPRECATIONS = [
-    RemovedInPip9Warning, RemovedInPip10Warning, Python26DeprecationWarning
-]
+class Python26DeprecationWarning(PipDeprecationWarning, Pending):
+    pass
 
 
 # Warnings <-> Logging Integration
@@ -53,15 +50,15 @@
             # want it to appear as if someone typed this entire message out.
             log_message = "DEPRECATION: %s" % message
 
-            # Things that are DeprecationWarnings will be removed in the very
-            # next version of pip. We want these to be more obvious so we
-            # use the ERROR logging level while the PendingDeprecationWarnings
-            # are still have at least 2 versions to go until they are removed
-            # so they can just be warnings.
-            if issubclass(category, DeprecationWarning):
-                logger.error(log_message)
-            else:
+            # PipDeprecationWarnings that are Pending still have at least 2
+            # versions to go until they are removed so they can just be
+            # warnings.  Otherwise, they will be removed in the very next
+            # version of pip. We want these to be more obvious so we use the
+            # ERROR logging level.
+            if issubclass(category, Pending):
                 logger.warning(log_message)
+            else:
+                logger.error(log_message)
         else:
             _warnings_showwarning(
                 message, category, filename, lineno, file, line,
@@ -69,6 +66,9 @@
 
 
 def install_warning_logger():
+    # Enable our Deprecation Warnings
+    warnings.simplefilter("default", PipDeprecationWarning, append=True)
+
     global _warnings_showwarning
 
     if _warnings_showwarning is None:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/utils/ui.py 
new/pip-8.0.3/pip/utils/ui.py
--- old/pip-8.0.2/pip/utils/ui.py       2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/utils/ui.py       2016-02-25 18:18:32.000000000 +0100
@@ -219,6 +219,11 @@
     # even via colorama. So don't even try.
     if WINDOWS:
         yield
+    # We don't want to clutter the output with control characters if we're
+    # writing to a file, or if the user is running with --quiet.
+    # See https://github.com/pypa/pip/issues/3418
+    elif not file.isatty() or logger.getEffectiveLevel() > logging.INFO:
+        yield
     else:
         file.write(HIDE_CURSOR)
         try:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip/wheel.py new/pip-8.0.3/pip/wheel.py
--- old/pip-8.0.2/pip/wheel.py  2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/pip/wheel.py  2016-02-25 18:18:32.000000000 +0100
@@ -519,7 +519,7 @@
                 writer.writerow(row)
             for f in generated:
                 h, l = rehash(f)
-                writer.writerow((f, h, l))
+                writer.writerow((normpath(f, lib_dir), h, l))
             for f in installed:
                 writer.writerow((installed[f], '', ''))
     shutil.move(temp_record, record)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip.egg-info/PKG-INFO 
new/pip-8.0.3/pip.egg-info/PKG-INFO
--- old/pip-8.0.2/pip.egg-info/PKG-INFO 2016-01-22 00:49:24.000000000 +0100
+++ new/pip-8.0.3/pip.egg-info/PKG-INFO 2016-02-25 18:18:37.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 1.1
 Name: pip
-Version: 8.0.2
+Version: 8.0.3
 Summary: The PyPA recommended tool for installing Python packages.
 Home-page: https://pip.pypa.io/
 Author: The pip developers
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/pip.egg-info/requires.txt 
new/pip-8.0.3/pip.egg-info/requires.txt
--- old/pip-8.0.2/pip.egg-info/requires.txt     2016-01-22 00:49:24.000000000 
+0100
+++ new/pip-8.0.3/pip.egg-info/requires.txt     2016-02-25 18:18:37.000000000 
+0100
@@ -4,3 +4,4 @@
 virtualenv>=1.10
 scripttest>=1.3
 mock
+pretend
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/setup.cfg new/pip-8.0.3/setup.cfg
--- old/pip-8.0.2/setup.cfg     2016-01-22 00:49:26.000000000 +0100
+++ new/pip-8.0.3/setup.cfg     2016-02-25 18:18:39.000000000 +0100
@@ -5,7 +5,7 @@
 universal = 1
 
 [egg_info]
-tag_date = 0
-tag_build = 
 tag_svn_revision = 0
+tag_build = 
+tag_date = 0
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/pip-8.0.2/setup.py new/pip-8.0.3/setup.py
--- old/pip-8.0.2/setup.py      2016-01-22 00:49:22.000000000 +0100
+++ new/pip-8.0.3/setup.py      2016-02-25 18:18:32.000000000 +0100
@@ -41,7 +41,8 @@
 
 long_description = read('README.rst')
 
-tests_require = ['pytest', 'virtualenv>=1.10', 'scripttest>=1.3', 'mock']
+tests_require = ['pytest', 'virtualenv>=1.10', 'scripttest>=1.3', 'mock',
+                 'pretend']
 
 
 setup(


Reply via email to