Название ветки CVS из имени тега - PullRequest
0 голосов
/ 13 февраля 2010

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

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

1 Ответ

1 голос
/ 15 февраля 2010

У меня есть следующие функции 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
}
...