2010-02-13 3 views
0

У меня есть несколько модулей в CVS с разными тегами. Как я могу получить имя ветки, в которой эти файлы помечены? Я попытался проверить файл из модуля с помощью cvs co -r TAG, а затем сделать cvs log, но он, как представляется, дает мне список всех ветвей, в которых находится файл, а не только одного имени ветки.Название филиала CVS от имени тега

Также это должен быть автоматический процесс, поэтому я не могу использовать веб-инструменты, такие как viewvc, для сбора этой информации.

ответ

1

У меня есть следующие функции Korn, которые вы можете настроить для запуска в bash. Должно быть ясно, что он делает.

Используйте номер get_ver(), чтобы определить номер версии для пути к файлу и заданного тега. Затем передайте путь к файлу и номер версии до get_branch_name(). Функция get_branch_name() полагается на несколько других помощников для извлечения информации и резки номеров версий.

get_ver() 
{ 
    typeset FILE_PATH=$1 
    typeset TAG=$2 
    TEMPINFO=/tmp/cvsinfo$$ 

    /usr/local/bin/cvs rlog -r$TAG $FILE_PATH 1>$TEMPINFO 2>/dev/null 

    VER_LINE=`grep "^revision" $TEMPINFO | awk '{print $2}'` 
    echo ${VER_LINE:-NONE} 
    rm -Rf $TEMPINFO 2>/dev/null 1>&2 
} 


get_branch_name() 
{ 
    typeset FILE=$1 
    typeset VER=$2 

    BRANCH_TYPE=`is_branch $VER` 

    if [[ $BRANCH_TYPE = "BRANCH" ]] 
    then 
     BRANCH_ID=`get_branch_id $VER` 
     BRANCH_NAME=`get_tags $FILE $BRANCH_ID` 
     echo $BRANCH_NAME 
    else 
     echo $BRANCH_TYPE 
    fi 
} 



get_minor_ver() 
{ 
    typeset VER=$1 

    END=`echo $VER | sed 's/.*\.\([0-9]*\)/\1/g'` 
    echo $END 
} 

get_major_ver() 
{ 
    typeset VER=$1 

    START=`echo $VER | sed 's/\(.*\.\)[0-9]*/\1/g'` 
    echo $START 
} 

is_branch() 
{ 
    typeset VER=$1 
    # We can work out if something is branched by looking at the version number. 
    # If it has only two parts (i.e. 1.123) then it's on the trunk 
    # If it has more parts (i.e. 1.2.2.4) then it's on the branch 
    # We can error detect if it has an odd number of parts 

    POINTS=`echo $VER | tr -dc "." | wc -c | awk '{print $1}'` 
    PARTS=$(($POINTS + 1)) 

    if [[ $PARTS -eq 2 ]] 
    then 
     print "TRUNK" 
    elif [[ $(($PARTS % 2)) -eq 0 ]] 
    then 
     print "BRANCH" 
    else 
     print "ERROR" 
    fi 
} 

get_branch_id() 
{ 
    typeset VER=$1 

    MAJOR_VER=`get_major_ver $VER` 
    MAJOR_VER=${MAJOR_VER%.} 

    BRANCH_NUMBER=`get_minor_ver $MAJOR_VER` 

    BRANCH_POINT=`get_major_ver $MAJOR_VER` 

    echo ${BRANCH_POINT}0.${BRANCH_NUMBER} 
} 

get_tags() 
{ 
    typeset FILE_PATH=$1 
    typeset VER=$2 

    TEMP_TAGS_INFO=/tmp/cvsinfo$$ 

    cvs rlog -r$VER $FILE_PATH 1>${TEMP_TAGS_INFO} 2>/dev/null 

    TEMPTAGS=`sed -n '/symbolic names:/,/keyword substitution:/p' ${TEMP_TAGS_INFO} | grep ": ${VER}$" | cut -d: -f1 | awk '{print $1}'` 
    TAGS=`echo $TEMPTAGS | tr ' ' '/'` 
    echo ${TAGS:-NONE} 
    rm -Rf $TEMP_TAGS_INFO 2>/dev/null 1>&2 
} 
Смежные вопросы