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