Browse Source
[devscripts/create-github-release] Add script for releasing on GitHub
[devscripts/create-github-release] Add script for releasing on GitHub
Yet only Basic authentication is supported either via .netrc or by manual inputmaster
No known key found for this signature in database
GPG Key ID: 2C393E0F18A9236D
1 changed files with 112 additions and 0 deletions
Split View
Diff Options
@ -0,0 +1,112 @@ |
|||
#!/usr/bin/env python |
|||
from __future__ import unicode_literals |
|||
|
|||
import base64 |
|||
import json |
|||
import mimetypes |
|||
import netrc |
|||
import optparse |
|||
import os |
|||
import sys |
|||
|
|||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) |
|||
|
|||
from youtube_dl.compat import ( |
|||
compat_basestring, |
|||
compat_input, |
|||
compat_getpass, |
|||
compat_print, |
|||
compat_urllib_request, |
|||
) |
|||
from youtube_dl.utils import ( |
|||
make_HTTPS_handler, |
|||
sanitized_Request, |
|||
) |
|||
|
|||
|
|||
class GitHubReleaser(object): |
|||
_API_URL = 'https://api.github.com/repos/rg3/youtube-dl/releases' |
|||
_UPLOADS_URL = 'https://uploads.github.com/repos/rg3/youtube-dl/releases/%s/assets?name=%s' |
|||
_NETRC_MACHINE = 'github.com' |
|||
|
|||
def __init__(self, debuglevel=0): |
|||
self._init_github_account() |
|||
https_handler = make_HTTPS_handler({}, debuglevel=debuglevel) |
|||
self._opener = compat_urllib_request.build_opener(https_handler) |
|||
|
|||
def _init_github_account(self): |
|||
try: |
|||
info = netrc.netrc().authenticators(self._NETRC_MACHINE) |
|||
if info is not None: |
|||
self._username = info[0] |
|||
self._password = info[2] |
|||
compat_print('Using GitHub credentials found in .netrc...') |
|||
return |
|||
else: |
|||
compat_print('No GitHub credentials found in .netrc') |
|||
except (IOError, netrc.NetrcParseError): |
|||
compat_print('Unable to parse .netrc') |
|||
self._username = compat_input( |
|||
'Type your GitHub username or email address and press [Return]: ') |
|||
self._password = compat_getpass( |
|||
'Type your GitHub password and press [Return]: ') |
|||
|
|||
def _call(self, req): |
|||
if isinstance(req, compat_basestring): |
|||
req = sanitized_Request(req) |
|||
# Authorizing manually since GitHub does not response with 401 with |
|||
# WWW-Authenticate header set (see |
|||
# https://developer.github.com/v3/#basic-authentication) |
|||
b64 = base64.b64encode( |
|||
('%s:%s' % (self._username, self._password)).encode('utf-8')).decode('ascii') |
|||
req.add_header('Authorization', 'Basic %s' % b64) |
|||
response = self._opener.open(req).read().decode('utf-8') |
|||
return json.loads(response) |
|||
|
|||
def list_releases(self): |
|||
return self._call(self._API_URL) |
|||
|
|||
def create_release(self, tag_name, name=None, body='', draft=False, prerelease=False): |
|||
data = { |
|||
'tag_name': tag_name, |
|||
'target_commitish': 'master', |
|||
'name': name, |
|||
'body': body, |
|||
'draft': draft, |
|||
'prerelease': prerelease, |
|||
} |
|||
req = sanitized_Request(self._API_URL, json.dumps(data).encode('utf-8')) |
|||
return self._call(req) |
|||
|
|||
def create_asset(self, release_id, asset): |
|||
asset_name = os.path.basename(asset) |
|||
url = self._UPLOADS_URL % (release_id, asset_name) |
|||
# Our files are small enough to be loaded directly into memory. |
|||
data = open(asset, 'rb').read() |
|||
req = sanitized_Request(url, data) |
|||
mime_type, _ = mimetypes.guess_type(asset_name) |
|||
req.add_header('Content-Type', mime_type or 'application/octet-stream') |
|||
return self._call(req) |
|||
|
|||
|
|||
def main(): |
|||
parser = optparse.OptionParser(usage='%prog VERSION BUILDPATH') |
|||
options, args = parser.parse_args() |
|||
if len(args) != 2: |
|||
parser.error('Expected a version and a build directory') |
|||
|
|||
version, build_path = args |
|||
|
|||
releaser = GitHubReleaser(debuglevel=0) |
|||
|
|||
new_release = releaser.create_release( |
|||
version, name='youtube-dl %s' % version, draft=True, prerelease=True) |
|||
release_id = new_release['id'] |
|||
|
|||
for asset in os.listdir(build_path): |
|||
compat_print('Uploading %s...' % asset) |
|||
releaser.create_asset(release_id, os.path.join(build_path, asset)) |
|||
|
|||
|
|||
if __name__ == '__main__': |
|||
main() |
Write
Preview
Loading…
Cancel
Save