]> granicus.if.org Git - python/commitdiff
Issue #21722: The distutils "upload" command now exits with a non-zero return code...
authorAntoine Pitrou <solipsis@pitrou.net>
Thu, 19 Jun 2014 03:07:46 +0000 (23:07 -0400)
committerAntoine Pitrou <solipsis@pitrou.net>
Thu, 19 Jun 2014 03:07:46 +0000 (23:07 -0400)
Patch by Martin Dengler.

Lib/distutils/command/upload.py
Lib/distutils/tests/test_upload.py
Misc/ACKS
Misc/NEWS

index c43607f42282545765cb4f5e8d92ce97accbce56..9aa54eee5ebf740cafd91fbd8f9d2edc8e1fd728 100644 (file)
@@ -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)
index 8b8262e1f34e96fab5d53fb45137444d65d9875b..17735d3974450e5020c6568033c1a2ad3841e9f9 100644 (file)
@@ -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)
 
index fc32f89f47d76caf2cd66288e9eebf2666446532..eac94583eec07f955b132cb39893228809998594 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -306,6 +306,7 @@ Vincent Delft
 Arnaud Delobelle
 Konrad Delong
 Erik Demaine
+Martin Dengler
 John Dennis
 L. Peter Deutsch
 Roger Dev
index f0b97b47e58bfa15a32ee78514dcb9ac050238aa..9ce00018a4925845930f462daa67b0ef8645c56d 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -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.