2_subversion中的增量编辑器:灵活的接口

  1. 漂亮的代码都是良性有界且易于理解的问题的局部解.
  2. svn反复执行的一个任务:用尽可能少的东西表达两个相似的目录树之间的差异.其中一个目标是记录对目录结构和单个文件的修改.
  3. 仓库(repository):围绕着目录版本来设计的.其实是目录树变化过程中的一系列快照.
  4. 对于每次提交的变化集合,都会创建一个新的目录树,新目录树中包含其独有的变化,但是与其他目录树共享不变化的部分的数据存储.
  5. 修订号:目录树的连续版本使用的整数标示.所以仓库是一个修订号的数组.
  6. 模型的优点:
    1. 易读性:如果要找到文件x/y/z.txt的第m个修改.那么直接找到修订号m,然后顺着父子关系找到z.txt.
    2. 读写操作可并发:
  7. 工作副本:svn的客户端.用户的未提交的本地修改,与某个目录树上的副本.
  8. 文本增量:指一个文件在两个版本之间的差异.看做为一个补丁,用于从文件的一个版本生成另一个版本的文件.
  9. Baton(接力棒):void *类型.用来吧运行环境传递给回调函数.
  10. 窗口处理器:将文本增量数据应用到目标文件.
  11. 接口设计
    1. 本来,最简单的方法是用简单的数据结构来表示目录树增量.但是有时增量会很巨大,以至于无法填充到交换区(C/S之间的)内.所以,svn需要处理那些由于过于庞大而无法在交换中一次性进行填充的目录树增量.
    2. 所以,为使用者定义了一种标准的方式,只要生产者产生了任何增量.使用者就立刻进行处理.使用一个结构来表示由增量的使用者定义的回调函数,并由增量的生产者来调用.回调函数的每次处理都将处理一小部分增量(如文件改名等).
    3. 回调函数由增量的使用者来实现,而增量的生产者调用这些函数.所以,相当于调用者(生产者)将目录树增量的数据压入被调用者(使用者).
  12. 函数
    1. delete_entry,add/open_file/dir.参数:1)目录baton,表示发生变化的目录.2)路径,要修改的相对路径(其和edit_baton结合使用).返回:新的child_baton,表示将要变化或修改的目录,后续动作使用它进行进一步的修改.
    2. 操作:在foo/bar目录下新创建一个文件foo/bar/baz.c
    3. 首先,使用则提供edit_baton,作为增量编辑的全局baton.然后,生成者调用以下的函数序列:
    4. open_root(edit_baton),为顶级目录生成一个baton.
    5. open_dir(root,"foo"),为"foo"生成一个baton f
    6. open_dir(f,"foo/bar"),为foo/bar"生成一个baton b
    7. add_file(b,"foo/bar/baz.c").
    8. 生产者完成对目录的修改时,调用close_dir.使用者可在此时进行清理工作,并释放baton的存储空间.
    9. add/open_file的回调都会返回一个baton来表示被创建或修改的文件.这个baton可以被传递给apply_textdelta来改变文件的内容.当生成者完成修改后,将调用close_file.使用者将进行清理工作并释放baton.
  13. 函数的调用顺序(限制)
    1. 一个目录入口,最多一次open/add_file/dir,之后不能在改目录上进行delete_entry;最多一次delete_entry,随后可以在同目录上进行add_file/dir.
    2. 只有子目录baton都close之后,该目录baton才能被close.
    3. 生产者调用add/open_dir是,必须指定在当前打开的目录baton上.即不能同时打开两个同级的目录baton.
    4. open/add_file时,执行其他文件或目录调用前,必须调用apply_textdelta来提交修改并执行close_file.
    5. 调用apply_textdelta时,在执行其他的svn_delta_editor调用之前,必须先调用所有的窗口处理器.
  14. 分析:
    1. 选择了约束:使用baton之间的关系迫使编辑按照深度优先的顺序进行.
    2. 隐式传递了运行环境(baton).任何一个baton都可以访问全局的编辑运行环境.baton的功能:为编辑的各部分提供了作用域;传递了全局运行环境.
    3. 在不同的子操作之间提供了清晰的边界.接口的"流行化"使得生产者和使用者同时控制内存的使用,过程和可中断性.

posted on 2011-11-16 09:43  RobynHYB  阅读(261)  评论(0编辑  收藏  举报

导航