Meta/Linus: blame not just Linus's initial version but any version

Junio C Hamano committed Mar 13, 2013 at 13:20 UTC e7e5b124954e267a497968e5230651d25ab20e33
1 file changed +53 -8
Linus
+53 -8
@@ -4,8 +4,44 @@
4 _x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
5 _x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
6
7 -initial=$(git rev-parse --verify e83c5163316f89bfbde7d9ab23ca2e25604af290) &&
8 -this=$(git rev-parse --verify ${1-HEAD}^0) || exit
7 +summary=
8 +while case $# in 0) break ;; esac
9 +do
10 + case "$1" in
11 + -s | --summary)
12 + summary=t
13 + ;;
14 + -*)
15 + echo >&2 "$1: unknown option"
16 + exit 1
17 + ;;
18 + *)
19 + break
20 + ;;
21 + esac
22 + shift
23 +done
24 +
25 +if test $# = 0
26 +then
27 + this=HEAD
28 +else
29 + this=$1
30 + shift
31 +fi
32 +
33 +if test $# = 0
34 +then
35 + initial=e83c5163316f89bfbde7d9ab23ca2e25604af290
36 + range="..$this"
37 +else
38 + initial=$1
39 + range="$initial..$this"
40 + shift
41 +fi
42 +
43 +this=$(git rev-parse --verify "$this^0") &&
44 +initial=$(git rev-parse --verify "$initial^0") || exit
45
46 tmp="/var/tmp/Linus.$$"
47 trap 'rm -f "$tmp".*' 0
@@ -30,10 +66,12 @@ show () {
66 printf "%12d %12d %s (%d.%02d%%)\n" $s $t $n $p $c
67 }
68
33 -git ls-tree -r "$initial" |
34 -while read mode type sha1 name
69 +empty_tree=$(git hash-object -t tree -w --stdin </dev/null)
70 +
71 +git diff-tree -r --raw $empty_tree $initial -- "$@" |
72 +while read mode_old mode_new sha1_old sha1_new op name
73 do
36 - git blame $opts --porcelain -S "$graft" "$initial" -- "$name" |
74 + git blame $opts --porcelain -S "$graft" "$this..$initial" -- "$name" |
75 sed -ne "s/^\($_x40\) .*/\1/p" |
76 sort |
77 uniq -c | {
@@ -57,13 +95,20 @@ do
95 done | {
96 total=0
97 surviving=0
98 + test -n "$summary" ||
99 printf "%12s %12s %s (survival%%)\n" surviving original path
100 while read s t n
101 do
102 total=$(( $total + $t )) surviving=$(( $surviving + $s ))
64 - # printf "%12d %12d %s\n" $s $t $n
103 + test -n "$summary" ||
104 show $s $t $n
105 done
67 - # printf "%12d %12d %s\n" $surviving $total Total
68 - show $surviving $total Total
106 + if test -n "$summary"
107 + then
108 + echo $surviving $total
109 + else
110 + label=Total
111 + show $surviving $total $label
112 + fi
113 +
114 }