svn添加强制注释,pre-commit结合python
12345678910111213141516171819202122编码的问题#!/usr/bin/envpython#coding:utf-8importsys,urllibdefault_encoding='utf-8'ifsys.getdefaulten...
·
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
编码的问题
# !/usr/bin/env python
# coding:utf-8
import sys,urllib
default_encoding = 'utf-8'
if sys.getdefaultencoding() ! = default_encoding:
reload (sys)
sys.setdefaultencoding(default_encoding)
s = '项目迁移到'
print sys.stdin.encoding
print urllib.quote(s.decode(sys.stdin.encoding).encode( 'gbk' ))
print urllib.quote(s.decode(sys.stdin.encoding).encode( 'utf8' ))
print urllib.quote(s.decode(sys.stdin.encoding).encode( 'gb2312' ))
print urllib.quote(s.decode( 'utf-8' ).encode( 'utf8' ))
str = '项目迁移到'
str = str .encode( 'utf8' )
d = { 'name' : str }
q = urllib.urlencode(d)
print q
unicode_str = unicode ( '中文' , encoding = 'utf-8' )
print unicode_str.encode( 'utf-8' )
|
参考 https://blog.phpgao.com/svn_pre_commit.html
检查提交日志是否为空
检查提交日志最少需要N个字符
检查提交文件是否是UTF-8格式
检查新文件的换行模式是否为LF
检查提交的文件是否含有TABs换行符
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
#!/bin/bash
REPOS = "$1"
TXN = "$2"
# Make sure that the log message contains some text.
SVNLOOK = / usr / bin / svnlook
ICONV = / usr / bin / iconv
SVNLOOKOK = 1
LOGMSG = `$SVNLOOK log - t "$TXN" "$REPOS" | wc - c`
if [ "$LOGMSG" - lt 2 ];
then
echo - e "\t That logmessage contains at least 2 alphanumeric characters. Commit aborted!" 1 >& 2
exit 1
fi
# Make sure that all files to be committed are encoded in UTF-8.
while read changeline;
do
# Get just the file (not the add / update / etc. status).
file = ${changeline: 4 }
# Only check source files.
if [[ $ file = = * .java || $ file = = * .xhtml || $ file = = * .css || $ file = = * .xml || $ file = = * .js ]] ; then
$SVNLOOK cat - t "$TXN" "$REPOS" "$file" | $ICONV - f UTF - 8 - t UTF - 8 - o / dev / null
if [ "${PIPESTATUS[1]}" ! = 0 ] ; then
echo "Only UTF-8 files can be committed (" $ file ")" 1 >& 2
exit 1
fi
fi
done < <($SVNLOOK changed - t "$TXN" "$REPOS" )
# Check files for svn:eol-style property
# Exit on all errors.
set - e
EOL_STYLE = "LF"
echo "`$SVNLOOK changed -t " $TXN " " $REPOS "`" | while read REPOS_PATH
do
if [[ $REPOS_PATH = ~ A[[:blank:]]{ 3 }(. * )\.(java|css|properties|xhtml|xml|js) ]]
then
if [ ${ #BASH_REMATCH[*]} -ge 2 ]
then
FILENAME = ${BASH_REMATCH[ 1 ]}.${BASH_REMATCH[ 2 ]};
# Make sure every file has the right svn:eol-style property set
if [ $EOL_STYLE ! = "`$SVNLOOK propget -t \"$TXN\" \"$REPOS\" svn:eol-style \"$FILENAME\" 2> /dev/null`" ]
then
ERROR = 1 ;
echo "svn ps svn:eol-style $EOL_STYLE \"$FILENAME\"" >& 2
fi
fi
fi
test - z $ERROR || (echo "Please execute above commands to correct svn property settings. EOL Style LF must be used!" >& 2 ; exit 1 )
done
# Block commits with tabs
# This is coded in python
# Exit on all errors
set - e
$SVNLOOK diff - t "$TXN" "$REPOS" | python / dev / fd / 3 3 << 'EOF'
import sys
ignore = True
SUFFIXES = [ ".java" , ".css" , ".xhtml" , ".js" , ".xml" , ".properties" ]
filename = None
for ln in sys.stdin:
if ignore and ln.startswith( "+++ " ):
filename = ln[ 4 :ln.find( "\t" )].strip()
ignore = not reduce ( lambda x, y: x or y, map ( lambda x: filename.endswith(x), SUFFIXES))
elif not ignore:
if ln.startswith( "+" ):
if ln.count( "\t" ) > 0 :
sys.stderr.write( "\n*** Transaction blocked, %s contains tab character:\n\n%s" % (filename, ln))
sys.exit( 1 )
if not (ln.startswith( "@" ) or \
ln.startswith( "-" ) or \
ln.startswith( "+" ) or \
ln.startswith( " " )):
ignore = True
sys.exit( 0 )
EOF
# All checks passed, so allow the commit.
exit 0
|
使用Python写服务器端的SVN Hook
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
import re
def main(argv):
# 从参数中取出来代码库和事务信息
(repos, txn) = argv
# svnlook log拿到的是用户提交时填写的log信息,然后随便你想做什么
message = " ".join(os.popen(" svnlook log '%s' - t '%s' " % (repos, txn)).readlines()).strip()
# svnlook changed拿到的是用户提交的文件,这个列表中有文件的状态(A,U,D之类的)和文件名
changelist = os.popen( "svnlook changed '%s' -t '%s'" % (repos, txn)).readlines()
# svnlook cat能读出用户提交文件的内容
fileContent = " ".join(os.popen(" svnlook cat - t % s % s % s" % (txn, repos, filename)).readlines()).strip()
# 返回
if msg = = '':
sys.exit( 0 )
else :
# 输出返回信息
sys.stderr.write(msg)
sys.exit( 1 )
if __name__ = = "__main__" :
# sys.stderr.write(os.getcwd())
# 发现默认的工作目录竟然是跟目录“/”,这里要换一下当前工作目录
os.chdir(sys.path[ 0 ])
# sys.stderr.write(os.getcwd())
main(sys.argv[ 1 :])
|
我自己做的,我只是提供给接口判断
cat pre-commit
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/bin/bash
REPOS = "$1"
TXN = "$2"
RES = "OK"
SVNLOOK = '/svn/csvn/bin/svnlook'
USER = `$SVNLOOK author - t $TXN $REPOS`
LOG = `$SVNLOOK log - t "$TXN" "$REPOS" `
var = `python / svn / csvn / data / repositories / xx / hooks / check.py "${LOG}" "${REPOS}" "${USER}" "${REPOS}" `
if [ "$var" = = "success" ];then
exit 0
else
echo "$result" 1 >& 2
exit 1
fi
|
shell
curl -v -L -G --data-urlencode 'wd=手机' "
http://www.baidu.com/s"
curl -s -d
cat check.py
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# !/usr/bin/env python
# coding:utf-8
import urllib
import urllib2
import sys
message = sys.argv[ 1 ]
repos = sys.argv[ 2 ]
user = sys.argv[ 3 ]
project = sys.argv[ 4 ]
def postHttp(message = None ,repos = None ,user = None ,project = None ):
url = "
#上面是java接口,去判断和过滤提交的信息
postdata = dict (message = message,repos = repos,user = user,project = project)
postdata = urllib.urlencode(postdata)
request = urllib2.Request(url,postdata)
response = urllib2.urlopen(request)
print response.read()
#postHttp('a b','/svn/csvn/data/repositories/xx','test','/svn/csvn/data/repositories/xx')
#'a b' 中间空格,意味着提交可以有空格字符
postHttp(message,repos,user,project)
|
另外说下post几个参数
#REPOS="$1"
#REV="$2"
#AUTHOR=$(svnlook author -r $REV $REPOS)
#MESSAGE=$(svnlook log $REPOS -r $REV)
#MESSAGE=$(svnlook propget --revprop -r $REV $REPOS svn:log)
具体实例
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
cat pre - commit.sh
cd / svn / csvn / data / repositories /
for i in `ls - l|grep ^d|awk '{print $NF}' `
do
yes|cp - r / home / back / pre - commit . / $i / hooks /
yes|cp - r / home / back / check.py . / $i / hooks /
sed - i 's/sadoc/$i/g' . / $i / hooks / check.py
done
cd / svn / csvn / data / repositories / sadoc / hooks
rm - rf pre - commit
cat pre - commit
#!/bin/bash
REPOS = "$1"
TXN = "$2"
RES = "OK"
SVNLOOK = '/svn/csvn/bin/svnlook'
USER = `$SVNLOOK author - t $TXN $REPOS`
LOG = `$SVNLOOK log - t "$TXN" "$REPOS" `
var = `python / svn / csvn / data / repositories / sadoc / hooks / check.py "${LOG}" "${REPOS}" "${USER}" "${REPOS}" `
if [ "$var" = = "success" ];then
exit 0
else
echo "$var" 1 >& 2
exit 1
fi
cat check.py
# !/usr/bin/env python
# coding:utf-8
import urllib
import urllib2
import sys
message = sys.argv[ 1 ]
repos = sys.argv[ 2 ]
user = sys.argv[ 3 ]
project = sys.argv[ 4 ]
def postHttp(message = None ,repos = None ,user = None ,project = None ):
url = "http://xx/hooks/svn/pre-commit/verify"
postdata = dict (message = message,repos = repos,user = user,project = project)
postdata = urllib.urlencode(postdata)
request = urllib2.Request(url,postdata)
response = urllib2.urlopen(request)
print response.read()
#postHttp('xx-1 将git上项目迁移到svn上','/svn/csvn/data/repositories/ued-resource','xx','/svn/csvn/data/repositories/ued-resource')
postHttp(message,repos,user,project)
|
本文转自 liqius 51CTO博客,原文链接:http://blog.51cto.com/szgb17/1936734,如需转载请自行联系原作者
更多推荐



所有评论(0)