Only keep the most recent release on GitHub

GitHub claims they have no disk quotas for releases, but I dont want to
rely on that.
This commit is contained in:
Kovid Goyal 2014-09-05 12:45:21 +05:30
parent dd3e52df27
commit b6bbf61efd

View File

@ -387,13 +387,16 @@ class GitHub(Base): # {{{
def __init__(self, files, reponame, version, username, password, replace=False): def __init__(self, files, reponame, version, username, password, replace=False):
self.files, self.reponame, self.version, self.username, self.password, self.replace = ( self.files, self.reponame, self.version, self.username, self.password, self.replace = (
files, reponame, version, username, password, replace) files, reponame, version, username, password, replace)
self.current_tag_name = 'v' + self.version
import requests import requests
self.requests = s = requests.Session() self.requests = s = requests.Session()
s.auth = (self.username, self.password) s.auth = (self.username, self.password)
s.headers.update({'Accept': 'application/vnd.github.v3+json'}) s.headers.update({'Accept': 'application/vnd.github.v3+json'})
def __call__(self): def __call__(self):
release = self.create_release() releases = self.releases()
self.clean_older_releases(releases)
release = self.create_release(releases)
upload_url = release['upload_url'].partition('{')[0] upload_url = release['upload_url'].partition('{')[0]
existing_assets = self.existing_assets(release['id']) existing_assets = self.existing_assets(release['id'])
for path, desc in self.files.iteritems(): for path, desc in self.files.iteritems():
@ -413,6 +416,16 @@ class GitHub(Base): # {{{
if r.status_code != 200: if r.status_code != 200:
self.fail(r, 'Failed to set label for %s' % fname) self.fail(r, 'Failed to set label for %s' % fname)
def clean_older_releases(self, releases):
for release in releases:
if release.get('assets', None) and release['tag_name'] != self.current_tag_name:
self.info('\nDeleting old released installers from: %s' % release['tag_name'])
for asset in release['assets']:
r = self.requests.delete(self.API + 'repos/%s/%s/releases/assets/%s' % (self.username, self.reponame, asset['id']))
if r.status_code != 204:
self.fail(r, 'Failed to delete obsolete asset: %s for release: %s' % (
asset['name'], release['tag_name']))
def do_upload(self, url, path, desc, fname): def do_upload(self, url, path, desc, fname):
mime_type = mimetypes.guess_type(fname)[0] mime_type = mimetypes.guess_type(fname)[0]
self.info('Uploading to GitHub: %s (%s)' % (fname, mime_type)) self.info('Uploading to GitHub: %s (%s)' % (fname, mime_type))
@ -438,26 +451,29 @@ class GitHub(Base): # {{{
self.fail('Failed to get assets for release') self.fail('Failed to get assets for release')
return {asset['name']:asset['id'] for asset in r.json()} return {asset['name']:asset['id'] for asset in r.json()}
def create_release(self): def releases(self):
url = self.API + 'repos/%s/%s/releases' % (self.username, self.reponame)
r = self.requests.get(url)
if r.status_code != 200:
self.fail(r, 'Failed to list releases')
return r.json()
def create_release(self, releases):
' Create a release on GitHub or if it already exists, return the existing release ' ' Create a release on GitHub or if it already exists, return the existing release '
for release in releases:
# Check for existing release
if release['tag_name'] == self.current_tag_name:
return release
url = self.API + 'repos/%s/%s/releases' % (self.username, self.reponame) url = self.API + 'repos/%s/%s/releases' % (self.username, self.reponame)
r = self.requests.post(url, data=json.dumps({ r = self.requests.post(url, data=json.dumps({
'tag_name':'v%s' % self.version, 'tag_name': self.current_tag_name,
'target_commitish': 'master', 'target_commitish': 'master',
'name': 'version %s' % self.version, 'name': 'version %s' % self.version,
'body': 'Release version %s' % self.version, 'body': 'Release version %s' % self.version,
'draft': False, 'prerelease':False 'draft': False, 'prerelease':False
})) }))
if r.status_code != 201: if r.status_code != 201:
if not self.already_exists(r): self.fail(r, 'Failed to create release for version: %s' % self.version)
self.fail(r, 'Failed to create release for version: %s' % self.version)
# Find existing release
r = self.requests.get(url)
if r.status_code != 200:
self.fail(r, 'Failed to list releases')
for release in reversed(r.json()):
if release.get('tag_name', None) == 'v' + self.version:
return release
return r.json() return r.json()
# }}} # }}}