xref: /dflybsd-src/gnu/usr.bin/rcs/rcstest (revision 86d7f5d305c6adaa56ff4582ece9859d73106103)
186d7f5d3SJohn Marino#! /bin/sh
286d7f5d3SJohn Marino
386d7f5d3SJohn Marino# Test RCS's functions.
486d7f5d3SJohn Marino# The RCS commands are searched for in the PATH as usual;
586d7f5d3SJohn Marino# to test the working directory's commands, prepend . to your PATH.
686d7f5d3SJohn Marino
786d7f5d3SJohn Marino# Test RCS by creating files RCS/a.* and RCS/a.c.
886d7f5d3SJohn Marino# If all goes well, output nothing, and remove the temporary files.
986d7f5d3SJohn Marino# Otherwise, send a message to standard output.
1086d7f5d3SJohn Marino# Exit status is 0 if OK, 1 if an RCS bug is found, and 2 if scaffolding fails.
1186d7f5d3SJohn Marino# With the -v option, output more debugging info.
1286d7f5d3SJohn Marino
1386d7f5d3SJohn Marino# If diff outputs `No differences encountered' when comparing identical files,
1486d7f5d3SJohn Marino# then rcstest may also output these noise lines; ignore them.
1586d7f5d3SJohn Marino
1686d7f5d3SJohn Marino# The current directory and ./RCS must be readable, writable, and searchable.
1786d7f5d3SJohn Marino
1886d7f5d3SJohn Marino# $FreeBSD: src/gnu/usr.bin/rcs/rcstest,v 1.5 1999/08/27 23:36:37 peter Exp $
1986d7f5d3SJohn Marino# $DragonFly: src/gnu/usr.bin/rcs/rcstest,v 1.2 2003/06/17 04:25:47 dillon Exp $
2086d7f5d3SJohn Marino
2186d7f5d3SJohn Marino
2286d7f5d3SJohn Marino#    Copyright 1990, 1991, 1992, 1993, 1994, 1995 Paul Eggert
2386d7f5d3SJohn Marino#    Distributed under license by the Free Software Foundation, Inc.
2486d7f5d3SJohn Marino#
2586d7f5d3SJohn Marino# This file is part of RCS.
2686d7f5d3SJohn Marino#
2786d7f5d3SJohn Marino# RCS is free software; you can redistribute it and/or modify
2886d7f5d3SJohn Marino# it under the terms of the GNU General Public License as published by
2986d7f5d3SJohn Marino# the Free Software Foundation; either version 2, or (at your option)
3086d7f5d3SJohn Marino# any later version.
3186d7f5d3SJohn Marino#
3286d7f5d3SJohn Marino# RCS is distributed in the hope that it will be useful,
3386d7f5d3SJohn Marino# but WITHOUT ANY WARRANTY; without even the implied warranty of
3486d7f5d3SJohn Marino# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
3586d7f5d3SJohn Marino# GNU General Public License for more details.
3686d7f5d3SJohn Marino#
3786d7f5d3SJohn Marino# You should have received a copy of the GNU General Public License
3886d7f5d3SJohn Marino# along with RCS; see the file COPYING.
3986d7f5d3SJohn Marino# If not, write to the Free Software Foundation,
4086d7f5d3SJohn Marino# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
4186d7f5d3SJohn Marino#
4286d7f5d3SJohn Marino# Report problems and direct all questions to:
4386d7f5d3SJohn Marino#
4486d7f5d3SJohn Marino#     rcs-bugs@cs.purdue.edu
4586d7f5d3SJohn Marino
4686d7f5d3SJohn Marino# The Makefile overrides the following defaults.
4786d7f5d3SJohn Marino: ${ALL_CFLAGS=-Dhas_conf_h}
4886d7f5d3SJohn Marino: ${CC=cc}
4986d7f5d3SJohn Marino: ${DIFF=diff}
5086d7f5d3SJohn Marino# : ${LDFLAGS=} ${LIBS=} tickles old shell bug
5186d7f5d3SJohn Marino
5286d7f5d3SJohn MarinoCL="$CC $ALL_CFLAGS $LDFLAGS -o a.out"
5386d7f5d3SJohn MarinoL=$LIBS
5486d7f5d3SJohn Marino
5586d7f5d3SJohn MarinoRCSINIT=-x
5686d7f5d3SJohn Marinoexport RCSINIT
5786d7f5d3SJohn Marino
5886d7f5d3SJohn MarinoSLASH=/
5986d7f5d3SJohn MarinoRCSfile=RCS${SLASH}a.c
6086d7f5d3SJohn MarinoRCS_alt=RCS${SLASH}a.d
6186d7f5d3SJohn Marinolockfile=RCS${SLASH}a._
6286d7f5d3SJohn Marino
6386d7f5d3SJohn Marinocase $1 in
6486d7f5d3SJohn Marino-v) q=; set -x;;
6586d7f5d3SJohn Marino'') q=-q;;
6686d7f5d3SJohn Marino*) echo >&2 "$0: usage: $0 [-v]"; exit 2
6786d7f5d3SJohn Marinoesac
6886d7f5d3SJohn Marino
6986d7f5d3SJohn Marinoif test -d RCS
7086d7f5d3SJohn Marinothen rmdir=:
7186d7f5d3SJohn Marinoelse rmdir=rmdir; mkdir RCS || exit
7286d7f5d3SJohn Marinofi
7386d7f5d3SJohn Marino
7486d7f5d3SJohn Marinorm -f a.* $RCSfile $RCS_alt $lockfile &&
7586d7f5d3SJohn Marinoecho 1.1 >a.11 &&
7686d7f5d3SJohn Marinoecho 1.1.1.1 >a.3x1 &&
7786d7f5d3SJohn Marinoecho 1.2 >a.12 || { echo "#initialization failed"; exit 2; }
7886d7f5d3SJohn Marino
7986d7f5d3SJohn Marinocase "`$DIFF -c a.11 a.3x1`" in
8086d7f5d3SJohn Marino*!\ 1.1.1.1)
8186d7f5d3SJohn Marino	diff="$DIFF -c";;
8286d7f5d3SJohn Marino*)
8386d7f5d3SJohn Marino	echo "#warning: $DIFF -c does not work, so diagnostics may be cryptic"
8486d7f5d3SJohn Marino	diff=$DIFF
8586d7f5d3SJohn Marinoesac
8686d7f5d3SJohn Marino
8786d7f5d3SJohn Marinorcs -i -L -ta.11 $q a.c &&
8886d7f5d3SJohn Marinotest -r $RCSfile || {
8986d7f5d3SJohn Marino	echo "#rcs -i -L failed; perhaps RCS is not properly installed."
9086d7f5d3SJohn Marino	exit 1
9186d7f5d3SJohn Marino}
9286d7f5d3SJohn Marino
9386d7f5d3SJohn Marinorlog a.c >/dev/null || { echo "#rlog failed on empty RCS file"; exit 1; }
9486d7f5d3SJohn Marinorm -f $RCSfile || exit 2
9586d7f5d3SJohn Marino
9686d7f5d3SJohn Marinocp a.11 a.c &&
9786d7f5d3SJohn Marinoci -ta.11 -mm $q a.c &&
9886d7f5d3SJohn Marinotest -r $RCSfile &&
9986d7f5d3SJohn Marinorcs -L $q a.c || { echo "#ci+rcs -L failed"; exit 1; }
10086d7f5d3SJohn Marinotest ! -f a.c || { echo "#ci did not remove working file"; exit 1; }
10186d7f5d3SJohn Marinofor l in '' '-l'
10286d7f5d3SJohn Marinodo
10386d7f5d3SJohn Marino	co $l $q a.c &&
10486d7f5d3SJohn Marino	test -f a.c || { echo '#co' $l did not create working file; exit 1; }
10586d7f5d3SJohn Marino	$diff a.11 a.c || { echo '#ci' followed by co $l is not a no-op; exit 1; }
10686d7f5d3SJohn Marinodone
10786d7f5d3SJohn Marino
10886d7f5d3SJohn Marinocp a.12 a.c &&
10986d7f5d3SJohn Marinoci -mm $q a.c &&
11086d7f5d3SJohn Marinoco $q a.c &&
11186d7f5d3SJohn Marino$diff a.12 a.c || { echo "#ci+co failed"; exit 1; }
11286d7f5d3SJohn Marino
11386d7f5d3SJohn Marinorm -f a.c &&
11486d7f5d3SJohn Marinoco -r1.1 $q a.c &&
11586d7f5d3SJohn Marino$diff a.11 a.c || { echo "#can't retrieve first revision"; exit 1; }
11686d7f5d3SJohn Marino
11786d7f5d3SJohn Marinorm -f a.c &&
11886d7f5d3SJohn Marinocp a.3x1 a.c &&
11986d7f5d3SJohn Marinoci -r1.1.1 -mm $q a.c &&
12086d7f5d3SJohn Marinoco -r1.1.1.1 $q a.c &&
12186d7f5d3SJohn Marino$diff a.3x1 a.c || { echo "#branches failed"; exit 1; }
12286d7f5d3SJohn Marino
12386d7f5d3SJohn Marinorm -f a.c &&
12486d7f5d3SJohn Marinoco -l $q a.c &&
12586d7f5d3SJohn Marinoci -f -mm $q a.c &&
12686d7f5d3SJohn Marinoco -r1.3 $q a.c &&
12786d7f5d3SJohn Marino$diff a.12 a.c || { echo "#(co -l; ci -f) failed"; exit 1; }
12886d7f5d3SJohn Marino
12986d7f5d3SJohn Marinorm -f a.c &&
13086d7f5d3SJohn Marinoco -l $q a.c &&
13186d7f5d3SJohn Marinoecho 1.4 >a.c &&
13286d7f5d3SJohn Marinoci -l -mm $q a.c &&
13386d7f5d3SJohn Marinoecho error >a.c &&
13486d7f5d3SJohn Marinoci -mm $q a.c || { echo "#ci -l failed"; exit 1; }
13586d7f5d3SJohn Marino
13686d7f5d3SJohn Marinorm -f a.c &&
13786d7f5d3SJohn Marinoco -l $q a.c &&
13886d7f5d3SJohn Marinoecho 1.5 >a.c &&
13986d7f5d3SJohn Marinoci -u -mm $q a.c &&
14086d7f5d3SJohn Marinotest -r a.c || { echo "#ci -u didn't create a working file"; exit 1; }
14186d7f5d3SJohn Marinorm -f a.c &&
14286d7f5d3SJohn Marinoecho error >a.c || exit 2
14386d7f5d3SJohn Marinoci -mm $q a.c 2>/dev/null && { echo "#ci -u didn't unlock the file"; exit 1; }
14486d7f5d3SJohn Marino
14586d7f5d3SJohn Marinorm -f a.c &&
14686d7f5d3SJohn Marinorcs -l $q a.c &&
14786d7f5d3SJohn Marinoco -u $q a.c || { echo "#rcs -l + co -u failed"; exit 1; }
14886d7f5d3SJohn Marinorm -f a.c &&
14986d7f5d3SJohn Marinoecho error >a.c || exit 2
15086d7f5d3SJohn Marinoci -mm $q a.c 2>/dev/null && { echo "#co -u didn't unlock the file"; exit 1; }
15186d7f5d3SJohn Marino
15286d7f5d3SJohn Marinorm -f a.c &&
15386d7f5d3SJohn Marinocp a.11 a.c &&
15486d7f5d3SJohn Marinoco -f $q a.c || { echo "#co -f failed"; exit 1; }
15586d7f5d3SJohn Marino$diff a.11 a.c >/dev/null && { echo "#co -f had no effect"; exit 1; }
15686d7f5d3SJohn Marino
15786d7f5d3SJohn Marinoco -p1.1 $q a.c >a.t &&
15886d7f5d3SJohn Marino$diff a.11 a.t || { echo "#co -p failed"; exit 1; }
15986d7f5d3SJohn Marino
16086d7f5d3SJohn Marinofor n in n N
16186d7f5d3SJohn Marinodo
16286d7f5d3SJohn Marino	rm -f a.c &&
16386d7f5d3SJohn Marino	co -l $q a.c &&
16486d7f5d3SJohn Marino	echo $n >a.$n &&
16586d7f5d3SJohn Marino	cp a.$n a.c &&
16686d7f5d3SJohn Marino	ci -${n}n -mm $q a.c &&
16786d7f5d3SJohn Marino	co -rn $q a.c &&
16886d7f5d3SJohn Marino	$diff a.$n a.c || { echo "#ci -$n failed"; exit 1; }
16986d7f5d3SJohn Marinodone
17086d7f5d3SJohn Marino
17186d7f5d3SJohn Marinocase $LOGNAME in
17286d7f5d3SJohn Marino?*) me=$LOGNAME;;
17386d7f5d3SJohn Marino*)
17486d7f5d3SJohn Marino	case $USER in
17586d7f5d3SJohn Marino	?*) me=$USER;;
17686d7f5d3SJohn Marino	*)
17786d7f5d3SJohn Marino		me=`who am i` || exit 2
17886d7f5d3SJohn Marino		me=`echo "$me" | sed -e 's/ .*//' -e 's/.*!//'`
17986d7f5d3SJohn Marino		case $me in
18086d7f5d3SJohn Marino		'') echo >&2 "$0: cannot deduce user name"; exit 2
18186d7f5d3SJohn Marino		esac
18286d7f5d3SJohn Marino	esac
18386d7f5d3SJohn Marinoesac
18486d7f5d3SJohn Marino
18586d7f5d3SJohn Marino
18686d7f5d3SJohn Marino# Get the date of the previous revision in UTC.
18786d7f5d3SJohn Marinodate=`rlog -r a.c | sed -n '/^date: /{ s///; s/;.*//; p; q; }'` || exit
18886d7f5d3SJohn Marinocase $date in
18986d7f5d3SJohn Marino[0-9][0-9][0-9]*[0-9]/[0-1][0-9]/[0-3][0-9]\ [0-2][0-9]:[0-5][0-9]:[0-6][0-9]);;
19086d7f5d3SJohn Marino*) echo >&2 "$0: $date: bad rlog date output"; exit 1
19186d7f5d3SJohn Marinoesac
19286d7f5d3SJohn MarinoPWD=`pwd` && export PWD &&
19386d7f5d3SJohn Marinorm -f a.c &&
19486d7f5d3SJohn Marinoco -l $q a.c &&
19586d7f5d3SJohn Marinosed 's/@/$/g' >a.kv <<EOF
19686d7f5d3SJohn Marino@Author: w @
19786d7f5d3SJohn Marino@Date: $date @
19886d7f5d3SJohn Marino@Header: $PWD$SLASH$RCSfile 2.1 $date w s @
19986d7f5d3SJohn Marino@Id: a.c 2.1 $date w s @
20086d7f5d3SJohn Marino@Locker:  @
20186d7f5d3SJohn Marino * @Log: a.c @
20286d7f5d3SJohn Marino * Revision 2.1  $date  w
20386d7f5d3SJohn Marino * m
20486d7f5d3SJohn Marino *
20586d7f5d3SJohn Marino@Name: Oz @
20686d7f5d3SJohn Marino@RCSfile: a.c @
20786d7f5d3SJohn Marino@Revision: 2.1 @
20886d7f5d3SJohn Marino@Source: $PWD$SLASH$RCSfile @
20986d7f5d3SJohn Marino@State: s @
21086d7f5d3SJohn MarinoEOF
21186d7f5d3SJohn Marinotest $? = 0 &&
21286d7f5d3SJohn Marinosed 's/:.*\$/$/' a.kv >a.k &&
21386d7f5d3SJohn Marinosed -e 's/w s [$]/w s '"$me"' $/' -e 's/[$]Locker: /&'"$me/" a.kv >a.kvl &&
21486d7f5d3SJohn Marinosed s/Oz//g a.kv >a.e &&
21586d7f5d3SJohn Marinosed s/Oz/N/g a.kv >a.N &&
21686d7f5d3SJohn Marinosed -e '/\$/!d' -e 's/\$$/: old $/' a.k >a.o &&
21786d7f5d3SJohn Marinosed -e 's/\$[^ ]*: //' -e 's/ \$//' a.kv >a.v &&
21886d7f5d3SJohn Marinocp a.o a.c &&
21986d7f5d3SJohn Marinoci -d"$date" -nOz -ss -ww -u2.1 -mm $q a.c &&
22086d7f5d3SJohn Marino$diff a.kv a.c || { echo "#keyword expansion failed"; exit 1; }
22186d7f5d3SJohn Marinoco -pOz -ko $q a.c >a.oo &&
22286d7f5d3SJohn Marino$diff a.o a.oo || { echo "#co -p -ko failed"; exit 1; }
22386d7f5d3SJohn Marinocp a.kv a.o && cp a.o a.b || exit 2
22486d7f5d3SJohn Marinorcs -oOz $q a.c &&
22586d7f5d3SJohn Marinorcs -l $q a.c &&
22686d7f5d3SJohn Marinoci -k -u $q a.c &&
22786d7f5d3SJohn Marino$diff a.kv a.c || { echo "#ci -k failed"; exit 1; }
22886d7f5d3SJohn Marinosed -n 's/^[^$]*\$/$/p' a.kv >a.i &&
22986d7f5d3SJohn Marinoident a.c >a.i1 &&
23086d7f5d3SJohn Marinosed -e 1d -e 's/^[	 ]*//' a.i1 >a.i2 &&
23186d7f5d3SJohn Marino$diff a.i a.i2 || { echo "#ident failed"; exit 1; }
23286d7f5d3SJohn Marino
23386d7f5d3SJohn Marinorcs -i $q a.c 2>/dev/null && { echo "#rcs -i permitted existing file"; exit 1; }
23486d7f5d3SJohn Marino
23586d7f5d3SJohn Marinorm -f a.c &&
23686d7f5d3SJohn Marinoco -l $q a.c &&
23786d7f5d3SJohn Marinoecho 2.2 >a.c &&
23886d7f5d3SJohn Marinoci -mm $q a.c &&
23986d7f5d3SJohn Marinoecho 1.1.1.2 >a.c &&
24086d7f5d3SJohn Marinorcs -l1.1.1 $q a.c &&
24186d7f5d3SJohn Marinoci -r1.1.1.2 -mm $q a.c &&
24286d7f5d3SJohn Marinorcs -b1.1.1 $q a.c &&
24386d7f5d3SJohn Marinotest " `co -p $q a.c`" = ' 1.1.1.2' || { echo "#rcs -b1.1.1 failed"; exit 1; }
24486d7f5d3SJohn Marinorcs -b $q a.c &&
24586d7f5d3SJohn Marinotest " `co -p $q a.c`" = ' 2.2' || { echo "#rcs -b failed"; exit 1; }
24686d7f5d3SJohn Marino
24786d7f5d3SJohn Marinoecho 2.3 >a.c || exit 2
24886d7f5d3SJohn Marinorcs -U $q a.c || { echo "#rcs -U failed"; exit 1; }
24986d7f5d3SJohn Marinoci -mm $q a.c || { echo "#rcs -U didn't unset strict locking"; exit 1; }
25086d7f5d3SJohn Marinorcs -L $q a.c || { echo "#rcs -L failed"; exit 1; }
25186d7f5d3SJohn Marinoecho error >a.c || exit 2
25286d7f5d3SJohn Marinoci -mm $q a.c 2>/dev/null && { echo "#ci retest failed"; exit 1; }
25386d7f5d3SJohn Marino
25486d7f5d3SJohn Marinorm -f a.c &&
25586d7f5d3SJohn Marinolog0=`rlog -h a.c` &&
25686d7f5d3SJohn Marinoco -l $q a.c &&
25786d7f5d3SJohn Marinoci -mm $q a.c &&
25886d7f5d3SJohn Marinolog1=`rlog -h a.c` &&
25986d7f5d3SJohn Marinotest " $log0" = " $log1" || { echo "#unchanged ci didn't revert"; exit 1; }
26086d7f5d3SJohn Marino
26186d7f5d3SJohn Marinorm -f a.c &&
26286d7f5d3SJohn Marinorcs -nN:1.1 $q a.c &&
26386d7f5d3SJohn Marinoco -rN $q a.c &&
26486d7f5d3SJohn Marino$diff a.11 a.c || { echo "#rcs -n failed"; exit 1; }
26586d7f5d3SJohn Marino
26686d7f5d3SJohn Marinorm -f a.c &&
26786d7f5d3SJohn Marinorcs -NN:2.1 $q a.c &&
26886d7f5d3SJohn Marinoco -rN $q a.c &&
26986d7f5d3SJohn Marino$diff a.N a.c || { echo "#rcs -N failed"; exit 1; }
27086d7f5d3SJohn Marino
27186d7f5d3SJohn Marinorm -f a.c &&
27286d7f5d3SJohn Marinoco -l $q a.c &&
27386d7f5d3SJohn Marinoecho ':::$''Log$' >a.c &&
27486d7f5d3SJohn Marinoci -u -mm $q a.c &&
27586d7f5d3SJohn Marinotest " `sed '$!d' a.c`" = ' :::' || { echo "#comment leader failed"; exit 1; }
27686d7f5d3SJohn Marino
27786d7f5d3SJohn Marinorm -f a.c &&
27886d7f5d3SJohn Marinorcs -o2.2: $q a.c &&
27986d7f5d3SJohn Marinoco $q a.c &&
28086d7f5d3SJohn Marino$diff a.e a.c || { echo "#rcs -o failed"; exit 1; }
28186d7f5d3SJohn Marino
28286d7f5d3SJohn Marinorcsdiff -r1.1 -rOz $q a.c >a.0
28386d7f5d3SJohn Marinocase $? in
28486d7f5d3SJohn Marino1) ;;
28586d7f5d3SJohn Marino*) echo "#rcsdiff bad status"; exit 1
28686d7f5d3SJohn Marinoesac
28786d7f5d3SJohn Marino$DIFF a.11 a.kv >a.1
28886d7f5d3SJohn Marino$diff a.0 a.1 || { echo "#rcsdiff failed"; exit 1; }
28986d7f5d3SJohn Marino
29086d7f5d3SJohn Marinorcs -l2.1 $q a.c || { echo "#rcs -l2.1 failed"; exit 1; }
29186d7f5d3SJohn Marinofor i in b k kv kvl o v
29286d7f5d3SJohn Marinodo
29386d7f5d3SJohn Marino	rm -f a.c &&
29486d7f5d3SJohn Marino	cp a.$i a.c &&
29586d7f5d3SJohn Marino	rcsdiff -k$i -rOz $q a.c || { echo "#rcsdiff -k$i failed"; exit 1; }
29686d7f5d3SJohn Marinodone
29786d7f5d3SJohn Marinoco -p1.1 -ko $q a.c >a.t &&
29886d7f5d3SJohn Marino$diff a.11 a.t || { echo "#co -p1.1 -ko failed"; exit 1; }
29986d7f5d3SJohn Marinorcs -u2.1 $q a.c || { echo "#rcs -u2.1 failed"; exit 1; }
30086d7f5d3SJohn Marino
30186d7f5d3SJohn Marinorm -f a.c &&
30286d7f5d3SJohn Marinorcsclean $q a.c &&
30386d7f5d3SJohn Marinorcsclean -u $q a.c || { echo "#rcsclean botched a nonexistent file"; exit 1; }
30486d7f5d3SJohn Marino
30586d7f5d3SJohn Marinorm -f a.c &&
30686d7f5d3SJohn Marinoco $q a.c &&
30786d7f5d3SJohn Marinorcsclean -n $q a.c &&
30886d7f5d3SJohn Marinorcsclean -n -u $q a.c &&
30986d7f5d3SJohn Marinotest -f a.c || { echo "#rcsclean -n removed a file"; exit 1; }
31086d7f5d3SJohn Marino
31186d7f5d3SJohn Marinorm -f a.c &&
31286d7f5d3SJohn Marinoco $q a.c &&
31386d7f5d3SJohn Marinorcsclean $q a.c &&
31486d7f5d3SJohn Marinotest ! -f a.c || { echo "#rcsclean missed an unlocked file"; exit 1; }
31586d7f5d3SJohn Marino
31686d7f5d3SJohn Marinorm -f a.c &&
31786d7f5d3SJohn Marinoco -l $q a.c &&
31886d7f5d3SJohn Marinorcsclean $q a.c &&
31986d7f5d3SJohn Marinotest -f a.c || { echo "#rcsclean removed a locked file"; exit 1; }
32086d7f5d3SJohn Marinorcsclean -u $q a.c &&
32186d7f5d3SJohn Marinotest ! -f a.c || {
32286d7f5d3SJohn Marino	echo "#rcsclean -u missed an unchanged locked file"; exit 1;
32386d7f5d3SJohn Marino}
32486d7f5d3SJohn Marino
32586d7f5d3SJohn Marinorm -f a.c &&
32686d7f5d3SJohn Marinoco -l $q a.c &&
32786d7f5d3SJohn Marinoecho change >>a.c &&
32886d7f5d3SJohn Marinorcsclean $q a.c &&
32986d7f5d3SJohn Marinorcsclean $q -u a.c &&
33086d7f5d3SJohn Marinotest -f a.c || { echo "#rcsclean removed a changed file"; exit 1; }
33186d7f5d3SJohn Marino
33286d7f5d3SJohn Marinorm -f a.c &&
33386d7f5d3SJohn Marinoco -l $q a.c &&
33486d7f5d3SJohn Marinocat >a.c <<'EOF'
33586d7f5d3SJohn Marino2.2
33686d7f5d3SJohn Marinoa
33786d7f5d3SJohn Marinob
33886d7f5d3SJohn Marinoc
33986d7f5d3SJohn Marinod
34086d7f5d3SJohn MarinoEOF
34186d7f5d3SJohn Marinotest $? = 0 &&
34286d7f5d3SJohn Marinoci -l -mm $q a.c &&
34386d7f5d3SJohn Marinoco -p2.2 $q a.c | sed -e s/2.2/2.3/ -e s/b/b1/ >a.c &&
34486d7f5d3SJohn Marinoci -l -mm $q a.c &&
34586d7f5d3SJohn Marinoco -p2.2 $q a.c | sed -e s/2.2/new/ -e s/d/d1/ >a.c || exit 2
34686d7f5d3SJohn Marinocat >a.0 <<'EOF'
34786d7f5d3SJohn Marino2.3
34886d7f5d3SJohn Marinoa
34986d7f5d3SJohn Marinob1
35086d7f5d3SJohn Marinoc
35186d7f5d3SJohn Marinod1
35286d7f5d3SJohn MarinoEOF
35386d7f5d3SJohn Marinocat >a.1 <<'EOF'
35486d7f5d3SJohn Marino<<<<<<< a.c
35586d7f5d3SJohn Marinonew
35686d7f5d3SJohn Marino=======
35786d7f5d3SJohn Marino2.3
35886d7f5d3SJohn Marino>>>>>>> 2.3
35986d7f5d3SJohn Marinoa
36086d7f5d3SJohn Marinob1
36186d7f5d3SJohn Marinoc
36286d7f5d3SJohn Marinod1
36386d7f5d3SJohn MarinoEOF
36486d7f5d3SJohn Marinorcsmerge -E -r2.2 -r2.3 $q a.c
36586d7f5d3SJohn Marinocase $? in
36686d7f5d3SJohn Marino0)
36786d7f5d3SJohn Marino	if $diff a.0 a.c >/dev/null
36886d7f5d3SJohn Marino	then echo "#warning: diff3 -E does not work, " \
36986d7f5d3SJohn Marino		"so merge and rcsmerge ignore overlaps and suppress overlap lines."
37086d7f5d3SJohn Marino	else
37186d7f5d3SJohn Marino		$diff a.1 a.c || { echo "#rcsmerge failed (status 0)"; exit 1; }
37286d7f5d3SJohn Marino		echo "#warning: The diff3 lib program exit status ignores overlaps," \
37386d7f5d3SJohn Marino			"so rcsmerge does not warn about overlap lines that it generates."
37486d7f5d3SJohn Marino	fi
37586d7f5d3SJohn Marino	;;
37686d7f5d3SJohn Marino1)
37786d7f5d3SJohn Marino	$diff a.1 a.c || { echo "#rcsmerge failed (status 1)"; exit 1; }
37886d7f5d3SJohn Marino	;;
37986d7f5d3SJohn Marino*)
38086d7f5d3SJohn Marino	echo "#rcsmerge bad status"; exit 1
38186d7f5d3SJohn Marinoesac
38286d7f5d3SJohn Marino
38386d7f5d3SJohn Marino# Avoid `tr' if possible; it's not portable, and it can't handle null bytes.
38486d7f5d3SJohn Marino# Our substitute exclusive-ORs with '\n';
38586d7f5d3SJohn Marino# this ensures null bytes on output, which is even better than `tr',
38686d7f5d3SJohn Marino# since some diffs think a file is binary only if it contains null bytes.
38786d7f5d3SJohn Marinocat >a.c <<'EOF'
38886d7f5d3SJohn Marino#include <stdio.h>
38986d7f5d3SJohn Marinoint main() {
39086d7f5d3SJohn Marino	int c;
39186d7f5d3SJohn Marino	while ((c=getchar()) != EOF)
39286d7f5d3SJohn Marino		putchar(c ^ '\n');
39386d7f5d3SJohn Marino	return 0;
39486d7f5d3SJohn Marino}
39586d7f5d3SJohn MarinoEOF
39686d7f5d3SJohn Marinotr=tr
39786d7f5d3SJohn Marinoif (rm -f a.exe a.out && $CL a.c $L >&2) >/dev/null 2>&1
39886d7f5d3SJohn Marinothen
39986d7f5d3SJohn Marino	if test -s a.out
40086d7f5d3SJohn Marino	then tr=./a.out
40186d7f5d3SJohn Marino	elif test -s a.exe
40286d7f5d3SJohn Marino	then tr=./a.exe
40386d7f5d3SJohn Marino	fi
40486d7f5d3SJohn Marinofi
40586d7f5d3SJohn Marino{
40686d7f5d3SJohn Marino	co -p $q a.c | $tr '\012' '\200' >a.24 &&
40786d7f5d3SJohn Marino	cp a.24 a.c &&
40886d7f5d3SJohn Marino	ciOut=`(ci -l -mm $q a.c 2>&1)` &&
40986d7f5d3SJohn Marino	case $ciOut in
41086d7f5d3SJohn Marino	?*) echo >&2 "$ciOut"
41186d7f5d3SJohn Marino	esac &&
41286d7f5d3SJohn Marino	co -p $q a.c | $tr '\200' '\012' >a.c &&
41386d7f5d3SJohn Marino	rcsdiff -r2.3 $q a.c >/dev/null &&
41486d7f5d3SJohn Marino
41586d7f5d3SJohn Marino	echo 2.5 >a.c &&
41686d7f5d3SJohn Marino	ci -l -mm $q a.c &&
41786d7f5d3SJohn Marino	cp a.24 a.c &&
41886d7f5d3SJohn Marino	rcsdiff -r2.4 $q a.c >/dev/null
41986d7f5d3SJohn Marino} || echo "#warning: Traditional diff is used, so RCS is limited to text files."
42086d7f5d3SJohn Marino
42186d7f5d3SJohn Marinorcs -u -o2.4: $q a.c || { echo "#rcs -u -o failed"; exit 1; }
42286d7f5d3SJohn Marino
42386d7f5d3SJohn Marinorcs -i -Aa.c -t- $q a.d || { echo "#rcs -i -A failed"; exit 1; }
42486d7f5d3SJohn Marino
42586d7f5d3SJohn Marinorlog -r2.1 a.c >a.t &&
42686d7f5d3SJohn Marinogrep '^checked in with -k' a.t >/dev/null &&
42786d7f5d3SJohn Marinosed '/^checked in with -k/d' a.t >a.u &&
42886d7f5d3SJohn Marino$diff - a.u <<EOF
42986d7f5d3SJohn Marino
43086d7f5d3SJohn MarinoRCS file: $RCSfile
43186d7f5d3SJohn MarinoWorking file: a.c
43286d7f5d3SJohn Marinohead: 2.3
43386d7f5d3SJohn Marinobranch:
43486d7f5d3SJohn Marinolocks: strict
43586d7f5d3SJohn Marinoaccess list:
43686d7f5d3SJohn Marinosymbolic names:
43786d7f5d3SJohn Marino	N: 2.1
43886d7f5d3SJohn Marino	Oz: 2.1
43986d7f5d3SJohn Marino	n: 1.8
44086d7f5d3SJohn Marinokeyword substitution: kv
44186d7f5d3SJohn Marinototal revisions: 13;	selected revisions: 1
44286d7f5d3SJohn Marinodescription:
44386d7f5d3SJohn Marino1.1
44486d7f5d3SJohn Marino----------------------------
44586d7f5d3SJohn Marinorevision 2.1
44686d7f5d3SJohn Marinodate: $date;  author: w;  state: s;  lines: +14 -1
44786d7f5d3SJohn Marino=============================================================================
44886d7f5d3SJohn MarinoEOF
44986d7f5d3SJohn Marinotest $? = 0 || { echo "#rlog failed"; exit 1; }
45086d7f5d3SJohn Marino
45186d7f5d3SJohn Marino
45286d7f5d3SJohn Marinotest ! -f $lockfile || { echo "#lock file not removed"; exit 1; }
45386d7f5d3SJohn Marino
45486d7f5d3SJohn Marinorm -f a.* $RCSfile $RCS_alt
45586d7f5d3SJohn Marino$rmdir RCS
456