Shell脚本实现的基于SVN的代码提交量统计工具

页面导航:首页 > 脚本专栏 > shell > Shell脚本实现的基于SVN的代码提交量统计工具

Shell脚本实现的基于SVN的代码提交量统计工具

来源:互联网 作者:脚本宝典 时间:2015-07-21 13:37 【

最近没啥事,就用bash写了一个基于svn的代码统计小工具。 可以指定统计的目录,默认递归统计子目录。 目前还没有屏蔽指定目录的功能。哈 代码比较粗糙。不过先晒出来。 ? 1 2 3 4

最近没啥事,就用bash写了一个基于svn的代码统计小工具。 可以指定统计的目录,默认递归统计子目录。

目前还没有屏蔽指定目录的功能。哈 代码比较粗糙。不过先晒出来。

?

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
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
#!/bin/bash - 
#""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
#     FILE: lines.sh
#     USAGE: ./lines.sh [dir]
#     AUTHOR: william
#  DESCRIPTION: 基于SVN的代码提交量统计工具
#    OPTIONS: ---
#    CREATED: 06/05/2012 12:49:20 PM CST
#"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
  
set -o nounset               # Treat unset variables as an error
  
  
# 关注的文件类型 后罪名
FILES_TYPE="*.cpp *.h *.lua"
  
# 需要统计的人员,在这里写入需要统计的人,用空格隔开。哈还不智能
declare -r CODER_LIST="coder1 coder2"
declare -i coder1
declare -i coder2
  
  
declare -r USAGE="Usage: $0 [dir]. default dir is current dir.\n"
  
# ERROR CODES;
declare -r E_BAD_PATH=1
declare -r E_INVAILED_ARGU=2
declare -r E_NOT_SVN_DIR=3
  
  
#TODO 屏蔽一些dir 还没写哈
# TODO other way get path not with / end 
getpath()
{
  #debug
  #echo dir_name: ${dir_name}
  #echo base_name: ${base_name}
  if [ $dir_name == "/" ] || [ $base_name == "/" ]; then
    work_path="/"
  else
    work_path=${dir_name}/${base_name}
  fi
}
  
statistic_codelines()
{
  if [ -z "$1" ]; then
    echo "ERROR statistic_codelines not argument"
    return
  fi
  local pwd_length=${#PWD}
  echo "--------------------------"
  echo "${PWD}"
  for coder in $CODER_LIST; do
    local num=$(echo "$1" | grep ${coder} | wc -l)
    (( ${coder} += num ))
    if [ $num -ne 0 ]; then
      printf "%10s | %-7d\n" ${coder} $num
    fi
  done
  echo "--------------------------"
}
  
  
# init check argument set work_path
init_work_path()
{
  if [ $# -eq 1 ]; then
    if [ $1 == "-h" ]; then # is help
        echo -e "$USAGE"
    elif [ -d $1 ]; then
      dir_name=$(dirname ${1})
      base_name=$(basename ${1})
      getpath;
    else
      echo -e "An invailed argument"
      echo -e "Use -h get help."
      exit $E_INVAILED_ARGU
    fi
  fi
}
  
# check work_path
check_work_path()
{
  if [ -z $work_path ] || [ ! -d $work_path ]; then
    exit $E_BADPATH;
  fi
}
  
# enter work_path
enter_work_path()
{
  cd ${work_path}
  if [ ! $? ]; then
    echo "Can not enter ${work_path} "
  fi
}
  
# check work_pat is a svn dir
is_svn_dir()
{
  (
  # check if current dir is asvn dir
  svn info &> /dev/null
  exit $?
  )
  return $?
}
  
action()
{
  local dir_name=.
  local base_name=
  local work_path=$dir_name
  
  init_work_path $1
  check_work_path
  enter_work_path #todo can't enter
  
  #echo "NOW DIR: $PWD, OLD DIR $OLDPWD"
  is_svn_dir
  #todo to next dir
  local ret=$?
  if [ $ret -ne 0 ]
  then
    echo -e "Current dir \"${work_path}\" not a svn dir."
    exit $E_NOT_SVN_DIR
  fi
  
  # get source files
  local files=$(ls ${FILES_TYPE} 2> /dev/null)
  
  if [ -n "$files" ]; then
   local namelist=$(echo -n ${files} | xargs -n 1 svn blame | awk '{print $2}')
   #svn blame $files #| grep $1 | wc -l
   statistic_codelines "$namelist"
  fi
  
  local sub_dirs=$(find -maxdepth 1 -type d -name "[^.]*" 2>/dev/null)
  
  if [ -n "$sub_dirs" ]; then
    for dir in $sub_dirs ; do
      action "$dir"
    done
  fi
  
  cd ..
}
  
total()
{
  echo "-------- TOTOAL ----------"
  echo "   NAME | lines    " 
  echo "--------------------------"
  for coder in $CODER_LIST; do
    if [ ${!coder} -ne 0 ]; then
      printf "%10s | %-7d\n" ${coder} ${!coder}
    fi
  done
  echo "--------------------------"
}
  
# main
echo "-----开始统计,请耐心等待.... :) "
action $1
total
  
exit 0


Tags:

文章评论

最 近 更 新
热 点 排 行
Js与CSS工具
代码转换工具

<