1
#!/usr/bin/env python
2
3
from __future__ import with_statement
4
5
import sys
6
import subprocess
7
8
import gitaggregates
9
10
def read_tag(t):
11
    args = ['git', 'cat-file', 'tag', t]
12
    sub = subprocess.Popen(args, stdout=subprocess.PIPE, close_fds=True)
13
14
    rv=None
15
    for l in sub.stdout:
16
        if rv is not None:
17
            rv.append(l)
18
        elif l.strip() == '':
19
            rv = []
20
21
    return ''.join(rv)
22
23
def emit(prev, r, f=sys.stdout):
24
    tagdesc = read_tag(r)
25
26
    c = gitaggregates.Contributors([prev + '..' + r])
27
    chart = c.mk_chart()
28
    pie_url = chart.BASE_URL + '&'.join(chart.get_url_bits())
29
    vdesc = "Changes from release %s to %s" % (prev, r)
30
    if not prev:
31
        vdesc = "Release " + r
32
    f.write("<h2>%s</h2>\n" % (vdesc))
33
    f.write("""<div><img class="pie" src="%s" alt="contributors"/>"""
34
            % pie_url)
35
    f.write("<pre>%s</pre></div>" % tagdesc)
36
37
if __name__ == '__main__':
38
39
    if not sys.argv[1:]:
40
        sys.stderr.write("Need to list some tag objects.\n")
41
        sys.exit(1)
42
43
    title = "Changelog"
44
    try:
45
        with open(".git/description") as f:
46
            desc = f.read().strip()
47
            if not desc.startswith("Unnamed repository"):
48
                title= "Changelog for " + desc
49
    except:
50
        pass
51
52
    print """<?xml version="1.0" encoding="UTF-8"?>
53
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
54
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
55
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
56
57
<head>
58
    <title>%s</title>
59
    <style type="text/css">
60
        .pie {
61
            float: right;
62
        }
63
        h2 {
64
            clear: both;
65
        }
66
    </style>
67
</head>
68
69
<body>
70
""" % title
71
72
    print "<h1>%s</h1>" % title
73
74
    prev = ''
75
76
    pairs = []
77
78
    for r in sys.argv[1:]:
79
        pairs.append((prev, r))
80
        prev = r
81
82
    for prev, r in reversed(pairs):
83
        emit(prev, r)
84
85
    print "</body></html>"