1#! /bin/sh
2
3# rcsfreeze - assign a symbolic revision number to a configuration of RCS files
4
5# $FreeBSD$
6
7#       The idea is to run rcsfreeze each time a new version is checked
8#       in. A unique symbolic revision number (C_[number], where number
9#       is increased each time rcsfreeze is run) is then assigned to the most
10#       recent revision of each RCS file of the main trunk.
11#
12#       If the command is invoked with an argument, then this
13#       argument is used as the symbolic name to freeze a configuration.
14#       The unique identifier is still generated
15#       and is listed in the log file but it will not appear as
16#       part of the symbolic revision name in the actual RCS file.
17#
18#       A log message is requested from the user which is saved for future
19#       references.
20#
21#       The shell script works only on all RCS files at one time.
22#       It is important that all changed files are checked in (there are
23#       no precautions against any error in this respect).
24#       file names:
25#       {RCS/}.rcsfreeze.ver	version number
26#       {RCS/}.rscfreeze.log	log messages, most recent first
27
28PATH=/bin:/usr/bin:$PATH
29export PATH
30
31DATE=`LC_ALL=C date` || exit
32# Check whether we have an RCS subdirectory, so we can have the right
33# prefix for our paths.
34if test -d RCS
35then RCSDIR=RCS/ EXT=
36else RCSDIR= EXT=,v
37fi
38
39# Version number stuff, log message file
40VERSIONFILE=${RCSDIR}.rcsfreeze.ver
41LOGFILE=${RCSDIR}.rcsfreeze.log
42# Initialize, rcsfreeze never run before in the current directory
43test -r $VERSIONFILE || { echo 0 >$VERSIONFILE && >>$LOGFILE; } || exit
44
45# Get Version number, increase it, write back to file.
46VERSIONNUMBER=`cat $VERSIONFILE` &&
47VERSIONNUMBER=`expr $VERSIONNUMBER + 1` &&
48echo $VERSIONNUMBER >$VERSIONFILE || exit
49
50# Symbolic Revision Number
51SYMREV=C_$VERSIONNUMBER
52# Allow the user to give a meaningful symbolic name to the revision.
53SYMREVNAME=${1-$SYMREV}
54echo >&2 "rcsfreeze: symbolic revision number computed: \"${SYMREV}\"
55rcsfreeze: symbolic revision number used:     \"${SYMREVNAME}\"
56rcsfreeze: the two differ only when rcsfreeze invoked with argument
57rcsfreeze: give log message, summarizing changes (end with EOF or single '.')" \
58	|| exit
59
60# Stamp the logfile. Because we order the logfile the most recent
61# first we will have to save everything right now in a temporary file.
62TMPLOG=/tmp/rcsfrz$$
63trap 'rm -f $TMPLOG; exit 1' 1 2 13 15
64# Now ask for a log message, continously add to the log file
65(
66	echo "Version: $SYMREVNAME($SYMREV), Date: $DATE
67-----------" || exit
68	while read MESS
69	do
70		case $MESS in
71		.) break
72		esac
73		echo "	$MESS" || exit
74	done
75	echo "-----------
76" &&
77	cat $LOGFILE
78) >$TMPLOG &&
79
80# combine old and new logfiles
81cp $TMPLOG $LOGFILE &&
82rm -f $TMPLOG &&
83
84# Now the real work begins by assigning a symbolic revision number
85# to each rcs file.  Take the most recent version on the default branch.
86
87# If there are any .*,v files, throw them in too.
88# But ignore RCS/.* files that do not end in ,v.
89DOTFILES=
90for DOTFILE in ${RCSDIR}.*,v
91do
92	if test -f "$DOTFILE"
93	then
94		DOTFILES="${RCSDIR}.*,v"
95		break
96	fi
97done
98
99exec rcs -q -n$SYMREVNAME: ${RCSDIR}*$EXT $DOTFILES
100