1 #!/bin/bash/python
2 # -*-coding:utf-8-*-
3 #svn统计url代码行数脚本,过滤空行,不过滤注释。
4
5 import subprocess,os,sys,time,re,shutil
6 from optparse import OptionParser
7
8 #初始化temp文件:
9 FOLDER = "/tmp/temp_cm_svn_resource_total/"
10 #初始化设置私密配置文件:
11 PRIVATE_FILE = "/home/wwl/conf/wwl_private.conf"
12 #Exclude条件:
13 EXCLUDE = r"\.(txt|dic|properties|xml|config|log|key|pem|crt|per|sql|prefs|ver|gif|png|jpg|war|jar|swf|)$"
14
15 #清理temp文件夹
16 def clean():
17 if os.path.exists(FOLDER):
18 shutil.rmtree(FOLDER)
19 print "清理temp文件夹成功。"
20 else:
21 print "temp文件夹不存在。"
22
23 #创建temp文件夹
24 def mkdir():
25 #os.mkdir(FOLDER)
26 os.makedirs(FOLDER)
27 print "创建temp文件夹成功。"
28
29 #读取配置文件,私密信息
30 def get_conf_private():
31 if os.path.isfile(PRIVATE_FILE):
32 with open(PRIVATE_FILE,'r') as private:
33 for line in private:
34 if line.startswith('SVN_USERNAME'):
35 username = line.split('=')[1]
36 elif line.startswith('SVN_PASSWORD'):
37 passwd = line.split('=')[1]
38 return (username,passwd)
39 else:
40 print "svn配置文件不存在,联系值班CM!!!"
41 sys.exit(1)
42
43 #检验svn的用户名、密码和url是否正确
44 def svn_check_url_u_p(uname,pword,url,temp_svninfo):
45 cmd = "svn info --no-auth-cache --non-interactive --username='%s' --password='%s' %s >%s" %(uname,pword,url,temp_svninfo)
46 p = subprocess.Popen(cmd,shell=True,stderr=subprocess.PIPE,stdout=subprocess.PIPE)
47 (stderr_test,stdout_test) = p.communicate()
48 if len(stderr_test) == 0:
49 print "url正确,svn账号密码正确:",url
50 elif 'authorization failed' in stderr_test:
51 print "svn账号密码不正确,请联系值班CM!!!"
52 sys.exit(1)
53 elif 'Not a valid URL' in stderr_test:
54 print "url错误,请检查配置:",url
55 sys.exit(1)
56
57 #获取svn list url文件 并处理目录文件:
58 def svn_list(uname,pword,url,temp_svnlist):
59 cmd = "svn list -R --no-auth-cache --non-interactive --username='%s' --password='%s' %s |grep -v '\/$' >>%s" %(uname,pword,url,temp_svnlist)
60 p = subprocess.Popen(cmd,shell=True,stderr=subprocess.PIPE,stdout=subprocess.PIPE)
61 (stderr_test,stdout_test) = p.communicate()
62 if len(stderr_test) == 0:
63 print "svn list Success..."
64 else:
65 print "svn list Error...请联系值班CM!!!"
66 sys.exit(1)
67
68 #处理svn list文件:
69 def deal_with_svnlist(uname,pword,ufile):
70 cmd = "svn blame --no-auth-cache --non-interactive --username='%s' --password='%s' %s |awk 'NF>2' |wc -l" %(uname,pword,ufile)
71 p = subprocess.Popen(cmd,shell=True,stderr=subprocess.PIPE,stdout=subprocess.PIPE)
72 (stderr_test,stdout_test) = p.communicate()
73 if stdout_test.startswith("Skipping binary file"):
74 print "Skipping binary file : ",ufile
75 return 0
76 else:
77 return int(stdout_test)
78
79 #判断过滤条件:
80 def is_ignore_svn(file_name):
81 ignore_file_pattern_svn = EXCLUDE
82 match = re.search(ignore_file_pattern_svn,file_name)
83 if match == None:
84 return False
85 else:
86 return True
87
88 def main():
89 #获取当前时间戳:
90 print "####******Begin testing at: ",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())," ********####"
91 now_time = time.strftime("%Y%m%d%H%M%S",time.localtime())
92 clean()
93 mkdir()
94 temp_svninfo = os.path.join(FOLDER,"temp_svninfo."+now_time)
95 temp_svnlist = os.path.join(FOLDER,"temp_svnlist."+now_time)
96
97 #获取命令行参数并赋值给变量
98 parser = OptionParser()
99 parser.add_option("-o",dest="url",default="",help="-o URL svn URL地址")
100 parser.add_option("-u",dest="username",default=get_conf_private()[0].strip(),help="-u USER_NAME svn服务器用户名")
101 parser.add_option("-p",dest="passwd",default=get_conf_private()[1].strip(),help="-p PASSWD svn服务器密码")
102 parser.add_option("-f",dest="judge",default="N",help="-f yes|YES|Y|y 是否打印文件列表")
103
104 (options,args)=parser.parse_args()
105
106 url = options.url.strip()
107 #判断url参数是否赋值:
108 if len(url) == 0:
109 print "url不能为空,请检查输入!!!"
110 sys.exit(1)
111
112 #检查url是否正确,svn账号密码是否正确
113 svn_check_url_u_p(options.username,options.passwd,url,temp_svninfo)
114
115 #获取svn list url文件 并处理目录文件:
116 svn_list(options.username,options.passwd,url,temp_svnlist)
117
118 #初始化赋值:
119 AddedLineNum = 0
120 AddFileNum = 0
121 ExcludeFileNum = 0
122
123 #是否显示增加文件:
124 if options.judge in ['Y','YES','y','yes']:
125 with open(temp_svnlist,'r') as svnlist:
126 print "本次增加的文件:"
127 for file in svnlist:
128 print file
129 else:
130 print "本次跳过的文件:"
131
132 #处理svnlist文件:
133 with open(temp_svnlist,'r') as svnlist:
134 for file in svnlist:
135 AddFileNum += 1
136 if is_ignore_svn(file):
137 print "Skipping file : ",file
138 ExcludeFileNum += 1
139 else:
140 ufile = os.path.join(url,file).strip()
141 AddedLineNum += deal_with_svnlist(options.username,options.passwd,ufile)
142
143 clean()
144
145 print "===============代码行差异为:=================\n"
146 print "代码行总数 = ",AddedLineNum," 行"
147 print "全部文件总数 = ",AddFileNum," 个\n"
148 print "排除文件总数 = ",ExcludeFileNum," 个\n"
149 print "=============代码行统计完成!================="
150 print "####******End of testing at: ",time.strftime("%Y-%m-%d %H:%M:%S",time.localtime())," **********####"
151 print "%s%d" %('a',AddedLineNum)
152
153 if __name__ == "__main__":
154 main()
wwl_private.conf文件用于存放默认的svn账号密码:(如果执行python的时候没有输入-u -p 脚本调用此私密配置)
#(username)
SVN_USERNAME=wwl
#(password)
SVN_PASSWORD=wwl

使用环境:python2.7、svn1.6、Ubuntu13.04

使用命令:python xxx.py -o "url"  -f y -u "name" -p "password"

背景说明:统计一个svn的url代码总行数其实也可以使用前面那个diff脚本,其中old_url设置为一个空url。

但是有2点不足:

      1.svn diff只能在同一个物理库中进行,如果有多个物理库需要对应建多个空url;

      2.如果url里面包含的代码非常多,使用diff脚本生成的temp文件将会很庞大,解析temp文件很慢甚至卡死。

脚本解析:使用svn info 命令判断url是否正确,svn用户名、密码是否正确;

       使用svn list 输出此url包含的所有文件名到temp文件并排除以'/'结尾的文件夹;

使用svn blame 遍历所有文件并计算非空行数,排除二进制文件;

设置过滤器EXCLUDE,过滤指定文件不统计;

过滤空行增删,不过滤注释;

PS:如果使用的是svn1.7版本:检验svn用户名、密码和url替换成下面代码

 1 #检验svn的用户名、密码和url是否正确
2 def svn_check_url_u_p(uname,pword,url,temp_svninfo):
3 cmd = "svn info --no-auth-cache --non-interactive --username='%s' --password='%s' %s >%s" %(uname,pword,url,temp_svninfo)
4 p = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
5 (stderr_test,stdout_test) = p.communicate()
6 if len(stderr_test) == 0:
7 print "url正确,svn账号密码正确:",url
8 elif 'E170001' in stderr_test:
9 print "svn账号密码不正确,请联系值班CM!!!"
10 sys.exit(1)
11 elif 'E000002' in stderr_test:
12 print "url错误,请检查配置:",url
13 sys.exit(1)

Python-统计svn代码总行数的更多相关文章

  1. 编写Java脚本统计工程代码总行数

    在新公司工作将近一年了,一直独自一人负责服务端集群的运维和代码的编写.不知不觉从一个Project发展到了七八个Project. 看着越来越多的代码,今天突然想统计一下一共写了多少代码.[这里只统计完 ...

  2. 使用PYTHON统计项目代码行数

    目录 一 使用PYTHON统计项目代码行数 二 应用实例 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 使用PYTHON统计项目代码行数 遇到一个非常小的需求:统计一个项目里头的各类源代码 ...

  3. 我的Android进阶之旅------>Android Studio使用statistics插件统计项目代码总行数

    今天公司说要统计一下项目总共了多少行代码,于是上网看了一下使用statistic插件可以统计代码总行数,下面给大家分享一下 ! 1.下载[statistic]插件 首先当然要把名为[statistic ...

  4. vs2010统计项目代码总行数

    按CTRL+SHIFT+F (Find in files),勾上支持正则表达式,然后输入搜索内容: ^:b*[^:b#/]+.*$ 找到最后一行就是结果

  5. VS 2017 统计项目代码总行数

    编辑 → 查找和替换 → 在文件中的查找,打开查找窗口 填入正则表达式  ^b*[^:b#/]+.*$ 查找范围选“整个解决方案”,勾选上“使用正则表达式” 如果要限制文件类型,就填上要查找的文件类型 ...

  6. python统计代码总行数(代码行、空行、注释行)

    我们在工作或学习代码的过程中,经常会想知道自己写了多少行代码,今天在项目环境写了个脚本统计了项目代码的数量. 功能: 1.统计代码总行数 2.统计空行数 3.统计注释行数 # coding=utf-8 ...

  7. 基于Gitlab统计代码行--统计所有仓库、所有提交人的代码总行数(新增加-删除)

    公司绩效考核要求,统计GITLAB仓库所有人提示有效代码行业 脚本1: 统计所有仓库.所有提交人的代码总行数(新增加-删除) 脚本2: 统计所有仓库.所有提交人的代码提交汇总与删除汇总 脚本3: 统计 ...

  8. iOS 统计App 的代码总行数

    打开Terminal,cd 到项目的根目录下,输入以下命令 find . -name "*.m" -or -name "*.mm" -or -name &quo ...

  9. VS2012 利用正则统计项目代码行数

    原文:VS2012 利用正则统计项目代码行数 #开头和/开头或者空行都不计入代码量,  搜索出来以后最后一行就是代码行数了:

随机推荐

  1. 每天一个linux命令-lsof -i :port命令

    使用lsof -i :port就能看见所指定端口运行的程序,同时还有当前连接. losf -i:port | wc -l,统计端口连接数

  2. ArcGIS教程:树状图

    摘要 构造可显示特征文件里连续合并类之间的属性距离的树示意图(树状图). 使用方法 · 输入特征文件必须採用预定的特征文件格式. 特征文件可使用 Iso 聚类或创建特征工具来创建.该文件必须至少包括两 ...

  3. 《学习R》

    <学习R> 基本信息 原书名:Learning R 原出版社: O'Reilly Media 作者: (美)Richard Cotton 译者: 刘军 丛书名: 图灵程序设计丛书 出版社: ...

  4. 相关性系数及其python实现

    参考文献: 1.python 皮尔森相关系数 https://www.cnblogs.com/lxnz/p/7098954.html 2.统计学之三大相关性系数(pearson.spearman.ke ...

  5. PHP工程师笔试题

    PHP工程师笔试题 提示:请将答案写在另外一张空白纸上,并在30分钟内完成. PHP 请写出include.require.include_once.require_noce的区别. include是 ...

  6. Sql Server简单加密与解密 【转】

    前言: 在SQL Server 2005和SQL Server 2008之前.如果希望加密敏感数据,如财务信息.工资或身份证号,必须借助外部应用程序或算法.SQL Server 2005引入内建数据加 ...

  7. Cookie常用的优化方式

    我们知道,对于每一个http请求,无论是动态的网页aspx,还是jsp,还是/user/add这种MVC模式的URL,还是CSS或者JS文件,每一个http请求都会带着在硬盘上存有的跟这个域相关存有的 ...

  8. PHPExcel-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护

    首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPExcel.php和PHPExcel的文件夹,这个类文件和文件夹是我们需要的,把class ...

  9. git版本还原

    本地还原 在确认需要进行版本还原以后, 打开GIT BASH 输入: git reset --hard ad76ebf5ba8fb12bc38300ee99db478b332c1f7b 此操作成功以后 ...

  10. tensorflow基本操作介绍

    1.tensorflow的基本运作 为了快速的熟悉TensorFlow编程,下面从一段简单的代码开始: import tensorflow as tf #定义‘符号’变量,也称为占位符 a = tf. ...