2011-03-18 45 views
2

我們正在從PVCS遷移到Subversion。我已經演示了一個PVCS導出=> SVN導入,它可以很好地完成這項工作,但我們有一個問題。PVCS到SVN遷移 - 如何將PVCS標籤寫入SVN日誌Msg

我們廣泛使用了PVCS標籤,這些標籤爲我們提供了一個清晰而一致的工作請求號碼(W.R.)鏈接。當我們遷移到SVN時,這些標籤會變成標籤(本身很好),但是我們也在實施JIRA,因此需要將適當的SVN版本鏈接到JIRA問題編號。這是通過將JIRA問題編號寫入SVN日誌消息來完成的。

到目前爲止;在SVN導入時我正在閱讀每個SVN日誌消息,並在其中找到工作請求編號,我將相應的JIRA問題編號附加到SVN日誌消息中(使用SVN中的提交後腳本)。然而,將W.R.寫入PVCS提交描述的做法是可選的,而PVCS標籤的使用是強制性的。因此,許多版本在日誌中沒有W.R.編號,只能在PVCS標籤中(或成爲SVN標籤)。

有沒有什麼方法可以在SVN導入過程中找到PVCS版本標籤?我可以在由PVCS導出創建的轉儲文件中看到它們,它們成爲節點路徑的一部分。

或者是否有報告或查詢我可以運行,會給我一個每個標籤的修訂列表?

問候 卡爾

回答

2

我結束了這個整理自己。如果任何人有同樣的問題,我發現這是可能使用

svn ls <repo URL including tags location> 

讓所有標籤的列表,然後使用

svn info ... 

獲得這些標籤的版本和awk SVN信息的使用以下輸出。注意我必須將版本號減1才能得到我感興趣的實際版本。我認爲這是因爲在導入期間,SVN在創建版本後將適當版本複製到標記文件夾,這被認爲是一個版本。

BEGIN { RS=""; 
    FS = "\n"; } 
/^Path:/ { n1 = split($1,path,":"); 
      n3 = split($6,nodeKind, ":"); 
      n2 = split($9,lastRev,":"); 
      theRev = lastRev[2] -1; 
printf("%8s %10s, %-75s\n", theRev, nodeKind[2], path[2]); } 

WRKEYFILE和PTKEYFILE只是的.csv查找文件來匹配與

PT_TICKET,PKEY,Issue Title 

然後我寫了一個腳本如下格式...

REPO=svn://vuwunicocsagfg1/Banner/tags 
REPOPATH=/var/subversion/Banner 
WRKEYFILE=workReq_pKey.unix 
PTKEYFILE=ptTicket_pKey.unix 

# working variables 
TEMPFILE=$$.tmp 
TAGLIST=$$.tags 
REVISIONS=$$.revisions 
SVNINFO=$$.info 
SVNLOOK=/usr/bin/svnlook 


# look up details in Subversion 
svn info -R $REPO | awk -f new_svn_report.awk > $SVNINFO 
svn ls $REPO > $TAGLIST 

cat $TAGLIST | awk '{ print $1}' | while read LINE 
do 

    JIRAISSUE="" 
    WRNUM="" 
    PTNUM="" 
    UWRNUM="" 
    UPTNUM="" 

    # Find Work Request or Perfect Tracker number 
    WRNUM=$(echo "$LINE" | sed -n -e "s:.*\([wW][rR][0-9# -][0-9]\+\).*:\1:p") 
    PTNUM=$(echo "$LINE" | sed -n -e "s:.*\([pP][tT][0-9# -][0-9]\+\).*:\1:p") 

    # upper case the strings found and remove unwanted chars 
    UWRNUM=`echo $WRNUM| tr 'a-z' 'A-Z' | tr --delete '# -'` 
    UPTNUM=`echo $PTNUM| tr 'a-z' 'A-Z' | tr --delete '# -'` 
    # Debug 
    # echo "==============================" 
    # echo "Line is: $LINE, WRNUM is: $WRNUM, PTNUM is: $PTNUM" 

    if [[ -n "$UWRNUM" ]] 
    then 

     # Find the JIRA issue number 
     awk -F',' '/'"$UWRNUM"'/ {print $2}' $WRKEYFILE | awk '{if (NR==1) {print $0}}' > $TEMPFILE 
     JIRAISSUE=`cat $TEMPFILE` 

     awk -F',' '/'"$UWRNUM"'/ {print $2,"; " $3}' $WRKEYFILE | tr '"' '_' | awk '{if (NR==1) {print $0}}' > $TEMPFILE 
     NEWLOG=`cat $TEMPFILE` 

     # all revisions in this Tag which are not directories 
     grep $UWRNUM $SVNINFO | grep -v "directory" > $REVISIONS 
    fi 

    if [[ -n "$UPTNUM" ]] 
    then 
     # Find the JIRA issue number 
     awk -F',' '/'"$UPTNUM"'/ {print $2}' $PTKEYFILE | awk '{if (NR==1) {print $0}}' > $TEMPFILE 
     JIRAISSUE=`cat $TEMPFILE` 

     awk -F',' '/'"$UPTNUM"'/ {print $2,"; " $3}' $PTKEYFILE | tr '"' '_' | awk '{if (NR==1) {print $0}}' > $TEMPFILE 
     NEWLOG=`cat $TEMPFILE` 

     # all revisions in this Tag which are not directories 
     grep $UPTNUM $SVNINFO | grep -v "directory" > $REVISIONS 
    fi 

    if [[ -n "$JIRAISSUE" ]] 
    then 
     cat $REVISIONS | awk '{ print $1}' | while read REVLINE 
     do 

     $SVNLOOK log -r "$REVLINE" "$REPOPATH" | tr '"' '_' > $TEMPFILE 
     OLDLOG=`cat $TEMPFILE ` 

     if `echo $OLDLOG | grep "$JIRAISSUE" 1>/dev/null 2>&1` 
     then 
      LOGMSG=$OLDLOG 
     else 
      LOGMSG="$OLDLOG $NEWLOG" 
     fi 
     # Debug 
     # echo "Jira issue is: $JIRAISSUE" 
     # echo "update the log message for Revision $REVLINE" 
     # echo "New log message is: $LOGMSG" 
     # echo "***********************************" 

     echo "svn propset --revprop -r "$REVLINE" svn:log \""$LOGMSG"\" $REPO" 
     svn propset --revprop -r "$REVLINE" svn:log \""$LOGMSG"\" $REPO 
     echo "" 

     done 
    fi 
done