跳转到主要内容

支持读写操作的面向对象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 (36.7 kB 查看哈希值)

上传时间

构建分发

ore.svn-1.0.5-py2.5.egg (91.9 kB 查看哈希值)

上传时间

由以下支持