#!/usr/bin/env python import datetime import re import subprocess RELEASE = re.compile(r'[0-9]+\.[0-9]+\.[0-9]+') ISSUE = re.compile(r'#([0-9]+)') REVLIST = 'git rev-list develop --abbrev-commit --format="parents %p%n%B%n~~~" --max-count=200 develop' TEMPLATE = """ boto v{version} =========== :date: {date} Description goes here. Changes ------- {changes} """ revisions = subprocess.check_output(REVLIST, shell=True, stderr=subprocess.STDOUT) commit_list = [] for hunk in revisions.split('~~~')[:-1]: lines = hunk.strip().splitlines() commit = lines[0].split(' ', 1)[1] parents = lines[1].split(' ', 1)[1].split(' ') message = ' '.join(lines[2:]) # print(commit, parents) if RELEASE.search(message): print('Found release commit, stopping:') print(message) break if len(parents) > 1: commit_list.append([commit, message]) removals = [ re.compile(r'merge pull request #[0-9]+ from [a-z0-9/_-]+', re.I), re.compile(r"merge branch '[a-z0-9/_-]+' into [a-z0-9/_-]+", re.I), re.compile(r'fix(es)? [#0-9, ]+.?', re.I) ] changes = '' for commit, message in commit_list: append = [] issues = set() for issue in ISSUE.findall(message): if issue not in issues: append.append(':issue:`{issue}`'.format(issue=issue)) issues.add(issue) append.append(':sha:`{commit}`'.format(commit=commit)) append = ' (' + ', '.join(append) + ')' original = message for removal in removals: message = removal.sub('', message) message = message.strip() if not message: message = original.strip() changes += '* ' + message + append + '\n' print(TEMPLATE.format( version='?.?.?', date=datetime.datetime.now().strftime('%Y/%m/%d'), changes=changes ))