OpenSolaris_b135/tools/scripts/sccscp.sh

#!/bin/sh 
#
# CDDL HEADER START
#
# The contents of this file are subject to the terms of the
# Common Development and Distribution License, Version 1.0 only
# (the "License").  You may not use this file except in compliance
# with the License.
#
# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
# or http://www.opensolaris.org/os/licensing.
# See the License for the specific language governing permissions
# and limitations under the License.
#
# When distributing Covered Code, include this CDDL HEADER in each
# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
# If applicable, add the following below this CDDL HEADER, with the
# fields enclosed by brackets "[]" replaced with your own identifying
# information: Portions Copyright [yyyy] [name of copyright owner]
#
# CDDL HEADER END
#
#
# Copyright 1993-1998, 2003 Sun Microsystems, Inc.
# All rights reserved.
# Use is subject to license terms.
# 
#pragma ident	"%Z%%M%	%I%	%E% SMI"
#
#	This script is to be used to copy SCCS files and SCCS 
#	directory structures within a CodeManager workspace
#	You specify the 'clear file' or directory to sccscp, it
#	will duplicate the coresponding s-dot file(s), 
#	and do an SCCS GET operation on the newly
#	created s-dot file.
#
#

#
# The CDPATH variable causes ksh's `cd' builtin to emit messages to stdout
# under certain circumstances, which can really screw things up; unset it.
#
unset CDPATH

R_FLAG=0
G_FLAG=0
E_FLAG=0

usage()
{
	echo "usage:	sccscp [-r] filename1 [ filename2...] target"
	echo "	-r copy a directory and all of its files"
	echo "	-g copy the sdot file, but do not sccs-get it"
	echo "	-e copy most recent delta if file is currently checked out."
	echo "	-d debug mode"
} #usage()


#
# function to return that last arguement passed to it. 
# I use this in place of array indexing - which shell
# does not do well.
#
getlast()
{
	for arg in $*
	do
	:
	done
	echo "$arg"
} # getlast()



#
# copy_file(source, destination)
#
copy_file()
{
	f1=`basename $1`
	d1=`dirname $1`
	s1="$d1/SCCS/s.$f1"
	p1="$d1/SCCS/p.$f1"
	f2=`basename $2`
	d2=`dirname $2`
	s2="$d2/SCCS/s.$f2"
	#
	# is the file currently checked out?
	#
	if [ "(" -f $p1 ")" -a "(" $E_FLAG -eq "0" ")" ]; then
		echo "sccscp: $f1 currently checked out - not copied"
		return
	fi
	#
	# Does the destination directory have an SCCS directory,
	# if not we will create it!
	#
	if [ ! -d $d2/SCCS ]; then
		mkdir $d2/SCCS
	fi
	cp $s1 $s2
	if [ $G_FLAG -eq "0" ]; then
		PWD=`pwd`
		cd $d2 
	   	echo "sccs get $d2/$f2"
 	   	sccs get $f2 
		cd $PWD
	fi
} # copy_file()


#
# copy_dir(source, destination)
#
copy_dir()
{
	PWD=`pwd`

	if [ -d $2 ]; then
		destdir=$2/`basename $1`
	else
		destdir=$2
	fi

	cd $1

	find . -name "s.*" -print | grep '/SCCS/s\.' \
	| while read sdot
	do
		sdot=`echo $sdot | sed -e "s/^\.\///"`
		d2=$PWD/$destdir/`dirname $sdot`
		f2=`basename $sdot | sed -e "s/^s\.//" `
		if [ "(" -f $PWD/$1/`dirname $sdot`/p.$f2 ")" -a \
		     "(" $E_FLAG -eq "0" ")" ]; then
			d1=`basename $sdot`
			d1=`basename $d1`
			echo "sccscp: $d1/$f2 currently checked out - not copied"
			continue
		fi
		if [ ! -d $d2 ]; then
			mkdir -p $d2
		fi
		cp $PWD/$1/$sdot $PWD/$destdir/$sdot
		if [ $G_FLAG -eq "0" ]; then
			dir=`dirname $destdir/$sdot`
			dir=`dirname $dir`
			cd $PWD/$dir
			echo "sccs get $dir/$f2"
			sccs get $f2 
		fi
	done

	cd $PWD
} # copy_dir()

if [ -f /usr/sccs/admin ]; then
	ADMIN=/usr/sccs/admin
	PRS=/usr/sccs/prs
else
	ADMIN=/usr/ccs/bin/admin
	PRS=/usr/ccs/bin/prs
fi


#
# Parse options...
#
set -- `getopt edgr $*`
if [ $? != 0 ]; then
	usage
	exit 2
fi

for i in $*
do
	case $i in
	-r) R_FLAG=1; shift;;
	-d) set -x; shift;;
	-g) G_FLAG=1; shift;;
	-e) E_FLAG=1; shift;;
	--) shift; break;;
	esac
done

if [ $# -lt 2 ]; then
	echo "sccscp: Insufficient arguments (${#})"
	usage
	exit 1
fi

lastarg=`getlast $*`

if [ "(" $# -gt 2 ")" -a "(" ! -d $lastarg ")" ]; then
	echo "sccscp: Target must be a directory"
	usage
	exit 1
fi

while [ $# -gt 1 ]
do
	if [ ! -r $1 ]; then
		echo "sccscp: cannot access $1"
		shift
		continue
	fi
	if [ -d $lastarg ]; then
		dest=$lastarg/`basename $1`
	else
		dest=$lastarg
	fi
	if [ -d $1 ]; then
		if [ $R_FLAG -eq 0 ]; then
			echo "sccscp: <$1> directory"
		else
			copy_dir $1 $dest
		fi
	else
		copy_file $1 $dest
	fi
	shift
done