Миграция из PVCS в SVN - Как записать метки PVCS в сообщение журнала SVN

Мы находимся в процессе перехода с PVCS на Subversion. Я продемонстрировал экспорт PVCS => импорт SVN, который неплохо справляется со своей задачей, но у нас есть одна проблема.

Мы широко использовали этикетки PVCS, которые дают нам четкую и последовательную ссылку на наши номера запросов на работу (W.R.). Когда мы переходим на SVN, эти метки становятся тегами (что само по себе нормально), НО мы также реализуем JIRA, поэтому нам необходимо связать соответствующую версию SVN с номером проблемы JIRA. Это делается путем записи номера проблемы JIRA в сообщение журнала SVN.

Уже; во время импорта SVN я читаю каждое сообщение журнала SVN и там, где я нахожу номер запроса на работу, я добавляю соответствующий номер проблемы JIRA к сообщению журнала SVN (используя сценарий пост-фиксации в SVN). Однако практика записи W.R. в описание фиксации PVCS была необязательной, тогда как использование меток PVCS было обязательным. Поэтому многие версии не имеют номера W.R. в журнале, только в метке PVCS (или в виде тега SVN).

Есть ли способ найти этикетку версии PVCS во время импорта SVN? Я вижу их в файле дампа, созданном при экспорте PVCS, где они становятся частью пути к узлу.

Или, альтернативно, есть отчет или запрос, который я могу запустить, который даст мне список исправлений для каждого тега?

С уважением, Карл


person Karl    schedule 18.03.2011    source источник


Ответы (1)


В итоге я сам это разбирал. Если у кого-то еще есть такая же проблема, я обнаружил, что можно получить список всех тегов, используя

svn ls <repo URL including tags location>

а затем получить версии в этих тегах, используя

svn info ...

И AWK вывод SVN INFO, используя следующее. Обратите внимание: мне пришлось уменьшить номер версии на 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
person Karl    schedule 06.04.2011