Vincent Trent (FKing)

There is no gene for human spirit

博客园 首页 新随笔 联系 订阅 管理

  源代码管理软件Subversion是继CVS后的又一个强力开源软件,现最新版本为1.2,开始支持lock模式了。(更坚定了我 使用它的决心)而当我们使用它的svnserve提供服务时,要实现目录级的验证需要用到pre-commit这个hook。很感谢 hbifts为我们提供了实现的思路和代码(参见下面的文章链接)。我写的 程序也是基于他的solution修改而成的。

下面我说说我的改进的地方:
1、精简svnhandler.cs。感觉原来的这个比较乱,现在精简后只保留两个获取author和commit files的公共方法。
2、当权限不足,拒绝提交时,除退出码设为非零外,同时向stderr标准错误流输出提示。这样做提交者就有可能在客户 端工具中看到出错提示(如使用TortoiseSVN),不至于让人不知所然。
3、日志使用功能强大的开源log4net,方便日后的管理。(是不是有些大材小用?^_^)
4、最重要和大幅度的改进就是权限判断了。判断的准则是类似于目录权限继承。如要提交的文件是trunk/folder/file.cs, 那么首先判断trunk/folder的权限,存在trunk/folder的规则则使用之,否则再查找trunk目录的权限规则,一直到根目录为 止(此例为trunk)。若无任何的规则存在,则默认为可提交。(这个可根据你的需要修改程序)
  为配合这种判断准则,相应的配置文件也由ini改为xml。hbifts在他的文章最后提到过出于性能的考虑没有采用xml。 不过我认为svnserve一般应用在局域网的场合内,提交的频率不会太高,性能方面可以忽略。最重要的是xml更适用于上面 所说的判断准则。

  接着说一下配置文件格式。根节点为“Rules”,下级节点为“Rule”。每个Rule节点代表对一个目录的权限设定。它有 两个属性“Path”和“Default”。其中“Path”为必需项,指定要指派权限的目录名。“Default”为可选,指明当前提交者 不匹配任何一个用户名时默认的权限。取值为“Allow”或“Deny”,默认为“Allow”。“Rule”节点可带有多个下级节点。 下级节点应为“<Allow>……</Allow>”或“<Deny>……</Deny>”。每个节点对应一个用户名。若 当前提交者匹配这个用户名,则根据该节点名称(Allow或Deny)来决定他可否进行提交动作。

  由于这个程序没试过在线调试,都是通过日志、实操和分析程序来调试的,所以可能还会有些Bug。欢迎各位捉虫者多提宝 贵意见。

  使用的方法就是把编译生成的pre-commit.exe、log4net.dll、pre-commit.exe.config复制到Repository目录下的hook目录, 再新建一个XML配置文件就可以了。源码中带有一个简单的配置例子,可参考。

点击下载源码

参考资料:

  1. Subversion 主页
  2. hbifts原文《增强SVN的Commit权限控制》
posted on 2005-06-16 10:38  Vincent Trent  阅读(2016)  评论(1编辑  收藏  举报