支持读写操作的面向对象Subversion API
项目描述
提供了一个替代的Pythonic r/w API,用于Subversion,该API利用底层的libsvn API,并具有自动内存管理功能,支持svn (1.0-1.5)以及事务处理。主要设计目标是使从Python中操作Subversion变得有趣且简单。自2002年以来(svn 0.1x系列),它一直在使用中。
它直接在Subversion存储库层操作,并需要直接访问存储库的文件系统。
ore.svn采用Apache公共许可证(2.0)授权
安装
要安装此软件包,您必须安装Python Subversion绑定。虽然ore.svn支持较旧的Subversion版本,但建议使用最新版本,因为它们都包含对语言绑定的错误修复和改进。一旦您有了绑定,要安装此软件包
$ easy_install ore.svn
此库与zope3有一些基本集成,用于接口声明和事务,并依赖于这些库(zope.interface,transaction),这些库将与它一起安装。
API
SubversionContext
表示对Subversion存储库中节点层次结构的访问
>>> from ore.svn import SubversionContext >>> ctx = SubversionContext( test_repo_path )
您还可以将操作限制在存储库中的特定路径。这将绑定上下文到特定的子树。
>>> another_ctx = SubversionContext( test_repo_path, '/myproject')
要从上下文中访问SVN节点,我们访问上下文中节点树的根。
>>> node = ctx.root
存储库中任何节点的路径都由svn_path属性表示。
>>> node.svn_path '/'
SubversionNode
表示子版本控制存储库中的文件或目录,提供通用的属性处理和版本历史检查。
节点上的存储库版本属性可通过属性访问。
节点最后修改的版本的最后日志消息
>>> node.last_log # information from the last <Log: date message author revision>
节点最后修改的日期
>>> node.modification_time datetime.datetime(2004, 3, 27, 18, 1, 4)
节点创建的版本
>>> node.revision_created 5
节点的容器节点
>>> node.parent_node <ore.svn.directory.SubversionDirectory object at ...>
自定义节点属性可通过可变属性映射对象访问
>>> node.properties['svn:externals'] = "ore.svn https://svn.objectrealms.net/svn/public/ore.svn"
所有节点都有一个API,用于发现其路径祖先以及相应的版本信息
>>> file = node['core']['elephants.txt'] >>> log_entries = file.getMappedLogEntries() >>> for entry in log_entries: ... print "Revision and Path", entry.revision, entry.rev_path Revision and Path 4 /core/elephants.txt Revision and Path 2 /core/elephants.txt Revision and Path 1 /core/elephants.txt
SubversionDirectory
目录使用标准的Python映射接口来公开其子项
>>> directory = node # the root is also a directory, alias it for clarity >>> directory.keys() ['core']
我们还可以使用文件和目录属性来访问仅这些类型的子节点。
>>> directory.files []
或者查看目录中是否包含具有特定名称的文件
>>> "readme.txt" in directory False>>> directory = directory['core'] >>> directory.keys() ['elephants.txt', 'resources', 'cats.txt']>>> file = directory['cats.txt'] >>> directory.get('nonexistant')
我们使用给定的复制名称复制目录中的节点。
>>> copied_file = directory.copy( "zebra.txt", file )
要创建目录或空文件。
>>> subdirectory = directory.makeDirectory("baz") >>> newfile = subdirectory.makeFile("bear.txt")
我们可以通过将节点赋值到目录中来移动节点,从旧位置到新位置。
>>> directory['horses.txt'] = directory['elephants.txt'] >>> 'elephants.txt' in directory False
要删除节点,标准映射API生效
>>> del directory['horses.txt']
SubversionFile
除了标准的节点日志检查外,文件还提供了一些额外的方法,我们可以通过访问内容属性来检查文件的内容。
>>> file.contents 'hello world\nrevision 2\n\n'
并向文件写入,用字符串替换文件内容。
>>> file.write("old cat new tricks")
或者,我们只需对内容属性进行赋值。
>>> file.contents = "abc"
对于大文件,我们可以使用流API写入内容
>>> from StringIO import StringIO >>> in_stream = StringIO("When angry, count ten, before you speak; if very angry, a hundred.") >>> file.writeStream( in_stream )
或读取它们。
>>> out_stream = StringIO() >>> file.read( writer=out_stream ) >>> out_stream.getvalue() 'When angry, count ten, before you speak; if very angry, a hundred.'
附加属性,文件内容的长度
>>> file.size 66L
内容的MD5校验和
>>> file.checksum '8c3b9a49408f09648a7b0494af5d88e5'
以及其MIME类型。
>>> file.mime_type 'text/plain'
位置和历史
我们可以使用多种API调用检查任何节点的历史。getLog返回特定版本的日志条目,默认情况下是最新的。
>>> file.getLog() <Log: date message author revision>
我们还可以通过调用getLogEntries获取节点的所有日志条目。
>>> for i in file.getLogEntries(): print i.date, i.author, i.message, 2004-03-27 17:50:49 hazmat moving files 2004-03-27 17:50:20 hazmat second commit 2004-03-27 17:49:07 hazmat initial import
流式传输
要流式传输文件的内容,请向getContents API提供流。
>> stream = os.tmpfile() >> file.getContents(writer=stream)
要将流的内容写入文件,请使用writeStream
>> fh = open('bigfile.pdf') >> file.writeStream(fh)
事务
ore.svn与zope的事务API集成以进行事务管理。事务处理是自动的,任何对节点的修改都会自动创建相应的子版本控制事务。系统不使用子版本控制的delta编辑器API,节点是在原地修改的。
>> import transaction
>> transaction.abort() # 中断我们迄今为止所做的所有修改
>> root.makeDirectory("reptiles") >> del root['oldproject'] >> transaction.commit() # 提交我们的更改
对于那些更喜欢的人来说,还有一个可选的API,它还公开了设置版本属性。
>> root.makeDirectory("mammals") <SubversionDirectory mammals>
>> svntxn = ctx.transaction
>> svntxn.author = "kapil" >> svntxn.message = "为哺乳动物创建目录"
>> svntxn.commit()
如果设置了访问名称,则在创建事务时将作者设置为访问名称。
锁定
SVN锁定API要求为文件系统访问设置用户名,因为锁定与所有者相关联。当前,锁定仅适用于文件。
>> ctx.setAccess("zookeeper") >> file_node = root['horses.txt']
树迭代器
提供了一种快速迭代和操作子版本控制目录树的方法。
>>> from ore.svn.tree import fileIterator, lockTree, unlockTree打印目录及其子目录中所有文件的路由
>>> ctx = SubversionContext( test_repo_path )>>> for file_node in fileIterator( ctx.root ): ... print file_node.path锁定和解锁目录及其子目录中的所有文件(树)
>>> lockTree( ctx.root, 'lock-token-abc' )要解锁,我们需要传递相同的令牌,或者通过break_locks布尔关键字参数强制执行
>>> unlockTree( ctx.root, 'lock-token-abc' )
属性表
待办 - 文档
变更
1.0.5 - 2008/5/5
更新单元测试,不再需要手动干预来创建仓库
将README转换为真正的文档测试。
修复树迭代器API的问题。
1.0.4 - 2008/2/3
更新install_requires,事务模块现在与zodb分离!
0.9.6 - 2006/8/7
第一个PyPi版本
项目详情
下载文件
下载适用于您平台的文件。如果您不确定选择哪个,请了解更多关于安装包的信息。
源分发
构建分发
ore.svn-1.0.5.tar.gz的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 944e8626db56aa6740744d84097f78d4a076ea156e151caf46105dd082d3cce2 |
|
MD5 | 72f7b3d57ac746d97cf41a88d2c5f07e |
|
BLAKE2b-256 | 933d04ae4eb43d8f4de0cdcbd07856e6fd279d2315683bb880a8440822d81ed9 |
ore.svn-1.0.5-py2.5.egg的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4df8e385e24be82ffdecb8c8939aa6fcdd8a116df1b53899249ee2865a32933d |
|
MD5 | 2cc3f45bfedbb0d3b93c5bbf29c6290b |
|
BLAKE2b-256 | fc2f0393358321b147cd663a641ad39ac21247e35e626d18b2897d5aa747f4a3 |