- Python 获取SVN 文件
背景:
最近要从SVN 服务器的一个文件夹里面check out 八十几个文件,但是这个文件夹比较大,里面有几千个文件。
由于服务器在印度,check out 非常缓慢而且经常莫名其妙地断开连接。
(吐槽下:谁在维护这个服务器啊,服务器太慢啦,为什么把这么多文件放在同一个文件夹啊)
于是我放弃将整个文件夹check out出来的想法,准备单独check out 这八十几个文件。
平时取单个文件的时候,我是通过浏览器访问SVN服务器,使用浏览器的"文件另存为"功能来下载文件,
但是这八十几个文件一个"另存为",又太... 好吧,我承认我有点懒...
于是我写了这个Python脚本...
核心思想:
使用urllib2模块来模拟浏览器访问SVN服务器.
SVN服务器是要校验权限的,因此使用HTTPBasicAuthHandler来添加用户名和密码,进行授权.
为了维护的方便,将要check out的文件列表放在一个文本文件里面,每一个文件占一行.
将需要check out文件所在文件夹的URL(baseurl),用户名(user),密码(passwd)和存储文件列表的文件名称(fileList)放在配置文件里面.
另外做了几个exception的处理: 文件不存在,用户名 密码 错误 和 URL 错误.
要注意的是 HTTPError 是 URLError 的子集, 因此要先捕获HTTPError, 不然错误总是被URLError 捕获.
代码结构:
|__GetFilesFromSVN.py
|__config.ini
|__fileList.txt
代码:
GetFilesFromSVN.py
001
#----------------------------------------------
002
# Author : Jeff Yu
003
# Date : 2012-8-13
004
# Function : get files from SVN
005
#----------------------------------------------
006
007
#----------------------------------
008
# Step1: Get INFO
009
#----------------------------------
010
import sys,ConfigParser
011
012
try:
013
configFile = open("config.ini","r")
014
except IOError:
015
print "config.ini is not found"
016
raw_input("")
017
sys.exit()
018
019
config = ConfigParser.ConfigParser()
020
config.readfp(configFile)
021
configFile.close()
022
023
# get baseurl
024
try:
025
baseurl = config.get("INFO","baseurl")
026
027
# incase last "/" is missing in baseurl
028
baseurl = baseurl.rstrip("/")
029
baseurl = "%s/"%baseurl
030
except ConfigParser.NoOptionError:
031
print "baseurl is not found under section INFO in config.ini."
032
raw_input("")
033
sys.exit()
034
035
# get user
036
try:
037
user = config.get("INFO","user")
038
except ConfigParser.NoOptionError:
039
meg = "user is not found under section INFO in config.ini."
040
raw_input("")
041
sys.exit()
042
043
# get passwd
044
try:
045
passwd = config.get("INFO","passwd")
046
except ConfigParser.NoOptionError:
047
meg = "passwd is not found under section INFO in config.ini."
048
raw_input("")
049
sys.exit()
050
051
# get fileList
052
try:
053
fileList = config.get("INFO","fileList")
054
except ConfigParser.NoOptionError:
055
meg = "fileList is not found under section INFO in config.ini."
056
raw_input("")
057
sys.exit()
058
059
060
#----------------------------------
061
# Step2: Auth
062
#----------------------------------
063
import urllib2
064
realm = "Subversion Repositories"
065
auth = urllib2.HTTPBasicAuthHandler()
066
auth.add_password(realm, baseurl, user, passwd)
067
opener = urllib2.build_opener(auth, urllib2.CacheFTPHandler)
068
urllib2.install_opener(opener)
069
070
071
#----------------------------------
072
# Step3: Create Folder
073
#----------------------------------
074
import os
075
folderName = "svnFile"
076
if not os.path.exists(folderName):
077
os.mkdir(folderName)
078
079
080
#----------------------------------
081
# Step4: Get Files
082
#----------------------------------
083
fr = open(fileList,'r')
084
for i in fr:
085
i = i.strip("\n")
086
i = i.strip(" ")
087
088
# ignore the blank line
089
if i != "":
090
url = "%s%s"%(baseurl,i)
091
092
try:
093
data = urllib2.urlopen(url)
094
095
fw = open("%s/%s"%(folderName,i),'w')
096
fw.write(data.read())
097
fw.close()
098
099
print "Download: %s."%i
100
101
except urllib2.HTTPError, e:
102
# HTTPError is a subclass of URLError
103
# need to catch this exception first
104
mesg = str(e).split(" ")
105
errCode = mesg[2].rstrip(":")
106
107
if errCode == "401":
108
# HTTP Error 401: basic auth failed
109
print "Can not login in, please check the user and passwd in config.ini."
110
break
111
elif errCode == "404":
112
# HTTP Error 404: Not Found
113
print "Not Found: %s"%i
114
else:
115
print e
116
print "Failed to download %s"%i
117
118
except urllib2.URLError:
119
# 1.SVN server is down
120
# 2.URL is not correct
121
print "Please check SVN Server status and baseurl in config.ini."
122
break
123
124
fr.close()
125
raw_input("")
config.ini
1
[INFO]
2
baseurl = https://xxx/xxx/xxx/xxx/
3
user = 用户名
4
passwd = 密码
5
fileList= fileList.txt
fileList.txt
1
aaaaa.txt
2
bbbbb.txt
3
ccccc.txt
使用方法:
1.配置config.ini,配置好需要check out文件所在文件夹的URL(baseurl),用户名(user),密码(passwd)和存储文件列表的文件名称(fileList)
2.将要check out的文件列表放在文本文件里面(fileList.txt),每一个文件占一行.
3.双击GetFilesFromSVN.py运行,下载的文件将放在当前文件夹下用过名为svnFile的文件夹里面.
PS:获取realm
在这个脚本中,我hardcode了一段代码(064行) realm = "Subversion Repositories"
关于这个realm,可以使用下面脚本获取:
01
import urllib2
02
import sys
03
04
url = '这里写URL'
05
06
username = '这里写用户名'
07
password = '这里写密码'
08
09
req = urllib2.Request(url)
10
try:
11
handle = urllib2.urlopen(req)
12
except IOError, e:
13
pass
14
else:
15
print "This page isn't protected by authentication."
16
sys.exit(1)
17
18
getrealm = e.headers['www-authenticate']
19
print getrealm