实现 SVN:文件ChangeLog自动添加

来源:互联网 发布:ubuntu安装软件的位置 编辑:程序博客网 时间:2024/06/05 16:27

PRE-COMMIT HOOK
另存为 changeLog.bat :

view source
print?
1::!/bin/sh
2:: PRE-COMMIT HOOK
3:: 请设置Php.exe的位置和Hook目录。
4set php="D:/phpDir/php.exe"
5set hookPath="D:/Project/SVNHooks/ChangeLog"
6 
7php -f %hookPath%/changeLog.php %1 %2 %3 %4 %5
8 
9exit 1

同目录 changeLog.php 文件:

view source
print?
001<?php
002/**
003 * 获取更新列表文件
004 */
005$tmppath = $argv[1];
006if (empty($tmppath) || !file_exists($tmppath)) {
007    exit();
008}
009/**
010 * 获取更新的文件列表
011 */
012$files = preg_split("/(/r/n|/r|/n)/",file_get_contents($tmppath));
013/**
014 * 生成新纪录信息
015 * @param <String> $prefix  $log-history 前的内容
016 * @param <type> $author    作者
017 * @param <type> $revision  当前文件最后提交版本
018 * @param <type> $logs      需要追加的记录
019 * @return <String>         新纪录
020 */
021function newLog($prefix,$author,$revision,$logs) {
022    $content = '';
023    $logs = json_decode($logs,true);
024    $date = gmdate("Y-m-d H:i:s/Z");
025    foreach($logs as $log) {
026        $content .= $prefix."     v$revision $date $author : ".base64_decode($log);
027    }
028    return $content;
029}
030/**
031 * 更新记录
032 * @param <String> $content     文件内容
033 * @param <String> $fileName    文件名 (分离文件与文件名方便测试)
034 * @param <String> $author      作者
035 * @param <Integer> $revision   当前文件最后提交版本
036 * @return <String>             更新后的文件内容
037 */
038function releaseLog($content,$fileName,$author,$revision) {
039    $logs = array();
040    $log = null;
041    $offset = 0;
042    do {
043        $logNewStart = strpos($content,'$log-new:',$offset);
044        if (!$logNewStart) {
045            break;
046        }
047        $offset = $logNewStart + 9;
048        $logNewEnd = strpos($content,'$',$offset);
049        if ( $logNewEnd - $offset < 1) {
050            continue;
051        }
052        $log = trim(substr($content,$offset, $logNewEnd - $offset));
053        if (!empty ($log)) {
054            $logs[] = base64_encode($log);
055        }
056    }while($logNewStart > -1);
057    if(count($logs) < 1) {
058        return $content;
059    }
060    $logs = json_encode($logs);
061    $ext = substr($fileName,strripos($fileName,'.')+1);
062 
063    if (in_array($ext,array('java','php'))) {
064        $pattern = "/(/r/n|/r|/n)([^/$]*?)///$log-history:([^/$]*?)///$/ie";
065        $content = preg_replace($pattern, "'//1'.'//2'.'/$log-history:'.'//3'.newLog('//1'.'//2','$author',$revision,'$logs').'//1//2/$'", $content);
066        $content = preg_replace("////$log-new:([^/$]*?)///$/i", "/$log-new:/$", $content);
067    }
068    return $content;
069}
070/**
071 *
072 */
073foreach($files as $file) {
074    $file = trim($file);
075    /**
076     * 被删除的文件不需要更新
077     */
078    if (!file_exists($file)) {
079        continue;
080    }
081    /**
082     * 获取文件的SVN信息
083     */
084    exec('svn info -r head  "'.$file.'" --incremental --xml ',$svninfo);
085    $svninfo = simplexml_load_string(join('',$svninfo));
086    /**
087     * 作者
088     */
089    $author = $svninfo->xpath('/entry/commit/author');
090    if (count($author)>0) {
091        $author = $author[0];
092    }else {
093        $author = '';
094    }
095    /**
096     * 最后提交版本
097     */
098    $revision = 0;
099    $commit = $svninfo->xpath('/entry/commit');
100    if (count($commit)>0) {
101        $attrs = $commit[0]->attributes();
102        foreach($attrs as $key => $value) {
103            if ($key == 'revision') {
104                $revision = (string) $value;
105            }
106        }
107    }
108    file_put_contents($file,releaseLog(file_get_contents($file),$file,$author,$revision));
109}
110 
111/**
112 * 文件SVN属性 示例
113 */
114//$svninfo = '
115//<entry
116//    kind="file"
117//    path="changeLog.php"
118//    revision="76">
119//    <url>https://localhost:123/svn/SVNHooksTest/trunk/changeLog.php</url>
120//    <repository>
121//        <root>https://localhost:123/svn/SVNHooksTest</root>
122//        <uuid>088859e8-dc8e-9b88-8088-88886865dee8</uuid>
123//    </repository>
124//    <commit
125//        revision="69">
126//        <author>MoXie</author>
127//        <date>2009-11-27T09:15:12.085009Z</date>
128//    </commit>
129//</entry>';
130/**
131 * 记录更新测试
132 */
133//$content  = '
134///**
135// * $Id: test.php 120 2009-11-11 07:56:15Z HanMeimei $
136// * $log-new: 这是本期需要添加的修改记录1 $
137// * $log-new: $
138// * $log-new: 这是本期需要添加的修改记录2 $
139// * $log-new:      $
140// * $log-new: 这是本期需要添加的修改记录3 $
141// * $log-new: 这是一条换了行
142// *              的记录1 $
143// * $log-new: 这是一条换了行
144// *              的记录2 $
145// * $log-history:$
146// */';
147//file_put_contents("Person.java",releaseLog($content,'Person.java','MoXie',88));
148?>

范例:提交前:

view source
print?
01<?php
02/**
03 * $Id: changeLog.php 93 2009-11-27 13:20:01Z MoXie $
04 * $log-new: 这是修改记录G $
05 * $log-new: 这是修改记录H $
06 * $log-history:
07 *      v89 2009-11-27 13:05:37Z MoXie : 这是修改记录A
08 *      v89 2009-11-27 13:05:37Z MoXie : 这是修改记录B
09 *
10 *      v91 2009-11-27 13:06:18Z MoXie : 这是修改记录C
11 *      v91 2009-11-27 13:06:18Z MoXie : 这是修改记录D
12 *
13 *      v92 2009-11-27 13:07:17Z MoXie : 这是修改记录E
14 *      v92 2009-11-27 13:07:17Z MoXie : 这是修改记录F
15 * $
16 */
17echo "123321";
18?>

提交后:

view source
print?
01<?php
02/**
03 * $Id: changeLog.php 94 2009-11-27 13:26:01Z MoXie $
04 * $log-new:$
05 * $log-new:$
06 * $log-history:
07 *      v89 2009-11-27 13:05:37Z MoXie : 这是修改记录A
08 *      v89 2009-11-27 13:05:37Z MoXie : 这是修改记录B
09 *
10 *      v91 2009-11-27 13:06:18Z MoXie : 这是修改记录C
11 *      v91 2009-11-27 13:06:18Z MoXie : 这是修改记录D
12 *
13 *      v92 2009-11-27 13:07:17Z MoXie : 这是修改记录E
14 *      v92 2009-11-27 13:07:17Z MoXie : 这是修改记录F
15 *
16 *      v93 2009-11-27 13:25:59Z MoXie : 这是修改记录G
17 *      v93 2009-11-27 13:25:59Z MoXie : 这是修改记录H
18 * $
19 */
20echo "123321";
21?>
原创粉丝点击