File: git-effort

package info (click to toggle)
git-extras 1.7.0-1.2
  • links: PTS
  • area: main
  • in suites: wheezy
  • size: 696 kB
  • sloc: sh: 381; makefile: 52
file content (127 lines) | stat: -rwxr-xr-x 1,698 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#!/bin/bash

tmp="$(mktemp --suffix=-git-effort)"
above='0'
color=

trap "rm -rf '$tmp'" EXIT

#
# get date for the given <commit>
#

date() {
  git log --pretty='format: %ai' $1 | cut -d ' ' -f 2
}

#
# hide cursor
#

hide_cursor() {
  printf '\033[?25l'
}

#
# show cursor
#

show_cursor() {
  printf '\033[?25h'
  printf '\033[m\n'
  exit 1
}

#
# get active days for the given <commit>
#

active_days() {
  date $1 | uniq | awk '
    { sum += 1 }
    END { print sum }
  '
}

#
# set 'color' based on the given <num>
#

color_for() {
  test $1 -gt 10 && color='33'
  test $1 -gt 25 && color='33;1'
  test $1 -gt 50 && color='93'
  test $1 -gt 75 && color='93;1'
  test $1 -gt 100 && color='31'
  test $1 -gt 125 && color='31;1'
  test $1 -gt 150 && color='91'
  test $1 -gt 200 && color='91;1'
}

#
# compute the effort of the given <file ...>
#

effort() {
  for file in $@; do
    commits=`git log --oneline $file | wc -l`
    color='90'

    # ignore <= --above
    test $commits -le $above && continue

    # commits
    color_for $commits
    printf "  \033[${color}m%-45s %-10d" $file $commits

    # active days
    active=`active_days $file`
    color_for $active
    printf "\033[${color}m %d\033[0m\n" $active
  done
}

#
# print heading
#

heading() {
  echo
  printf "  %-45s %-10s %s\n" 'file' 'commits' 'active days'
  echo
}

#
# output sorted results
#

sort_effort() {
  clear
  echo
  heading
  cat $tmp | sort -rn -k 2
}

# --above <n-commits>

if test "$1" = "--above"; then
  shift; above=$1
  shift
fi

# [file ...]

files=${@-`git ls-files`}

# hide cursor

hide_cursor
trap show_cursor INT

# loop files

heading
effort $files | tee $tmp && sort_effort
echo

show_cursor