最近没啥事,就用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

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

  1. linux运维自动化脚本,linux运维自动化shell脚本小工具

    linux运维shell 脚本小工具,如要分享此文章,请注明文章出处,以下脚本仅供参考,若放置在服务器上出错,后果请自负 1.检测cpu剩余百分比 #!/bin/bash #Inspect CPU # ...

  2. linux 命令行与shell脚本编程大全

    linux 命令行与shell脚本编程大全 第一章 Linux LiveCD就是从cd读取的系统,由于没法将数据写入到cd,所以一旦重启,之前操作过后的一切数据都会丢失. 第二章 第三章 1.man手 ...

  3. Linux命令行与shell脚本编程大全:第2版

    <Linux命令行与shell脚本编程大全:第2版> 基本信息 作者: (美)布卢姆(Blum,R.) 布雷斯纳汉(Bresnahan.C.) [作译者介绍] 译者: 武海峰 丛书名: 图 ...

  4. Linux_《Linux命令行与shell脚本编程大全》第十章学习总结

    时间:2017年08月24日星期四 说明:本文部分内容均摘取自书籍<Linux命令行与shell脚本编程大全>,版权归原作者所有.<Linux命令行与shell脚本编程大全>( ...

  5. 《Linux命令行与Shell脚本编程大全第2版.布卢姆》pdf

    下载地址:网盘下载 内容简介  · · · · · · 本书是一本关于Linux 命令行与shell 脚本编程的全面教程.全书分为四部分:第一部分介绍Linuxshell 命令行:第二部分介绍shel ...

  6. 《linux命令行与shell脚本编程大全》第三版 - 核心笔记(3/4):函数与图形化脚本

    <linux命令行与shell脚本编程大全> 全书4部分: ☆ [1]linux命令行(1-10章) ☆ [2]shell脚本编程基础(11-16章) ☆ [3]高级shell脚本编程(1 ...

  7. linux脚本求命令行上整数和,《Linux命令行与shell脚本编程大全》 第二十二章 学习札记...

    <Linux命令行与shell脚本编程大全> 第二十二章 学习笔记 第二十二章:使用其他shell 什么是dash shell Debian的dash shell是ash shell的直系 ...

  8. Linux下如何执行Shell脚本

    Linux下如何执行Shell脚本 Linux下你可以有两种方式执行Shell脚本: 1.用shell程序执行脚本:根据你的shell脚本的类型,选择shell程序,常用的有sh,bash,tcsh等 ...

  9. Linux下eclipse中shell脚本编程环境的搭建

    注意:本文所用到的linux发行版是fedora 15.如果用fedora 15以上的版本可能会有问题.至于解决方案或者是搭建方法我会尽量抽出时间写一篇新的博客... 本文主要是介绍在linux平台下 ...

最新文章

  1. Material-UI使用
  2. windows cmd post请求_cmd命令集合
  3. 软件测试中的存根程序
  4. 创业者ALL IN区块链的5条建议
  5. Flutter RichText 使用案例解析 Flutter WidgetSpan 设置图片显示
  6. php jquery进度条,如何实现jQuery进度条效果
  7. ruby Enumerator::lazy
  8. jQuery 元素移除empty() remove()与detach()的区别?
  9. 表格制作模块xlwt
  10. 《HTML与CSS入门经典(第8版)》——导读
  11. MySQL 聚合函数以及 优先级
  12. SkinSharp函数文档
  13. 网易云音乐android变臃肿,网易云音乐版权少,为什么用户还能突破8亿??
  14. Centos8下nginx源码编译安装
  15. matlab求解指派问题最优解的函数
  16. 虚拟usb打印机服务器,usb打印机服务器 云盘
  17. JUCE学习笔记05-音频输出基础(白噪)
  18. 配置微信公众号之公众号绑定小程序
  19. mysql如何提高查询效率_MySQL调优系列——如何提高MySQL的查询效率
  20. python元组定义_python定义元组

热门文章

  1. java socket程序_java 简单的java socket程序
  2. 千元显卡玩转百亿大模型,清华推出工具包BMInf让模型推理轻而易举
  3. Github 本周最热的 10 款「机器学习」开源项目 | PaperDaily #27
  4. Numpy-随机生成以及矩阵的运算
  5. ant react 上传_react之ant design mobile如何只能上传一张图片
  6. python 支付宝个人账单_解析2018年度三大用户数据报告——网易云音乐、支付宝、微信...
  7. 【Java代码】使用双冒号 :: 简洁代码及方法引用(静态方法+构造方法+实例方法+函数式编程举例)
  8. springboot Field userInfoInter in com.**.** required a bean of type ‘***.**‘
  9. 启动设备ar1失败 错误代码2_设备启动系列(2)寿力空压机
  10. Spring Boot-切换嵌入式Servlet容器