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. 从CRITS发展历史解读结构框架

    Michael Goffin 是MITRE公司的一名员工,在其博客中介绍了Crits 的发展历史.原文地址例如以下: CRITs: Collaborative Research Into Threat ...

  2. SharePoint 修改项目的new图标显示天数

    前言 最近有这么个需求,用户需要修改新建项目前面的new图标的显示天数,查了很久,发现有powershell命令或者stsadm命令可以,分享给大家. PowerShell命令 $wa = Get-S ...

  3. hdu 2049 不easy系列之(4)——考新郎

    不easy系列之(4)--考新郎 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  4. 《RESTful Web APIs中文版》

    <RESTful Web APIs中文版> 基本信息 原书名:RESTful Web APIs 原出版社: O'Reilly Media 作者: Leonard Richardson    ...

  5. [Android Pro] AndroidStudio IDE界面插件开发(进阶篇之Editor)

    转载请注明出处:[huachao1001的专栏:http://blog.csdn.net/huachao1001/article/details/53885981] 我们开发AndroidStudio ...

  6. ArcEngine C++ 10 程序的运行环境,ArcEngine RT的授权

    以前我一直以为 必须安装 Arcgis Desktop才可以授权,发现我错了,原来是这个样子的. 一.安装License manager,并授权许可server.txt 当然这个license也可以安 ...

  7. Useful JVM Flags – Part 8 (GC Logging)

    The last part of this series is about garbage collection logging and associated flags. The GC log is ...

  8. Linux命令之du

    Linux du命令用来查看文件或目录所占用磁盘空间的大小(Summarize disk usage of each FILE, recursively for directories.) 语法: d ...

  9. SEM(搜索引擎营销)

    ylbtech-Miscellaneos:SEM(搜索引擎营销) 搜索引擎营销:英文Search Engine Marketing ,我们通常简称为“SEM”.就是根据用户使用搜索引擎的方式利用用户检 ...

  10. 【deep learning学习笔记】注释yusugomori的DA代码 --- dA.h

    DA就是“Denoising Autoencoders”的缩写.继续给yusugomori做注释,边注释边学习.看了一些DA的材料,基本上都在前面“转载”了.学习中间总有个疑问:DA和RBM到底啥区别 ...