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
}