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

 更新时间:2015年06月29日 09:01:37   投稿:junjie  
这篇文章主要介绍了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 

相关文章

  • shell实现贪吃蛇的示例代码

    shell实现贪吃蛇的示例代码

    本文主要介绍了shell实现贪吃蛇的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • Linux输出内容到指定文件的解决方案

    Linux输出内容到指定文件的解决方案

    这篇文章主要介绍了Linux输出内容到指定文件的解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Linux命令行循环执行shell命令

    Linux命令行循环执行shell命令

    这篇文章主要介绍了Linux命令行,循环执行shell命令的相关知识,主要包括死循环,普通计数循环,以及Linux shell循环命令 while死循环的用法,需要的朋友可以参考下
    2023-01-01
  • 一个简单的防CC攻击Shell脚本分享

    一个简单的防CC攻击Shell脚本分享

    这篇文章主要介绍了一个简单的防CC攻击Shell脚本分享,主要原理是分析apache或者nginx的访问日志,对大量访问的IP加入iptables进行禁止访问,需要的朋友可以参考下
    2014-06-06
  • linux BASH shell下设置字体及背景颜色

    linux BASH shell下设置字体及背景颜色

    这篇文章主要介绍了linux BASH shell下设置字体及背景颜色的方法,需要的朋友可以参考下
    2014-04-04
  • 给定链表中间节点指针,删除中间节点的方法

    给定链表中间节点指针,删除中间节点的方法

    本文实现算法来删除单链表中的中间节点,只知道指向该节点中间节点的指针,大家可以参考使用
    2013-11-11
  • git 删除分支和回滚的实例详解

    git 删除分支和回滚的实例详解

    这篇文章主要介绍了git 删除分支和回滚的实例详解的相关资料,希望通过本文大家能理解掌握这部分内容,需要的朋友可以参考下
    2017-09-09
  • Shell脚本解压rpm软件包

    Shell脚本解压rpm软件包

    这篇文章主要介绍了Shell脚本解压rpm软件包,用来解压后提取某个包中文件,需要的朋友可以参考下
    2014-06-06
  • Linux监控cpu以及内存使用情况之top命令(详解)

    Linux监控cpu以及内存使用情况之top命令(详解)

    下面小编就为大家带来一篇Linux监控cpu以及内存使用情况之top命令(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • shell脚本转发80端口数据包给Node.js服务器

    shell脚本转发80端口数据包给Node.js服务器

    开发基于Node.js的WEB应用很方便,但是服务端口问题很蛋疼,由于Linux内核规定普通用户只能使用大于1024的端口号,所以使用普通用户运行Node.js服务就不能监听80端口
    2014-03-03

最新评论