#!/bin/sh # Usage: # rmmagic rcsfile # where "rcsfile" is the path to an RCS ",v" file. This file is modified # in-place. # This script removes RCS "magic branches". A magic branch is syntactically # the same as a version number, but its penultimate branch number is 0. # "1.2.0.3" is an example. This mechanism acts as a place-holder for # branches in the event that no revisions actually exist on the branch. # For example, "1.2.0.3" identifies version 1.2 if version 1.2.3.1 does not # exist; otherwise, it identifies the latest revision on the 1.2.3 branch. # The following procedure is performed: # - Scan the RCS symbolic name list for magic branches. # - For each one found: # - munge the magic branch into an actual branch number and test for # version 1 on that branch. # - If no versions exist on the magic branch, check out the version sprouting # the branch, and check it back in on the branch. # - Move the symbolic name from the magic branch to the actual branch. # Here is an example: # - Scanning for magic branches, a magic branch named "foo" is found that # points to "1.2.0.3". # - Check existence of version 1.2.3.1 . # - If version 1.2.3.1 does not exist: # - Check out version 1.2 . # - Check in version 1.2.3.1 . # - Move symbolic name "foo" to point to branch 1.2.3 . # Note that this script relies on Paul Sander's "rinfo" program in addition # to RCS and a few standard Unix tools. The rinfo program can be found at # and at # . It also requires Software # ChipSet, which is available at the same Web and FTP site. # This script has been placed in the public domain by its author, Paul # Sander (paul@sander.cupertino.ca.us). rcsfile="$1" t1="/tmp/sh.$$.1" cleanup() { rm -f "$t1" } trap cleanup 0 1 2 3 5 15 t() { echo "$@" eval "$@" } comment="Workaround for RCS magic branch" rcsdir=`dirname "$rcsfile"` rcsfn=`basename "$rcsfile" ",v"` rcswf="$rcsdir/$rcsfn" rinfo -dsummary "$rcsfile" | cut '-d ' -f1 > "$t1" rinfo +tags < "$rcsfile" | fgrep '.0.' | sed -e 's/:/ /' | ( read name mbr while [ "$name" != "" ] do bp=`expr "x$mbr" : 'x\(.*\)\.0\.[0-9]*$'` bn=`expr "x$mbr" : 'x.*\.0\.\([0-9]*\)$'` br="$bp.$bn" bv="$br.1" if fgrep "$bv" "$t1" > /dev/null then : else t co "-r$bp" "$rcsfile" "$rcswf" t ci "-f$bv" "'-m$comment'" "$rcsfile" "$rcswf" fi t rcs "-N${name}:$br" "$rcsfile" read name mbr done true )