]>
Raphaƫl G. Git Repositories - youtubedl/blob - devscripts/create-github-release.py
428111b3f0e893d9ae53da648844833e87dd72b3
   2 from __future__ 
import unicode_literals
 
  14 sys
.path
.insert(0, os
.path
.dirname(os
.path
.dirname(os
.path
.abspath(__file__
)))) 
  16 from youtube_dl
.compat 
import ( 
  21     compat_urllib_request
, 
  23 from youtube_dl
.utils 
import ( 
  29 class GitHubReleaser(object): 
  30     _API_URL 
= 'https://api.github.com/repos/ytdl-org/youtube-dl/releases' 
  31     _UPLOADS_URL 
= 'https://uploads.github.com/repos/ytdl-org/youtube-dl/releases/%s/assets?name=%s' 
  32     _NETRC_MACHINE 
= 'github.com' 
  34     def __init__(self
, debuglevel
=0): 
  35         self
._init
_github
_account
() 
  36         https_handler 
= make_HTTPS_handler({}, debuglevel
=debuglevel
) 
  37         self
._opener 
= compat_urllib_request
.build_opener(https_handler
) 
  39     def _init_github_account(self
): 
  41             info 
= netrc
.netrc().authenticators(self
._NETRC
_MACHINE
) 
  43                 self
._username 
= info
[0] 
  44                 self
._password 
= info
[2] 
  45                 compat_print('Using GitHub credentials found in .netrc...') 
  48                 compat_print('No GitHub credentials found in .netrc') 
  49         except (IOError, netrc
.NetrcParseError
): 
  50             compat_print('Unable to parse .netrc') 
  51         self
._username 
= compat_input( 
  52             'Type your GitHub username or email address and press [Return]: ') 
  53         self
._password 
= compat_getpass( 
  54             'Type your GitHub password and press [Return]: ') 
  57         if isinstance(req
, compat_basestring
): 
  58             req 
= sanitized_Request(req
) 
  59         # Authorizing manually since GitHub does not response with 401 with 
  60         # WWW-Authenticate header set (see 
  61         # https://developer.github.com/v3/#basic-authentication) 
  62         b64 
= base64
.b64encode( 
  63             ('%s:%s' % (self
._username
, self
._password
)).encode('utf-8')).decode('ascii') 
  64         req
.add_header('Authorization', 'Basic %s' % b64
) 
  65         response 
= self
._opener
.open(req
).read().decode('utf-8') 
  66         return json
.loads(response
) 
  68     def list_releases(self
): 
  69         return self
._call
(self
._API
_URL
) 
  71     def create_release(self
, tag_name
, name
=None, body
='', draft
=False, prerelease
=False): 
  74             'target_commitish': 'master', 
  78             'prerelease': prerelease
, 
  80         req 
= sanitized_Request(self
._API
_URL
, json
.dumps(data
).encode('utf-8')) 
  81         return self
._call
(req
) 
  83     def create_asset(self
, release_id
, asset
): 
  84         asset_name 
= os
.path
.basename(asset
) 
  85         url 
= self
._UPLOADS
_URL 
% (release_id
, asset_name
) 
  86         # Our files are small enough to be loaded directly into memory. 
  87         data 
= open(asset
, 'rb').read() 
  88         req 
= sanitized_Request(url
, data
) 
  89         mime_type
, _ 
= mimetypes
.guess_type(asset_name
) 
  90         req
.add_header('Content-Type', mime_type 
or 'application/octet-stream') 
  91         return self
._call
(req
) 
  95     parser 
= optparse
.OptionParser(usage
='%prog CHANGELOG VERSION BUILDPATH') 
  96     options
, args 
= parser
.parse_args() 
  98         parser
.error('Expected a version and a build directory') 
 100     changelog_file
, version
, build_path 
= args
 
 102     with io
.open(changelog_file
, encoding
='utf-8') as inf
: 
 103         changelog 
= inf
.read() 
 105     mobj 
= re
.search(r
'(?s)version %s\n{2}(.+?)\n{3}' % version
, changelog
) 
 106     body 
= mobj
.group(1) if mobj 
else '' 
 108     releaser 
= GitHubReleaser() 
 110     new_release 
= releaser
.create_release( 
 111         version
, name
='youtube-dl %s' % version
, body
=body
) 
 112     release_id 
= new_release
['id'] 
 114     for asset 
in os
.listdir(build_path
): 
 115         compat_print('Uploading %s...' % asset
) 
 116         releaser
.create_asset(release_id
, os
.path
.join(build_path
, asset
)) 
 119 if __name__ 
== '__main__':