将对象数据与版本控制系统同步
z3c.vcsync的Python项目详细描述
版本控制同步
此包包含有助于处理 版本控制系统的持久内容。
这在需要能够工作的软件中很有用 离线。Web应用程序运行在用户的笔记本电脑上,而该笔记本电脑可能不在 从互联网连接。再次连接时,用户将与 版本控制服务器,接收可能由 其他人,并提交他们自己的更改。
另一个优点是版本控制系统总是包含 内容随时间发展的历史。基于版本控制 内容也可以用于其他独立于 应用程序。
而这个包是用其他版本控制系统编写的 考虑到这一点,到目前为止,它只是为了与svn合作而开发的。实例 以下均为SVN提供。
同步顺序如下:
- 将持久状态(istate)保存到 与zope应用程序相同的机器。
- SVN向上 。subversion合并其他用户所做的更改 已签入SVN服务器。
- 任何SVN冲突都会自动解决。
- 将svn签出中的更改重新加载到持久的python对象中
- SVN提交 < > >
-
获取修订版nr()
:返回
应用程序已与同步。州政府通常存储
应用程序对象。
设置修订号(nr) :存储 应用程序已与同步。
对象(修订版) :任何已修改的对象(或 添加)因为同步了 修订版。也会回来 许多对象(未被修改的对象)是安全的,尽管较少 因为它们将被重新出口。
通常在您的应用程序中,这将通过执行 目录搜索,以便快速查找。
已删除(修订版) :已删除对象的任何路径 从修订后返回的路径是安全的 已被移除,并已被另一个对象替换为 同样的名字。不过,返回"太多"路径也是安全的 效率较低,因为这些路径中的对象可能会重新导出 不必要。
通常在应用程序中,您会维护一个已删除的列表 通过连接到 iobjectmovedevent 和 iobjectremovedevent 并记录 被移动或移除。出口后,可以安全地清除 名单:< /P>
这一切都是一步到位的。它可以反复发生 再次以一种合理安全的方式,如在同步之后 结论是,持久对象和本地对象的状态 SVN结帐将始终同步。
在同步过程中,系统只会注意 同步那些已更改的对象和文件。也就是说,在 步骤1)仅应用已修改、添加或 删除将影响签出。步骤4)只有 文件系统上已更改、添加或删除的文件 到 up 操作将更改持久对象状态。
状态
要同步的内容由一个对象表示,该对象提供 状态 。状态表示容器对象,它应该 包含 数据 对象(包含实际数据的容器 要同步)和找到的对象(包含 否则在解决冲突期间会丢失的对象。
需要实现以下方法:
在本例中,我们将使用更简单、效率更低的实现 通过内容查找更改。资讯科技轨道这个 修订号作为根对象的特殊属性:
>>> from z3c.vcsync.tests import TestState
内容
现在我们有了可以在 容器,让我们为自己构建一个内容树。
一个条目包含一些有效载荷数据,并维护svn版本 之后就换了。在实际应用程序中,通常 通过使用注释和 正在侦听iobjectmodifiedvent,但我们将使用一个属性 这里:
>>> from z3c.vcsync.tests import Item
此代码需要一个 get_revision_nr 方法来获取访问权限 到上次同步的修订号。现在我们来定义 此项返回0,但我们稍后将更改此项:
>>> def get_revision_nr(self): ... return 0 >>> Item.get_revision_nr = get_revision_nr
除了 项类之外,我们还有一个 容器类:
>>> from z3c.vcsync.tests import Container
它是一个类,实现了足够多的dictionary api和 实现 icontainer 接口。普通的Zope 3文件夹或 Grok容器也可以工作。
现在我们创建一个容器:
>>> root = Container() >>> root.__name__ = 'root'
容器有两个子容器( data 和 found )。
< Buff行情>>>> root['data'] = data = Container() >>> root['found'] = Container() >>> data['foo'] = Item(payload=1) >>> data['bar'] = Item(payload=2) >>> data['sub'] = Container() >>> data['sub']['qux'] = Item(payload=3)
作为同步过程的一部分,我们需要能够导出 版本控制签出目录中的持久python对象 文件和目录的形式。
现在我们已经实现了 state,让我们创建 state 对象:
>>> state = TestState(root)
读取和写入文件系统
为了与同步机器集成,我们需要一种方法来转储 文件系统的python对象(svn工作副本),以及 再次将其解析回对象。
让我们先研究一下这个包,因为它提供了一些必需的 基础设施:
>>> import grokcore.component as grok >>> grok.testing.grok('z3c.vcsync')
我们需要为获取项的项类提供序列化程序 并将其写入文件系统到具有特定扩展名的文件中 ( 。测试 ):
>>> from z3c.vcsync.tests import ItemSerializer
我们还需要提供一个解析器来从文件系统加载一个对象 回到python中,覆盖以前存在的对象:
>>> from z3c.vcsync.tests import TestState0
有时python树中没有以前存在的对象, 我们需要补充一下。为此,我们建立了一个工厂 实际工作的解析器):
>>> from z3c.vcsync.tests import TestState1
在本例中,解析器和工厂都是按扩展名注册的 。测试 。这是实用程序的名称。
我们注册这些组件:
>>> from z3c.vcsync.tests import TestState2
我们还需要一个容器的解析器和工厂,为 空扩展名(因此没有特殊的实用程序名)。这些可能是非常 简单:
>>> from z3c.vcsync.tests import TestState3
设置SVN存储库
现在我们需要一个SVN存储库来同步。我们创建一个测试 svn repository now并创建一个svn路径以进行签出:
>>> from z3c.vcsync.tests import TestState4
我们现在可以用svn路径初始化 svncheckout 对象 我们刚刚创建的签出:
>>> from z3c.vcsync.tests import TestState5
工作副本的根目录将与 状态的根容器。因此,签出将包含 找到数据和子目录。
构造同步器
现在我们有了签出和状态,可以设置同步器:
>>> from z3c.vcsync.tests import TestState6
让我们把当前的同步器也设为。我们需要这个 此示例返回到上一个修订号:
>>> from z3c.vcsync.tests import TestState7
现在是时候更好地设置我们的 get_revision_nr 方法了, 利用当前同步器中的信息。在实际中 应用程序我们可能会直接从 内容,不需要回到同步器 (不需要持久化,但可以根据需要构建):
>>> from z3c.vcsync.tests import TestState8
同步
我们将首次同步:
>>> from z3c.vcsync.tests import TestState9
我们现在将检查SVN签出,以查看 同步成功。
为此,我们将介绍一些帮助函数,帮助我们演示 相对于 结帐:
>>> from z3c.vcsync.tests import Item0
我们看到容器和项的python对象结构 已转换为相同的目录结构和 。测试 文件系统上的文件:
>>> from z3c.vcsync.tests import Item1
.test 文件具有我们期望的有效载荷数据:
>>> from z3c.vcsync.tests import Item2
同步返回到对象中
现在让我们尝试相反的方法:我们将更改另一个svn内容 签出,并将更改同步回对象树。
我们有第二个空树,可以将对象加载到其中:
>>> from z3c.vcsync.tests import Item3
我们再次签出存储库:
>>> from z3c.vcsync.tests import Item4
让我们为这个新的签出和状态制作一个同步器:
>>> from z3c.vcsync.tests import Item5
现在这是当前的同步器(以便我们的 获取修订版 工作正常):
>>> from z3c.vcsync.tests import Item6
现在我们将同步:
>>> from z3c.vcsync.tests import Item7
树中对象的状态现在必须与原始状态相同:
>>> from z3c.vcsync.tests import Item8
现在,我们将更改其中一些对象,并再次同步:
>>> from z3c.vcsync.tests import Item9
我们现在可以再次同步原始树:
>>> def get_revision_nr(self): ... return 0 >>> Item.get_revision_nr = get_revision_nr0
我们应该看到反映到原始树中的更改:
>>> def get_revision_nr(self): ... return 0 >>> Item.get_revision_nr = get_revision_nr1
更多信息
要了解有关可以使用和需要实现的api的更多信息,请参见 接口.py
要了解如何使用 z3c.vcsync 导入和导出内容,请参见 导入端口.txt
可以从 conflicts.txt 和 内部.txt