Index: third_party/gsutil/third_party/boto/scripts/git-release-notes.py |
diff --git a/third_party/gsutil/third_party/boto/scripts/git-release-notes.py b/third_party/gsutil/third_party/boto/scripts/git-release-notes.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..5b6faaaf2190f278920f9b9688515723535c8c13 |
--- /dev/null |
+++ b/third_party/gsutil/third_party/boto/scripts/git-release-notes.py |
@@ -0,0 +1,75 @@ |
+#!/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 |
+)) |