Various fixes and debug code removal.
[git-dm.git] / changelogs
blob1077a0363921f3aba2721d38a7d5317a859dc596
1 #!/usr/bin/pypy
2 # -*- python -*-
4 # Go munging through changelogs for interesting info.
6 # git log <whatever> | changelogs
8 import gitlog
9 import sys
12 # Stats gathering.
14 EmptyCulprits = { }
15 SingleSSCulprits = { }
16 NoSOBCulprits = { }
18 def LogEmptyCulprit(culprit):
19     try:
20         EmptyCulprits[culprit] += 1
21     except KeyError:
22         EmptyCulprits[culprit] = 1
24 def LogSSCulprit(culprit):
25     try:
26         SingleSSCulprits[culprit] += 1
27     except KeyError:
28         SingleSSCulprits[culprit] = 1
30 def LogNoSOBCulprit(culprit):
31     try:
32         NoSOBCulprits[culprit] += 1
33     except KeyError:
34         NoSOBCulprits[culprit] = 1
36 def SortedCulprits(culprits):
37     def compare(c1, c2):
38         return culprits[c2] - culprits[c1]
39     names = culprits.keys()
40     names.sort(compare)
41     return names
43 def PrintCulprits(culprits, sorted):
44     for name in sorted:
45         print '\t%30s: %d' % (name, culprits[name])
47 # Patch logging
49 SSPatches = { }
50 EmptyCLPatches = { }
51 NoSOBPatches = { }
53 def LogSSPatch(p):
54     LogSSCulprit(p.author.name)
55     try:
56         SSPatches[p.author.name].append(p)
57     except KeyError:
58         SSPatches[p.author.name] = [p]
60 def LogECLPatch(p):
61     LogEmptyCulprit(p.author.name)
62     try:
63         EmptyCLPatches[p.author.name].append(p)
64     except KeyError:
65         EmptyCLPatches[p.author.name] = [p]
67 def LogNoSOB(p):
68     LogNoSOBCulprit(p.author.name)
69     try:
70         NoSOBPatches[p.author.name].append(p)
71     except KeyError:
72         NoSOBPatches[p.author.name] = [p]
74 LinusURL = 'http://git.kernel.org/linus/'
75 def WritePatches(names, patches, file):
76     out = open(file, 'w')
77     for name in names:
78         out.write('<h4>%s</h4>\n<ul>\n' % name)
79         for p in patches[name]:
80             out.write('\t<li><a href="%s%s"><tt>%s</tt></a> %s\n' % (LinusURL,
81                                                                      p.commit,
82                                                                      p.commit,
83                                                                      p.desc))
84         out.write('</ul>\n\n')
85     out.close()                     
88 # Main program.
90 Npatches = 0
91 NemptyCL = 0
93 Nsinglesob = 0
94 Nnosob = 0
95 Nothers = 0
97 p = gitlog.grabpatch(sys.stdin)
98 while p:
99     #print p.commit, len(p.changelog)
100     Npatches += 1
101     if len(p.changelog) == 0:
102         NemptyCL += 1
103         LogECLPatch(p)
104     if len(p.signoffs) == 0:
105         Nnosob += 1
106         LogNoSOB(p)
107     elif len(p.signoffs) == 1:
108         Nsinglesob += 1
109         if p.othertags == 0:
110             LogSSPatch(p)
111         else:
112             Nothers += 1
113     p = gitlog.grabpatch(sys.stdin)
115 print '%d patches, %d w/o changelog' % (Npatches, NemptyCL)
116 print '  %d w/o signoff, %d w/1 signoff, %d no others, %d SS culprits' % \
117       (Nnosob, Nsinglesob, Nsinglesob - Nothers, len(SingleSSCulprits))
118 print '\nMost single signoffs:'
119 sorted = SortedCulprits(SingleSSCulprits)[:20]
120 PrintCulprits(SingleSSCulprits, sorted)
121 WritePatches(sorted, SSPatches, 'sspatches.html')
123 print '\nMost empty changelogs:'
124 sorted = SortedCulprits(EmptyCulprits)[:20]
125 PrintCulprits(EmptyCulprits, sorted)
126 WritePatches(sorted, EmptyCLPatches, 'emptypatches.html')
128 print '\nNoSOB:'
129 sorted = SortedCulprits(NoSOBCulprits)
130 PrintCulprits(NoSOBCulprits, sorted)
131 WritePatches(sorted, NoSOBPatches, 'nosobpatches.html')