Home | History | Annotate | Download | only in scripts
      1 #!/bin/sh 
      2 #
      3 # CDDL HEADER START
      4 #
      5 # The contents of this file are subject to the terms of the
      6 # Common Development and Distribution License, Version 1.0 only
      7 # (the "License").  You may not use this file except in compliance
      8 # with the License.
      9 #
     10 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     11 # or http://www.opensolaris.org/os/licensing.
     12 # See the License for the specific language governing permissions
     13 # and limitations under the License.
     14 #
     15 # When distributing Covered Code, include this CDDL HEADER in each
     16 # file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     17 # If applicable, add the following below this CDDL HEADER, with the
     18 # fields enclosed by brackets "[]" replaced with your own identifying
     19 # information: Portions Copyright [yyyy] [name of copyright owner]
     20 #
     21 # CDDL HEADER END
     22 #
     23 #
     24 # Copyright 1993-1998, 2003 Sun Microsystems, Inc.
     25 # All rights reserved.
     26 # Use is subject to license terms.
     27 # 
     28 #pragma ident	"%Z%%M%	%I%	%E% SMI"
     29 #
     30 #	This script is to be used to copy SCCS files and SCCS 
     31 #	directory structures within a CodeManager workspace
     32 #	You specify the 'clear file' or directory to sccscp, it
     33 #	will duplicate the coresponding s-dot file(s), 
     34 #	and do an SCCS GET operation on the newly
     35 #	created s-dot file.
     36 #
     37 #
     38 
     39 #
     40 # The CDPATH variable causes ksh's `cd' builtin to emit messages to stdout
     41 # under certain circumstances, which can really screw things up; unset it.
     42 #
     43 unset CDPATH
     44 
     45 R_FLAG=0
     46 G_FLAG=0
     47 E_FLAG=0
     48 
     49 usage()
     50 {
     51 	echo "usage:	sccscp [-r] filename1 [ filename2...] target"
     52 	echo "	-r copy a directory and all of its files"
     53 	echo "	-g copy the sdot file, but do not sccs-get it"
     54 	echo "	-e copy most recent delta if file is currently checked out."
     55 	echo "	-d debug mode"
     56 } #usage()
     57 
     58 
     59 #
     60 # function to return that last arguement passed to it. 
     61 # I use this in place of array indexing - which shell
     62 # does not do well.
     63 #
     64 getlast()
     65 {
     66 	for arg in $*
     67 	do
     68 	:
     69 	done
     70 	echo "$arg"
     71 } # getlast()
     72 
     73 
     74 
     75 #
     76 # copy_file(source, destination)
     77 #
     78 copy_file()
     79 {
     80 	f1=`basename $1`
     81 	d1=`dirname $1`
     82 	s1="$d1/SCCS/s.$f1"
     83 	p1="$d1/SCCS/p.$f1"
     84 	f2=`basename $2`
     85 	d2=`dirname $2`
     86 	s2="$d2/SCCS/s.$f2"
     87 	#
     88 	# is the file currently checked out?
     89 	#
     90 	if [ "(" -f $p1 ")" -a "(" $E_FLAG -eq "0" ")" ]; then
     91 		echo "sccscp: $f1 currently checked out - not copied"
     92 		return
     93 	fi
     94 	#
     95 	# Does the destination directory have an SCCS directory,
     96 	# if not we will create it!
     97 	#
     98 	if [ ! -d $d2/SCCS ]; then
     99 		mkdir $d2/SCCS
    100 	fi
    101 	cp $s1 $s2
    102 	if [ $G_FLAG -eq "0" ]; then
    103 		PWD=`pwd`
    104 		cd $d2 
    105 	   	echo "sccs get $d2/$f2"
    106  	   	sccs get $f2 
    107 		cd $PWD
    108 	fi
    109 } # copy_file()
    110 
    111 
    112 #
    113 # copy_dir(source, destination)
    114 #
    115 copy_dir()
    116 {
    117 	PWD=`pwd`
    118 
    119 	if [ -d $2 ]; then
    120 		destdir=$2/`basename $1`
    121 	else
    122 		destdir=$2
    123 	fi
    124 
    125 	cd $1
    126 
    127 	find . -name "s.*" -print | grep '/SCCS/s\.' \
    128 	| while read sdot
    129 	do
    130 		sdot=`echo $sdot | sed -e "s/^\.\///"`
    131 		d2=$PWD/$destdir/`dirname $sdot`
    132 		f2=`basename $sdot | sed -e "s/^s\.//" `
    133 		if [ "(" -f $PWD/$1/`dirname $sdot`/p.$f2 ")" -a \
    134 		     "(" $E_FLAG -eq "0" ")" ]; then
    135 			d1=`basename $sdot`
    136 			d1=`basename $d1`
    137 			echo "sccscp: $d1/$f2 currently checked out - not copied"
    138 			continue
    139 		fi
    140 		if [ ! -d $d2 ]; then
    141 			mkdir -p $d2
    142 		fi
    143 		cp $PWD/$1/$sdot $PWD/$destdir/$sdot
    144 		if [ $G_FLAG -eq "0" ]; then
    145 			dir=`dirname $destdir/$sdot`
    146 			dir=`dirname $dir`
    147 			cd $PWD/$dir
    148 			echo "sccs get $dir/$f2"
    149 			sccs get $f2 
    150 		fi
    151 	done
    152 
    153 	cd $PWD
    154 } # copy_dir()
    155 
    156 if [ -f /usr/sccs/admin ]; then
    157 	ADMIN=/usr/sccs/admin
    158 	PRS=/usr/sccs/prs
    159 else
    160 	ADMIN=/usr/ccs/bin/admin
    161 	PRS=/usr/ccs/bin/prs
    162 fi
    163 
    164 
    165 #
    166 # Parse options...
    167 #
    168 set -- `getopt edgr $*`
    169 if [ $? != 0 ]; then
    170 	usage
    171 	exit 2
    172 fi
    173 
    174 for i in $*
    175 do
    176 	case $i in
    177 	-r) R_FLAG=1; shift;;
    178 	-d) set -x; shift;;
    179 	-g) G_FLAG=1; shift;;
    180 	-e) E_FLAG=1; shift;;
    181 	--) shift; break;;
    182 	esac
    183 done
    184 
    185 if [ $# -lt 2 ]; then
    186 	echo "sccscp: Insufficient arguments (${#})"
    187 	usage
    188 	exit 1
    189 fi
    190 
    191 lastarg=`getlast $*`
    192 
    193 if [ "(" $# -gt 2 ")" -a "(" ! -d $lastarg ")" ]; then
    194 	echo "sccscp: Target must be a directory"
    195 	usage
    196 	exit 1
    197 fi
    198 
    199 while [ $# -gt 1 ]
    200 do
    201 	if [ ! -r $1 ]; then
    202 		echo "sccscp: cannot access $1"
    203 		shift
    204 		continue
    205 	fi
    206 	if [ -d $lastarg ]; then
    207 		dest=$lastarg/`basename $1`
    208 	else
    209 		dest=$lastarg
    210 	fi
    211 	if [ -d $1 ]; then
    212 		if [ $R_FLAG -eq 0 ]; then
    213 			echo "sccscp: <$1> directory"
    214 		else
    215 			copy_dir $1 $dest
    216 		fi
    217 	else
    218 		copy_file $1 $dest
    219 	fi
    220 	shift
    221 done
    222 
    223