SVN用户使用指南1.0_第1页
SVN用户使用指南1.0_第2页
SVN用户使用指南1.0_第3页
SVN用户使用指南1.0_第4页
SVN用户使用指南1.0_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、SVN用户使用指南Version 1.0文档变更记录文件状态: 草稿 正式发布 当前版本:V1.0作 者:wanghj审 核 人:发布日期:修订号修改内容描述修改人修改日期备注目 录 TOC o 1-3 h z u HYPERLINK l _Toc237319714 1. 引言 PAGEREF _Toc237319714 h 1 HYPERLINK l _Toc237319715 1.1. 目的 PAGEREF _Toc237319715 h 1 HYPERLINK l _Toc237319716 1.2. 范围 PAGEREF _Toc237319716 h 1 HYPERLINK l _T

2、oc237319717 2. SVN根底知识 PAGEREF _Toc237319717 h 1 HYPERLINK l _Toc237319718 2.1. SVN简介 PAGEREF _Toc237319718 h 1 HYPERLINK l _Toc237319719 2.2. SVN特性 PAGEREF _Toc237319719 h 1 HYPERLINK l _Toc237319720 2.3. SVN的架构 PAGEREF _Toc237319720 h 3 HYPERLINK l _Toc237319721 3. SVN的根本应用 PAGEREF _Toc237319721 h

3、 4 HYPERLINK l _Toc237319722 3.1. 客户端的安装 PAGEREF _Toc237319722 h 4 HYPERLINK l _Toc237319723 3.2. 版本库浏览 Repo-browser PAGEREF _Toc237319723 h 6 HYPERLINK l _Toc237319724 3.3. 版本库的根本操作 PAGEREF _Toc237319724 h 8 HYPERLINK l _Toc237319725 3.3.1. Add filefolder添加文件(文件夹) PAGEREF _Toc237319725 h 8 HYPERLIN

4、K l _Toc237319726 3.3.2. commit 提交 PAGEREF _Toc237319726 h 9 HYPERLINK l _Toc237319727 3.3.3. Show log 查看日志 PAGEREF _Toc237319727 h 9 HYPERLINK l _Toc237319728 3.3.4. Export 导出 PAGEREF _Toc237319728 h 11 HYPERLINK l _Toc237319729 3.3.5. Revision graph 版本树显示 PAGEREF _Toc237319729 h 12 HYPERLINK l _To

5、c237319730 3.3.6. Check out 检出 PAGEREF _Toc237319730 h 13 HYPERLINK l _Toc237319731 3.3.7. Refresh 刷新 PAGEREF _Toc237319731 h 13 HYPERLINK l _Toc237319732 3.3.8. Delete 删除 PAGEREF _Toc237319732 h 14 HYPERLINK l _Toc237319733 3.3.9. Rename 对目录或文件进行改名 PAGEREF _Toc237319733 h 14 HYPERLINK l _Toc2373197

6、34 3.3.10. Copy to working copy 把当前目录拷贝到本地 PAGEREF _Toc237319734 h 15 HYPERLINK l _Toc237319735 3.3.11. Copy to 拷贝到 PAGEREF _Toc237319735 h 16 HYPERLINK l _Toc237319736 3.4. 客户端操作 PAGEREF _Toc237319736 h 17 HYPERLINK l _Toc237319737 3.4.1. 客户端的根本操作 PAGEREF _Toc237319737 h 17 HYPERLINK l _Toc23731973

7、8 3.4.2. 常用功能介绍 PAGEREF _Toc237319738 h 20 HYPERLINK l _Toc237319739 3.4.3. 分支与合并 PAGEREF _Toc237319739 h 23 HYPERLINK l _Toc237319740 4. SVN API PAGEREF _Toc237319740 h 25 HYPERLINK l _Toc237319741 4.1. 使用API PAGEREF _Toc237319741 h 25 HYPERLINK l _Toc237319742 4.2. URL和路径需求 PAGEREF _Toc237319742 h

8、 27 HYPERLINK l _Toc237319743 4.3. 使用C和C+以外的语言 PAGEREF _Toc237319743 h 27 HYPERLINK l _Toc237319744 4.4. 代码样例 PAGEREF _Toc237319744 h 28 HYPERLINK l _Toc237319745 4.4.1. 使用版本库层 PAGEREF _Toc237319745 h 28 HYPERLINK l _Toc237319746 4.4.2. 使用Python处理版本库层 PAGEREF _Toc237319746 h 35 HYPERLINK l _Toc23731

9、9747 4.4.3. 一个Python状态爬虫 PAGEREF _Toc237319747 h 40 HYPERLINK l _Toc237319748 4.5. 参考资料 PAGEREF _Toc237319748 h 45引言目的为了对配置管理工具(Subversion,以下简称为SVN)应用过程提供指导,编制此指南.范围本标准适应于北京高伟达软件技术内部使用SVN根底知识SVN简介SVN 是一具开源的版本控制系统,SVN 将文件存放在中心版本库里,这个版本库很像一个普通的文件效劳器,不同的是,它可以记录每一次文件和的修改情况。这样我们就可以籍此将数据回复到以前的版本,并可以查看的更改细

10、节。也就是说,一旦一个文件被传到SVN 上面,那么不管对它进行什么操作,SVN 都会有清晰的记录,即使它在N 天前被删除了,也可以被找回来。所以,许多人将版本控制系统当作一种神奇的“时间机器。SVN特性版本化目录SVN 实现的“虚拟版本化文件系统可以跟踪目录树的变更。也就是说,在SVN 中,文件和目录都是版本化的。真实的版本历史由于实现了文件和目录的版本化,SVN 可以记录如文件拷贝和改名这些常见操作带来的版本变更,即在SVN 中,对文件或目录都可以进行增加、拷贝和操作,并有版本历史记录。原子提交一系列相关的更改,要么全部提交到版本库,要么一个也不提交,这样用户就可以将相关的更改组成一个逻辑整

11、体,防止出现局部修改需另一局部未修改的情况提交到版本库中。可选的网络层SVN 在版本库访问的实现上具有较高的抽象程度,利于人们实现新的网络访问机制。SVN 可以作为一个扩展模块嵌入到Apache 之中,这种方式在稳定性和交互性方面有很大的优势,可以直接使用效劳器的成熟技术认证、授权和传输压缩等。此外,SVN 自身也实现了一个轻型的、可独立运行的效劳器软件。这个效劳器使用了一个特定的协议,这个协议可以轻松用SSH 封装。我们目前选用的是SVN 自身的效劳器,即Svnserver 方式,本文主要是对Svnserver 方式的使用方法介绍。一致的数据操作SVN 用一个二进制差算法描述文件和变化,对于

12、文件可读和二进行制不可读文件其操作方式是一致的。这两种类型的文件压缩存储在版本库中,而差异信息那么在网络上双向传递。高效的分支和标签操作在 SVN 中,分支与标签操作的开销与工程的大小无关,SVN 的分支和标签操作是一种类似于硬链接的机制拷贝整个工程。因而这些操作通常只会花费很少且相对固定的时间。可修改性SVN 没有历史负担,它以一系列优质的共享C 程序库的方式实现,具有定义良好的API。SVN的架构SVN的根本应用客户端的安装点击Yes,重启电脑,完成安装。版本库浏览 Repo-browser完成安装之后,点击鼠标右键,会出现以下图,这是SVN的根本功能,下面一一介绍.点击Repo-brow

13、ser之后,会出现下面的小对话框:在里面输入你要键接的版本库:输入方法为: s:/效劳器IP:端口号/所在版本库名称,如PQA的配置库为: s:/.8:8443/PQA记得svn 是小写字母的,点“OK进入登录界面。如果以前有登录过,SVN 会自动记录登录历史。登录界面如下:输入用户名和密码即可进入所在的版本库。版本库的根本操作Add filefolder添加文件(文件夹)用此命令可以向效劳器端目录添加一个本地的文件或文件夹。commit 提交使用commit命令可以将add的文件添加到效劳器Show log 查看日志点击此按扭,会显示当前目录下的所有文件和目录日志的信息。会跳出下面的对话框:

14、Export 导出用此命令,指定路径,便可导出一个干净的目录树,所谓“干净的就是导出的文件不受SVN 的版本控制。默认的是导出当前版本的目录内容,当然也可以指定你想导出的版,如以下图:在Export directory中选择本地的路径.Revision graph 版本树显示 它可以把对此目录所做的所有操作以图的形式显示出来,并可以记录每一步都进行了什么操作,相当于“Show log的一个图解,如以下图所示:Check out 检出用此命令可以从效劳器导出选中的目录到本地工作拷贝本机,它和Export 的区别在于,检出的文件受版本控制,如以下图所示:Refresh 刷新刷新效劳器端目录。Del

15、ete 删除对目录或文件都可以进行删除操作,删除后版本号增加,可以通过“show log找出已经删除的文件,并且可以看到文件夹变成:注意:文件只有在自己的工作副本中删除了,必须执行commit,文件才算是真正的删除了。Rename 对目录或文件进行改名如果要对文件进行改名,要在效劳器端对文件或文件夹用Rename 命令,改完后在本地工作拷贝的上级目录执行“Commit即可。可以在本地用右键,使用TSVN 的菜单改名,提交后效果一样。Copy to working copy 把当前目录拷贝到本地本地工作拷贝必须是已经受版本控制的文件夹,执行此命令后,如:把“01 参考资料复制到本地工作拷贝的“P

16、QA中,就会出现以下图,绿色的对号表示此目录是从效劳器上“Checkout出来的受版本控制的本地工作拷贝,蓝色的加号表示此文件预添加到效劳器上。这时,在此目录空白处或选中“01参考资料文件夹,右键执行“SVN Commit命令如以下图所示:“01参考资料便会成功提交到效劳器上“PQA的目录下面。Copy to 拷贝到用此命令可以在当前版本库中建立分支标签/基线,SVN 允许并行的维护文件和目录的分支,各个分支间互相联系,也可以从一个分支复制修改到另一个分支,最终,可以让本地工作拷贝反映到不同的分支上,所以在日常的工作中,可以“混合和比较不同的开发线。客户端操作客户端的根本操作在本地工作拷贝空白

17、处点击右键会出现如以下图所示,下面对此菜单中常用的功能做详细的介绍.工作拷贝就是执行“checkout命令从效劳器端检出到本地的一个目录,是个人的一个私有工作区,在此目录下,可以任意的编辑文件,如果是源代码文件,可以像平常一样编译。比方,我们对过程记录中会议记录中一个文件的日期做修改,被编辑后的文件和它的上一级目录都会显示为:这时可以对此文件执行 SVN Commit 提交操作,那么编辑的内容便会提交到效劳器上,以便大家共享你的工作成果。这时对改后的版本点击右键,执行“Show log后,可以显示版本日志,如果想看到本次的改动和原始的版本有何差异,那么选中当前版本记录,右键执行“show ch

18、anges如以下图所示:这时它就会显示本次是哪些动作导致了版本的变化,红色局部新增加的内容,它以标注的方式显示:还要补充说明的是,在SVN 上,有三种权限:读、读写、无权限。如果想对你的工作拷贝进行编辑,那么你必须有在这个目录下读写的权限,如果在效劳器端此目录下面你无权限或只有读的权限,那么即使在本地拷贝做了修改,也不能提交到效劳器上,也就是说,每个有读权限的人可以看查版本库目录下的内容无权限的不能查看,但只能对自己被赋予读写权限的目录做修改。这就保护了你的工作目录不会被别的人随意改动。常用功能介绍Revert 返回上一级如果你对文件做了修改之后,还未进行提交,可是文档的标记已经为红色的叹号,

19、而这时你又发现变错了,想把文档返回到原来的状态,这时你可以执行Revert 操作,便可使文档回到原来的状态,因为你没有执行提交操作,这时效劳器上版本库版本号不会增加。Update to revision 返回到版本如果是你已经执行了提交操作,这时可以用Update to revision 命令,在跳出的对话框中选择你想返回到的版本,那么你的本地工作拷贝便会回到你所选的版本的状态。“Save revision to也可以把原来版本进行存档。强调一点的是,你的本地工作拷贝可以返回到原来的版本,可是效劳器上只会记录你对它进行最后一次提交的版本,所以效劳器端版本不会变化,如果你想把效劳器端的文档内容也

20、换为原来的状态,可以用旧版本文件覆盖新版本文件,然后提交。Import 导入导入是一种批量向效劳器上添加文件的方法,如果你想把本地的文件或文件夹添加到效劳器上的某个目录下面,那么在本地的目录中,在空白处右键TortoisrSVNImport,会跳出下面的对话框:点“OK后就可以把本地的文件或文件夹导入到效劳器端所选目录下面。SVN Update 更新用此命令可以更新你的工作拷贝,因为每个人都有自己的工作拷贝,在你对工程目录进行操作的同时,工程组其他人员也在进行编辑并提交的动作,版本库内容随着工程人员的每一次提交做着不同的变化,所以在每次编辑操作之前,都要对本地工作拷贝执行Update 的操作,

21、以保证本地工作拷贝与效劳器工程版本库内容保持一致。Resolved 冲突已解决当两个人同时编辑一个文件,一个人先提交后,另一个人再进行提交的时候就会出现冲突,这时会弹出冲突对话框,如以下图所示:你可以对出现的冲突的文件进行编辑,选定你最终想要的文档。这就是“Merge合并操作。在出现冲突以及应用分支时会经常用到合并的功能。合并完毕后,执行 Resolved,那么新的版本就被生成了。Switch 切换把你的工作拷贝切换到另个的URL效劳器目录,效劳器端目录有所变化,所存储的文件位置发生了变化,那么对你的工作拷贝进行编辑后就会出现提交不上去的情况,这时就要执行Switch 操作,使你的工作拷贝切换

22、到效劳器端对应的目录下面,即可再进行提交。Switch 操作只限于版本库内的切换。Relocate 重新定位它和Switch 的功能是一样的,不同的是,它实现的是版本库与版本库之间的切换。当效劳器地址或版本库名称发生变化时,可以用些命令来更新你的工作拷贝。CreateApply patch 创立应用补丁如果你对这个文件没有修改的权限,但是迫于形势,你又必须对这个文件进行修改,这时你就可以用Create patch 创立补丁,然后把你创立的补丁发给对此目录有写权限的工作人员,他执行Apply patch后,你所做的修改就会被提交到效劳器上。分支与合并从工程主分支下载工程初始源码到开发分支操作步骤

23、:在trunk目录新建一个工程名称为Astx;在Astx工程中新建两个模块分别为module1和module2,分别为新建一个名 test.txt的文件;选择Astx工程名称,右击选择branch/tag;请注意 From WC at URL必须是工程Astx的根路径,To URL:在这里选择branch 存放的路径,通常的路径为: :/localhost/svn/Astx/branches/astx_dev_tb; 注:Branches为分支的存放路径,astx_dev_tb为分支的名称在branches 目录右击update,就可以看到刚刚的astx_dev_tb分支;把分支(astx_d

24、ev_tb)的的修改合并到工程主分支操作步骤:选择工程主分支右击TortoiseSVN选择 merge,选择 Reintegrate a branch;点击Next,在URL to merge from 的地址栏中选择astx_dev_tb分支的路径; 注意Working copy是工程主分支的路径;点击NEXT,在Merge depth 下拉框中选择 “working copy,点击Merge, 将分支的修改合并到主干上;在工程主分支右击commit,整个的过程才算完成!如果要退回前一个版本,选择工程主分支右击TortoiseSVN选择Revert,将取消本 次合并的内容.两个不同分支的修改

25、合并到工程主分支修改同一个文件的不同行操作步骤:基于工程主分支创立两个不同的分支分别为:astx_dev_john,astx_dev_harry(创立分支的方法,请参照1.1);注: john和harry 为同一个工程创立自己的工作副本,工作是并行的.john和harry修改同一个文件text.txt的不同行,john先保存修改到版本库(具体 的合并的步骤,请参照1.2),最后别忘了commit!当harry提交修改的时候,版本库提示文件text.txt在他上次更新之后已经更改了, 如果john修改的内容不和harry的冲突,一旦把所有的修改集成到一起,就可以把工作拷贝保存到版本库,最后别忘了

26、commit! 修改同一个文件的同一行操作步骤:基于工程主分支创立两个不同的分支分别为:astx_dev_john,astx_dev_harry;注: john和harry 为同一个工程创立自己的工作副本,工作是并行的.john和harry修改同一个文件text.txt的同一行,john先保存修改到版本库(具体的合并的步骤,请参照1.2);当harry提交修改的时候,版本库提示文件text.txt冲突,这时只能够人工去选择一组修改,并把所有的修改集成到一起,就可以把工作拷贝保存到版本库,记得做完之后一定要commit!SVN API使用API使用Subversion库API开发应用看起来相当的

27、直接,所有的公共头文件放在源文件的subversion/include目录,从源代码编译和安装Subversion本身,需要这些头文件拷贝到系统位置。这些头文件包括了所有用户和Subversion库可以访问的功能和类型。Subversion开发者社区仔细确实保所有的公共API有完好的文档直接引用头文件的文档。你首先应该注意Subversion的数据类型和方法是命名空间保护的,每一个公共Subversion对象名以svn_开头,然后紧跟一个这个对象定义如wc、client和fs等等所在的库的简短编码,然后是一个下划线_和后面的对象名称。半公开的方法库使用,但是但库之外代码不可以使用并且只可以在库

28、自己的目录看到与这个命名模式不同,并不是库代码之后紧跟一个下划线,他们是用两个下划线_。给定源文件的私有方法没有特殊前缀,使用static声明。当然,一个编译器不会关心命名习惯,只是用来区分给定方法或数据类型的应用范围。关于Subversion的API编程的另一个好的资源是hacking指南,可以在找到,这个文档包含了有用的信息,同时满足Subversion本身的开发者和将Subversion作为第三方库的开发者。Apache 可移值运行库伴随Subversion自己的数据类型,你会看到许多apr开头的数据类型引用来自Apache可移植运行库APR的对象。APR是Apache可移植运行库,源自

29、为了效劳器代码的多平台性,尝试将不同的操作系统特定字节与操作系统无关代码隔离。结果就提供了一个根底API的库,只有一些适度区别或者是广泛的来自各个操作系统。Apache 效劳器很明显是APR库的第一个用户,Subversion开发者立刻发现了使用APR库的价值。意味着Subversion没有操作系统特定的代码,也意味着Subversion客户端可以在Server存在的平台编译和运行。当前这个列表包括,各种类型的Unix、Win32、OS/2和Mac OS X。除了提供了跨平台一致的系统调用, APR给Subversion对多种数据类型有快速的访问,如动态数组和哈希表。Subversion在代码

30、中广泛使用这些类型,但是Subversion的API原型中最常见的APR类型是apr_pool_tAPR内存池,Subversion使用内部缓冲池用来进行内存分配除非外部库在API传递参数时需要一个不同的内存管理模式,而且一个人如果针对Subversion的API编码不需要做同样的事情,他们可以在需要时给API提供缓冲池,这意味着Subversion的API使用者也必须链接到APR,必须调用apr_initialize()来初始化APR子系统,而且在使用Subversion API时必须创立和管理池,通常是使用svn_pool_create()、svn_pool_clear()和svn_poo

31、l_destroy()。使用内存池编程几乎每一个使用过C语言的开发者曾经感慨令人畏缩的内存管理,分配足够的内存,并且追踪内存的分配,在不需要时释放内存这个任务会非常复杂。当然,如果没有正确地做到这一点会导致程序毁掉自己,或者更加严重一点,把电脑搞瘫。另一方面高级语言使开发者完全摆脱了内存管理, HYPERLINK :/ /svnbook/1.4/svn.developer.usingapi.html l ftn.d0e13397#ftn.d0e13397 53Java和Python之类的语言使用垃圾收集原理,在需要的时候分配对象内存,在不使用时进行清理。APR提供

32、了一种叫做池根底的中等的内存管理方法,允许开发者以一种低分辨率的方式控制内存每块或池“pool的内存,而不是每个对象。不是使用malloc()和其他按照对象分配内存的方式,你要求APR从内存创立一段内存池,当你结束使用在池中创立的对象,你销毁池,可以有效地取消其中的对象消耗的内存。通过池,你不需要跟踪每个对象的内存释放,你的程序只需要跟踪这些对象,将对象分配到池中,而池的生命周期池的创立和删除之间的时间满足所有对象的需要。URL和路径需求因为分布式版本控制操作是Subversion存在的重点,有意义来关注一下国际化i18n支持。毕竟,当“分布式或许意味着“横跨办公室,它也意味着“横跨全球。为了

33、更容易一点,Subversion的所有公共接口只接受路径参数,这些参数是传统的,使用UTF-8编码。这意味着,举个例子,任何新的使用libsvn_client接口客户端库,在把这些参数传递给Subversion库前,需要首先将路径从本地代码转化为UTF-8代码,然后将Subversion传递回来的路径转换为本地代码,很幸运,Subversion提供了一组任何程序可以使用的转化方法见subversion/include/svn_utf.h。同样,Subversion的API需要所有的URL参数是正确的URI编码,所以,我们不会传递file:/home/username/My File.txt作为

34、My File.txt的URL,而要传递file:/home/username/My%20File.txt。再次,Subversion提供了一些你可以使用的助手方法svn_path_uri_encode()和svn_path_uri_decode(),分别用来URI的编码和解码。使用C和C+以外的语言除C语言以外,如果你对使用其他语言结合Subversion库感兴趣如Python脚本或是Java应用Subversion通过简单包裹生成器SWIG提供了最初的支持。Subversion的SWIG绑定位于subversion/bindings/swig,并且慢慢的走向成熟进入可用状态。这个绑定允许你

35、直接调用Subversion的API方法,使用包裹器会把脚本数据类型转化为Subversion需要的C语言库类型。非常不幸,Subversion的语言绑定缺乏对核心Subversion模块的关注,但是,花了很多力气处理创立针对Python、Perl和Ruby的功能绑定,在一定程度上,在这些接口上的工作量可以在其他语言的SWIG包括C#、Guile、Java、MzScheme、OCaml、PHP、Tcl等等接口上得到重用。然而,为了完成复杂的API,一些SWIG接口仍然需要额外的编程工作,关于SWIG本身的更多信息可以看工程的网站 :/ /。Subversion也有Java的语言

36、绑定,JavaJL绑定位于Subversion源目录树的subversion/bindings/java不是基于SWIG的,而是javah和手写JNI的混合,JavaHL几乎覆盖Subversion客户端的API,目标是作为Java根底的Subversion客户端和集成IDE的实现。Subversion的语言绑定缺乏Subversion核心模块的关注,但是通常可以作为一个产品信赖。大量脚本、应用、Subversion的GUI客户端和其他第三方工具现在已经成功地运用了Subversion语言绑定来完成Subversion的集成。这里使用其它语言的方法来与Subversion交互没有任何意义:Su

37、bversion开发社区没有提供其他的绑定,你可以在Subversion工程链接页里找到其他绑定的链接,但是有一些流行的绑定我觉得应该特别留意。首先是Python的流行绑定,Barry Scott的PySVN。PySVN鼓吹它们提供了更多Python样式的接口,而不像Subversion自己的Python绑定的C样式接口。对于希望寻求Subversion纯Java实现的人,可以看看SVNKit :/svnkit /,也就是从头使用Java编写的Subversion。你必须要小心,SVNKit没有采用Subversion的核心库,其行为方式没有确保与Subversion匹配。代码样例使用版本库层

38、使用版本库层中包含了一段C代码C编写描述了我们讨论的概念,它使用了版本库和文件系统接口可以通过方法名svn_repos_和svn_fs_分辨创立了一个添加目录的修订版本。你可以看到APR库的使用,为了内存分配而传递,这些代码也揭开了一些关于Subversion错误处理的晦涩事实所有的Subversion错误必须需要明确的处理以防止内存泄露在某些情况下,应用失败。/* Convert a Subversion error into a simple boolean error code. * * NOTE: Subversion errors must be cleared (using svn

39、_error_clear() * because they are allocated from the global pool, else memory * leaking occurs. */#define INT_ERR(expr) do svn_error_t *_temperr = (expr); if (_temperr) svn_error_clear(_temperr); return 1; return 0; while (0)/* Create a new directory at the path NEW_DIRECTORY in the Subversion * rep

40、ository located at REPOS_PATH. Perform all memory allocation in * POOL. This function will create a new revision for the addition of * NEW_DIRECTORY. Return zero if the operation completes * successfully, non-zero otherwise. */static intmake_new_directory(const char *repos_path, const char *new_dire

41、ctory, apr_pool_t *pool) svn_error_t *err; svn_repos_t *repos; svn_fs_t *fs; svn_revnum_t youngest_rev; svn_fs_txn_t *txn; svn_fs_root_t *txn_root; const char *conflict_str; /* Open the repository located at REPOS_PATH. */ INT_ERR(svn_repos_open(&repos, repos_path, pool); /* Get a pointer to the fil

42、esystem object that is stored in REPOS. */ fs = svn_repos_fs(repos); /* Ask the filesystem to tell us the youngest revision that * currently exists. */ INT_ERR(svn_fs_youngest_rev(&youngest_rev, fs, pool); /* Begin a new transaction that is based on YOUNGEST_REV. We are * less likely to have our lat

43、er commit rejected as conflicting if we * always try to make our changes against a copy of the latest snapshot * of the filesystem tree. */ INT_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool); /* Now that we have started a new Subversion transaction, get a root * object that represents that trans

44、action. */ INT_ERR(svn_fs_txn_root(&txn_root, txn, pool); /* Create our new directory under the transaction root, at the path * NEW_DIRECTORY. */ INT_ERR(svn_fs_make_dir(txn_root, new_directory, pool); /* Commit the transaction, creating a new revision of the filesystem * which includes our added di

45、rectory path. */ err = svn_repos_fs_commit_txn(&conflict_str, repos, &youngest_rev, txn, pool); if (! err) /* No error? Excellent! Print a brief report of our success. */ printf(Directory %s was successfully added as new revision %ld.n, new_directory, youngest_rev); else if (err-apr_err = SVN_ERR_FS

46、_CONFLICT) /* Uh-oh. Our commit failed as the result of a conflict * (someone else seems to have made changes to the same area * of the filesystem that we tried to modify). Print an error * message. */ printf(A conflict occurred at path %s while attempting to add directory %s to the repository at %s

47、.n, conflict_str, new_directory, repos_path); else /* Some other error has occurred. Print an error message. */ printf(An error occurred while attempting to add directory %s to the repository at %s.n, new_directory, repos_path); INT_ERR(err); 使用Python处理版本库层同样的C程序需要处理APR内存池系统,但是Python自己处理内存,Subversio

48、n的Python绑定也遵循这种习惯。在C语言中,为表示路径和条目的hash需要处理自定义的数据类型例如APR提供的库,但是Python有hash叫做“dictionaries,并且是内置数据类型,而且还提供了一系列操作这些类型的函数,所以SWIG通过Subversion的语言绑定层的自定义帮助要小心的将这些自定义数据类型映射到目标语言的数据类型,这为目标语言的用户提供了一个更加直观的接口。#!/usr/bin/pythonCrawl a repository, printing versioned object path names.import sysimport os.pathimport

49、 svn.fs, svn.core, svn.reposdef crawl_filesystem_dir(root, directory): Recursively crawl DIRECTORY under ROOT in the filesystem, and return a list of all the paths at or below DIRECTORY. # Print the name of this path. print directory + / # Get the directory entries for DIRECTORY. entries = svn.fs.sv

50、n_fs_dir_entries(root, directory) # Loop over the entries. names = entries.keys() for name in names: # Calculate the entrys full path. full_path = directory + / + name # If the entry is a directory, recurse. The recursion will return # a list with the entry and all its children, which we will add to

51、 # our running list of paths. if svn.fs.svn_fs_is_dir(root, full_path): crawl_filesystem_dir(root, full_path) else: # Else its a file, so print its path here. print full_pathdef crawl_youngest(repos_path): Open the repository at REPOS_PATH, and recursively crawl its youngest revision. # Open the rep

52、ository at REPOS_PATH, and get a reference to its # versioning filesystem. repos_obj = svn.repos.svn_repos_open(repos_path) fs_obj = svn.repos.svn_repos_fs(repos_obj) # Query the current youngest revision. youngest_rev = svn.fs.svn_fs_youngest_rev(fs_obj) # Open a root object representing the younge

53、st (HEAD) revision. root_obj = svn.fs.svn_fs_revision_root(fs_obj, youngest_rev) # Do the recursive crawl. crawl_filesystem_dir(root_obj, ) if _name_ = _main_: # Check for sane usage. if len(sys.argv) != 2: sys.stderr.write(Usage: %s REPOS_PATHn % (os.path.basename(sys.argv0) sys.exit(1) # Canonical

54、ize the repository path. repos_path = svn.core.svn_path_canonicalize(sys.argv1) # Do the real work. crawl_youngest(repos_path)一个Python状态爬虫Subversion的Python绑定也可以用来进行工作拷贝的操作,在本章前面的小节中,我们提到过libsvn_client接口,它存在的目的就是简化编写Subversion客户端的难度, HYPERLINK :/ /svnbook/1.4/svn.developer.usingapi.htm

55、l l svn.developer.usingapi.otherlangs.ex-2 o 例8.3.一个Python状态爬虫 例8.3 “一个Python状态爬虫是一个例子,讲的是如何使用SWIG绑定创立一个扩展版本的svn status命令。#!/usr/bin/env pythonCrawl a working copy directory, printing status information.import sysimport os.pathimport getoptimport svn.core, svn.client, svn.wcdef generate_status_code(

56、status): Translate a status value into a single-character status code, using the same logic as the Subversion command-line client. code_map = svn.wc.svn_wc_status_none : , svn.wc.svn_wc_status_normal : , svn.wc.svn_wc_status_added : A, svn.wc.svn_wc_status_missing : !, svn.wc.svn_wc_status_incomplet

57、e : !, svn.wc.svn_wc_status_deleted : D, svn.wc.svn_wc_status_replaced : R, svn.wc.svn_wc_status_modified : M, svn.wc.svn_wc_status_merged : G, svn.wc.svn_wc_status_conflicted : C, svn.wc.svn_wc_status_obstructed : , svn.wc.svn_wc_status_ignored : I, svn.wc.svn_wc_status_external : X, svn.wc.svn_wc_status_unversioned : ?, return code_map.get(status, ?)def do_status(wc_path, verbose): # Calculate the length of the input worki

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论