diff --git a/.travis.yml b/.travis.yml index a74bed55..9fe38ddb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -49,7 +49,7 @@ jobs: install: - pip install GitPython PyGithub script: - - PYTHONUNBUFFERED=1 python ./gen_changelog.py + - PYTHONUNBUFFERED=1 python ./builder/assets/gen_changelog.py stages: - Build - Annotate diff --git a/builder/assets/gen_changelog.py b/builder/assets/gen_changelog.py new file mode 100644 index 00000000..71d61517 --- /dev/null +++ b/builder/assets/gen_changelog.py @@ -0,0 +1,75 @@ +#!/usr/bin/env python3 + +# Generate and upload changelog + +from git import Repo, exc +from github import Github +import os +import sys + +upload_changelog = True + +try: + current_tag = os.environ['TRAVIS_TAG'] + if current_tag == '': + current_tag = 'HEAD' + upload_changelog = False + print('TRAVIS_TAG is set to {}'.format(current_tag)) +except KeyError: + print('TRAVIS_TAG not set - not uploading changelog') + current_tag = 'HEAD' + upload_changelog = False + +try: + api_key = os.environ['GITHUB_OAUTH_TOKEN'] +except KeyError: + print('GITHUB_OAUTH_TOKEN not set - not uploading changelog') + api_key = None + upload_changelog = False + +try: + repo_slug = os.environ['TRAVIS_REPO_SLUG'] +except KeyError: + print('TRAVIS_REPO_SLUG not set - cannot determine remote repository') + repo_slug = '' + exit(1) + +if len(sys.argv) > 1: + repo_path = sys.argv[1] +else: + repo_path = '.' + +print('Opening repository at {}'.format(repo_path)) +repo = Repo(repo_path) +git = repo.git() +try: + print('Unshallowing repository') + git.fetch('--unshallow', '--tags') +except exc.GitCommandError: + print('Repository already unshallowed') +print('Attempting to get previous tag') +base_tag = git.describe('--tags', '--abbrev=0', '{}^'.format(current_tag)) +print('Base tag set to {}'.format(base_tag)) + +changelog = git.log('{}...{}'.format(base_tag, current_tag), '--pretty=format:* %H %s *(%an)*') +print('Current changelog: \n{}'.format(changelog)) + +# Only interact with Github if uploading is enabled +if upload_changelog: + gh = Github(api_key) + gh_repo = gh.get_repo(repo_slug) + # Get all releases and find ours by its tag name + gh_release = None + for release in gh_repo.get_releases(): + if release.tag_name == current_tag: + gh_release = release + if gh_release is None: + # We could not find the correct release, so here's our last resort. It will most likely fail. + gh_release = gh_repo.get_release(current_tag) + gh_body = gh_release.body + if gh_body is None: + gh_body = '' + gh_body = '{}\nChanges between `{}` and `{}`:\n\n{}'.format(gh_body, base_tag, current_tag, changelog) + print('New release body: {}'.format(gh_body)) + gh_release.update_release(gh_release.tag_name, gh_body, draft=True, prerelease=True, + tag_name=gh_release.tag_name, target_commitish=gh_release.target_commitish)