Removed, just going to use the base 'ChangeLog' file.
This commit is contained in:
parent
32cc25b3f3
commit
c69355cbcd
@ -1,211 +0,0 @@
|
||||
#!/usr/bin/python
|
||||
# vi: ts=4 expandtab
|
||||
|
||||
# A crappy little script
|
||||
# that changes bzr 'log'
|
||||
# into someting that rpm spec files can use (best effort)
|
||||
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
|
||||
from datetime import datetime
|
||||
from datetime import date
|
||||
|
||||
import subprocess
|
||||
|
||||
E_TYPES = ['tags', 'revno', 'author', 'timestamp', 'committer']
|
||||
|
||||
|
||||
def tiny_p(cmd):
|
||||
# Darn python 2.6 doesn't have check_output (argggg)
|
||||
sp = subprocess.Popen(cmd, stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE, stdin=None)
|
||||
(out, err) = sp.communicate()
|
||||
return (out, err)
|
||||
|
||||
|
||||
def extract_entry(collecting):
|
||||
entry = {}
|
||||
for t in E_TYPES:
|
||||
look_for = "%s:" % (t)
|
||||
for v in collecting:
|
||||
if v.startswith(look_for):
|
||||
entry[t] = v[len(look_for):].strip()
|
||||
break
|
||||
i = -1
|
||||
# Messages seem to be the last element so suck
|
||||
# those all up
|
||||
for a, v in enumerate(collecting):
|
||||
if v.startswith("message:"):
|
||||
i = a
|
||||
break
|
||||
if i != -1:
|
||||
msg_lines = collecting[i + 1:]
|
||||
entry['message'] = "\n".join(msg_lines)
|
||||
return entry
|
||||
|
||||
|
||||
def clean_authors(authors):
|
||||
if not authors:
|
||||
return ''
|
||||
auth_cleaned = set()
|
||||
for a in authors:
|
||||
a = a.strip()
|
||||
if a:
|
||||
auth_cleaned.add(a)
|
||||
if not auth_cleaned:
|
||||
return ''
|
||||
uniq_authors = list(auth_cleaned)
|
||||
if len(uniq_authors) == 1:
|
||||
return authors[0]
|
||||
auths = "(%s)" % ", ".join(uniq_authors)
|
||||
return auths
|
||||
|
||||
|
||||
def clean_revnos(revnos):
|
||||
novs = list()
|
||||
for r in revnos:
|
||||
r = r.strip()
|
||||
r = r.replace("[merge]", "")
|
||||
if r:
|
||||
novs.append(int(r))
|
||||
entries = list(novs)
|
||||
if not entries:
|
||||
return ''
|
||||
entries.sort()
|
||||
if len(entries) == 1:
|
||||
return "%s" % (entries[0])
|
||||
|
||||
# Check if consecutive
|
||||
start = entries[0]
|
||||
consec = True
|
||||
for (i, v) in enumerate(entries):
|
||||
if v != start + i:
|
||||
consec = False
|
||||
break
|
||||
if consec:
|
||||
end = entries[-1]
|
||||
return "%s => %s" % (start, end)
|
||||
v = [str(b) for b in entries]
|
||||
return ", ".join(v)
|
||||
|
||||
|
||||
def spacey(am):
|
||||
return " " * am
|
||||
|
||||
|
||||
def justify(text, space_wanted):
|
||||
c_bef = len(text)
|
||||
t_c = len(text.lstrip())
|
||||
space_am = (c_bef - t_c)
|
||||
needed = (space_wanted - space_am)
|
||||
if needed < 0:
|
||||
return text
|
||||
return (" " * (needed) + text)
|
||||
|
||||
|
||||
def clean_messages(messages):
|
||||
contents = []
|
||||
for msg in messages:
|
||||
# Split into sub-messages...
|
||||
# if we can
|
||||
lines = []
|
||||
pieces = msg.splitlines()
|
||||
if len(pieces) == 1:
|
||||
lines.append("%s- %s " %
|
||||
(spacey(4), msg.strip()))
|
||||
else:
|
||||
n_lines = []
|
||||
n_lines.append(pieces[0].strip())
|
||||
for line in pieces[1:]:
|
||||
line = line.lstrip()
|
||||
if not line:
|
||||
continue
|
||||
n_lines.append(justify(line, 6))
|
||||
lines.append("%s- %s" % (spacey(4), "\n".join(n_lines)))
|
||||
contents.extend(lines)
|
||||
return "\n".join(contents)
|
||||
|
||||
|
||||
def build_changelog(history=-1):
|
||||
cmd = ['bzr', 'log', '--timezone=utc']
|
||||
(stdout, _stderr) = tiny_p(cmd)
|
||||
|
||||
# Clean the format up
|
||||
entries = stdout.splitlines()
|
||||
all_entries = []
|
||||
collecting = []
|
||||
for e in entries:
|
||||
if e.startswith("---"):
|
||||
if collecting:
|
||||
a_entry = extract_entry(collecting)
|
||||
if a_entry:
|
||||
all_entries.append(a_entry)
|
||||
collecting = []
|
||||
else:
|
||||
collecting.append(e)
|
||||
|
||||
# Anything that we left behind??
|
||||
entry = extract_entry(collecting)
|
||||
if entry:
|
||||
all_entries.append(entry)
|
||||
|
||||
if history > 0:
|
||||
take_entries = list(all_entries[0:history])
|
||||
else:
|
||||
take_entries = list(all_entries)
|
||||
|
||||
# Merge those with same date
|
||||
date_entries = {}
|
||||
for e in take_entries:
|
||||
author = e.get('author')
|
||||
if not author:
|
||||
author = e.get('committer')
|
||||
if not author:
|
||||
continue
|
||||
timestamp = e.get('timestamp')
|
||||
if not timestamp:
|
||||
continue
|
||||
msg = e.get('message')
|
||||
if not msg:
|
||||
continue
|
||||
revno = e.get('revno')
|
||||
if not revno:
|
||||
continue
|
||||
# http://bugs.python.org/issue6641
|
||||
timestamp = timestamp.replace("+0000", '').strip()
|
||||
ds = datetime.strptime(timestamp, '%a %Y-%m-%d %H:%M:%S')
|
||||
ds = ds.date()
|
||||
if ds not in date_entries:
|
||||
entry = {}
|
||||
entry['messages'] = []
|
||||
entry['authors'] = []
|
||||
entry['revnos'] = []
|
||||
date_entries[ds] = entry
|
||||
entry = date_entries[ds]
|
||||
entry['messages'].append(msg)
|
||||
entry['authors'].append(author)
|
||||
entry['revnos'].append(revno)
|
||||
|
||||
# It wants them in chronological order...
|
||||
dates = sorted(date_entries.keys())
|
||||
chglog = []
|
||||
for ds in reversed(dates):
|
||||
e = date_entries[ds]
|
||||
authors = clean_authors(e['authors'])
|
||||
revnos = clean_revnos(e['revnos'])
|
||||
top_line = "%s %s - [revison %s]" % (ds.strftime("%a %b %d %Y"),
|
||||
authors, revnos)
|
||||
chglog.append("* %s" % (top_line))
|
||||
chglog.append(clean_messages(e['messages']))
|
||||
return "\n".join(chglog)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
args = sys.argv[1:]
|
||||
history_am = -1
|
||||
if args:
|
||||
history_am = int(args[0])
|
||||
chglog = build_changelog(history_am)
|
||||
print chglog
|
Loading…
x
Reference in New Issue
Block a user