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

下载本文档

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

文档简介

SVN用户使用指南VERSION10文档变更记录当前版本V10作者WANGHJ审核人文件状态草稿正式发布发布日期修订号修改内容描述修改人修改日期备注目录1引言111目的112范围12SVN基础知识121SVN简介122SVN特性123SVN的架构33SVN的基本应用431客户端的安装432版本库浏览REPOBROWSER633版本库的基本操作8331ADDFILE(FOLDER)添加文件文件夹8332COMMIT提交9333SHOWLOG查看日志9334EXPORT导出11335REVISIONGRAPH版本树显示12336CHECKOUT检出13337REFRESH刷新13338DELETE删除14339RENAME对目录或文件进行改名143310COPYTOWORKINGCOPY把当前目录拷贝到本地153311COPYTO拷贝到1634客户端操作17341客户端的基本操作17342常用功能介绍20343分支与合并234SVNAPI2541使用API2542URL和路径需求2743使用C和C以外的语言2744代码样例28441使用版本库层28442使用PYTHON处理版本库层35443一个PYTHON状态爬虫4045参考资料451引言11目的为了对配置管理工具SUBVERSION,以下简称为SVN应用过程提供指导,编制此指南12范围本规范适应于北京高伟达软件技术有限公司内部使用2SVN基础知识21SVN简介SVN是一具开源的版本控制系统,SVN将文件存放在中心版本库里,这个版本库很像一个普通的文件服务器,不同的是,它可以记录每一次文件和的修改情况。这样我们就可以籍此将数据回复到以前的版本,并可以查看的更改细节。也就是说,一旦一个文件被传到SVN上面,那么不管对它进行什么操作,SVN都会有清晰的记录,即使它在N天前被删除了,也可以被找回来。所以,许多人将版本控制系统当作一种神奇的“时间机器”。22SVN特性版本化目录SVN实现的“虚拟”版本化文件系统可以跟踪目录树的变更。也就是说,在SVN中,文件和目录都是版本化的。真实的版本历史由于实现了文件和目录的版本化,SVN可以记录如文件拷贝和改名这些常见操作带来的版本变更,即在SVN中,对文件或目录都可以进行增加、拷贝和操作,并有版本历史记录。原子提交一系列相关的更改,要么全部提交到版本库,要么一个也不提交,这样用户就可以将相关的更改组成一个逻辑整体,防止出现部分修改需另一部分未修改的情况提交到版本库中。可选的网络层SVN在版本库访问的实现上具有较高的抽象程度,利于人们实现新的网络访问机制。SVN可以作为一个扩展模块嵌入到APACHE之中,这种方式在稳定性和交互性方面有很大的优势,可以直接使用服务器的成熟技术认证、授权和传输压缩等。此外,SVN自身也实现了一个轻型的、可独立运行的服务器软件。这个服务器使用了一个特定的协议,这个协议可以轻松用SSH封装。我们目前选用的是SVN自身的服务器,即SVNSERVER方式,本文主要是对SVNSERVER方式的使用方法介绍。一致的数据操作SVN用一个二进制差算法描述文件和变化,对于文件(可读)和二进行制(不可读)文件其操作方式是一致的。这两种类型的文件压缩存储在版本库中,而差异信息则在网络上双向传递。高效的分支和标签操作在SVN中,分支与标签操作的开销与工程的大小无关,SVN的分支和标签操作是一种类似于硬链接的机制拷贝整个工程。因而这些操作通常只会花费很少且相对固定的时间。可修改性SVN没有历史负担,它以一系列优质的共享C程序库的方式实现,具有定义良好的API。23SVN的架构3SVN的基本应用31客户端的安装点击YES,重启电脑,完成安装。32版本库浏览REPOBROWSER完成安装之后,点击鼠标右键,会出现下图,这是SVN的基本功能,下面一一介绍点击REPOBROWSER之后,会出现下面的小对话框在里面输入你要键接的版本库输入方法为HTTPS/服务器IP端口号/所在版本库名称,如PQA的配置库为HTTPS/100588443/PQA(记得SVN是小写字母的),点“OK”进入登录界面。如果以前有登录过,SVN会自动记录登录历史。登录界面如下输入用户名和密码即可进入所在的版本库。33版本库的基本操作331ADDFILE(FOLDER)添加文件文件夹用此命令可以向服务器端目录添加一个本地的文件或文件夹。332COMMIT提交使用COMMIT命令可以将ADD的文件添加到服务器333SHOWLOG查看日志点击此按扭,会显示当前目录下的所有文件和目录日志的信息。会跳出下面的对话框334EXPORT导出用此命令,指定路径,便可导出一个干净的目录树,所谓“干净的”就是导出的文件不受SVN的版本控制。默认的是导出当前版本的目录内容,当然也可以指定你想导出的版,如图所示在EXPORTDIRECTORY中选择本地的路径335REVISIONGRAPH版本树显示它可以把对此目录所做的所有操作以图的形式显示出来,并可以记录每一步都进行了什么操作,相当于“SHOWLOG”的一个图解,如下图所示336CHECKOUT检出用此命令可以从服务器导出选中的目录到本地工作拷贝(本机),它和EXPORT的区别在于,检出的文件受版本控制,如下图所示337REFRESH刷新刷新服务器端目录。338DELETE删除对目录或文件都可以进行删除操作,删除后版本号增加,可以通过“SHOWLOG”找出已经删除的文件,并且可以看到文件夹变成注意文件只有在自己的工作副本中删除了,必须执行COMMIT,文件才算是真正的删除了。339RENAME对目录或文件进行改名如果要对文件进行改名,要在服务器端对文件或文件夹用RENAME命令,改完后在本地工作拷贝的上级目录执行“COMMIT”即可。可以在本地用右键,使用TSVN的菜单改名,提交后效果一样。3310COPYTOWORKINGCOPY把当前目录拷贝到本地本地工作拷贝必须是已经受版本控制的文件夹,执行此命令后,如把“01参考资料”复制到本地工作拷贝的“PQA”中,就会出现下图,绿色的对号表示此目录是从服务器上“CHECKOUT”出来的受版本控制的本地工作拷贝,蓝色的加号表示此文件预添加到服务器上。这时,在此目录空白处或选中“01参考资料”文件夹,右键执行“SVNCOMMIT”命令如下图所示“01参考资料”便会成功提交到服务器上“PQA”的目录下面。3311COPYTO拷贝到用此命令可以在当前版本库中建立分支(标签/基线),SVN允许并行的维护文件和目录的分支,各个分支间互相联系,也可以从一个分支复制修改到另一个分支,最终,可以让本地工作拷贝反映到不同的分支上,所以在日常的工作中,可以“混合和比较”不同的开发线。34客户端操作341客户端的基本操作在本地工作拷贝空白处点击右键会出现如下图所示,下面对此菜单中常用的功能做详细的介绍工作拷贝就是执行“CHECKOUT”命令从服务器端检出到本地的一个目录,是个人的一个私有工作区,在此目录下,可以任意的编辑文件,如果是源代码文件,可以像平常一样编译。比如,我们对过程记录中会议记录中一个文件的日期做修改,被编辑后的文件和它的上一级目录都会显示为这时可以对此文件执行SVNCOMMIT提交操作,那么编辑的内容便会提交到服务器上,以便大家共享你的工作成果。这时对改后的版本点击右键,执行“SHOWLOG”后,可以显示版本日志,如果想看到本次的改动和原始的版本有何差别,那么选中当前版本记录,右键执行“SHOWCHANGES”如下图所示这时它就会显示本次是哪些动作导致了版本的变化,红色部分新增加的内容,它以标注的方式显示还要补充说明的是,在SVN上,有三种权限读、读写、无权限。如果想对你的工作拷贝进行编辑,那么你必须有在这个目录下读写的权限,如果在服务器端此目录下面你无权限或只有读的权限,那么即使在本地拷贝做了修改,也不能提交到服务器上,也就是说,每个有读权限的人可以看查版本库目录下的内容(无权限的不能查看),但只能对自己被赋予读写权限的目录做修改。这就保护了你的工作目录不会被别的人随意改动。342常用功能介绍3421REVERT返回上一级如果你对文件做了修改之后,还未进行提交,可是文档的标记已经为红色的叹号,而这时你又发现变错了,想把文档返回到原来的状态,这时你可以执行REVERT操作,便可使文档回到原来的状态,因为你没有执行提交操作,这时服务器上版本库版本号不会增加。3422UPDATETOREVISION返回到版本如果是你已经执行了提交操作,这时可以用UPDATETOREVISION命令,在跳出的对话框中选择你想返回到的版本,那么你的本地工作拷贝便会回到你所选的版本的状态。“SAVEREVISIONTO”也可以把原来版本进行存档。强调一点的是,你的本地工作拷贝可以返回到原来的版本,可是服务器上只会记录你对它进行最后一次提交的版本,所以服务器端版本不会变化,如果你想把服务器端的文档内容也换为原来的状态,可以用旧版本文件覆盖新版本文件,然后提交。3423IMPORT导入导入是一种批量向服务器上添加文件的方法,如果你想把本地的文件或文件夹添加到服务器上的某个目录下面,那么在本地的目录中,在空白处右键TORTOISRSVNIMPORT,会跳出下面的对话框点“OK”后就可以把本地的文件或文件夹导入到服务器端所选目录下面。3424SVNUPDATE更新用此命令可以更新你的工作拷贝,因为每个人都有自己的工作拷贝,在你对项目目录进行操作的同时,项目组其他人员也在进行编辑并提交的动作,版本库内容随着项目人员的每一次提交做着不同的变化,所以在每次编辑操作之前,都要对本地工作拷贝执行UPDATE的操作,以保证本地工作拷贝与服务器项目版本库内容保持一致。3425RESOLVED冲突已解决当两个人同时编辑一个文件,一个人先提交后,另一个人再进行提交的时候就会出现冲突,这时会弹出冲突对话框,如下图所示你可以对出现的冲突的文件进行编辑,选定你最终想要的文档。这就是“MERGE”合并操作。在出现冲突以及应用分支时会经常用到合并的功能。合并完毕后,执行RESOLVED,则新的版本就被生成了。3426SWITCH切换把你的工作拷贝切换到另个的URL(服务器目录),服务器端目录有所变化,所存储的文件位置发生了变化,那么对你的工作拷贝进行编辑后就会出现提交不上去的情况,这时就要执行SWITCH操作,使你的工作拷贝切换到服务器端对应的目录下面,即可再进行提交。SWITCH操作只限于版本库内的切换。3427RELOCATE重新定位它和SWITCH的功能是一样的,不同的是,它实现的是版本库与版本库之间的切换。当服务器地址或版本库名称发生变化时,可以用些命令来更新你的工作拷贝。3428CREATE(APPLY)PATCH创建应用补丁如果你对这个文件没有修改的权限,但是迫于形势,你又必须对这个文件进行修改,这时你就可以用CREATEPATCH创建补丁,然后把你创建的补丁发给对此目录有写权限的工作人员,他执行APPLYPATCH后,你所做的修改就会被提交到服务器上。343分支与合并3431从项目主分支下载项目初始源码到开发分支操作步骤1在TRUNK目录新建一个项目名称为ASTX2在ASTX项目中新建两个模块分别为MODULE1和MODULE2,分别为新建一个名TESTTXT的文件3选择ASTX项目名称,右击选择BRANCH/TAG4请注意FROMWCATURL必须是项目ASTX的根路径,TOURL在这里选择BRANCH存放的路径,通常的路径为HTTP/LOCALHOST/SVN/ASTX/BRANCHES/ASTX_DEV_TB注BRANCHES为分支的存放路径,ASTX_DEV_TB为分支的名称5在BRANCHES目录右击UPDATE,就可以看到刚才的ASTX_DEV_TB分支;3432把分支ASTX_DEV_TB的的修改合并到项目主分支操作步骤1选择项目主分支右击TORTOISESVN选择MERGE,选择REINTEGRATEABRANCH;2点击NEXT,在URLTOMERGEFROM的地址栏中选择ASTX_DEV_TB分支的路径;注意WORKINGCOPY是项目主分支的路径3点击NEXT,在MERGEDEPTH下拉框中选择“WORKINGCOPY”,点击MERGE,将分支的修改合并到主干上;4在项目主分支右击COMMIT,整个的过程才算完成5如果要退回前一个版本,选择项目主分支右击TORTOISESVN选择REVERT,将取消本次合并的内容3433两个不同分支的修改合并到项目主分支34331修改同一个文件的不同行操作步骤1基于项目主分支创建两个不同的分支分别为ASTX_DEV_JOHN,ASTX_DEV_HARRY创建分支的方法,请参照11注JOHN和HARRY为同一个项目创建自己的工作副本,工作是并行的2JOHN和HARRY修改同一个文件TEXTTXT的不同行,JOHN先保存修改到版本库具体的合并的步骤,请参照12,最后别忘了COMMIT3当HARRY提交修改的时候,版本库提示文件TEXTTXT在他上次更新之后已经更改了,如果JOHN修改的内容不和HARRY的冲突,一旦把所有的修改集成到一起,就可以把工作拷贝保存到版本库,最后别忘了COMMIT34332修改同一个文件的同一行操作步骤1基于项目主分支创建两个不同的分支分别为ASTX_DEV_JOHN,ASTX_DEV_HARRY注JOHN和HARRY为同一个项目创建自己的工作副本,工作是并行的2JOHN和HARRY修改同一个文件TEXTTXT的同一行,JOHN先保存修改到版本库具体的合并的步骤,请参照123当HARRY提交修改的时候,版本库提示文件TEXTTXT冲突,这时只能够人工去选择一组修改,并把所有的修改集成到一起,就可以把工作拷贝保存到版本库,记得做完之后一定要COMMIT4SVNAPI41使用API使用SUBVERSION库API开发应用看起来相当的直接,所有的公共头文件放在源文件的SUBVERSION/INCLUDE目录,从源代码编译和安装SUBVERSION本身,需要这些头文件拷贝到系统位置。这些头文件包括了所有用户和SUBVERSION库可以访问的功能和类型。SUBVERSION开发者社区仔细的确保所有的公共API有完好的文档直接引用头文件的文档。你首先应该注意SUBVERSION的数据类型和方法是命名空间保护的,每一个公共SUBVERSION对象名以SVN_开头,然后紧跟一个这个对象定义(如WC、CLIENT和FS等等)所在的库的简短编码,然后是一个下划线(_)和后面的对象名称。半公开的方法(库使用,但是但库之外代码不可以使用并且只可以在库自己的目录看到)与这个命名模式不同,并不是库代码之后紧跟一个下划线,他们是用两个下划线(_)。给定源文件的私有方法没有特殊前缀,使用STATIC声明。当然,一个编译器不会关心命名习惯,只是用来区分给定方法或数据类型的应用范围。关于SUBVERSION的API编程的另一个好的资源是HACKING指南,可以在HTTP/SUBVERSIONTIGRISORG/HACKINGHTML找到,这个文档包含了有用的信息,同时满足SUBVERSION本身的开发者和将SUBVERSION作为第三方库的开发者。APACHE可移值运行库伴随SUBVERSION自己的数据类型,你会看到许多APR开头的数据类型引用来自APACHE可移植运行库(APR)的对象。APR是APACHE可移植运行库,源自为了服务器代码的多平台性,尝试将不同的操作系统特定字节与操作系统无关代码隔离。结果就提供了一个基础API的库,只有一些适度区别或者是广泛的来自各个操作系统。APACHEHTTP服务器很明显是APR库的第一个用户,SUBVERSION开发者立刻发现了使用APR库的价值。意味着SUBVERSION没有操作系统特定的代码,也意味着SUBVERSION客户端可以在SERVER存在的平台编译和运行。当前这个列表包括,各种类型的UNIX、WIN32、OS/2和MACOSX。除了提供了跨平台一致的系统调用,APR给SUBVERSION对多种数据类型有快速的访问,如动态数组和哈希表。SUBVERSION在代码中广泛使用这些类型,但是SUBVERSION的API原型中最常见的APR类型是APR_POOL_TAPR内存池,SUBVERSION使用内部缓冲池用来进行内存分配(除非外部库在API传递参数时需要一个不同的内存管理模式),而且一个人如果针对SUBVERSION的API编码不需要做同样的事情,他们可以在需要时给API提供缓冲池,这意味着SUBVERSION的API使用者也必须链接到APR,必须调用APR_INITIALIZE来初始化APR子系统,而且在使用SUBVERSIONAPI时必须创建和管理池,通常是使用SVN_POOL_CREATE、SVN_POOL_CLEAR和SVN_POOL_DESTROY。使用内存池编程几乎每一个使用过C语言的开发者曾经感叹令人畏缩的内存管理,分配足够的内存,并且追踪内存的分配,在不需要时释放内存这个任务会非常复杂。当然,如果没有正确地做到这一点会导致程序毁掉自己,或者更加严重一点,把电脑搞瘫。另一方面高级语言使开发者完全摆脱了内存管理,53JAVA和PYTHON之类的语言使用垃圾收集原理,在需要的时候分配对象内存,在不使用时进行清理。APR提供了一种叫做池基础的中等的内存管理方法,允许开发者以一种低分辨率的方式控制内存每块(或池“POOL”)的内存,而不是每个对象。不是使用MALLOC和其他按照对象分配内存的方式,你要求APR从内存创建一段内存池,当你结束使用在池中创建的对象,你销毁池,可以有效地取消其中的对象消耗的内存。通过池,你不需要跟踪每个对象的内存释放,你的程序只需要跟踪这些对象,将对象分配到池中,而池的生命周期(池的创建和删除之间的时间)满足所有对象的需要。42URL和路径需求因为分布式版本控制操作是SUBVERSION存在的重点,有意义来关注一下国际化(I18N)支持。毕竟,当“分布式”或许意味着“横跨办公室”,它也意味着“横跨全球”。为了更容易一点,SUBVERSION的所有公共接口只接受路径参数,这些参数是传统的,使用UTF8编码。这意味着,举个例子,任何新的使用LIBSVN_CLIENT接口客户端库,在把这些参数传递给SUBVERSION库前,需要首先将路径从本地代码转化为UTF8代码,然后将SUBVERSION传递回来的路径转换为本地代码,很幸运,SUBVERSION提供了一组任何程序可以使用的转化方法(见SUBVERSION/INCLUDE/SVN_UTFH)。同样,SUBVERSION的API需要所有的URL参数是正确的URI编码,所以,我们不会传递FILE/HOME/USERNAME/MYFILETXT作为MYFILETXT的URL,而要传递FILE/HOME/USERNAME/MY20FILETXT。再次,SUBVERSION提供了一些你可以使用的助手方法SVN_PATH_URI_ENCODE和SVN_PATH_URI_DECODE,分别用来URI的编码和解码。43使用C和C以外的语言除C语言以外,如果你对使用其他语言结合SUBVERSION库感兴趣如PYTHON脚本或是JAVA应用SUBVERSION通过简单包裹生成器(SWIG)提供了最初的支持。SUBVERSION的SWIG绑定位于SUBVERSION/BINDINGS/SWIG,并且慢慢的走向成熟进入可用状态。这个绑定允许你直接调用SUBVERSION的API方法,使用包裹器会把脚本数据类型转化为SUBVERSION需要的C语言库类型。非常不幸,SUBVERSION的语言绑定缺乏对核心SUBVERSION模块的关注,但是,花了很多力气处理创建针对PYTHON、PERL和RUBY的功能绑定,在一定程度上,在这些接口上的工作量可以在其他语言的SWIG(包括C、GUILE、JAVA、MZSCHEME、OCAML、PHP、TCL等等)接口上得到重用。然而,为了完成复杂的API,一些SWIG接口仍然需要额外的编程工作,关于SWIG本身的更多信息可以看项目的网站HTTP/WWWSWIGORG/。SUBVERSION也有JAVA的语言绑定,JAVAJL绑定(位于SUBVERSION源目录树的SUBVERSION/BINDINGS/JAVA)不是基于SWIG的,而是JAVAH和手写JNI的混合,JAVAHL几乎覆盖SUBVERSION客户端的API,目标是作为JAVA基础的SUBVERSION客户端和集成IDE的实现。SUBVERSION的语言绑定缺乏SUBVERSION核心模块的关注,但是通常可以作为一个产品信赖。大量脚本、应用、SUBVERSION的GUI客户端和其他第三方工具现在已经成功地运用了SUBVERSION语言绑定来完成SUBVERSION的集成。这里使用其它语言的方法来与SUBVERSION交互没有任何意义SUBVERSION开发社区没有提供其他的绑定,你可以在SUBVERSION项目链接页里(HTTP/SUBVERSIONTIGRISORG/LINKSHTML)找到其他绑定的链接,但是有一些流行的绑定我觉得应该特别留意。首先是PYTHON的流行绑定,BARRYSCOTT的PYSVN(HTTP/PYSVNTIGRISORG/)。PYSVN鼓吹它们提供了更多PYTHON样式的接口,而不像SUBVERSION自己的PYTHON绑定的C样式接口。对于希望寻求SUBVERSION纯JAVA实现的人,可以看看SVNKIT(HTTP/SVNKITCOM/),也就是从头使用JAVA编写的SUBVERSION。你必须要小心,SVNKIT没有采用SUBVERSION的核心库,其行为方式没有确保与SUBVERSION匹配。44代码样例441使用版本库层使用版本库层中包含了一段C代码(C编写)描述了我们讨论的概念,它使用了版本库和文件系统接口(可以通过方法名SVN_REPOS_和SVN_FS_分辨)创建了一个添加目录的修订版本。你可以看到APR库的使用,为了内存分配而传递,这些代码也揭开了一些关于SUBVERSION错误处理的晦涩事实所有的SUBVERSION错误必须需要明确的处理以防止内存泄露(在某些情况下,应用失败)。/CONVERTASUBVERSIONERRORINTOASIMPLEBOOLEANERRORCODENOTESUBVERSIONERRORSMUSTBECLEAREDUSINGSVN_ERROR_CLEARBECAUSETHEYAREALLOCATEDFROMTHEGLOBALPOOL,ELSEMEMORYLEAKINGOCCURS/DEFINEINT_ERREXPRDOSVN_ERROR_T_TEMPERREXPRIF_TEMPERRSVN_ERROR_CLEAR_TEMPERRRETURN1RETURN0WHILE0/CREATEANEWDIRECTORYATTHEPATHNEW_DIRECTORYINTHESUBVERSIONREPOSITORYLOCATEDATREPOS_PATHPERFORMALLMEMORYALLOCATIONINPOOLTHISFUNCTIONWILLCREATEANEWREVISIONFORTHEADDITIONOFNEW_DIRECTORYRETURNZEROIFTHEOPERATIONCOMPLETESSUCCESSFULLY,NONZEROOTHERWISE/STATICINTMAKE_NEW_DIRECTORYCONSTCHARREPOS_PATH,CONSTCHARNEW_DIRECTORY,APR_POOL_TPOOLSVN_ERROR_TERRSVN_REPOS_TREPOSSVN_FS_TFSSVN_REVNUM_TYOUNGEST_REVSVN_FS_TXN_TTXNSVN_FS_ROOT_TTXN_ROOTCONSTCHARCONFLICT_STR/OPENTHEREPOSITORYLOCATEDATREPOS_PATH/INT_ERRSVN_REPOS_OPEN/GETAPOINTERTOTHEFILESYSTEMOBJECTTHATISSTOREDINREPOS/FSSVN_REPOS_FSREPOS/ASKTHEFILESYSTEMTOTELLUSTHEYOUNGESTREVISIONTHATCURRENTLYEXISTS/INT_ERRSVN_FS_YOUNGEST_REV/BEGINANEWTRANSACTIONTHATISBASEDONYOUNGEST_REVWEARELESSLIKELYTOHAVEOURLATERCOMMITREJECTEDASCONFLICTINGIFWEALWAYSTRYTOMAKEOURCHANGESAGAINSTACOPYOFTHELATESTSNAPSHOTOFTHEFILESYSTEMTREE/INT_ERRSVN_FS_BEGIN_TXN/NOWTHATWEHAVESTARTEDANEWSUBVERSIONTRANSACTION,GETAROOTOBJECTTHATREPRESENTSTHATTRANSACTION/INT_ERRSVN_FS_TXN_ROOT/CREATEOURNEWDIRECTORYUNDERTHETRANSACTIONROOT,ATTHEPATHNEW_DIRECTORY/INT_ERRSVN_FS_MAKE_DIRTXN_ROOT,NEW_DIRECTORY,POOL/COMMITTHETRANSACTION,CREATINGANEWREVISIONOFTHEFILESYSTEMWHICHINCLUDESOURADDEDDIRECTORYPATH/ERRSVN_REPOS_FS_COMMIT_TXNIFERR/NOERROREXCELLENTPRINTABRIEFREPORTOFOURSUCCESS/PRINTF“DIRECTORYSWASSUCCESSFULLYADDEDASNEWREVISION“LDN“,NEW_DIRECTORY,YOUNGEST_REVELSEIFERRAPR_ERRSVN_ERR_FS_CONFLICT/UHOHOURCOMMITFAILEDASTHERESULTOFACONFLICTSOMEONEELSESEEMSTOHAVEMADECHANGESTOTHESAMEAREAOFTHEFILESYSTEMTHATWETRIEDTOMODIFYPRINTANERRORMESSAGE/PRINTF“ACONFLICTOCCURREDATPATHSWHILEATTEMPTING“TOADDDIRECTORYSTOTHEREPOSITORYATSN“,CONFLICT_STR,NEW_DIRECTORY,REPOS_PATHELSE/SOMEOTHERERRORHASOCCURREDPRINTANERRORMESSAGE/PRINTF“ANERROROCCURREDWHILEATTEMPTINGTOADDDIRECTORYS“TOTHEREPOSITORYATSN“,NEW_DIRECTORY,REPOS_PATHINT_ERRERR442使用PYTHON处理版本库层同样的C程序需要处理APR内存池系统,但是PYTHON自己处理内存,SUBVERSION的PYTHON绑定也遵循这种习惯。在C语言中,为表示路径和条目的HASH需要处理自定义的数据类型(例如APR提供的库),但是PYTHON有HASH(叫做“DICTIONARIES”),并且是内置数据类型,而且还提供了一系列操作这些类型的函数,所以SWIG(通过SUBVERSION的语言绑定层的自定义帮助)要小心的将这些自定义数据类型映射到目标语言的数据类型,这为目标语言的用户提供了一个更加直观的接口。/USR/BIN/PYTHON“CRAWLAREPOSITORY,PRINTINGVERSIONEDOBJECTPATHNAMES“IMPORTSYSIMPORTOSPATHIMPORTSVNFS,SVNCORE,SVNREPOSDEFCRAWL_FILESYSTEM_DIRROOT,DIRECTORY“RECURSIVELYCRAWLDIRECTORYUNDERROOTINTHEFILESYSTEM,ANDRETURNALISTOFALLTHEPATHSATORBELOWDIRECTORY“PRINTTHENAMEOFTHISPATHPRINTDIRECTORY“/“GETTHEDIRECTORYENTRIESFORDIRECTORYENTRIESSVNFSSVN_FS_DIR_ENTRIESROOT,DIRECTORYLOOPOVERTHEENTRIESNAMESENTRIESKEYSFORNAMEINNAMESCALCULATETHEENTRYSFULLPATHFULL_PATHDIRECTORY/NAMEIFTHEENTRYISADIRECTORY,RECURSETHERECURSIONWILLRETURNALISTWITHTHEENTRYANDALLITSCHILDREN,WHICHWEWILLADDTOOURRUNNINGLISTOFPATHSIFSVNFSSVN_FS_IS_DIRROOT,FULL_PATHCRAWL_FILESYSTEM_DIRROOT,FULL_PATHELSEELSEITSAFILE,SOPRINTITSPATHHEREPRINTFULL_PATHDEFCRAWL_YOUNGESTREPOS_PATH“OPENTHEREPOSITORYATREPOS_PATH,ANDRECURSIVELYCRAWLITSYOUNGESTREVISION“OPENTHEREPOSITORYATREPOS_PATH,ANDGETAREFERENCETOITSVERSIONINGFILESYSTEMREPOS_OBJSVNREPOSSVN_REPOS_OPENREPOS_PATHFS_OBJSVNREPOSSVN_REPOS_FSREPOS_OBJQUERYTHECURRENTYOUNGESTREVISIONYOUNGEST_REVSVNFSSVN_FS_YOUNGEST_REVFS_OBJOPENAROOTOBJECTREPRESENTINGTHEYOUNGESTHEADREVISIONROOT_OBJSVNFSSVN_FS_REVISION_ROOTFS_OBJ,YOUNGEST_REVDOTHERECURSIVECRAWLCRAWL_FILESYSTEM_DIRROOT_OBJ,“IF_NAME_“_MAIN_“CHECKFORSANEUSAGEIFLENSYSARGV2SYSSTDERRWRITE“USAGESREPOS_PATHN“OSPATHBASENAMESYSARGV0SYSEXIT1CANONICALIZETHEREPOSITORYPATHREPOS_PATHSVNCORESVN_PATH_CANONICALIZESYSARGV1DOTHEREALWORKCRAWL_YOUNGESTREPOS_PATH443一个PYTHON状态爬虫SUBVERSION的PYTHON绑定也可以用来进行工作拷贝的操作,在本章前面的小节中,我们提到过LIBSVN_CLIENT接口,它存在的目的就是简化编写SUBVERSION客户端的难度,例83“一个PYTHON状态爬虫”是一个例子,讲的是如何使用SWIG绑定创建一个扩展版本的SVNSTATUS命令。/USR/BIN/ENVPYTHON“CRAWLAWORKINGCOPYDIRECTORY,PRINTINGSTATUSINFORMATION“IMPORTSYSIMPORTOSPATHIMPORTGETOPTIMPORTSVNCORE,SVNCLIENT,SVNWCDEFGENERATE_STATUS_CODESTATUS“TRANSLATEASTATUSVALUEINTOASINGLECHARACTERSTATUSCODE,USINGTHESAMELOGICASTHESUBVERSIONCOMMANDLINECLIENT“CODE_MAPSVNWCSVN_WC_STATUS_NONE,SVNWCSVN_WC_STATUS_NORMAL,SVNWCSVN_WC_STATUS_ADDEDA,SVNWCSVN_WC_STATUS_MISSING,SVNWCSVN_WC_STATUS_INCOMPLETE,SVNWCSVN_WC_STATUS_DELETEDD,SVNWCSVN_WC_STATUS_REPLACEDR,SVNWCSVN_WC_STATUS_MODIFIEDM,SVNWCSVN_WC_STATUS_MERGEDG,SVNWCSVN_WC_STATUS_CONFLICTEDC,SVNWCSVN_WC_STATUS_OBSTRUCTED,SVNWCSVN_WC_STATUS_IGNOREDI,SVNWCSVN_WC_STATUS_EXTERNALX,SVNWCSVN_WC_STATUS_UNVERSIONED,RETURNCODE_MAPGETSTATUS,DEFDO_STATUSWC_PATH,VERBOSECALCULATETHELENGTHOFTHEINPUTWORKINGCOPYPATHWC_PATH_LENLENWC_PATHBUILD

温馨提示

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

评论

0/150

提交评论