NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

upload.py (5989B)


      1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\distutils\command\upload.py
      2 import os
      3 import socket
      4 import platform
      5 from urllib2 import urlopen, Request, HTTPError
      6 from base64 import standard_b64encode
      7 import urlparse
      8 import cStringIO as StringIO
      9 from hashlib import md5
     10 from distutils.errors import DistutilsOptionError
     11 from distutils.core import PyPIRCCommand
     12 from distutils.spawn import spawn
     13 from distutils import log
     14 
     15 class upload(PyPIRCCommand):
     16     description = 'upload binary package to PyPI'
     17     user_options = PyPIRCCommand.user_options + [('sign', 's', 'sign files to upload using gpg'), ('identity=', 'i', 'GPG identity used to sign files')]
     18     boolean_options = PyPIRCCommand.boolean_options + ['sign']
     19 
     20     def initialize_options(self):
     21         PyPIRCCommand.initialize_options(self)
     22         self.username = ''
     23         self.password = ''
     24         self.show_response = 0
     25         self.sign = False
     26         self.identity = None
     27 
     28     def finalize_options(self):
     29         PyPIRCCommand.finalize_options(self)
     30         if self.identity and not self.sign:
     31             raise DistutilsOptionError('Must use --sign for --identity to have meaning')
     32         config = self._read_pypirc()
     33         if config != {}:
     34             self.username = config['username']
     35             self.password = config['password']
     36             self.repository = config['repository']
     37             self.realm = config['realm']
     38         if not self.password and self.distribution.password:
     39             self.password = self.distribution.password
     40 
     41     def run(self):
     42         if not self.distribution.dist_files:
     43             raise DistutilsOptionError('No dist file created in earlier command')
     44         for command, pyversion, filename in self.distribution.dist_files:
     45             self.upload_file(command, pyversion, filename)
     46 
     47     def upload_file(self, command, pyversion, filename):
     48         schema, netloc, url, params, query, fragments = urlparse.urlparse(self.repository)
     49         if params or query or fragments:
     50             raise AssertionError('Incompatible url %s' % self.repository)
     51         if schema not in ('http', 'https'):
     52             raise AssertionError('unsupported schema ' + schema)
     53         if self.sign:
     54             gpg_args = ['gpg',
     55              '--detach-sign',
     56              '-a',
     57              filename]
     58             if self.identity:
     59                 gpg_args[2:2] = ['--local-user', self.identity]
     60             spawn(gpg_args, dry_run=self.dry_run)
     61         f = open(filename, 'rb')
     62         try:
     63             content = f.read()
     64         finally:
     65             f.close()
     66 
     67         meta = self.distribution.metadata
     68         data = {':action': 'file_upload',
     69          'protcol_version': '1',
     70          'name': meta.get_name(),
     71          'version': meta.get_version(),
     72          'content': (os.path.basename(filename), content),
     73          'filetype': command,
     74          'pyversion': pyversion,
     75          'md5_digest': md5(content).hexdigest(),
     76          'metadata_version': '1.0',
     77          'summary': meta.get_description(),
     78          'home_page': meta.get_url(),
     79          'author': meta.get_contact(),
     80          'author_email': meta.get_contact_email(),
     81          'license': meta.get_licence(),
     82          'description': meta.get_long_description(),
     83          'keywords': meta.get_keywords(),
     84          'platform': meta.get_platforms(),
     85          'classifiers': meta.get_classifiers(),
     86          'download_url': meta.get_download_url(),
     87          'provides': meta.get_provides(),
     88          'requires': meta.get_requires(),
     89          'obsoletes': meta.get_obsoletes()}
     90         comment = ''
     91         if command == 'bdist_rpm':
     92             dist, version, id = platform.dist()
     93             if dist:
     94                 comment = 'built for %s %s' % (dist, version)
     95         elif command == 'bdist_dumb':
     96             comment = 'built for %s' % platform.platform(terse=1)
     97         data['comment'] = comment
     98         if self.sign:
     99             data['gpg_signature'] = (os.path.basename(filename) + '.asc', open(filename + '.asc').read())
    100         auth = 'Basic ' + standard_b64encode(self.username + ':' + self.password)
    101         boundary = '--------------GHSKFJDLGDS7543FJKLFHRE75642756743254'
    102         sep_boundary = '\n--' + boundary
    103         end_boundary = sep_boundary + '--'
    104         body = StringIO.StringIO()
    105         for key, value in data.items():
    106             if not isinstance(value, list):
    107                 value = [value]
    108             for value in value:
    109                 if isinstance(value, tuple):
    110                     fn = ';filename="%s"' % value[0]
    111                     value = value[1]
    112                 else:
    113                     fn = ''
    114                 body.write(sep_boundary)
    115                 body.write('\nContent-Disposition: form-data; name="%s"' % key)
    116                 body.write(fn)
    117                 body.write('\n\n')
    118                 body.write(value)
    119                 if value and value[-1] == '\r':
    120                     body.write('\n')
    121 
    122         body.write(end_boundary)
    123         body.write('\n')
    124         body = body.getvalue()
    125         self.announce('Submitting %s to %s' % (filename, self.repository), log.INFO)
    126         headers = {'Content-type': 'multipart/form-data; boundary=%s' % boundary,
    127          'Content-length': str(len(body)),
    128          'Authorization': auth}
    129         request = Request(self.repository, data=body, headers=headers)
    130         try:
    131             result = urlopen(request)
    132             status = result.getcode()
    133             reason = result.msg
    134         except socket.error as e:
    135             self.announce(str(e), log.ERROR)
    136             return
    137         except HTTPError as e:
    138             status = e.code
    139             reason = e.msg
    140 
    141         if status == 200:
    142             self.announce('Server response (%s): %s' % (status, reason), log.INFO)
    143         else:
    144             self.announce('Upload failed (%s): %s' % (status, reason), log.ERROR)
    145         if self.show_response:
    146             msg = '\n'.join(('-' * 75, r.read(), '-' * 75))
    147             self.announce(msg, log.INFO)