目标

要做的东东呢,就是在向svn提交文件的时候,可以再server端读到所有提交文件的内容,并根据某些规则验证文件的合法性,如果验证失败,则终止提交,并在svn的客户端上显示错误信息。

准备工作

 

1,安装svn server,本文例子使用的是CollabNetSubversion-server-1.6.3-3.win32,安装时使用默认的repository目录,即C:/svn_repository。 2,创建一个svn repository。在命令行里,执行“svnadmin create C:/svn_repository/test”命令,系统就会在svn_repository目录下创建test文件夹,里面有conf,db,hooks,locks四个文件夹,这个hooks文件夹就是我们的主场哦。 注:执行svnadmin命令前,可能需要重启机器使环境变量生效,否则可能系统找不到svnadmin命令。 3,安装svn client,这里使用的是TortoiseSVN,用于update,commit文件,测试server端hook的可用性。

SVN Hook介绍

 

在hooks文件夹中,可以看到,系统已经生成了很多tmpl文件,它们就是hook的模版文件。使用hook的方法很简单,只要把可执行文件(如.exe/.bat)放入这个hooks文件夹中,并改成svn可识别的名字,就会被执行了。如把一个pre-commit.exe放入hooks文件夹,它就会在代码真正被commit之前运行。

注:TortoiseSVN也提供hook功能,在setting中可以设置,也有PreCommit,PostCommit等多个选项,并可以指定要运行的可执行文件,但这个hook是是在客户端的,与本文中所说的server端hook并不相同,而且似乎不能执行winForm形式的程序。此hook非彼hook哦~~

开始C#

创建一个Console Application,这个工程产生的.exe文件即可放入hooks文件夹,重命名为pre-commit.exe。

将默认的Main方法返回值改成int 如果return 0,则提交成功;如果return 1,则导致提交失败。 用Console.Error.WriteLing("...") 把错误信息发送到客户端。 Main函数的参数     args[0]: repository的路径,例如“C:\svn_repository\test”     args[1]: pre-commit时是transactionId,post-commit时是revision number。 如果要取得本次提交的文件列表或文件内容,则需要使用svnlook命令,会用到这两个参数。

代码 ————————————————————————

private static int Main(string[] args) {        if(.....)          return 0;      Console.Error.WriteLing(errorMessage);      return 1; }

————————————————————————

svnlook

svnlook.exe放在svn安装目录里,默认为“C:\Program Files\CollabNet Subversion Server\svnlook.exe”

命令行: 变化的文件列表: svnlook changed -t transactionId repository_path   svnlook changed -r revisionNumber repository_path 输出示例: U   folder1/1.txt D   2.txt A   3.txt

取得文件内容 svnlook cat -t transactionId repository_path filePath svnlook cat -r revisionNumber repository_path filePath 输出为该文件的内容。

因为在pre-commit中,Main函数的第二个参数是transactionId,所以要用-t,post-commit中参数是revisionNmuber,所以要用-r。其他hook中两个参数到底为何,可以在hooks文件夹相应的tmpl文件中找到答案。 使用C#运行命令行,以svnlook changed为例 ————————————————————————

using(var process = new Process()) {         process.StartInfo.UseShellExecute = false;         process.StartInfo.RedirectStandardOutput = true;         process.StartInfo.FileName = @"C:\Program Files\CollabNet Subversion Server\svnlook.exe";         process.StartInfo.Arguments = string.Format("changed -t {0} \"{1}\"", transactionId, repository_path); //transactionId和repository_path即Main函数中传进的两个参数。

process.Start();          content = process.StandardOutput.ReadToEnd();  // 取得svnlook命令的返回内容         process.WaitForExit();       }

————————————————————————

以上就是所需要的内容了,组装一下,加上自己的验证逻辑等等,编译,把exe文件copy到hooks文件夹,重命名,就可以运行喽~~~

原文来自:http://zaocanhebaodan.blogbus.com/logs/41743640.html

C#实现svn server端的hook的更多相关文章

  1. SVN Server导项目到本地库时提示"方法OPTIONS失败与无法连接到服务器"

    方法 OPTIONS 失败于 “https://xxxx/svn/xxxx”: 无法连接到服务器 (https://xxxx) 要留意  https 使用了443 端口,检查防火墙是否开放了该端口. ...

  2. SVN server 服务端修改端口号

    SVN server 服务端修改端口号 在实际使用中可能当安装svn server 服务后,发现与后续其他程序端口冲突, 1.打开svn server 管理界面->操作->properti ...

  3. SVN服务端启动解决方案(2013-12-10 记)

     解决每一次开机都得用DOS启动SVN服务,而DOS窗口又无法关闭的情况 1.安装Setup-Subversion-1.8.5.msi搭建好SVN服务端(下载地址:http://subversion. ...

  4. SVN Server配置详解 及备份

    SVN简介和工作原理 subversion(简称svn)是近几年崛起的版本管理软件,是cvs的接班人,目前绝大多数开源软件都使用svn作为代码版本管理软件.Subversion支持linux和wind ...

  5. (总结)CentOS Linux搭建SVN Server配置详解

         PS:虽然在公司linux服务器上搭建过几次svn,但是时间长了,有些配置操作会忘掉,上网搜索的结果都不大满意,有幸在前几天看到一篇算是最满意的svn搭建文章,转载一下以备以后使用,原文地址 ...

  6. SVN server的搭建

    当做大的项目是,svn是代码管理的好工具,假设是用自己的server,那么须要搭建SVNserver. Subversion是一款很优秀的svnserver工具,笔者採用VisualSVN serve ...

  7. redmine和svn server的部署

    作为一个程序猿,想要很好的管理自己项目和代码,我们需要一些工具做辅助. 项目管理工具redmine和代码版本管理工具 SVN(Subversion). 我们选择在虚拟机里面安装windows部署这两套 ...

  8. SVN 服务端 和 客户端

    网址大全  |  EF CodeFirst  |  电视  |  MyNPOI  |  开源  |  我的皮肤  |  ASP.NET MVC4  |  前端提升  |  LINQ  |  WCF   ...

  9. dubbo框架的web端(war)和server端(tar.gz)结合jenkins打包方式

    一.web端程序,打包成war包 jenkins配置 1.项目名称,旧文件处理配置 2.参数构建配置 3.源码库配置 4.打包文件pom.xml配置及多环境打包传参,此处传参qa(表示打测试环境包,名 ...

随机推荐

  1. Difference between [0-9], [[:digit:]] and \d

    Yes, it is [[:digit:]] ~ [0-9] ~ \d (where ~ means aproximate).In most programming languages (where ...

  2. Xamarin.Forms使用Slider注意问题

    Xamarin.Forms使用Slider注意问题   Xamarin.Forms中,Slider用来构建滑块控件.其中,Minimum表示最小值,Maximum表示最大值.如果Minimum大等于1 ...

  3. Codeforces 702 D Road to Post Office

    题目描述 Vasiliy has a car and he wants to get from home to the post office. The distance which he needs ...

  4. 【最大流】【Dinic】bzoj2929 [Poi1999]洞穴攀行

    TMD 题意其实是与1或n相连的边只能走一次,其他可以走无限次……翻译去死. 裸最大流. #include<cstdio> #include<cstring> #include ...

  5. MOD_EXPIRES安装和配置 提高网站速率

    MOD_EXPIRES安装和配置 提高网站速率   实施这一方法将节省你难以置信数额的带宽,极大地加快你的网站为你的网站访客.基本上,对于图片,CSS , JavaScript以及其他文件可以通过优化 ...

  6. JAVA 基本概念和编码规范

    概括性描述:一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作. 基本概念: 下面简要介绍下类.对象.方法和属性的概念. 对象:对象是类的一个实例,有状态和行为.例如, ...

  7. Linux防止“rm -rf /”误删除

    说明:不解释了,运维应该在每台服务器都去配置这个问题以减少灾难的发生 方法: 1.safe-rm safe-rm是一个开源软件用来替代不太安全的rm,可以在/etc/safe-rm.conf中配置路径 ...

  8. 国内流行的开源.net微信公众平台SDK对比分析

    一.引言 目前微信公众平台正如火如荼的进行中,微信虽然在海外市场不敌WhatsApp,但是已经俘获了国内绝大部分用户的心.作为国内最大的,超级"app",微信已算是成功问鼎了.公众 ...

  9. Delphi 获取sqlite中所有的表名

    取得sqlite数据库里所有的表名 查询table,type 段是'table',name段是table的名字, so: select name from sqlite_master where ty ...

  10. 在Delphi中使用键盘勾子获取键盘输入(译--5月7日)

    http://blog.sina.com.cn/s/blog_502b2e970100949s.html 获取键盘输入以控制无法接受输入焦点的控件考虑一些游戏,显示图片在TPainBox,但是TPai ...