Skip to content

Commit

Permalink
Add GitHub Release automation
Browse files Browse the repository at this point in the history
cc @ralsina

Signed-off-by: Chris Warrick <kwpolska@gmail.com>
  • Loading branch information
Kwpolska committed Jun 23, 2015
1 parent 63ef4a7 commit ccee711
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Expand Up @@ -20,3 +20,6 @@ __pycache__/

# pyenv
.python-version

# GitHub token
.pypt/gh-token
90 changes: 90 additions & 0 deletions .pypt/ghrel
@@ -0,0 +1,90 @@
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# Kw’s Release Tools/Python Project Template
# GitHub Releases Creator
# Copyright © 2013-2015, Chris Warrick.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions, and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the author of this software nor the names of
# contributors to this software may be used to endorse or promote
# products derived from this software without specific prior written
# consent.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Arguments:
# FILE BASEDIR REPO TAG

"""
Create GitHub releases out of changelogs.
Usage: .pypt/commitlog FILE BASEDIR REPO TAG, where
FILE is the path to the file to use, which can be
a plain .md file or a CMFN file,
BASEDIR is the project directory,
REPO is the full GitHub repository name (user/repo),
TAG is the tag to write to.
All paths should be absolute.
"""

import re
import requests
import json
from os.path import join as pjoin
from sys import argv

_script, FILE, BASEDIR, REPO, TAG = argv

with open(pjoin(BASEDIR, '.pypt', 'gh-token')) as fh:
TOKEN = fh.read().strip()

HEADERS = {
'User-Agent': 'Kwpolska/python-project-template',
'Authorization': 'token ' + TOKEN,
}

with open(FILE) as fh:
fdata = fh.read()
e = re.findall(
'#~ CHANGELOG MESSAGE START ~#\n(.*?)\n#~ CHANGELOG MESSAGE END ~#',
fdata, flags=re.S)

if e:
# parse as a CMFN file, replace backticks (reST->Markdown)
message = e[0].replace('``', '`')
else:
# parse as a plain Markdown file
message = fdata


r = requests.post(
'https://api.github.com/repos/{0}/releases'.format(REPO),
data=json.dumps({'tag_name': TAG, 'body': message}),
headers=HEADERS)

if r.status_code == 201:
print("GitHub Release created: {0}".format(r.json()['url']))
else:
print("GitHub Release failed: {0}".format(r.text))
exit(1)
19 changes: 19 additions & 0 deletions scripts/github-release.py
@@ -0,0 +1,19 @@
#!/usr/bin/env python
import subprocess
import sys
import os

if not os.path.exists('.pypt/gh-token'):
print("To use this script, you must create a GitHub token first.")
print("Get a token here: https://github.com/settings/tokens")
print("Then, put it in a file named .pypt/gh-token")
exit(1)

inpf = input if sys.version_info[0] == 3 else raw_input

FILE = inpf("Markdown file to use: ")
BASEDIR = os.getcwd()
REPO = 'getnikola/nikola'
TAG = inpf("Tag name (usually vX.Y.Z): ")

subprocess.call(['.pypt/ghrel', FILE, BASEDIR, REPO, TAG])

0 comments on commit ccee711

Please sign in to comment.