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. 【C++】STL常用容器总结之五:双端队列deque

    6.双端队列deque 所谓的deque是”double ended queue”的缩写,双端队列不论在尾部或头部插入元素,都十分迅速.而在中间插入元素则会比较费时,因为必须移动中间其他的元素.双端队 ...

  2. Unity3d-Particle System系统的学习(一)

    最近看了下Unity3d的粒子系统的相关视频,并且动手操作了下,感觉自己的美工技能又增进了下(开个小玩笑),发现粒子系统所需要记忆的东西还是有点多的. 所以为了不让自己遗忘某些知识点,我准备发布成博客 ...

  3. spring 5.0.1.RELEASE官方任然不支持velocity(平台升级)

    官方说明: Dear Spring community, It is my pleasure to announce that Spring Framework 5.0.1 is available ...

  4. Android之设备唯一识别

    唯一Android的设备ID String androidId = Settings.Secure.getString(getContentResolver(),Settings.Secure.AND ...

  5. fabric-ca-client

    fabric-ca-client enroll -u http://admin:adminpw@localhost:7054 /root/.fabric-ca-client:总用量 12-rwxr-x ...

  6. yolo源码解析(二)

    五 读取数据pascal_voc.py文件解析 我们在YOLENet类中定义了两个占位符,一个是输入图片占位符,一个是图片对应的标签占位符,如下: #输入图片占位符 [NONE,image_size, ...

  7. 管道命令和xargs的区别

    一直弄不懂,管道不就是把前一个命令的结果作为参数给下一个命令吗,那在 | 后面加不加xargs有什么区别NewUserFF 写道:懒蜗牛Gentoo 写道:管道是实现“将前面的标准输出作为后面的标准输 ...

  8. 样条之EHMT插值函数

    核心代码: ////////////////////////////////////////////////////////////////////// // 埃特金插值 ////////////// ...

  9. 命令行调用dubbo远程服务

    命令行调用dubbo远程服务 telnet远程连接到dubbo telnet 127.0.0.1 20880 查看提供服务的接口 dubbo>ls com.test.service.TestIn ...

  10. HDU—— 5159 Building Blocks

    Problem Description After enjoying the movie,LeLe went home alone. LeLe decided to build blocks. LeL ...