1

我需要编写一个 node.js 程序,只要开发人员将代码签入 svn,它就会以某种方式被触发。这将更新工作目录中的文件。开发人员在 Mac OS X 和 Windows 上工作。该程序需要在两台机器上运行。

有没有办法让我以某种方式听取 svn 客户端的提交?是否有任何允许插件/扩展的 svn sdk?会观察 .svn 隐藏目录(svn 创建供自己使用)进行更改吗?如果是这样,我如何通过查看此目录来知道文件已提交?

起初我认为钩子可能是要走的路,但钩子是在托管 svn 的机器上运行的,它们主要用于管理任务,例如发送电子邮件警报或启动构建

4

1 回答 1

1

首先您需要了解,如果不连接到服务器,就无法知道服务器上是否发生了更新。因此,您不能仅仅通过查看本地文件夹来做到这一点,因为这不是 svn 的工作方式。

实现您想要的解决方法如下。在服务器上,编写一个“post-commit”钩子,它从文本文件中获取一个计数器,将其递增,然后将其写回。将此文本文件存放在您的客户可以下载的地方。我假设这将在“http://www.example.com/commit-id.txt”上。然后,在客户端上,使用 shell 脚本来监视此文本文件的更改并执行所需的操作。例如,使用 windows powershell 可以按如下方式工作。对于 Mac,您需要使用不同的 shell,但我确信这个脚本可以很容易地移植。

function get-current-commit-id {
        trap [Exception] {
                # Make sure the script doesn't freak out when server is down or connection
                $commitid
                return
        }
        # The rand.next() ensures by brute force that the text file is not cached
        [int] $clnt.DownloadString("http://www.example.com/commit-id.txt?q="+$rand.next())
}

$clnt = new-object System.Net.WebClient
$commitid = get-current-commit-id

while( 1 ){
        $commitidnew = get-current-commit-id
        if( $commitidnew -ne $rsid ){
                Write-Output "Commit occured on server"

                ### execute desired action here
                ### perhaps you'll also want to run "svn up"

                $commitid = $rsidnew
        }
        ### check for new update every 10 seconds
        sleep 10
}
于 2013-01-11T09:21:28.897 回答