实现 SVN:文件ChangeLog自动添加
来源:互联网 发布:ubuntu安装软件的位置 编辑:程序博客网 时间:2024/06/05 16:27
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">
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
?>
范例:提交前:
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
?>
- 实现 SVN:文件ChangeLog自动添加
- 生成svn changelog脚本
- SVN不能自动添加新建的文件
- svn不能自动添加新建的文件
- svn实现批量添加和删除文件
- 用python实现自动删除svn文件
- svn 自动添加
- AndroidStudio 新建文件自动添加到svn版本控制
- MAC下添加添加Lib文件,实现自动提示功能
- SVN 自动添加属性设置
- Svn 实现 自动 发布
- Eclipse添加DTD文件实现xml的自动提示功能
- Eclipse添加DTD文件实现xml的自动提示功能
- Eclipse添加DTD文件实现xml的自动提示功能
- Eclipse添加DTD文件实现xml的自动提示功能
- Eclipse添加DTD文件实现xml的自动提示功能
- Eclipse添加DTD文件实现xml的自动提示功能
- Eclipse添加DTD文件实现xml的自动提示功能
- js 获取HTML 中的 title和 alt中的数据显示层
- 迅雷亲历面经:笔试+上机+面试
- HTML事件
- 虚拟桌面原理及实现
- ReadBook_Thinking_Method
- 实现 SVN:文件ChangeLog自动添加
- 如何使用regtop获取水源区悬赏分超过100的帖子地址?
- 一位硕士毕业生三个月求职经历与经验的结晶
- 显示器颜色设置
- Coolite+Form网站后台身份验证
- Oracle系统权限的分类
- 页面刷新问题
- 软件开发合同
- 2010中国经济:结构调整中的投资机遇