<code>編碼的問題</code>
<code># !/usr/bin/env python</code>
<code># coding:utf-8</code>
<code>import</code> <code>sys,urllib</code>
<code>default_encoding </code><code>=</code> <code>'utf-8'</code>
<code>if</code> <code>sys.getdefaultencoding() !</code><code>=</code> <code>default_encoding:</code>
<code> </code><code>reload</code><code>(sys)</code>
<code> </code><code>sys.setdefaultencoding(default_encoding)</code>
<code>s </code><code>=</code> <code>'項目遷移到'</code>
<code>print</code> <code>sys.stdin.encoding</code>
<code>print</code> <code>urllib.quote(s.decode(sys.stdin.encoding).encode(</code><code>'gbk'</code><code>))</code>
<code>print</code> <code>urllib.quote(s.decode(sys.stdin.encoding).encode(</code><code>'utf8'</code><code>))</code>
<code>print</code> <code>urllib.quote(s.decode(sys.stdin.encoding).encode(</code><code>'gb2312'</code><code>))</code>
<code>print</code> <code>urllib.quote(s.decode(</code><code>'utf-8'</code><code>).encode(</code><code>'utf8'</code><code>))</code>
<code>str</code> <code>=</code> <code>'項目遷移到'</code>
<code>str</code> <code>=</code> <code>str</code><code>.encode(</code><code>'utf8'</code><code>)</code>
<code>d </code><code>=</code> <code>{</code><code>'name'</code><code>:</code><code>str</code><code>}</code>
<code>q </code><code>=</code> <code>urllib.urlencode(d)</code>
<code>print</code> <code>q</code>
<code>unicode_str </code><code>=</code> <code>unicode</code><code>(</code><code>'中文'</code><code>, encoding</code><code>=</code><code>'utf-8'</code><code>)</code>
<code>print</code> <code>unicode_str.encode(</code><code>'utf-8'</code><code>)</code>
檢查送出日志是否為空
檢查送出日志最少需要N個字元
檢查送出檔案是否是UTF-8格式
檢查新檔案的換行模式是否為LF
檢查送出的檔案是否含有TABs換行符
<code>#!/bin/bash</code>
<code>REPOS</code><code>=</code><code>"$1"</code>
<code>TXN</code><code>=</code><code>"$2"</code>
<code># Make sure that the log message contains some text.</code>
<code>SVNLOOK</code><code>=</code><code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>svnlook</code>
<code>ICONV</code><code>=</code><code>/</code><code>usr</code><code>/</code><code>bin</code><code>/</code><code>iconv</code>
<code>SVNLOOKOK</code><code>=</code><code>1</code>
<code>LOGMSG</code><code>=</code><code>`$SVNLOOK log </code><code>-</code><code>t </code><code>"$TXN"</code> <code>"$REPOS"</code> <code>| wc </code><code>-</code><code>c` </code>
<code>if</code> <code>[ </code><code>"$LOGMSG"</code> <code>-</code><code>lt </code><code>2</code> <code>];</code>
<code>then</code>
<code> </code><code>echo </code><code>-</code><code>e </code><code>"\t That logmessage contains at least 2 alphanumeric characters. Commit aborted!"</code> <code>1</code><code>>&</code><code>2</code>
<code> </code><code>exit </code><code>1</code>
<code>fi</code>
<code># Make sure that all files to be committed are encoded in UTF-8.</code>
<code>while</code> <code>read changeline; </code>
<code>do</code>
<code> </code><code># Get just the file (not the add / update / etc. status).</code>
<code> </code><code>file</code><code>=</code><code>${changeline:</code><code>4</code><code>}</code>
<code> </code><code># Only check source files.</code>
<code> </code><code>if</code> <code>[[ $</code><code>file</code> <code>=</code><code>=</code> <code>*</code><code>.java || $</code><code>file</code> <code>=</code><code>=</code> <code>*</code><code>.xhtml || $</code><code>file</code> <code>=</code><code>=</code> <code>*</code><code>.css || $</code><code>file</code> <code>=</code><code>=</code> <code>*</code><code>.xml || $</code><code>file</code> <code>=</code><code>=</code> <code>*</code><code>.js ]] ; then</code>
<code> </code><code>$SVNLOOK cat </code><code>-</code><code>t </code><code>"$TXN"</code> <code>"$REPOS"</code> <code>"$file"</code> <code>| $ICONV </code><code>-</code><code>f UTF</code><code>-</code><code>8</code> <code>-</code><code>t UTF</code><code>-</code><code>8</code> <code>-</code><code>o </code><code>/</code><code>dev</code><code>/</code><code>null</code>
<code> </code><code>if</code> <code>[ </code><code>"${PIPESTATUS[1]}"</code> <code>!</code><code>=</code> <code>0</code> <code>] ; then</code>
<code> </code><code>echo </code><code>"Only UTF-8 files can be committed ("</code><code>$</code><code>file</code><code>")"</code> <code>1</code><code>>&</code><code>2</code>
<code> </code><code>exit </code><code>1</code>
<code> </code><code>fi</code>
<code> </code><code>fi</code>
<code>done < <($SVNLOOK changed </code><code>-</code><code>t </code><code>"$TXN"</code> <code>"$REPOS"</code><code>)</code>
<code># Check files for svn:eol-style property</code>
<code># Exit on all errors.</code>
<code>set</code> <code>-</code><code>e</code>
<code>EOL_STYLE</code><code>=</code><code>"LF"</code>
<code>echo </code><code>"`$SVNLOOK changed -t "</code><code>$TXN</code><code>" "</code><code>$REPOS</code><code>"`"</code> <code>| </code><code>while</code> <code>read REPOS_PATH</code>
<code> </code><code>if</code> <code>[[ $REPOS_PATH </code><code>=</code><code>~ A[[:blank:]]{</code><code>3</code><code>}(.</code><code>*</code><code>)\.(java|css|properties|xhtml|xml|js) ]]</code>
<code> </code><code>then</code>
<code> </code><code>if</code> <code>[ ${</code><code>#BASH_REMATCH[*]} -ge 2 ]</code>
<code> </code><code>then</code>
<code> </code><code>FILENAME</code><code>=</code><code>${BASH_REMATCH[</code><code>1</code><code>]}.${BASH_REMATCH[</code><code>2</code><code>]};</code>
<code> </code><code># Make sure every file has the right svn:eol-style property set</code>
<code> </code><code>if</code> <code>[ $EOL_STYLE !</code><code>=</code> <code>"`$SVNLOOK propget -t \"$TXN\" \"$REPOS\" svn:eol-style \"$FILENAME\" 2> /dev/null`"</code> <code>]</code>
<code> </code><code>ERROR</code><code>=</code><code>1</code><code>;</code>
<code> </code><code>echo </code><code>"svn ps svn:eol-style $EOL_STYLE \"$FILENAME\""</code> <code>>&</code><code>2</code>
<code> </code><code>fi</code>
<code> </code><code>fi</code>
<code> </code><code>test </code><code>-</code><code>z $ERROR || (echo </code><code>"Please execute above commands to correct svn property settings. EOL Style LF must be used!"</code> <code>>& </code><code>2</code><code>; exit </code><code>1</code><code>)</code>
<code>done</code>
<code># Block commits with tabs</code>
<code># This is coded in python</code>
<code># Exit on all errors</code>
<code>$SVNLOOK diff </code><code>-</code><code>t </code><code>"$TXN"</code> <code>"$REPOS"</code> <code>| python </code><code>/</code><code>dev</code><code>/</code><code>fd</code><code>/</code><code>3</code> <code>3</code><code><<</code><code>'EOF'</code>
<code>import</code> <code>sys</code>
<code>ignore </code><code>=</code> <code>True</code>
<code>SUFFIXES </code><code>=</code> <code>[ </code><code>".java"</code><code>, </code><code>".css"</code><code>, </code><code>".xhtml"</code><code>, </code><code>".js"</code><code>, </code><code>".xml"</code><code>, </code><code>".properties"</code> <code>]</code>
<code>filename </code><code>=</code> <code>None</code>
<code>for</code> <code>ln </code><code>in</code> <code>sys.stdin:</code>
<code> </code><code>if</code> <code>ignore </code><code>and</code> <code>ln.startswith(</code><code>"+++ "</code><code>):</code>
<code> </code><code>filename </code><code>=</code> <code>ln[</code><code>4</code><code>:ln.find(</code><code>"\t"</code><code>)].strip()</code>
<code> </code><code>ignore </code><code>=</code> <code>not</code> <code>reduce</code><code>(</code><code>lambda</code> <code>x, y: x </code><code>or</code> <code>y, </code><code>map</code><code>(</code><code>lambda</code> <code>x: filename.endswith(x), SUFFIXES))</code>
<code> </code><code>elif</code> <code>not</code> <code>ignore:</code>
<code> </code><code>if</code> <code>ln.startswith(</code><code>"+"</code><code>):</code>
<code> </code><code>if</code> <code>ln.count(</code><code>"\t"</code><code>) > </code><code>0</code><code>:</code>
<code> </code><code>sys.stderr.write(</code><code>"\n*** Transaction blocked, %s contains tab character:\n\n%s"</code> <code>%</code> <code>(filename, ln))</code>
<code> </code><code>sys.exit(</code><code>1</code><code>)</code>
<code> </code><code>if</code> <code>not</code> <code>(ln.startswith(</code><code>"@"</code><code>) </code><code>or</code> <code>\</code>
<code> </code><code>ln.startswith(</code><code>"-"</code><code>) </code><code>or</code> <code>\</code>
<code> </code><code>ln.startswith(</code><code>"+"</code><code>) </code><code>or</code> <code>\</code>
<code> </code><code>ln.startswith(</code><code>" "</code><code>)):</code>
<code> </code><code>ignore </code><code>=</code> <code>True</code>
<code>sys.exit(</code><code>0</code><code>)</code>
<code>EOF</code>
<code># All checks passed, so allow the commit.</code>
<code>exit </code><code>0</code>
使用Python寫伺服器端的SVN Hook
<code>#!/usr/bin/env python</code>
<code># -*- coding: utf-8 -*- </code>
<code>import</code> <code>os</code>
<code>import</code> <code>re</code>
<code>def</code> <code>main(argv):</code>
<code> </code><code># 從參數中取出來代碼庫和事務資訊</code>
<code> </code><code>(repos, txn) </code><code>=</code> <code>argv</code>
<code> </code><code># svnlook log拿到的是使用者送出時填寫的log資訊,然後随便你想做什麼</code>
<code> </code><code>message </code><code>=</code> <code>"</code><code>".join(os.popen("</code><code>svnlook log </code><code>'%s'</code> <code>-</code><code>t </code><code>'%s'</code><code>" </code><code>%</code> <code>(repos, txn)).readlines()).strip() </code>
<code> </code><code># svnlook changed拿到的是使用者送出的檔案,這個清單中有檔案的狀态(A,U,D之類的)和檔案名</code>
<code> </code><code>changelist </code><code>=</code> <code>os.popen(</code><code>"svnlook changed '%s' -t '%s'"</code> <code>%</code> <code>(repos, txn)).readlines()</code>
<code> </code><code># svnlook cat能讀出使用者送出檔案的内容</code>
<code> </code><code>fileContent </code><code>=</code> <code>"</code><code>".join(os.popen("</code><code>svnlook cat </code><code>-</code><code>t </code><code>%</code><code>s </code><code>%</code><code>s </code><code>%</code><code>s" </code><code>%</code> <code>(txn, repos, filename)).readlines()).strip()</code>
<code> </code><code># 傳回</code>
<code> </code><code>if</code> <code>msg </code><code>=</code><code>=</code> <code>'':</code>
<code> </code><code>sys.exit(</code><code>0</code><code>)</code>
<code> </code><code>else</code><code>:</code>
<code> </code><code># 輸出傳回資訊</code>
<code> </code><code>sys.stderr.write(msg)</code>
<code> </code><code>sys.exit(</code><code>1</code><code>) </code>
<code>if</code> <code>__name__ </code><code>=</code><code>=</code> <code>"__main__"</code><code>:</code>
<code> </code><code># sys.stderr.write(os.getcwd())</code>
<code> </code><code># 發現預設的工作目錄竟然是跟目錄“/”,這裡要換一下目前工作目錄</code>
<code> </code><code>os.chdir(sys.path[</code><code>0</code><code>])</code>
<code> </code><code>main(sys.argv[</code><code>1</code><code>:])</code>
我自己做的,我隻是提供給接口判斷
cat pre-commit
<code>RES</code><code>=</code><code>"OK"</code>
<code>SVNLOOK</code><code>=</code><code>'/svn/csvn/bin/svnlook'</code>
<code>USER</code><code>=</code><code>`$SVNLOOK author </code><code>-</code><code>t $TXN $REPOS`</code>
<code>LOG</code><code>=</code><code>`$SVNLOOK log </code><code>-</code><code>t </code><code>"$TXN"</code> <code>"$REPOS"</code><code>`</code>
<code>var</code><code>=</code><code>`python </code><code>/</code><code>svn</code><code>/</code><code>csvn</code><code>/</code><code>data</code><code>/</code><code>repositories</code><code>/</code><code>xx</code><code>/</code><code>hooks</code><code>/</code><code>check.py </code><code>"${LOG}"</code> <code>"${REPOS}"</code> <code>"${USER}"</code> <code>"${REPOS}"</code><code>`</code>
<code>if</code> <code>[ </code><code>"$var"</code> <code>=</code><code>=</code> <code>"success"</code> <code>];then</code>
<code>else</code>
<code>echo </code><code>"$result"</code> <code>1</code><code>>&</code><code>2</code>
<code>exit </code><code>1</code>
shell
curl -v -L -G --data-urlencode 'wd=手機' "http://www.baidu.com/s"
curl -s -d
cat check.py
<code>import</code> <code>urllib</code>
<code>import</code> <code>urllib2</code>
<code>message </code><code>=</code> <code>sys.argv[</code><code>1</code><code>]</code>
<code>repos </code><code>=</code> <code>sys.argv[</code><code>2</code><code>]</code>
<code>user</code><code>=</code><code>sys.argv[</code><code>3</code><code>]</code>
<code>project</code><code>=</code><code>sys.argv[</code><code>4</code><code>]</code>
<code>def</code> <code>postHttp(message</code><code>=</code><code>None</code><code>,repos</code><code>=</code><code>None</code><code>,user</code><code>=</code><code>None</code><code>,project</code><code>=</code><code>None</code><code>):</code>
<code> </code><code>url</code><code>=</code><code>" </code>
<code> </code><code>#上面是java接口,去判斷和過濾送出的資訊 </code>
<code> </code><code>postdata</code><code>=</code><code>dict</code><code>(message</code><code>=</code><code>message,repos</code><code>=</code><code>repos,user</code><code>=</code><code>user,project</code><code>=</code><code>project)</code>
<code> </code><code>postdata</code><code>=</code><code>urllib.urlencode(postdata)</code>
<code> </code><code>request </code><code>=</code> <code>urllib2.Request(url,postdata)</code>
<code> </code><code>response</code><code>=</code><code>urllib2.urlopen(request)</code>
<code> </code><code>print</code> <code>response.read()</code>
<code>#postHttp('a b','/svn/csvn/data/repositories/xx','test','/svn/csvn/data/repositories/xx')</code>
<code>#'a b' 中間空格,意味着送出可以有空格字元</code>
<code>postHttp(message,repos,user,project)</code>
另外說下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)
具體執行個體
<code>cat pre</code><code>-</code><code>commit.sh</code>
<code>cd </code><code>/</code><code>svn</code><code>/</code><code>csvn</code><code>/</code><code>data</code><code>/</code><code>repositories</code><code>/</code>
<code>for</code> <code>i </code><code>in</code> <code>`ls </code><code>-</code><code>l|grep ^d|awk </code><code>'{print $NF}'</code><code>`</code>
<code>yes|cp </code><code>-</code><code>r </code><code>/</code><code>home</code><code>/</code><code>back</code><code>/</code><code>pre</code><code>-</code><code>commit .</code><code>/</code><code>$i</code><code>/</code><code>hooks</code><code>/</code>
<code>yes|cp </code><code>-</code><code>r </code><code>/</code><code>home</code><code>/</code><code>back</code><code>/</code><code>check.py .</code><code>/</code><code>$i</code><code>/</code><code>hooks</code><code>/</code>
<code>sed </code><code>-</code><code>i </code><code>'s/sadoc/$i/g'</code> <code>.</code><code>/</code><code>$i</code><code>/</code><code>hooks</code><code>/</code><code>check.py</code>
<code>cd </code><code>/</code><code>svn</code><code>/</code><code>csvn</code><code>/</code><code>data</code><code>/</code><code>repositories</code><code>/</code><code>sadoc</code><code>/</code><code>hooks</code>
<code>rm </code><code>-</code><code>rf pre</code><code>-</code><code>commit</code>
<code>cat pre</code><code>-</code><code>commit</code>
<code>var</code><code>=</code><code>`python </code><code>/</code><code>svn</code><code>/</code><code>csvn</code><code>/</code><code>data</code><code>/</code><code>repositories</code><code>/</code><code>sadoc</code><code>/</code><code>hooks</code><code>/</code><code>check.py </code><code>"${LOG}"</code> <code>"${REPOS}"</code> <code>"${USER}"</code> <code>"${REPOS}"</code><code>`</code>
<code>echo </code><code>"$var"</code> <code>1</code><code>>&</code><code>2</code>
<code>cat check.py</code>
<code> </code><code>url</code><code>=</code><code>"http://xx/hooks/svn/pre-commit/verify"</code>
<code>#postHttp('xx-1 将git上項目遷移到svn上','/svn/csvn/data/repositories/ued-resource','xx','/svn/csvn/data/repositories/ued-resource')</code>
本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1936734,如需轉載請自行聯系原作者