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 
(0)

相关推荐

  • SVN 安装教程之服务器和客户端

    SVN服务器和客户端安装教程 SVN是什么?有何用? SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion.说得简单一点SVN就是用于多个人共同开发同一个项目,共用资源的目的,就是说,打个比方,一个团队五个人,每人负责一个模块,五个人可以在实践各地不同角落,只要每次把做好的模块在上传到svn服务器之前更新一下就能达到项目自动完全整合,说起来就是团队开

  • Windows下SVNServer安装与配置详解

    本节讲解一下Windows下SVNServer安装和配置,主要包括安装,配置,测试,建库和导入等内容,下面是具体的介绍,希望对你的学习有所帮助. 1.配置环境 Windows2003ServerwithSP1 ApacheHTTPServerv2.0.55 Subversionv1.4.2 2.安裝ApacheHTTPServer 将安装目录修改为C:\ApacheGroup 默认是安装到C:\ProgramFiles\ApacheGroup目录下 安装后的目录结构如下: C:\ApacheGr

  • 使用AndroidStudio上传忽略文件至SVN Server的解决办法

    在同组项目进行共享时,容易把本地的配置文件比如*.iml等文件上传至共享服务器,这样会对队友造成巨大的麻烦,为了解决这个问题,可以使用下面方法解决,下面以上传到服务器的app.iml文件为例. 一.在AS的Setting中取消忽略文件后缀".iml": 二.在Windows目录中找到当前项目下的"app.iml"文件,右键该文件,选中TortoiseSVN,如下图2位置: 图2 在该项下选择Delete,删除该文件,如下图3所示: 图3 三.删除该文件后,在当前目录

  • windows下svn服务器快速搭建图文教程

    服务器端VISUALSVN SERVER 3.3.1 下载地址 https://www.visualsvn.com/server/download/  我们下载地址:http://www.jb51.net/softs/120928.html 客户端TortoiseSVN 1.8.13下载地址: https://www.visualsvn.com/visualsvn/download/tortoisesvn/  我们下载地址: http://www.jb51.net/softs/200039.ht

  • 图解SVN服务器搭建和使用(一)

    Subversion是一个自由/开源的版本控制系统,一组文件存放在中心版本库,记录每一次文件和目录的修改,Subversion允许把数据恢复到早期版本,或是检查数据修改的历史,Subversion可以通过网络访问它的版本库,从而使用户在不同的电脑上进行操作. Subversion是优秀的版本控制工具,其具体的的优点和详细介绍,这里就不再多说. 首先下载和搭建SVN服务器. 现在Subversion已经迁移到apache网站上了,下载地址: http://subversion.apache.org

  • Android Studio与SVN版本控制程序的协作使用指南

    AndroidStudio 的SVN 安装和使用方法与我以前用的其他IDE 都有很大差别,感觉特麻烦,网上相关资料很少,貌似现在 Git 比较流行,之前有用过 github 但是他只能是开源项目免费,下面总结最近自己安装和使用 SVN 的一些经验总结: 如果遇到 ignore 或其他设置无效等意外情况,可以尝试重启 androidstudio 或执行下 svn 的 update 试试 一.安装配置: 以前使用 ZendStudio 等等都是直接安装插件就可以了,但这里不行,需要自己独立安装带有

  • CentOS下搭建SVN服务器的步骤详解

    本文实例讲述了CentOS下搭建SVN服务器的步骤.分享给大家供大家参考,具体如下: 1.安装svn yum install -y subversion 2.验证安装是否成功 svnserve --version 3.创建svn版本库 mkdir svn svnadmin create svn/repo 注:这里的repo是版本库名称 4.配置svn 创建版本库后,在这个版本库的conf目录下会生成3个配置文件: [root@singledb conf]# pwd /root/svn/repo/

  • Ubuntu下定时提交代码到SVN服务器的Shell脚本分享

    有两个用途,一是偷懒不用去提交代码,二是在远程服务器上使用以作定期备份. 复制代码 代码如下: sudo gedit /etc/crontab 打开后加入这行 复制代码 代码如下: 0 * * * * my_user_name    my_script_path 表示每个整点以my_user_name身份执行my_script_path.这里最好是使用当前的用户名,修改掉默认的root,否则可能以root身份会提交失败.详情请询问百度crontab的用法. 然后script的内容为: 复制代码

  • Eclipse、MyEclipse 导入svn项目具体步骤

    SVN的使用,当然是提高工作效率,一个项目中每个人都负责一部分,然后在整合,这里就对Eclipse 和MyEclipse导入SVN项目,具体步骤做一个整理. 1.首先将上面的插件解压放在eclipse的dropins目录下 2.然后重启eclipse 将会提示 提示report usage of subclipse to subclipse team 点击OK 3.点击windows下的show View选择other 搜索svn 选择svn资源库 4.空白位置右键新建->资源库位置 (在svn

  • SVN无法提交出现 Can't set file "/db/txn_current" read-write :拒绝访问

    SVN无法提交 Can't set file "/db/txn_current" read-write :拒绝访问 原因: 在commit文件时,svn服务器被强行关闭了,导致版本信息文件写入不成功,重启后读取信息就不正确了! 解决办法: 重新将正确的版本信息写入到current.txn-current文件. 1.明确版本号(建议回滚一个版本,例如300,取299,以防最新的commit内容也不正常) 并删除最新版本(\Repositories\ProjectName\db\revpr

  • Eclipse 安装 SVN 在线插件教程

    Eclipse 安装 SVN 的在线插件               SVN 对用Eclipse 开发java 语言是很有帮助的,不同的项目功能由不同的负责人开发,最后在整理合并,省心省事. 这是继上次svn 客户端与服务器安装后的如何在Eclipse 环境下在线安装 SVN插件,我的Eclipse版本是4.50 SVN的在线安装 下面为大家提供SVN 的在线安装教程.下面是安装的 详细过程: 1.打开Eclipse的help的Install New Software 其中http://subc

  • Linux svn的搭建与使用(图文详解)

    Linunx svn的搭建与使用........纯手打的..具体入下: 一.安装前的准备 1.1 配置yum 库 1)加载光盘 2)进入/etc/yum.repo.d目录 3)复制"rhel-debuginfo.repo"为"my.repo" 4)修改my.repo文件 5)修改红框标注部分 修改完毕保存退出:wq 1.2 安装telnet 远程连接工具 1)用yum命令安装远程工具. 2)安装成功. 3)用vi命令编辑位于/etc/xinetd.d下的telnet

  • svn 清理失败 (cleanup 失败) 的快速解决方法

    1.cmd指令,进入.svn目录,找到wc.db文件 sqlite 3 打开 2. 对 svn源代码目录 右键, clean up, 稍等1至5分钟左右,然后会提示 清理成功 以上就是小编为大家带来的svn 清理失败 (cleanup 失败) 的快速解决方法全部内容了,希望大家多多支持我们~

随机推荐