mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	Issue #21722: The distutils "upload" command now exits with a non-zero return code when uploading fails.
Patch by Martin Dengler.
This commit is contained in:
		
						commit
						41dcf35c26
					
				
					 4 changed files with 21 additions and 8 deletions
				
			
		|  | @ -12,7 +12,7 @@ | |||
| from base64 import standard_b64encode | ||||
| from urllib.request import urlopen, Request, HTTPError | ||||
| from urllib.parse import urlparse | ||||
| 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 | ||||
|  | @ -184,7 +184,7 @@ def upload_file(self, command, pyversion, filename): | |||
|             reason = result.msg | ||||
|         except OSError as e: | ||||
|             self.announce(str(e), log.ERROR) | ||||
|             return | ||||
|             raise | ||||
|         except HTTPError as e: | ||||
|             status = e.code | ||||
|             reason = e.msg | ||||
|  | @ -193,8 +193,9 @@ def upload_file(self, command, pyversion, filename): | |||
|             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) | ||||
|         if self.show_response: | ||||
|             text = self._read_pypi_response(result) | ||||
|             msg = '\n'.join(('-' * 75, text, '-' * 75)) | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ | |||
| 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.log import INFO | ||||
| 
 | ||||
| from distutils.tests.test_config import PYPIRC, PyPIRCCommandTestCase | ||||
|  | @ -41,13 +42,14 @@ | |||
| 
 | ||||
| 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 getheader(self, name, default=None): | ||||
|         return { | ||||
|  | @ -58,7 +60,7 @@ def read(self): | |||
|         return b'xyzzy' | ||||
| 
 | ||||
|     def getcode(self): | ||||
|         return 200 | ||||
|         return self.code | ||||
| 
 | ||||
| 
 | ||||
| class uploadTestCase(PyPIRCCommandTestCase): | ||||
|  | @ -68,13 +70,15 @@ def setUp(self): | |||
|         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): | ||||
|  | @ -135,6 +139,10 @@ def test_upload(self): | |||
|         results = self.get_logs(INFO) | ||||
|         self.assertIn('xyzzy\n', results[-1]) | ||||
| 
 | ||||
|     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) | ||||
|  |  | |||
|  | @ -309,6 +309,7 @@ Vincent Delft | |||
| Arnaud Delobelle | ||||
| Konrad Delong | ||||
| Erik Demaine | ||||
| Martin Dengler | ||||
| John Dennis | ||||
| L. Peter Deutsch | ||||
| Roger Dev | ||||
|  |  | |||
|  | @ -103,6 +103,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 #21723: asyncio.Queue: support any type of number (ex: float) for the | ||||
|   maximum size. Patch written by Vajrasky Kok. | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Antoine Pitrou
						Antoine Pitrou