diff -r 4a48450f2505 Lib/distutils/command/upload.py --- a/Lib/distutils/command/upload.py Sat Jun 14 20:41:22 2014 -0700 +++ b/Lib/distutils/command/upload.py Mon Jun 16 12:07:44 2014 +0300 @@ -182,12 +182,12 @@ result = urlopen(request) status = result.getcode() reason = result.msg + except HTTPError as e: + status = e.code + reason = e.msg except OSError as e: self.announce(str(e), log.ERROR) return - except HTTPError as e: - status = e.code - reason = e.msg if status == 200: self.announce('Server response (%s): %s' % (status, reason), @@ -195,6 +195,7 @@ else: self.announce('Upload failed (%s): %s' % (status, reason), log.ERROR) + return if self.show_response: text = self._read_pypi_response(result) msg = '\n'.join(('-' * 75, text, '-' * 75)) diff -r 4a48450f2505 Lib/distutils/tests/test_upload.py --- a/Lib/distutils/tests/test_upload.py Sat Jun 14 20:41:22 2014 -0700 +++ b/Lib/distutils/tests/test_upload.py Mon Jun 16 12:07:44 2014 +0300 @@ -1,12 +1,14 @@ """Tests for distutils.command.upload.""" import os import unittest +from unittest.mock import Mock, patch +from urllib.request import HTTPError from test.support import run_unittest from distutils.command import upload as upload_mod from distutils.command.upload import upload from distutils.core import Distribution -from distutils.log import INFO +from distutils.log import INFO, ERROR from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase @@ -135,6 +137,36 @@ results = self.get_logs(INFO) self.assertIn('xyzzy\n', results[-1]) + def test_wrong_exception_order(self): + class CustomHTTPError(HTTPError): + def __str__(self): + return 'unexpected http error' + + tmp = self.mkdtemp() + path = os.path.join(tmp, 'xxx') + self.write_file(path) + command, pyversion, filename = 'xxx', '2.6', path + dist_files = [(command, pyversion, filename)] + self.write_file(self.rc, PYPIRC_LONG_PASSWORD) + + # lets run it + pkg_dir, dist = self.create_dist(dist_files=dist_files) + errors = ( + (OSError('oserror'), 'oserror'), + (CustomHTTPError("url", 400, "httperror", {}, None), + 'Upload failed (400): httperror') + ) + for mock, expected in errors: + with patch('distutils.command.upload.urlopen', + new=Mock(side_effect=mock)): + cmd = upload(dist) + cmd.show_response = 1 + cmd.ensure_finalized() + cmd.run() + results = self.get_logs(ERROR) + self.assertIn(expected, results[-1]) + self.clear_logs() + def test_suite(): return unittest.makeSuite(uploadTestCase)