]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Script to count contributors and commits per development cycle
authorJunio C Hamano <gitster@pobox.com>
Wed, 3 Feb 2010 07:12:24 +0000 (23:12 -0800)
committerJunio C Hamano <gitster@pobox.com>
Wed, 3 Feb 2010 07:12:24 +0000 (23:12 -0800)
count-contributors.sh [new file with mode: 0755]

diff --git a/count-contributors.sh b/count-contributors.sh
new file mode 100755 (executable)
index 0000000..4ee57f5
--- /dev/null
@@ -0,0 +1,73 @@
+#!/bin/sh
+
+LC_ALL=C LANG=C
+export LC_ALL LANG
+
+fmt="%-10s | %7d %7d %7d | %7d %7d | %-10s\n"
+hfmt=$(printf "%s" "$fmt" | sed -e 's/d/s/g')
+head=$(printf "$hfmt" release new this total this total date)
+
+old= ocommitcnt=
+git for-each-ref --format='%(refname:short)' refs/tags/ |
+perl -w -e '
+       use strict;
+       my @version = ();
+       my %asked = map { $_ => $_ } @ARGV;
+
+       while (<STDIN>) {
+               next unless (/^(v(\d+)\.(\d+)(?:\.(\d+))?(?:-rc(\d+))?)$/);
+               # $1 = tag == v$2.$3(.$4)?(-rc$5)?
+
+               if (exists $asked{$1}) {
+                       ; # ok
+               } elsif (defined $5) {
+                       # skip -rc releases
+                       next;
+               } elsif ($2 == 0) {
+                       # not worth showing breakdown during v0.99 period
+                       next unless ($1 eq "v0.99");
+               } elsif ($2 == 1) {
+                       # not worth showing breakdown before v1.4.0
+                       next if ($3 < 4 && $4);
+               }
+               push @version, [$1, $2, $3, $4, $5];
+       }
+       for (sort { (
+               $a->[1] <=> $b->[1] ||
+               $a->[2] <=> $b->[2] ||
+               $a->[3] <=> $b->[3] ||
+               ( (defined $a->[4] && defined $b->[4])
+                 ? $a->[4] <=> $b->[4]
+                 : defined $a->[4]
+                 ? -1 : 1 ) ); } @version) {
+               print $_->[0], "\n";
+       }
+' "$@" |
+while read new
+do
+       commitcnt=$(git rev-list --no-merges "$new" | wc -l)
+       git shortlog -s -n "$new" |
+       sed -e 's/^[    0-9]*//' |
+       sort >/var/tmp/new
+       if test -n "$old"
+       then
+               comm -13 /var/tmp/old /var/tmp/new >"/var/tmp/cont-$new"
+               i=$(git shortlog -s -n "$old..$new" |
+                       sed -e 's/^[    0-9]*//' |
+                       wc -l)
+               cc=$(( $commitcnt - $ocommitcnt ))
+       else
+               i=$(wc -l </var/tmp/new)
+               cat /var/tmp/new >"/var/tmp/cont-$new"
+               cc=$(( $commitcnt + 0 ))
+       fi
+       old=$new
+       mv /var/tmp/new /var/tmp/old
+       n=$(wc -l <"/var/tmp/cont-$new")
+       c=$(wc -l <"/var/tmp/old")
+       t=$(git show -s --format="%ci" "$old^0" | sed -e "s/ .*//")
+       ocommitcnt=$commitcnt
+       test -z "$head" || echo "$head"
+       printf "$fmt" $new $n $i $c $cc $commitcnt $t
+       head=
+done