PRE-COMMIT HOOK
另存为 changeLog.bat :
1 | ::!/bin/sh |
2 | :: PRE-COMMIT HOOK |
3 | :: 请设置Php.exe的位置和Hook目录。 |
4 | set php= "D:/phpDir/php.exe" |
5 | set hookPath= "D:/Project/SVNHooks/ChangeLog" |
6 |
7 | php -f %hookPath%/changeLog.php % 1 % 2 % 3 % 4 % 5 |
8 |
9 | exit 1 |
同目录 changeLog.php 文件:
001 | <?php |
002 | /** |
003 | * 获取更新列表文件 |
004 | */ |
005 | $tmppath = $argv [1]; |
006 | if ( 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 | */ |
021 | function 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 | */ |
038 | function 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 | */ |
073 | foreach ( $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"> |
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 | ?> |
范例: 提交前:
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 | */ |
17 | echo "123321" ; |
18 | ?> |
提交后:
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 | */ |
20 | echo "123321" ; |
21 | ?> |