Commit 077c9564 authored by Antoine Pitrou's avatar Antoine Pitrou

Issue #21722: The distutils "upload" command now exits with a non-zero return...

Issue #21722: The distutils "upload" command now exits with a non-zero return code when uploading fails.
Patch by Martin Dengler.
parent fa3b9cc7
......@@ -10,7 +10,7 @@ import urlparse
import cStringIO as StringIO
from hashlib import md5
from distutils.errors import DistutilsOptionError
from distutils.errors import DistutilsError, DistutilsOptionError
from distutils.core import PyPIRCCommand
from distutils.spawn import spawn
from distutils import log
......@@ -181,7 +181,7 @@ class upload(PyPIRCCommand):
self.announce(msg, log.INFO)
except socket.error, e:
self.announce(str(e), log.ERROR)
return
raise
except HTTPError, e:
status = e.code
reason = e.msg
......@@ -190,5 +190,6 @@ class upload(PyPIRCCommand):
self.announce('Server response (%s): %s' % (status, reason),
log.INFO)
else:
self.announce('Upload failed (%s): %s' % (status, reason),
log.ERROR)
msg = 'Upload failed (%s): %s' % (status, reason)
self.announce(msg, log.ERROR)
raise DistutilsError(msg)
......@@ -7,6 +7,7 @@ from test.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.errors import DistutilsError
from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase
......@@ -41,16 +42,17 @@ username:me
class FakeOpen(object):
def __init__(self, url):
def __init__(self, url, msg=None, code=None):
self.url = url
if not isinstance(url, str):
self.req = url
else:
self.req = None
self.msg = 'OK'
self.msg = msg or 'OK'
self.code = code or 200
def getcode(self):
return 200
return self.code
class uploadTestCase(PyPIRCCommandTestCase):
......@@ -60,13 +62,15 @@ class uploadTestCase(PyPIRCCommandTestCase):
self.old_open = upload_mod.urlopen
upload_mod.urlopen = self._urlopen
self.last_open = None
self.next_msg = None
self.next_code = None
def tearDown(self):
upload_mod.urlopen = self.old_open
super(uploadTestCase, self).tearDown()
def _urlopen(self, url):
self.last_open = FakeOpen(url)
self.last_open = FakeOpen(url, msg=self.next_msg, code=self.next_code)
return self.last_open
def test_finalize_options(self):
......@@ -124,6 +128,11 @@ class uploadTestCase(PyPIRCCommandTestCase):
auth = self.last_open.req.headers['Authorization']
self.assertNotIn('\n', auth)
def test_upload_fails(self):
self.next_msg = "Not Found"
self.next_code = 404
self.assertRaises(DistutilsError, self.test_upload)
def test_suite():
return unittest.makeSuite(uploadTestCase)
......
......@@ -306,6 +306,7 @@ Vincent Delft
Arnaud Delobelle
Konrad Delong
Erik Demaine
Martin Dengler
John Dennis
L. Peter Deutsch
Roger Dev
......
......@@ -29,6 +29,9 @@ Core and Builtins
Library
-------
- Issue #21722: The distutils "upload" command now exits with a non-zero
return code when uploading fails. Patch by Martin Dengler.
- Issue #21766: Prevent a security hole in CGIHTTPServer by URL unquoting paths
before checking for a CGI script at that path.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment