CVS Techniques

This info is for reference to the core developers. Use of anonymous CVS for outsiders is not yet covered here, but may be in the future.

Checking out a module

First set the CVSROOT environment variable and make sure it is exported:
For sh variants, use

CVSROOT=cvs.r-project.org:/home/rdevel/CVS-ARCHIVE
export CVSROOT

For csh and derivatives, use

setenv CVSROOT cvs.r-project.org:/home/rdevel/CVS-ARCHIVE

Also make sure that you have CVS_RSH set to ssh.

Current head revision.

cvs co -P R

The -P option prunes empty directories. The checked out directory will be called "R". Use the -d option to call it something else.

Current patch branch

(aka "R-release")

cvs co -P -r R-0-65-patches R

Specific release version

cvs co -P -r R-0-65-1 R

Updating

cvs up -Pd -r <tag>

Notice the -r option. This can mostly be omitted, but in case a new directory has been added, one might not get the version from the relevant branch. You don't need it on the main branch of course.

Committing

cvs commit -m'describe change' FILE1 FILE2 ...

or just

cvs commit

in which case you'll be asked for a change comment.

Updating from the release branch, entire tree



	# assumes that 	"R-trunk-update-last" is set correctly
	# if not:
	# cvs rtag -F -r R-trunk-update R-trunk-update-last R
        # WATCHIT!! After an x.y.0 release set it to R-x-y, not
        #           R-trunk-update-last...

export RTOP=~/misc
export TAG=R-0-90-patches
cd $RTOP/r-release/R 
cvs update -Pd -r $TAG
cvs tag -F R-trunk-update

cd $RTOP/r-devel/R
cvs update -Pd
cvs update -j R-trunk-update-last  -j R-trunk-update
find -type f | xargs grep '>>>>>>>'
	# fix conflicts...
cvs commit -m 'branch update'

	# better do this right away...
cvs rtag -F -r R-trunk-update R-trunk-update-last R

Updating from the release branch, specific files



FILES="src/main/unique.c NEWS" #change to your liking
RELEASE=~/misc/r-release/R             #ditto
DEVEL=~/misc/r-devel/R                 #ditto

# fix and commit to release version as usual, e.g.
cvs up
vi $FILES
#----------
# TEST your CHANGES
#---------
cvs commit $FILES

cvs tag -F -r R-trunk-update R-trunk-update-last $FILES
cvs tag -F R-trunk-update $FILES

cd $DEVEL

cvs update -j R-trunk-update-last  -j R-trunk-update $FILES
grep '>>>>>>>' $FILES
#------------
# FIX CONFLICTS (if any)
#------------
cvs commit -m 'branch update' $FILES
cvs tag -F -r R-trunk-update R-trunk-update-last $FILES

Making releases

Dot-release (x.y.0)


MINOR=90
NEWMINOR=99
TAG=R-0-$MINOR
REL=R-0.$MINOR.0
OREL=R-0.65.1
FTPDIR=~ftp/pub/CRAN/src/base/
echo -e "TAG=$TAG\nREL=$REL\nOREL=$OREL"

export CVSROOT=/home/rdevel/CVS-ARCHIVE/
cd r-devel
cvs checkout -P R
	#-- set/check version number and release status:
cd R
echo 0.$MINOR.0 > VERSION
autoconf

rm src/main/gram.c
cd ../BUILD
make distclean
../R/configure
make
make check
cp src/main/gram.c ../R/src/main/gram.c

cd ../R
cvs update -Pd # watch out for last minute merges!
cvs commit -m 'preparing for release'

#---- at specified time:

cvs update # watch out for last minute merges - make check again if necessary!
cvs tag $TAG
cvs rtag -b -r $TAG $TAG-patches R
cd ~
mv r-release $OREL
mkdir r-release
cd r-release
cvs checkout -r $TAG-patches R
cvs tag -F R-trunk-update-last	

cd ~/public-releases
cvs export -r $TAG -d $REL R
GZIP=-9 tar cvfz $REL.tgz $REL
cp $REL.tgz $REL/{README,INSTALL,RESOURCES,MIRROR-SITES,PLATFORMS,NEWS,Y2K} $FTPDIR 

cd $FTPDIR
split -b 1400k $REL.tgz $REL.tgz-split.

	-- set release numbers on release and devel. versions

cd ~/r-devel/R
echo 0.$NEWMINOR.0 "Under development (unstable)" > VERSION
cvs commit -m 'prepare for next version' VERSION

cd ~/r-release/R
echo 0.$MINOR.0 "Patched" > VERSION
cvs commit -m 'prepare for next version' VERSION

Dot-dot release (x.y.z)


	# Exec the following and check carefully:

MINOR=90
PL=1
OPL=$[PL-1]
TAG=R-0-$MINOR-$PL
REL=R-0.$MINOR.$PL
OREL=R-0.$MINOR.$OPL
DIFF=R-0.$MINOR.$OPL-0.$MINOR.$PL.diff
echo -e "TAG=$TAG\nREL=$REL\nDIFF=$DIFF"
FTPDIR=~ftp/pub/CRAN/src/base/

	# go to the release directory
cd ~/r-release
cvs checkout  -Pr R-0-$MINOR-patches R
	#-- set/check version number and release status
cd R
echo 0.$MINOR.$PL  > VERSION
autoconf

cd ~/r-release/BUILD
../R/configure --prefix ~/$REL
rm ../R/src/main/gram.c
make
make check
make install
mv src/main/gram.c ../R/src/main/gram.c
cd ~/r-release/R
cvs update -Pd
cvs commit -m "prepare for release $REL"
cvs tag $TAG 
	
cd ~/public-releases
cvs export -r $TAG -d $REL R
GZIP=-9 tar cvfz $REL.tgz $REL


diff -ruN $OREL $REL > $DIFF
gzip -9 $DIFF 

#	(verify the patches)
#	(copy tarfile and diff.gz to FTP  ~ftp/pub/alpha/)

cp $REL.tgz $REL/{README,INSTALL,RESOURCES,MIRROR-SITES,PLATFORMS,NEWS,Y2K} $FTPDIR
cp $DIFF.gz $FTPDIR

cd $FTPDIR
split -b 1400k $REL.tgz $REL.tgz-split.

cd ~/r-release/R
echo 0.$MINOR.$PL Patched  > VERSION
cvs commit -m "prepare for next release"

Handling experimental branches


Suppose you want to have a branch to hold your volatile changes, let's
say R-exp-pd.

(A) Creating the branch
    ===================

cvs rtag -b R-exp-pd R
mkdir r-experimental
cd r-experimental
cvs checkout -P -r R-exp-pd R

(B) Hacking on the branch
    =====================

Just like on the release branch:

cvs update -Pd -r R-exp-pd
#..hack, hack, hack....
cvs commit -m'hacked blah' 

(C) Updating from r-devel (aka "main trunk")
    ========================================

cvs rtag -F R-head R
cvs update -j R-head # resolve conflicts if any
cvs commit -m 'merged from main'

(D) Merging the hack back into r-devel
    ==================================

cd ~/r-devel/R 
cvs update -j R-exp-pd # resolve conflicts if any
cvs commit -m merged with experimental branch