<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 262,  comments - 221,  trackbacks - 0

    【1.業(yè)務(wù)需求】


    為部門的SVN服務(wù)器添加一項commit控制:即用戶在提交改變時必須寫注釋,且不得低于10個字符。

    【2.基本思路】
    SVN本身并不提供這種強制寫log的功能,而是通過一系列的鉤子程序(我們稱為hook腳本),在提交之前(pre-commit),提交過程中(start-commit),提交之后(post-commit),調(diào)用預(yù)定的鉤子程序來完成一些附加的功能。

    本次我們要實現(xiàn)的是在提交到版本庫之前檢查用戶是否已經(jīng)寫了注釋,當(dāng)然要使用pre-commit這個鉤子程序。我們打開SVN的repository下的hook目錄,可以發(fā)現(xiàn)有好幾個文件,其中一個是“pre-commit.tmpl”。這個文件是一個模板文件,它告訴了我們?nèi)绾螌崿F(xiàn)提交前控制。打開該模板文件,我們看到如下一段說明:

    # The pre-commit hook is invoked before a Subversion txn is
    # committed.  Subversion runs this hook by invoking a program
    # (script
    , executable, binary, etc.) named 'pre-commit' (for which
    # this file is a template)
    , with the following ordered arguments:
    #
    #   
    [1] REPOS-PATH   (the path to this repository)                            
    #   
    [2] TXN-NAME     (the name of the txn about to be committed)
    #
    # The default working directory for the invocation is undefined
    , so
    # the program should set one explicitly if it cares.
    #
    # If the hook program exits with success
    , the txn is committed; but
    # if it exits with failure (non-zero), the txn is aborted, no commit
    # takes place
    , and STDERR is returned to the client.   The hook
    # program can use the 'svnlook' utility to help it examine the txn.

    我們看到在一個提交事務(wù)執(zhí)行之前,該hook腳本會被調(diào)用。然后向該腳本傳遞兩個參數(shù):REPOS-PATH和TXN-NAME,一個是用戶要提交的URL,一個是本次事務(wù)的一個事務(wù)號。如果提交成功則返回0,否則返回其它非0結(jié)果。那么我們的鉤子程序就是要在事務(wù)提交之前,攔截這些請求,然后通過svnlook命令來檢查是否已經(jīng)寫了log。

    【3.示例代碼】
    下面這段代碼是網(wǎng)上直接拷貝的一段代碼:

    @echo off
    setlocal
    set REPOS=%1

    set TXN=%2  
    rem check that logmessage contains at least 10 characters
    svnlook log "%REPOS%" -t "%TXN%" | findstr "." > nul

    if %errorlevel% gtr 
    0 goto err
    exit 
    0
    :err
    echo Empty log message not allowed. Commit aborted! 1>&2

    exit 
    1

    下面解析一下綠色高亮處代碼的作用:

     ①set REPOS=%1 
        set TXN=%2
       還記得我們前面提到的但事務(wù)提交時,會傳遞兩個參數(shù)嗎?這里就是分別用來接收URL和事務(wù)號的
     
    ②svnlook log "%REPOS%" -t "%TXN%" | findstr ".........." > nul
       這句是核心程序。首先svnlook log是用來查看某個版本庫某次提交的log的,那么我們怎么知道這兩個
       參數(shù)呢?答案就是我們前面已經(jīng)保存的REPOS和TXN參數(shù)。
       它的作用是查看%REPOS%這個URL第%TXN%次提交的log信息,那么| findstr ".........."呢?細心
       的讀者會發(fā)現(xiàn)這里有10個圓點號,即表示10個字符。
       整句的作用就是先獲取當(dāng)前提交的log內(nèi)容,然后判斷是否有10個字符以上

    ③echo Empty log message not allowed. Commit aborted! 1>&2
       這句話的作用是當(dāng)提交檢查失敗時,輸出的提示信息

    【4. 運行測試及錯誤解決】
    到這里我們應(yīng)該可以正常運行了吧?下面我們把上面這個程序保存為pre-commit.bat,保存到hook目錄下。啟動SVN,隨意修改一個文件后,不寫注釋提交。看看下面的結(jié)果: 居然提示我們找不到svn repository目錄下的format文件:

    Svnlook:不能打開文件”C:\peng\Other\newRepo\fom…\” The system cannot find The path specified.

    真郁悶!這是什么原因。仔細檢查文件,沒有發(fā)現(xiàn)語法錯誤。從SVN的官網(wǎng)上下了一份同樣內(nèi)容的bat文件,測試通過!那會不會是文件的格式原因呢?我試著比較了這兩份文件的字符數(shù),發(fā)現(xiàn)居然不一樣。會不會是一些控制字符的原因。

    于是打開舊的文件,重新整理格式,發(fā)現(xiàn)每一行后面都多了一個中文的換行符。刪除這些換行符再測試,測試通過!

    教訓(xùn):從網(wǎng)頁上直接拷貝代碼有時會帶有特殊字符,諸如控制字符會中文空格等,這些字符有時會引起一些不必要的錯誤。

     



    -------------------------------------------------------------
    生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
    posted on 2008-12-24 16:02 Paul Lin 閱讀(4740) 評論(1)  編輯  收藏 所屬分類: 項目管理


    FeedBack:
    # re: 【版本控制之路】SVN強制寫Log失敗的解決方案一例
    2008-12-27 16:22 | The Matrix
    good job  回復(fù)  更多評論
      
    <2008年12月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    常用鏈接

    留言簿(21)

    隨筆分類

    隨筆檔案

    BlogJava熱點博客

    好友博客

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲视频免费在线看| 免费大片av手机看片| 久久大香伊焦在人线免费| 亚洲中文字幕久久精品无码喷水| 精品亚洲成a人在线观看| 黄a大片av永久免费| 97在线观免费视频观看| 亚洲第一页中文字幕| 6080午夜一级毛片免费看6080夜福利| 亚洲精选在线观看| 88av免费观看入口在线| 亚洲精品影院久久久久久| 69式国产真人免费视频| 亚洲 暴爽 AV人人爽日日碰 | 67194在线午夜亚洲| 无码人妻久久一区二区三区免费丨| 亚洲av无码国产综合专区| 国产青草亚洲香蕉精品久久| 久久国产免费一区| 亚洲精品高清国产麻豆专区| 18以下岁毛片在免费播放| 亚洲一区二区三区不卡在线播放 | a级毛片视频免费观看| 亚洲成AV人片一区二区| 国产精品免费精品自在线观看| 亚洲一区电影在线观看| 国产男女性潮高清免费网站| 久久久久无码精品亚洲日韩 | 亚洲网站在线观看| 无码国产精品久久一区免费| 亚洲av成人无码网站…| 亚洲色精品88色婷婷七月丁香 | 亚洲人成色77777在线观看| 一级毛片aaaaaa免费看| 亚洲 国产 图片| 亚洲第一第二第三第四第五第六| 日本免费一区二区在线观看| 亚洲国产一成人久久精品| 四虎精品视频在线永久免费观看| 亚洲精华国产精华精华液好用| 亚洲日韩人妻第一页|