Subversion API 函数和开发思路介绍

      现在与一些朋友在考虑写一个开发合作与在线交流、资源共享相结合的程序。查找资料的时候,发现了Subversion 。迷上它了。先它的说明书中,还没有翻译成中文的部分(就是贴在下面的东西)翻译出来,现在正在蚂蚁啃骨头一样研究它的源代码,说实话,真的不错!下面是翻译的正文:

SubVersion开发信息 

SubVersion是一个开源项目,它的财政支持来自CollabNet Inc,这是位于加州的一个软件公司。本项目欢迎程序员加入开发,鼓励您为它做点事情,无论是出点主意,还是修正Bug,或者是提炼代码。

本章是针对那些打算直接利用这个软件的源代码帮助这个软件发展的人。我们会在这里公布一些该软件的内部细节,这些技术细节对你继续开发subversion有帮助,也可以让你利用SubVersion的库写出全新的工具。

分层设计的库

Subversion采用模块化设计,是一组C库的集合。每个库都有定义良好的接口和Purpose,而且大多数模块都处于三个主要的层之一中,这三个层分别是:存储层(Repositiry layer)、存储访问层(Repository Access layer)和客户层(Client Layer)。在学习这些层之前,先学习下表中列出的库的详细目录。为了保持一致性,这里使用它们的Unix 库名称(如:libsvc_fs , libsvn_wc, mod_dav_svn)。

表:subversion库的目录

介绍

libsvn_client

客户端程序的主接口

libsvn_delta

Tree and text differencing routines

libsvn_fs

Subversion文件系统库。

libsvn_ra

Repository Access commons and module loader

libsvn_ra_dav

WebDAV存储访问模块

libsvn_ra_local

本地存储访问模块

libsvn_ra_svn

一个私有协议存储访问模块

libsvn_repos

存储(仓库)接口

libsvn_subr

各种有用的子程序

libsvn_wc

工作版本(副本)管理器

mod_dav_svn

WebDAV操作映射到SubversionApache模块

在上面的表中单词"miscellaneous"只出现了一次是个好事情。Subversion的开发团队很严谨的让各种功能放合适的层和库中。模块化设计最大的好处是,从开发者的角度看,它不复杂。作为一个开发者,你可以很快地找到你所需要的功能的位置。下面的图表表示,Subversion库是怎样组装在一起的。

图表:Subversion的层的结构

使用模块化设计的另外一个好处是:我们可以用一个全新的库去替换一个指定的模块,在不影响其它的代码的情况下,实现相同的API。其实这种情况已经发生过了。Libsvn_ra_dav libsvn_ra_local 和实现的是相同的接口。三个库都与存储层通信,其中Libsvn_ra_davlibsvn_ra_svn通过网络通信,而libsvn_ra_local则是直接连接。

Subversion的客户端的设计也是高度模块化的。目前已经可以使用的客户端只是个基于命令行的程序,但是有很多第三方已经在开发GUI程序了。这些客户端都是使用着相同的API函数,对于大多数的客户端程序设计来说,libsvn_client一个库就足够了。

存储层

与存储层有关的是两个库,一个是repository库,一个是filesystem库。这些库提供了存储和那些版本控制数据的修订报告。这个层是通过存储访问层连接client层的,而且从用户的角度来看,素材来自网络的另外一端。

Subversion文件系统可以通过libsvn_fs API函数访问,这个文件系统其实是一个虚拟的文件系统,不是那种在操作系统中使用的真正的文件系统。在这里所谓的存储,不是真的创建一个文件或者目录,相反,它是使用一个数据库系统作为后台。当前使用的数据库系统是BDB。但是随着以后的开发,它将与其他的数据库系统兼容,也许还可以通过ODBC访问。

这个文件系统的API函数提供了在大多数的文件系统中能够使用的功能:你可以创建、移动文件和目录,复制和移动它们,编辑文件的内容等等。某些功能还需要继续完善,比如:添加、删除和移动文件或文件夹的原数据(属性)。此外,这个文件系统还有版本控制功能,就是说,当你改变了目录树以后,它能够记忆在更动以前,或者以前以前的目录树的样子—一直到最初的样子。

你对你的目录树的任何更动都是在一个Subversion事务中完成的。下面是一个简化的例子,用于描述如何编辑你的文件系统:

1、  Begin:启动一个Subversion事务;

2、  进行修改(添加、删除、属性编辑等);

3、  Commit:提交事务。

一旦你提交了事务,对文件系统的修改将永远地存储在historical artifacts中。每次这样的操作都会形成一个单一的新的目录树的修正版本,而且每个版本都有一个永远存在的snapshot,这样你就总是可以访问到它们。

有关事务的解释

在靠近数据库代码的libsvn_fs库中使用事务,特别容易将它与数据库系统本身使用的事务混淆。这两种事务都支持原子操作和事务隔离。换句话说,使用事务,可以让你的一组操作要么全部成功,要么全部失败,如果失败,就像什么事情也没有发生过一样—这样做,也不会影响到其它过程对数据的操作。

数据库事务通常只处理针对数据库自身一些小的操作。而Subversion的事务的范围要大一些,它处理一些高层次的操作,像修改一个目录和文件的集合,并生成文件系统库新的版本。如果你还没有明白,就这样考虑,在使用数据库事务前,需要先创建Subversion事务(这样,如果Sunversion事务创建失败,数据库根本就不会创建任何事务)。

对用户来说幸运的是:在文件系统的API函数中,数据库系统自己的事务已经几乎完全被隐藏了。只有在你深入挖掘文件系统具体的实现的时候,它才有意义。

与一般的文件系统相似,你要使用Subversion的文件系统,访问或者描述一个修正版本的文件或目录的时候,同样是使用路径字符串,像/foo/bar这样,就像你在某个经常使用中的shell程序中进行的操作一样。通过给恰当的API函数传递文件或目录的名称,你就可以创建一个新的文件或目录。查询信息的时候也是一样。

与大多数的文件系统不同的是,仅仅一个路径并不能提供足够的描述一个文件或者文件夹的信息。普通的文件夹结构是下面这样的(以一个两层的结构为例):

图表:2层结构的目录结构

Subversion的文件系统有一个属于自己的属性,那是其他的文件系统所没有的,这就是“时间”。在这个文件系统的接口,几乎每个有path参数的函数,都同时需要一个root参数。这个svn_fs_root_t参数即描述了一个修订版本也描述了一个事务,并且提供了关于版本32/foo/bar与版本98/foo/bar的不同。下面的图表显示了这个特性:

图表:修订时间,Subversion的特性

正如前面所说的,lib_svnAPI函数与其他的文件系统很相似,只是它有很有趣的版本控制能力。使用这些API函数已经能够满足基本的对文件和目录版本控制的要求,尽管如此,SubVersion还是需要更多的功能,这样就引入了libsvn_repos库。

Libsvn_repos基本上就是文件系统函数库的封装。这个库负责创建仓储层,确保文件系统是否初始化等等。这个库也提供一些钩子脚本,这些脚本在某些行为发生的时候,被存储代码执行。这些脚本可以用于通知、授权,以及仓库管理员想要做的其他事情。这些功能与版本控制系统并没有直接的关系,所以它们被放置在单独的库中。

使用libsvn_repos库的开发人员会发现,它并没有完全封装文件系统的全部接口。只有一些主要的文件系统的活动才会被存储接口封装。其中包括创建和提交Subversion事务,以及对修订版本的修改。在以后,剩余的事件也将被封装起来。没有封装的还是要直接调用libsvn_fs API函数。

下面是一个代码片断,它同时使用了存储和文件系统接口,通过增加一个目录,创建了一个新的文件系统修订版本。注意,在这个例子里面(包括以后所有的例子),SVN_ERR宏简单地检测来自某个函数的未成功的错误,如果存在错误就返回它。

例:使用存储层

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
如果你想要远程修改 Subversion 的密码,你需要进行以下几个步骤: 1. 确认你已经安装了 Subversion 服务器,并且已经设置了用户和密码。如果你还没有设置用户和密码,请先执行以下命令: ``` htpasswd -c /path/to/svn-auth-file username ``` 其中,`/path/to/svn-auth-file` 是你要设置的用户密码文件的路径,`username` 是你要设置的用户名。命令执行后,会提示你输入密码。 2. 安装 Apache 的 mod_dav_svn 模块,以便你能够通过浏览器访问 Subversion 仓库。你可以使用以下命令安装 mod_dav_svn: ``` sudo apt-get install libapache2-mod-svn ``` 3. 配置 ApacheSubversion 访问控制。打开 Apache 的配置文件,添加以下内容: ``` <Location /svn> DAV svn SVNParentPath /path/to/svn/repositories AuthType Basic AuthName "Subversion Repository" AuthUserFile /path/to/svn-auth-file Require valid-user </Location> ``` 其中,`/svn` 是你要访问的 URL,`/path/to/svn/repositories` 是你的 Subversion 仓库的路径,`/path/to/svn-auth-file` 是你设置的用户名和密码文件的路径。 4. 重启 Apache 服务器,使配置生效: ``` sudo service apache2 restart ``` 5. 现在,你可以通过浏览器访问 Subversion 仓库,输入用户名和密码即可访问。如果你想修改密码,可以执行以下命令: ``` htpasswd /path/to/svn-auth-file username ``` 然后输入新的密码即可。 希望这些步骤能帮助你远程修改 Subversion 的密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值