天天看點

svn添加強制注釋,pre-commit結合python

<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>&gt;&amp;</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>&gt;&amp;</code><code>2</code>

<code>      </code><code>exit </code><code>1</code>

<code>    </code><code>fi</code>

<code>  </code><code>fi</code>

<code>done &lt; &lt;($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&gt; /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>&gt;&amp;</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>&gt;&amp; </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>&lt;&lt;</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>) &gt; </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>&gt;&amp;</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>&gt;&amp;</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,如需轉載請自行聯系原作者

上一篇: 快速搭建ldap
下一篇: RMAN