What's cooking (2011/05 #04)
[alt-git.git] / count-contributors.sh
blob4ee57f57f8b521f4179c121ebd38e79e7aa578e1
1 #!/bin/sh
3 LC_ALL=C LANG=C
4 export LC_ALL LANG
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)
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;
17 while (<STDIN>) {
18 next unless (/^(v(\d+)\.(\d+)(?:\.(\d+))?(?:-rc(\d+))?)$/);
19 # $1 = tag == v$2.$3(.$4)?(-rc$5)?
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);
33 push @version, [$1, $2, $3, $4, $5];
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";
45 ' "$@" |
46 while read new
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 ))
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