xref: /netbsd-src/external/gpl2/rcs/dist/src/rcstest (revision 7bdc26784bf54dccf8e31c40b2af54b918f70f81)
1*7bdc2678Schristos#! /bin/sh
2*7bdc2678Schristos
3*7bdc2678Schristos# Test RCS's functions.
4*7bdc2678Schristos# The RCS commands are searched for in the PATH as usual;
5*7bdc2678Schristos# to test the working directory's commands, prepend . to your PATH.
6*7bdc2678Schristos
7*7bdc2678Schristos# Test RCS by creating files RCS/a.* and RCS/a.c.
8*7bdc2678Schristos# If all goes well, output nothing, and remove the temporary files.
9*7bdc2678Schristos# Otherwise, send a message to standard output.
10*7bdc2678Schristos# Exit status is 0 if OK, 1 if an RCS bug is found, and 2 if scaffolding fails.
11*7bdc2678Schristos# With the -v option, output more debugging info.
12*7bdc2678Schristos
13*7bdc2678Schristos# If diff outputs `No differences encountered' when comparing identical files,
14*7bdc2678Schristos# then rcstest may also output these noise lines; ignore them.
15*7bdc2678Schristos
16*7bdc2678Schristos# The current directory and ./RCS must be readable, writable, and searchable.
17*7bdc2678Schristos
18*7bdc2678Schristos#	Id: rcstest,v 5.14 1995/06/16 06:19:24 eggert Exp
19*7bdc2678Schristos
20*7bdc2678Schristos
21*7bdc2678Schristos#    Copyright 1990, 1991, 1992, 1993, 1994, 1995 Paul Eggert
22*7bdc2678Schristos#    Distributed under license by the Free Software Foundation, Inc.
23*7bdc2678Schristos#
24*7bdc2678Schristos# This file is part of RCS.
25*7bdc2678Schristos#
26*7bdc2678Schristos# RCS is free software; you can redistribute it and/or modify
27*7bdc2678Schristos# it under the terms of the GNU General Public License as published by
28*7bdc2678Schristos# the Free Software Foundation; either version 2, or (at your option)
29*7bdc2678Schristos# any later version.
30*7bdc2678Schristos#
31*7bdc2678Schristos# RCS is distributed in the hope that it will be useful,
32*7bdc2678Schristos# but WITHOUT ANY WARRANTY; without even the implied warranty of
33*7bdc2678Schristos# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
34*7bdc2678Schristos# GNU General Public License for more details.
35*7bdc2678Schristos#
36*7bdc2678Schristos# You should have received a copy of the GNU General Public License
37*7bdc2678Schristos# along with RCS; see the file COPYING.
38*7bdc2678Schristos# If not, write to the Free Software Foundation,
39*7bdc2678Schristos# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
40*7bdc2678Schristos#
41*7bdc2678Schristos# Report problems and direct all questions to:
42*7bdc2678Schristos#
43*7bdc2678Schristos#     rcs-bugs@cs.purdue.edu
44*7bdc2678Schristos
45*7bdc2678Schristos# The Makefile overrides the following defaults.
46*7bdc2678Schristos: ${ALL_CFLAGS=-Dhas_conf_h}
47*7bdc2678Schristos: ${CC=cc}
48*7bdc2678Schristos: ${DIFF=diff}
49*7bdc2678Schristos# : ${LDFLAGS=} ${LIBS=} tickles old shell bug
50*7bdc2678Schristos
51*7bdc2678SchristosCL="$CC $ALL_CFLAGS $LDFLAGS -o a.out"
52*7bdc2678SchristosL=$LIBS
53*7bdc2678Schristos
54*7bdc2678SchristosRCSINIT=-x
55*7bdc2678Schristosexport RCSINIT
56*7bdc2678Schristos
57*7bdc2678SchristosSLASH=/
58*7bdc2678SchristosRCSfile=RCS${SLASH}a.c
59*7bdc2678SchristosRCS_alt=RCS${SLASH}a.d
60*7bdc2678Schristoslockfile=RCS${SLASH}a._
61*7bdc2678Schristos
62*7bdc2678Schristoscase $1 in
63*7bdc2678Schristos-v) q=; set -x;;
64*7bdc2678Schristos'') q=-q;;
65*7bdc2678Schristos*) echo >&2 "$0: usage: $0 [-v]"; exit 2
66*7bdc2678Schristosesac
67*7bdc2678Schristos
68*7bdc2678Schristosif test -d RCS
69*7bdc2678Schristosthen rmdir=:
70*7bdc2678Schristoselse rmdir=rmdir; mkdir RCS || exit
71*7bdc2678Schristosfi
72*7bdc2678Schristos
73*7bdc2678Schristosrm -f a.* RCSfile $RCS_alt lockfile &&
74*7bdc2678Schristosecho 1.1 >a.11 &&
75*7bdc2678Schristosecho 1.1.1.1 >a.3x1 &&
76*7bdc2678Schristosecho 1.2 >a.12 || { echo "#initialization failed"; exit 2; }
77*7bdc2678Schristos
78*7bdc2678Schristoscase "`$DIFF -c a.11 a.3x1`" in
79*7bdc2678Schristos*!\ 1.1.1.1)
80*7bdc2678Schristos	diff="$DIFF -c";;
81*7bdc2678Schristos*)
82*7bdc2678Schristos	echo "#warning: $DIFF -c does not work, so diagnostics may be cryptic"
83*7bdc2678Schristos	diff=$DIFF
84*7bdc2678Schristosesac
85*7bdc2678Schristos
86*7bdc2678Schristosrcs -i -L -ta.11 $q a.c &&
87*7bdc2678Schristostest -r $RCSfile || {
88*7bdc2678Schristos	echo "#rcs -i -L failed; perhaps RCS is not properly installed."
89*7bdc2678Schristos	exit 1
90*7bdc2678Schristos}
91*7bdc2678Schristos
92*7bdc2678Schristosrlog a.c >/dev/null || { echo "#rlog failed on empty RCS file"; exit 1; }
93*7bdc2678Schristosrm -f $RCSfile || exit 2
94*7bdc2678Schristos
95*7bdc2678Schristoscp a.11 a.c &&
96*7bdc2678Schristosci -ta.11 -mm $q a.c &&
97*7bdc2678Schristostest -r $RCSfile &&
98*7bdc2678Schristosrcs -L $q a.c || { echo "#ci+rcs -L failed"; exit 1; }
99*7bdc2678Schristostest ! -f a.c || { echo "#ci did not remove working file"; exit 1; }
100*7bdc2678Schristosfor l in '' '-l'
101*7bdc2678Schristosdo
102*7bdc2678Schristos	co $l $q a.c &&
103*7bdc2678Schristos	test -f a.c || { echo '#co' $l did not create working file; exit 1; }
104*7bdc2678Schristos	$diff a.11 a.c || { echo '#ci' followed by co $l is not a no-op; exit 1; }
105*7bdc2678Schristosdone
106*7bdc2678Schristos
107*7bdc2678Schristoscp a.12 a.c &&
108*7bdc2678Schristosci -mm $q a.c &&
109*7bdc2678Schristosco $q a.c &&
110*7bdc2678Schristos$diff a.12 a.c || { echo "#ci+co failed"; exit 1; }
111*7bdc2678Schristos
112*7bdc2678Schristosrm -f a.c &&
113*7bdc2678Schristosco -r1.1 $q a.c &&
114*7bdc2678Schristos$diff a.11 a.c || { echo "#can't retrieve first revision"; exit 1; }
115*7bdc2678Schristos
116*7bdc2678Schristosrm -f a.c &&
117*7bdc2678Schristoscp a.3x1 a.c &&
118*7bdc2678Schristosci -r1.1.1 -mm $q a.c &&
119*7bdc2678Schristosco -r1.1.1.1 $q a.c &&
120*7bdc2678Schristos$diff a.3x1 a.c || { echo "#branches failed"; exit 1; }
121*7bdc2678Schristos
122*7bdc2678Schristosrm -f a.c &&
123*7bdc2678Schristosco -l $q a.c &&
124*7bdc2678Schristosci -f -mm $q a.c &&
125*7bdc2678Schristosco -r1.3 $q a.c &&
126*7bdc2678Schristos$diff a.12 a.c || { echo "#(co -l; ci -f) failed"; exit 1; }
127*7bdc2678Schristos
128*7bdc2678Schristosrm -f a.c &&
129*7bdc2678Schristosco -l $q a.c &&
130*7bdc2678Schristosecho 1.4 >a.c &&
131*7bdc2678Schristosci -l -mm $q a.c &&
132*7bdc2678Schristosecho error >a.c &&
133*7bdc2678Schristosci -mm $q a.c || { echo "#ci -l failed"; exit 1; }
134*7bdc2678Schristos
135*7bdc2678Schristosrm -f a.c &&
136*7bdc2678Schristosco -l $q a.c &&
137*7bdc2678Schristosecho 1.5 >a.c &&
138*7bdc2678Schristosci -u -mm $q a.c &&
139*7bdc2678Schristostest -r a.c || { echo "#ci -u didn't create a working file"; exit 1; }
140*7bdc2678Schristosrm -f a.c &&
141*7bdc2678Schristosecho error >a.c || exit 2
142*7bdc2678Schristosci -mm $q a.c 2>/dev/null && { echo "#ci -u didn't unlock the file"; exit 1; }
143*7bdc2678Schristos
144*7bdc2678Schristosrm -f a.c &&
145*7bdc2678Schristosrcs -l $q a.c &&
146*7bdc2678Schristosco -u $q a.c || { echo "#rcs -l + co -u failed"; exit 1; }
147*7bdc2678Schristosrm -f a.c &&
148*7bdc2678Schristosecho error >a.c || exit 2
149*7bdc2678Schristosci -mm $q a.c 2>/dev/null && { echo "#co -u didn't unlock the file"; exit 1; }
150*7bdc2678Schristos
151*7bdc2678Schristosrm -f a.c &&
152*7bdc2678Schristoscp a.11 a.c &&
153*7bdc2678Schristosco -f $q a.c || { echo "#co -f failed"; exit 1; }
154*7bdc2678Schristos$diff a.11 a.c >/dev/null && { echo "#co -f had no effect"; exit 1; }
155*7bdc2678Schristos
156*7bdc2678Schristosco -p1.1 $q a.c >a.t &&
157*7bdc2678Schristos$diff a.11 a.t || { echo "#co -p failed"; exit 1; }
158*7bdc2678Schristos
159*7bdc2678Schristosfor n in n N
160*7bdc2678Schristosdo
161*7bdc2678Schristos	rm -f a.c &&
162*7bdc2678Schristos	co -l $q a.c &&
163*7bdc2678Schristos	echo $n >a.$n &&
164*7bdc2678Schristos	cp a.$n a.c &&
165*7bdc2678Schristos	ci -${n}n -mm $q a.c &&
166*7bdc2678Schristos	co -rn $q a.c &&
167*7bdc2678Schristos	$diff a.$n a.c || { echo "#ci -$n failed"; exit 1; }
168*7bdc2678Schristosdone
169*7bdc2678Schristos
170*7bdc2678Schristoscase $LOGNAME in
171*7bdc2678Schristos?*) me=$LOGNAME;;
172*7bdc2678Schristos*)
173*7bdc2678Schristos	case $USER in
174*7bdc2678Schristos	?*) me=$USER;;
175*7bdc2678Schristos	*)
176*7bdc2678Schristos		me=`who am i` || exit 2
177*7bdc2678Schristos		me=`echo "$me" | sed -e 's/ .*//' -e 's/.*!//'`
178*7bdc2678Schristos		case $me in
179*7bdc2678Schristos		'') echo >&2 "$0: cannot deduce user name"; exit 2
180*7bdc2678Schristos		esac
181*7bdc2678Schristos	esac
182*7bdc2678Schristosesac
183*7bdc2678Schristos
184*7bdc2678Schristos
185*7bdc2678Schristos# Get the date of the previous revision in UTC.
186*7bdc2678Schristosdate=`rlog -r a.c | sed -n '/^date: /{ s///; s/;.*//; p; q; }'` || exit
187*7bdc2678Schristoscase $date in
188*7bdc2678Schristos[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]);;
189*7bdc2678Schristos*) echo >&2 "$0: $date: bad rlog date output"; exit 1
190*7bdc2678Schristosesac
191*7bdc2678SchristosPWD=`pwd` && export PWD &&
192*7bdc2678Schristosrm -f a.c &&
193*7bdc2678Schristosco -l $q a.c &&
194*7bdc2678Schristossed 's/@/$/g' >a.kv <<EOF
195*7bdc2678Schristos@Author: w @
196*7bdc2678Schristos@Date: $date @
197*7bdc2678Schristos@Header: $PWD$SLASHRCSfile 2.1 date w s @
198*7bdc2678Schristos@Id: a.c 2.1 $date w s @
199*7bdc2678Schristos@Locker:  @
200*7bdc2678Schristos * @Log: a.c @
201*7bdc2678Schristos * Revision 2.1  $date  w
202*7bdc2678Schristos * m
203*7bdc2678Schristos *
204*7bdc2678Schristos@Name: Oz @
205*7bdc2678Schristos@RCSfile: a.c @
206*7bdc2678Schristos@Revision: 2.1 @
207*7bdc2678Schristos@Source: $PWD$SLASH$RCSfile @
208*7bdc2678Schristos@State: s @
209*7bdc2678SchristosEOF
210*7bdc2678Schristostest $? = 0 &&
211*7bdc2678Schristossed 's/:.*\$/$/' a.kv >a.k &&
212*7bdc2678Schristossed -e 's/w s [$]/w s '"$me"' $/' -e 's/[$]Locker: /&'"$me/" a.kv >a.kvl &&
213*7bdc2678Schristossed s/Oz//g a.kv >a.e &&
214*7bdc2678Schristossed s/Oz/N/g a.kv >a.N &&
215*7bdc2678Schristossed -e '/\$/!d' -e 's/\$$/: old $/' a.k >a.o &&
216*7bdc2678Schristossed -e 's/\$[^ ]*: //' -e 's/ \$//' a.kv >a.v &&
217*7bdc2678Schristoscp a.o a.c &&
218*7bdc2678Schristosci -d"$date" -nOz -ss -ww -u2.1 -mm $q a.c &&
219*7bdc2678Schristos$diff a.kv a.c || { echo "#keyword expansion failed"; exit 1; }
220*7bdc2678Schristosco -pOz -ko $q a.c >a.oo &&
221*7bdc2678Schristos$diff a.o a.oo || { echo "#co -p -ko failed"; exit 1; }
222*7bdc2678Schristoscp a.kv a.o && cp a.o a.b || exit 2
223*7bdc2678Schristosrcs -oOz $q a.c &&
224*7bdc2678Schristosrcs -l $q a.c &&
225*7bdc2678Schristosci -k -u $q a.c &&
226*7bdc2678Schristos$diff a.kv a.c || { echo "#ci -k failed"; exit 1; }
227*7bdc2678Schristossed -n 's/^[^$]*\$/$/p' a.kv >a.i &&
228*7bdc2678Schristosident a.c >a.i1 &&
229*7bdc2678Schristossed -e 1d -e 's/^[	 ]*//' a.i1 >a.i2 &&
230*7bdc2678Schristos$diff a.i a.i2 || { echo "#ident failed"; exit 1; }
231*7bdc2678Schristos
232*7bdc2678Schristosrcs -i $q a.c 2>/dev/null && { echo "#rcs -i permitted existing file"; exit 1; }
233*7bdc2678Schristos
234*7bdc2678Schristosrm -f a.c &&
235*7bdc2678Schristosco -l $q a.c &&
236*7bdc2678Schristosecho 2.2 >a.c &&
237*7bdc2678Schristosci -mm $q a.c &&
238*7bdc2678Schristosecho 1.1.1.2 >a.c &&
239*7bdc2678Schristosrcs -l1.1.1 $q a.c &&
240*7bdc2678Schristosci -r1.1.1.2 -mm $q a.c &&
241*7bdc2678Schristosrcs -b1.1.1 $q a.c &&
242*7bdc2678Schristostest " `co -p $q a.c`" = ' 1.1.1.2' || { echo "#rcs -b1.1.1 failed"; exit 1; }
243*7bdc2678Schristosrcs -b $q a.c &&
244*7bdc2678Schristostest " `co -p $q a.c`" = ' 2.2' || { echo "#rcs -b failed"; exit 1; }
245*7bdc2678Schristos
246*7bdc2678Schristosecho 2.3 >a.c || exit 2
247*7bdc2678Schristosrcs -U $q a.c || { echo "#rcs -U failed"; exit 1; }
248*7bdc2678Schristosci -mm $q a.c || { echo "#rcs -U didn't unset strict locking"; exit 1; }
249*7bdc2678Schristosrcs -L $q a.c || { echo "#rcs -L failed"; exit 1; }
250*7bdc2678Schristosecho error >a.c || exit 2
251*7bdc2678Schristosci -mm $q a.c 2>/dev/null && { echo "#ci retest failed"; exit 1; }
252*7bdc2678Schristos
253*7bdc2678Schristosrm -f a.c &&
254*7bdc2678Schristoslog0=`rlog -h a.c` &&
255*7bdc2678Schristosco -l $q a.c &&
256*7bdc2678Schristosci -mm $q a.c &&
257*7bdc2678Schristoslog1=`rlog -h a.c` &&
258*7bdc2678Schristostest " $log0" = " $log1" || { echo "#unchanged ci didn't revert"; exit 1; }
259*7bdc2678Schristos
260*7bdc2678Schristosrm -f a.c &&
261*7bdc2678Schristosrcs -nN:1.1 $q a.c &&
262*7bdc2678Schristosco -rN $q a.c &&
263*7bdc2678Schristos$diff a.11 a.c || { echo "#rcs -n failed"; exit 1; }
264*7bdc2678Schristos
265*7bdc2678Schristosrm -f a.c &&
266*7bdc2678Schristosrcs -NN:2.1 $q a.c &&
267*7bdc2678Schristosco -rN $q a.c &&
268*7bdc2678Schristos$diff a.N a.c || { echo "#rcs -N failed"; exit 1; }
269*7bdc2678Schristos
270*7bdc2678Schristosrm -f a.c &&
271*7bdc2678Schristosco -l $q a.c &&
272*7bdc2678Schristosecho ':::$''Log$' >a.c &&
273*7bdc2678Schristosci -u -mm $q a.c &&
274*7bdc2678Schristostest " `sed '$!d' a.c`" = ' :::' || { echo "#comment leader failed"; exit 1; }
275*7bdc2678Schristos
276*7bdc2678Schristosrm -f a.c &&
277*7bdc2678Schristosrcs -o2.2: $q a.c &&
278*7bdc2678Schristosco $q a.c &&
279*7bdc2678Schristos$diff a.e a.c || { echo "#rcs -o failed"; exit 1; }
280*7bdc2678Schristos
281*7bdc2678Schristosrcsdiff -r1.1 -rOz $q a.c >a.0
282*7bdc2678Schristoscase $? in
283*7bdc2678Schristos1) ;;
284*7bdc2678Schristos*) echo "#rcsdiff bad status"; exit 1
285*7bdc2678Schristosesac
286*7bdc2678Schristos$DIFF a.11 a.kv >a.1
287*7bdc2678Schristos$diff a.0 a.1 || { echo "#rcsdiff failed"; exit 1; }
288*7bdc2678Schristos
289*7bdc2678Schristosrcs -l2.1 $q a.c || { echo "#rcs -l2.1 failed"; exit 1; }
290*7bdc2678Schristosfor i in b k kv kvl o v
291*7bdc2678Schristosdo
292*7bdc2678Schristos	rm -f a.c &&
293*7bdc2678Schristos	cp a.$i a.c &&
294*7bdc2678Schristos	rcsdiff -k$i -rOz $q a.c || { echo "#rcsdiff -k$i failed"; exit 1; }
295*7bdc2678Schristosdone
296*7bdc2678Schristosco -p1.1 -ko $q a.c >a.t &&
297*7bdc2678Schristos$diff a.11 a.t || { echo "#co -p1.1 -ko failed"; exit 1; }
298*7bdc2678Schristosrcs -u2.1 $q a.c || { echo "#rcs -u2.1 failed"; exit 1; }
299*7bdc2678Schristos
300*7bdc2678Schristosrm -f a.c &&
301*7bdc2678Schristosrcsclean $q a.c &&
302*7bdc2678Schristosrcsclean -u $q a.c || { echo "#rcsclean botched a nonexistent file"; exit 1; }
303*7bdc2678Schristos
304*7bdc2678Schristosrm -f a.c &&
305*7bdc2678Schristosco $q a.c &&
306*7bdc2678Schristosrcsclean -n $q a.c &&
307*7bdc2678Schristosrcsclean -n -u $q a.c &&
308*7bdc2678Schristostest -f a.c || { echo "#rcsclean -n removed a file"; exit 1; }
309*7bdc2678Schristos
310*7bdc2678Schristosrm -f a.c &&
311*7bdc2678Schristosco $q a.c &&
312*7bdc2678Schristosrcsclean $q a.c &&
313*7bdc2678Schristostest ! -f a.c || { echo "#rcsclean missed an unlocked file"; exit 1; }
314*7bdc2678Schristos
315*7bdc2678Schristosrm -f a.c &&
316*7bdc2678Schristosco -l $q a.c &&
317*7bdc2678Schristosrcsclean $q a.c &&
318*7bdc2678Schristostest -f a.c || { echo "#rcsclean removed a locked file"; exit 1; }
319*7bdc2678Schristosrcsclean -u $q a.c &&
320*7bdc2678Schristostest ! -f a.c || {
321*7bdc2678Schristos	echo "#rcsclean -u missed an unchanged locked file"; exit 1;
322*7bdc2678Schristos}
323*7bdc2678Schristos
324*7bdc2678Schristosrm -f a.c &&
325*7bdc2678Schristosco -l $q a.c &&
326*7bdc2678Schristosecho change >>a.c &&
327*7bdc2678Schristosrcsclean $q a.c &&
328*7bdc2678Schristosrcsclean $q -u a.c &&
329*7bdc2678Schristostest -f a.c || { echo "#rcsclean removed a changed file"; exit 1; }
330*7bdc2678Schristos
331*7bdc2678Schristosrm -f a.c &&
332*7bdc2678Schristosco -l $q a.c &&
333*7bdc2678Schristoscat >a.c <<'EOF'
334*7bdc2678Schristos2.2
335*7bdc2678Schristosa
336*7bdc2678Schristosb
337*7bdc2678Schristosc
338*7bdc2678Schristosd
339*7bdc2678SchristosEOF
340*7bdc2678Schristostest $? = 0 &&
341*7bdc2678Schristosci -l -mm $q a.c &&
342*7bdc2678Schristosco -p2.2 $q a.c | sed -e s/2.2/2.3/ -e s/b/b1/ >a.c &&
343*7bdc2678Schristosci -l -mm $q a.c &&
344*7bdc2678Schristosco -p2.2 $q a.c | sed -e s/2.2/new/ -e s/d/d1/ >a.c || exit 2
345*7bdc2678Schristoscat >a.0 <<'EOF'
346*7bdc2678Schristos2.3
347*7bdc2678Schristosa
348*7bdc2678Schristosb1
349*7bdc2678Schristosc
350*7bdc2678Schristosd1
351*7bdc2678SchristosEOF
352*7bdc2678Schristoscat >a.1 <<'EOF'
353*7bdc2678Schristos<<<<<<< a.c
354*7bdc2678Schristosnew
355*7bdc2678Schristos=======
356*7bdc2678Schristos2.3
357*7bdc2678Schristos>>>>>>> 2.3
358*7bdc2678Schristosa
359*7bdc2678Schristosb1
360*7bdc2678Schristosc
361*7bdc2678Schristosd1
362*7bdc2678SchristosEOF
363*7bdc2678Schristosrcsmerge -E -r2.2 -r2.3 $q a.c
364*7bdc2678Schristoscase $? in
365*7bdc2678Schristos0)
366*7bdc2678Schristos	if $diff a.0 a.c >/dev/null
367*7bdc2678Schristos	then echo "#warning: diff3 -E does not work, " \
368*7bdc2678Schristos		"so merge and rcsmerge ignore overlaps and suppress overlap lines."
369*7bdc2678Schristos	else
370*7bdc2678Schristos		$diff a.1 a.c || { echo "#rcsmerge failed (status 0)"; exit 1; }
371*7bdc2678Schristos		echo "#warning: The diff3 lib program exit status ignores overlaps," \
372*7bdc2678Schristos			"so rcsmerge does not warn about overlap lines that it generates."
373*7bdc2678Schristos	fi
374*7bdc2678Schristos	;;
375*7bdc2678Schristos1)
376*7bdc2678Schristos	$diff a.1 a.c || { echo "#rcsmerge failed (status 1)"; exit 1; }
377*7bdc2678Schristos	;;
378*7bdc2678Schristos*)
379*7bdc2678Schristos	echo "#rcsmerge bad status"; exit 1
380*7bdc2678Schristosesac
381*7bdc2678Schristos
382*7bdc2678Schristos# Avoid `tr' if possible; it's not portable, and it can't handle null bytes.
383*7bdc2678Schristos# Our substitute exclusive-ORs with '\n';
384*7bdc2678Schristos# this ensures null bytes on output, which is even better than `tr',
385*7bdc2678Schristos# since some diffs think a file is binary only if it contains null bytes.
386*7bdc2678Schristoscat >a.c <<'EOF'
387*7bdc2678Schristos#include <stdio.h>
388*7bdc2678Schristosint main() {
389*7bdc2678Schristos	int c;
390*7bdc2678Schristos	while ((c=getchar()) != EOF)
391*7bdc2678Schristos		putchar(c ^ '\n');
392*7bdc2678Schristos	return 0;
393*7bdc2678Schristos}
394*7bdc2678SchristosEOF
395*7bdc2678Schristostr=tr
396*7bdc2678Schristosif (rm -f a.exe a.out && $CL a.c $L >&2) >/dev/null 2>&1
397*7bdc2678Schristosthen
398*7bdc2678Schristos	if test -s a.out
399*7bdc2678Schristos	then tr=./a.out
400*7bdc2678Schristos	elif test -s a.exe
401*7bdc2678Schristos	then tr=./a.exe
402*7bdc2678Schristos	fi
403*7bdc2678Schristosfi
404*7bdc2678Schristos{
405*7bdc2678Schristos	co -p $q a.c | $tr '\012' '\200' >a.24 &&
406*7bdc2678Schristos	cp a.24 a.c &&
407*7bdc2678Schristos	ciOut=`(ci -l -mm $q a.c 2>&1)` &&
408*7bdc2678Schristos	case $ciOut in
409*7bdc2678Schristos	?*) echo >&2 "$ciOut"
410*7bdc2678Schristos	esac &&
411*7bdc2678Schristos	co -p $q a.c | $tr '\200' '\012' >a.c &&
412*7bdc2678Schristos	rcsdiff -r2.3 $q a.c >/dev/null &&
413*7bdc2678Schristos
414*7bdc2678Schristos	echo 2.5 >a.c &&
415*7bdc2678Schristos	ci -l -mm $q a.c &&
416*7bdc2678Schristos	cp a.24 a.c &&
417*7bdc2678Schristos	rcsdiff -r2.4 $q a.c >/dev/null
418*7bdc2678Schristos} || echo "#warning: Traditional diff is used, so RCS is limited to text files."
419*7bdc2678Schristos
420*7bdc2678Schristosrcs -u -o2.4: $q a.c || { echo "#rcs -u -o failed"; exit 1; }
421*7bdc2678Schristos
422*7bdc2678Schristosrcs -i -Aa.c -t- $q a.d || { echo "#rcs -i -A failed"; exit 1; }
423*7bdc2678Schristos
424*7bdc2678Schristosrlog -r2.1 a.c >a.t &&
425*7bdc2678Schristosgrep '^checked in with -k' a.t >/dev/null &&
426*7bdc2678Schristossed '/^checked in with -k/d' a.t >a.u &&
427*7bdc2678Schristos$diff - a.u <<EOF
428*7bdc2678Schristos
429*7bdc2678SchristosRCS file: $RCSfile
430*7bdc2678SchristosWorking file: a.c
431*7bdc2678Schristoshead: 2.3
432*7bdc2678Schristosbranch:
433*7bdc2678Schristoslocks: strict
434*7bdc2678Schristosaccess list:
435*7bdc2678Schristossymbolic names:
436*7bdc2678Schristos	N: 2.1
437*7bdc2678Schristos	Oz: 2.1
438*7bdc2678Schristos	n: 1.8
439*7bdc2678Schristoskeyword substitution: kv
440*7bdc2678Schristostotal revisions: 13;	selected revisions: 1
441*7bdc2678Schristosdescription:
442*7bdc2678Schristos1.1
443*7bdc2678Schristos----------------------------
444*7bdc2678Schristosrevision 2.1
445*7bdc2678Schristosdate: $date;  author: w;  state: s;  lines: +14 -1
446*7bdc2678Schristos=============================================================================
447*7bdc2678SchristosEOF
448*7bdc2678Schristostest $? = 0 || { echo "#rlog failed"; exit 1; }
449*7bdc2678Schristos
450*7bdc2678Schristos
451*7bdc2678Schristostest ! -f $lockfile || { echo "#lock file not removed"; exit 1; }
452*7bdc2678Schristos
453*7bdc2678Schristosrm -f a.* RCSfile RCS_alt
454*7bdc2678Schristos$rmdir RCS
455