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

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

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

#!/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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值