• C#实现svn server端的hook


    目标

    要做的东东呢,就是在向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 est”     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 FilesCollabNet Subversion Serversvnlook.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 FilesCollabNet Subversion Serversvnlook.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

  • 相关阅读:
    道路计划猿练级(笔者:陈浩)
    OpenCV——Delaunay三角 [转载]
    mysql声明摘要
    JDBC公共动作类
    Android SharedPreferences复杂的存储
    SAP ABAP规划 SY-REPID与SY-CPROG差额
    在我的眼里,生产主管(1)——如何做竞争分析
    Oracle生成查询包括对应于所有数据表记录语句中指定的字段名
    SDUT 2894-C(最短spfa)
    人脉的本质
  • 原文地址:https://www.cnblogs.com/chen110xi/p/4819089.html
Copyright © 2020-2023  润新知