将对象数据与版本控制系统同步

z3c.vcsync的Python项目详细描述


版本控制同步

此包包含有助于处理 版本控制系统的持久内容。

这在需要能够工作的软件中很有用 离线。Web应用程序运行在用户的笔记本电脑上,而该笔记本电脑可能不在 从互联网连接。再次连接时,用户将与 版本控制服务器,接收可能由 其他人,并提交他们自己的更改。

另一个优点是版本控制系统总是包含 内容随时间发展的历史。基于版本控制 内容也可以用于其他独立于 应用程序。

而这个包是用其他版本控制系统编写的 考虑到这一点,到目前为止,它只是为了与svn合作而开发的。实例 以下均为SVN提供。

同步顺序如下:

  1. 将持久状态(istate)保存到 与zope应用程序相同的机器。
  2. SVN向上 。subversion合并其他用户所做的更改 已签入SVN服务器。
  3. 任何SVN冲突都会自动解决。
  4. 将svn签出中的更改重新加载到持久的python对象中
  5. SVN提交
  6. < > >

    这一切都是一步到位的。它可以反复发生 再次以一种合理安全的方式,如在同步之后 结论是,持久对象和本地对象的状态 SVN结帐将始终同步。

    在同步过程中,系统只会注意 同步那些已更改的对象和文件。也就是说,在 步骤1)仅应用已修改、添加或 删除将影响签出。步骤4)只有 文件系统上已更改、添加或删除的文件 到 up 操作将更改持久对象状态。

    状态

    要同步的内容由一个对象表示,该对象提供 状态 。状态表示容器对象,它应该 包含 数据 对象(包含实际数据的容器 要同步)和找到的对象(包含 否则在解决冲突期间会丢失的对象。

    需要实现以下方法:

      < DL>
      获取修订版nr() :返回 应用程序已与同步。州政府通常存储 应用程序对象。

    • 设置修订号(nr) :存储 应用程序已与同步。

    • 对象(修订版) :任何已修改的对象(或 添加)因为同步了 修订版。也会回来 许多对象(未被修改的对象)是安全的,尽管较少 因为它们将被重新出口。

      通常在您的应用程序中,这将通过执行 目录搜索,以便快速查找。

    • 已删除(修订版) :已删除对象的任何路径 从修订后返回的路径是安全的 已被移除,并已被另一个对象替换为 同样的名字。不过,返回"太多"路径也是安全的 效率较低,因为这些路径中的对象可能会重新导出 不必要。

      通常在应用程序中,您会维护一个已删除的列表 通过连接到 iobjectmovedevent iobjectremovedevent 并记录 被移动或移除。出口后,可以安全地清除 名单:< /P>

    在本例中,我们将使用更简单、效率更低的实现 通过内容查找更改。资讯科技轨道这个 修订号作为根对象的特殊属性:

    >>> 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 TestState
    
    0

    有时python树中没有以前存在的对象, 我们需要补充一下。为此,我们建立了一个工厂 实际工作的解析器):

    >>> from z3c.vcsync.tests import TestState
    
    1

    在本例中,解析器和工厂都是按扩展名注册的 。测试 。这是实用程序的名称。

    我们注册这些组件:

    >>> from z3c.vcsync.tests import TestState
    
    2

    我们还需要一个容器的解析器和工厂,为 空扩展名(因此没有特殊的实用程序名)。这些可能是非常 简单:

    >>> from z3c.vcsync.tests import TestState
    
    3

    设置SVN存储库

    现在我们需要一个SVN存储库来同步。我们创建一个测试 svn repository now并创建一个svn路径以进行签出:

    >>> from z3c.vcsync.tests import TestState
    
    4

    我们现在可以用svn路径初始化 svncheckout 对象 我们刚刚创建的签出:

    >>> from z3c.vcsync.tests import TestState
    
    5

    工作副本的根目录将与 状态的根容器。因此,签出将包含 找到数据和子目录。

    构造同步器

    现在我们有了签出和状态,可以设置同步器:

    >>> from z3c.vcsync.tests import TestState
    
    6

    让我们把当前的同步器也设为。我们需要这个 此示例返回到上一个修订号:

    >>> from z3c.vcsync.tests import TestState
    
    7

    现在是时候更好地设置我们的 get_revision_nr 方法了, 利用当前同步器中的信息。在实际中 应用程序我们可能会直接从 内容,不需要回到同步器 (不需要持久化,但可以根据需要构建):

    >>> from z3c.vcsync.tests import TestState
    
    8

    同步

    我们将首次同步:

    >>> from z3c.vcsync.tests import TestState
    
    9

    我们现在将检查SVN签出,以查看 同步成功。

    为此,我们将介绍一些帮助函数,帮助我们演示 相对于 结帐:

    >>> from z3c.vcsync.tests import Item
    
    0

    我们看到容器和项的python对象结构 已转换为相同的目录结构和 。测试 文件系统上的文件:

    >>> from z3c.vcsync.tests import Item
    
    1

    .test 文件具有我们期望的有效载荷数据:

    >>> from z3c.vcsync.tests import Item
    
    2

    同步返回到对象中

    现在让我们尝试相反的方法:我们将更改另一个svn内容 签出,并将更改同步回对象树。

    我们有第二个空树,可以将对象加载到其中:

    >>> from z3c.vcsync.tests import Item
    
    3

    我们再次签出存储库:

    >>> from z3c.vcsync.tests import Item
    
    4

    让我们为这个新的签出和状态制作一个同步器:

    >>> from z3c.vcsync.tests import Item
    
    5

    现在这是当前的同步器(以便我们的 获取修订版 工作正常):

    >>> from z3c.vcsync.tests import Item
    
    6

    现在我们将同步:

    >>> from z3c.vcsync.tests import Item
    
    7

    树中对象的状态现在必须与原始状态相同:

    >>> from z3c.vcsync.tests import Item
    
    8

    现在,我们将更改其中一些对象,并再次同步:

    >>> from z3c.vcsync.tests import Item
    
    9

    我们现在可以再次同步原始树:

    >>> def get_revision_nr(self):
    ...    return 0
    >>> Item.get_revision_nr = get_revision_nr
    
    0

    我们应该看到反映到原始树中的更改:

    >>> def get_revision_nr(self):
    ...    return 0
    >>> Item.get_revision_nr = get_revision_nr
    
    1

    更多信息

    要了解有关可以使用和需要实现的api的更多信息,请参见 接口.py

    要了解如何使用 z3c.vcsync 导入和导出内容,请参见 导入端口.txt

    可以从 conflicts.txt 内部.txt

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
如何表示1。。Java中的n关系   java在安卓应用程序中添加polaris viewer   Java字符串::replaceAll仅替换第一个出现(可能不正确的正则表达式)   java Tomcat/JBoss部署后脚本   如何在Heroku Java应用程序中运行发出web请求的周期进程   java如何以纳秒为单位证明算法的时间   Solaris上的java自定义ListCellRenderer(使用jre5)   java试图为我的播放器类测试块实现播放器重力(RealtutsGml平台教程)   c#消耗一个。带有java的net web服务未显示预期结果   java在KOI8\R中检索html   基于java图形的搜索与基于随机的搜索   java如何检查安卓设备上的可用空间?在SD卡上?