实现 SVN:文件ChangeLog自动添加

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 ?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值