#!/bin/sh

# This feature requires use of builtin cvsps!
"$TESTDIR/hghave" cvs || exit 80

set -e

echo "[extensions]" >> $HGRCPATH
echo "convert = " >> $HGRCPATH
echo "graphlog = " >> $HGRCPATH

echo % create cvs repository with one project
mkdir cvsrepo
cd cvsrepo
CVSROOT=`pwd`
export CVSROOT
CVS_OPTIONS=-f
export CVS_OPTIONS
cd ..

filterpath()
{
    eval "$@" | sed "s:$CVSROOT:*REPO*:g"
}

cvscall()
{
    echo cvs -f "$@"
    cvs -f "$@" 2>&1
}

# output of 'cvs ci' varies unpredictably, so just discard it
cvsci()
{
    echo cvs -f ci "$@"
    cvs -f ci "$@" >/dev/null 2>&1
}

filterpath cvscall -d "$CVSROOT" init
mkdir cvsrepo/proj

cvscall -q co proj

echo % create file1 on the trunk
cd proj
touch file1
cvscall -Q add file1
cvsci -m"add file1 on trunk" file1

echo % create two branches
cvscall -q tag -b v1_0
cvscall -q tag -b v1_1

echo % create file2 on branch v1_0
cvscall -Q up -rv1_0
touch file2
cvscall -Q add file2
cvsci -m"add file2" file2

echo % create file3, file4 on branch v1_1
cvscall -Q up -rv1_1
touch file3
touch file4
cvscall -Q add file3 file4
cvsci -m"add file3, file4 on branch v1_1" file3 file4

echo % merge file2 from v1_0 to v1_1
cvscall -Q up -jv1_0
cvsci -m"MERGE from v1_0: add file2"

# Step things up a notch: now we make the history really hairy, with
# changes bouncing back and forth between trunk and v1_2 and merges
# going both ways.  (I.e., try to model the real world.)

echo "% create branch v1_2"
cvscall -Q up -A
cvscall -q tag -b v1_2

echo "% create file5 on branch v1_2"
cvscall -Q up -rv1_2
touch file5
cvs -Q add file5
cvsci -m"add file5 on v1_2"

echo "% create file6 on trunk post-v1_2"
cvscall -Q up -A
touch file6
cvscall -Q add file6
cvsci -m"add file6 on trunk post-v1_2"

echo "% merge file5 from v1_2 to trunk"
cvscall -Q up -A
cvscall -Q up -jv1_2 file5
cvsci -m"MERGE from v1_2: add file5"

echo "% merge file6 from trunk to v1_2"
cvscall -Q up -rv1_2
cvscall up -jHEAD file6
cvsci -m"MERGE from HEAD: add file6"

echo % cvs rlog output
filterpath cvscall -q rlog proj | egrep '^(RCS file|revision)'

echo "% convert to hg (#1)"
cd ..
filterpath hg convert --datesort proj proj.hg

echo "% hg glog output (#1)"
hg -R proj.hg glog --template "{rev} {desc}\n"

echo "% convert to hg (#2: with merge detection)"
filterpath hg convert \
  --config convert.cvsps.mergefrom="\"^MERGE from (\S+):\"" \
  --datesort \
  proj proj.hg2

echo "% hg glog output (#2)"
hg -R proj.hg2 glog --template "{rev} {desc}\n"
