文档章节

Python 获取SVN 文件

姐夫
 姐夫
发布于 2012/08/14 14:28
字数 942
阅读 6485
收藏 11
背景:
 最近要从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

© 著作权归作者所有

姐夫
粉丝 49
博文 34
码字总数 8509
作品 0
浦东
程序员
私信 提问
加载中

评论(13)

大布小璠
如果下载的文件含有中文,也就是说url含有中文如何处理?求解。。。。
大布小璠

引用来自“ShadowFiend_gm”的评论

赞,搞定了,真的很棒。一开始提示401,后来按照7楼大大的方法,抓到了realm后,再替换后,果然成功了。
你好,你怎么抓到realm的?我的会报错惹
大布小璠
Traceback (most recent call last):
File "F:\practice\mysvn\401page.py", line 21, in <module>
getrealm = e.headers['www-authenticate']
AttributeError: 'URLError' object has no attribute 'headers'
>>>

这是怎么回事呀
ShadowFiend_gm
ShadowFiend_gm
赞,搞定了,真的很棒。一开始提示401,后来按照7楼大大的方法,抓到了realm后,再替换后,果然成功了。
shao
shao

引用来自“姐夫”的评论

引用来自“shao”的评论

用不了啊?什么情况

报什么错?

找不到要更新的文件
姐夫
姐夫 博主

引用来自“shao”的评论

用不了啊?什么情况

报什么错?
优雅先生
优雅先生
Mark下
http://bbs.chinaunix.net/thread-1238478-1-1.html
shao
shao
用不了啊?什么情况
姐夫
姐夫 博主

引用来自“leehark”的评论

引用来自“JeffYu”的评论

引用来自“leehark”的评论

Python有SVN模块可以试一下

我问了下度娘, 没找到, 你能告诉我是哪个模块吗?

问谷歌

谷歌果然强大
leehark
leehark

引用来自“JeffYu”的评论

引用来自“leehark”的评论

Python有SVN模块可以试一下

我问了下度娘, 没找到, 你能告诉我是哪个模块吗?

问谷歌
svn web管理之submin

1.安装所需软件包 shell>yum -y install subversion subversion-devel httpd moddavsvn apr-devel apr-until-devel neon-devel 2.下载安装pysvn shell>wget http://pysvn.barrys-emacs.org/......

蓝蝶飞扬
2014/06/23
292
0
更新hive元数据-python代码

因为之前平台部署的hive下的元数据是放在mysql中的,而mysql由设置了为了拉丁文,导致元数据都是乱码的。 于是开始了更新计划,办法就是用svn中的建表语句,提取出来写到元数据的mysql下,然...

yuppy_zyp
2017/11/14
0
0
python3 使用py2exe打包exe

py2exe在sourceforge 的下载只支持到2.7。 针对python3.0+的版本,需要自己编译。 1.下载源码 svn checkout svn://svn.code.sf.net/p/py2exe/svn/trunk py2exe-svn 2.编译环境 这里使用的是v...

zhangguotony
2014/08/12
3.4K
0
UBUNTU12下pyv8 的安装部骤

V8是谷歌开源的JavaScript引擎, 使用C++开发,并在谷歌浏览器中使用. 它可以独立运行, 也可以嵌入到任何C++应用程序中.pyv8 是 Python 的对 v8 引擎一个封装. 一、先安装boost 1. 下载boost...

清风徐不来
2013/03/08
327
0
每日备份JENKINS_HOME至SVN

每日备份JENKINS_HOME至版本控制系统SVN Jenkins是一个可扩展的开源的持续集成工具,也是当下最流行的持续集成工具。 易于安装(Easy installation) 易于配置(Easy configuration) 变更集支持...

donhui
2015/04/06
2.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库物理设计要做什么

选择合适的数据管理系统。 注意: 1、事务多时选Oracle。 2、SQLserver只支持在Windows下运行。 3、开发用的语言用的.net时,使用SQL server。 2、MySQL常用存储引擎 MySQL是开源数据库,只要...

sunnycat-薛定谔的猫
29分钟前
4
0
如何快速安全的插入千万条数据

前言 最近有个需求解析一个订单文件,并且说明文件可达到千万条数据,每条数据大概在20个字段左右,每个字段使用逗号分隔,需要尽量在半小时内入库。 思路 1.估算文件大小 因为告诉文件有千万...

ksfzhaohui
30分钟前
6
0
Could not build the precompiled application for the device.

Flutter报错:Could not build the precompiled application for the device. Xcode报错:Multiple commands produce '/Users/User/Library/Developer/Xcode/DerivedData/Runner-faibejedzvv......

RainOrz
40分钟前
3
0
UCOSII 任务调度笔记

ucosii是根据优先级进行调度的。对于任务,两种状态,就绪态和非就绪态,很多种情况下任务都会处于非就绪态,如:信号量,消息队列,邮箱,延迟,任务的挂起,调度锁等都会使程序进入非就绪态...

青春无极限
43分钟前
3
0
JS-4-if

本文转载于:专业的前端网站➼JS-4-if 流程控制结构 1 顺序结构 alert(10); alert(20); 2 分支结构(选择结构) * IF 2.1 if(条件) { 条件成立时执行的语句 } else { 条件不成立时执行的语句 ...

前端老手
44分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部