Python 獲取SVN 文件

openkk 12年前發布 | 64K 次閱讀 Python Subversion 版本控制系統

背景:
 最近要從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

#----------------------------------------------
# Author    : Jeff Yu
# Date      : 2012-8-13
# Function  : get files from SVN
#----------------------------------------------

#----------------------------------
# Step1: Get INFO
#----------------------------------
import sys,ConfigParser

try:
    configFile = open("config.ini","r")
except IOError:
    print "config.ini is not found"
    raw_input("")
    sys.exit()

config = ConfigParser.ConfigParser()
config.readfp(configFile)
configFile.close()

# get baseurl
try:
    baseurl = config.get("INFO","baseurl")

    # incase last "/" is missing in baseurl
    baseurl = baseurl.rstrip("/")
    baseurl = "%s/"%baseurl
except ConfigParser.NoOptionError: 
    print "baseurl is not found under section INFO in config.ini."
    raw_input("")
    sys.exit()

# get user
try: 
    user = config.get("INFO","user")
except ConfigParser.NoOptionError:   
    meg = "user is not found under section INFO in config.ini."
    raw_input("")
    sys.exit()

# get passwd    
try:
    passwd = config.get("INFO","passwd")
except ConfigParser.NoOptionError:
    meg = "passwd is not found under section INFO in config.ini."
    raw_input("")
    sys.exit()

# get fileList   
try: 
    fileList = config.get("INFO","fileList")
except ConfigParser.NoOptionError:
    meg = "fileList is not found under section INFO in config.ini."
    raw_input("")
    sys.exit()


#----------------------------------
# Step2: Auth
#----------------------------------
import urllib2
realm = "Subversion Repositories"
auth = urllib2.HTTPBasicAuthHandler()
auth.add_password(realm, baseurl, user, passwd)
opener = urllib2.build_opener(auth, urllib2.CacheFTPHandler)
urllib2.install_opener(opener)


#----------------------------------
# Step3: Create Folder
#----------------------------------
import os
folderName = "svnFile"
if not os.path.exists(folderName):
    os.mkdir(folderName)


#----------------------------------
# Step4: Get Files
#----------------------------------
fr = open(fileList,'r')
for i in fr:
    i = i.strip("\n")
    i = i.strip(" ")

    # ignore the blank line
    if i != "":
        url = "%s%s"%(baseurl,i)

        try:
            data = urllib2.urlopen(url)

            fw = open("%s/%s"%(folderName,i),'w')
            fw.write(data.read())
            fw.close()

            print "Download: %s."%i

        except urllib2.HTTPError, e:
            # HTTPError is a subclass of URLError
            # need to catch this exception first
            mesg = str(e).split(" ")
            errCode = mesg[2].rstrip(":")

            if errCode == "401":
                # HTTP Error 401: basic auth failed
                print "Can not login in, please check the user and passwd in config.ini."
                break
            elif errCode == "404":
                # HTTP Error 404: Not Found
                print "Not Found: %s"%i
            else:
                print e
                print "Failed to download %s"%i

        except urllib2.URLError:
            # 1.SVN server is down 
            # 2.URL is not correct
            print "Please check SVN Server status and baseurl in config.ini."
            break

fr.close()
raw_input("")

config.ini

[INFO]
baseurl = https://xxx/xxx/xxx/xxx/
user    = 用戶名
passwd  = 密碼
fileList= fileList.txt

fileList.txt

aaaaa.txt
bbbbb.txt
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,可以使用下面腳本獲取:

import urllib2
import sys

url = '這里寫URL'

username = '這里寫用戶名'
password = '這里寫密碼'

req = urllib2.Request(url)
try:
    handle = urllib2.urlopen(req)
except IOError, e:
    pass
else:
    print "This page isn't protected by authentication."
    sys.exit(1)

getrealm = e.headers['www-authenticate']
print getrealm

參考:http://bbs.chinaunix.net/thread-1238478-1-1.html

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!