Script to count contributors and commits per development cycle

Junio C Hamano committed Feb 2, 2010 at 23:12 UTC ece251b6407cf83959e595c3057c4f23b418dbb3
1 file changed +73
count-contributors.sh new
+73
@@ -0,0 +1,73 @@
1 +#!/bin/sh
2 +
3 +LC_ALL=C LANG=C
4 +export LC_ALL LANG
5 +
6 +fmt="%-10s | %7d %7d %7d | %7d %7d | %-10s\n"
7 +hfmt=$(printf "%s" "$fmt" | sed -e 's/d/s/g')
8 +head=$(printf "$hfmt" release new this total this total date)
9 +
10 +old= ocommitcnt=
11 +git for-each-ref --format='%(refname:short)' refs/tags/ |
12 +perl -w -e '
13 + use strict;
14 + my @version = ();
15 + my %asked = map { $_ => $_ } @ARGV;
16 +
17 + while (<STDIN>) {
18 + next unless (/^(v(\d+)\.(\d+)(?:\.(\d+))?(?:-rc(\d+))?)$/);
19 + # $1 = tag == v$2.$3(.$4)?(-rc$5)?
20 +
21 + if (exists $asked{$1}) {
22 + ; # ok
23 + } elsif (defined $5) {
24 + # skip -rc releases
25 + next;
26 + } elsif ($2 == 0) {
27 + # not worth showing breakdown during v0.99 period
28 + next unless ($1 eq "v0.99");
29 + } elsif ($2 == 1) {
30 + # not worth showing breakdown before v1.4.0
31 + next if ($3 < 4 && $4);
32 + }
33 + push @version, [$1, $2, $3, $4, $5];
34 + }
35 + for (sort { (
36 + $a->[1] <=> $b->[1] ||
37 + $a->[2] <=> $b->[2] ||
38 + $a->[3] <=> $b->[3] ||
39 + ( (defined $a->[4] && defined $b->[4])
40 + ? $a->[4] <=> $b->[4]
41 + : defined $a->[4]
42 + ? -1 : 1 ) ); } @version) {
43 + print $_->[0], "\n";
44 + }
45 +' "$@" |
46 +while read new
47 +do
48 + commitcnt=$(git rev-list --no-merges "$new" | wc -l)
49 + git shortlog -s -n "$new" |
50 + sed -e 's/^[ 0-9]*//' |
51 + sort >/var/tmp/new
52 + if test -n "$old"
53 + then
54 + comm -13 /var/tmp/old /var/tmp/new >"/var/tmp/cont-$new"
55 + i=$(git shortlog -s -n "$old..$new" |
56 + sed -e 's/^[ 0-9]*//' |
57 + wc -l)
58 + cc=$(( $commitcnt - $ocommitcnt ))
59 + else
60 + i=$(wc -l </var/tmp/new)
61 + cat /var/tmp/new >"/var/tmp/cont-$new"
62 + cc=$(( $commitcnt + 0 ))
63 + fi
64 + old=$new
65 + mv /var/tmp/new /var/tmp/old
66 + n=$(wc -l <"/var/tmp/cont-$new")
67 + c=$(wc -l <"/var/tmp/old")
68 + t=$(git show -s --format="%ci" "$old^0" | sed -e "s/ .*//")
69 + ocommitcnt=$commitcnt
70 + test -z "$head" || echo "$head"
71 + printf "$fmt" $new $n $i $c $cc $commitcnt $t
72 + head=
73 +done