views:

2998

answers:

5

I have a legacy CVS repository which shall be migrated to Perforce.

For each module, I need to identify what branches exist in that module.

I just want a list of branch names, no tags. It must be a command line tool, for scripting reasons.

For example (assuming there is a cvs-list-branches.sh script):

$ ./cvs-list-branches.sh module1
HEAD
dev_foobar
Release_1_2
Release_1_3
$
A: 

This will bring up tags too, but tags and branches are basically the same in CVS.

$cvs.exe rlog -h -l -b module1
Kris Erickson
Is there a simple way to filter out tags? Our CI server produces lots and lots of tags every night...Or is CVS really that stupid so that there is no way of telling the difference between a branch and a tag?
Other than parsing the version numbers, no there is no way of telling. You have to remember that branches are something that CVS added to RCS, the real version control under the hood.
Kris Erickson
A: 

with Wincvs (Gui client for windows) this is trivial, a right click will give you any branches and tags the files have.

Trough a shell you may use cvs log -h -l module.

Decio Lira
I specifically said that it should be a command line tool!
and its there! A just added the wincvs info so it could be useful to other people.
Decio Lira
+3  A: 

You could simply parse log output of cvs log -h. For each file there will be a section named Symbolic names :. All tags listed there that have a revision number that contains a zero as the last but one digit are branches. E.g.:

$ cvs log -h

Rcs file : '/cvsroot/Module/File.pas,v'
Working file : 'File.pas'
Head revision : 1.1
Branch revision : 
Locks : strict
Access :
Symbolic names :
    1.1 : 'Release-1-0'
    1.1.2.4 : 'Release-1-1'
    1.1.0.2 : 'Maintenance-BRANCH'
Keyword substitution : 'kv'
Total revisions : 5
Selected revisions : 0
Description :

===============================================

In this example Maintenance-BRANCH is clearly a branch because its revision number is listed as 1.1.0.2. This is also sometimes called a magic branch revision number.

Oliver Giesen
A: 

I have a small collection of "handy" korn shell functions one of which fetches tags for a given file. I've made a quick attempt to adapt it to do what you want. It simply does some seding/greping of the (r)log output and lists versions which have ".0." in them (which indicates that it's a branch tag):

get_branch_tags()
{
    typeset FILE_PATH=$1

    TEMP_TAGS_INFO=/tmp/cvsinfo$$

    /usr/local/bin/cvs rlog $FILE_PATH 1>${TEMP_TAGS_INFO} 2>/dev/null

    TEMPTAGS=`sed -n '/symbolic names:/,/keyword substitution:/p' ${TEMP_TAGS_INFO} | grep "\.0\." | cut -d: -f1 | awk '{print $1}'`
    TAGS=`echo $TEMPTAGS | tr ' ' '/'`
    echo ${TAGS:-NONE}
    rm -Rf $TEMP_TAGS_INFO 2>/dev/null 1>&2
}
Tom Duckering
A: 

As a quick hack:) The same stands true for rlog.

cvs log -h|awk -F"[.:]" '/^\t/&&$(NF-1)==0{print $1}'|sort -u

pooh