1 #!/bin/ksh -p 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 2003 Sun Microsystems, Inc. All rights reserved. 25 # Use is subject to license terms. 26 # 27 #ident "%Z%%M% %I% %E% SMI" 28 # 29 # Print sccs history of a file with 30 # comment and differences for each delta. 31 # 32 # With the -r invocation style, only the deltas between the given sids are 33 # printed. sccshist -r1.2 -r1.3, for example, prints the SID description for 34 # 1.3, followed by the diffs between 1.2 and 1.3. The SID description for 1.2 35 # is not printed. 36 # 37 # With the -n invocation style, deltas to a given number of SIDs are printed. 38 # Given a file with 1.5, 1.4, ... 1.1, sccshist -n 2 will print the 1.5 SID 39 # header, 1.4 -> 1.5 diffs, the 1.4 SID header, and 1.3 -> 1.4 diffs. 40 # 41 42 PROGNAME=$(basename "$0") 43 44 SCCS=/usr/ccs/bin/sccs 45 46 die() 47 { 48 echo "$PROGNAME: $@" >&2 49 exit 1 50 } 51 52 usage() 53 { 54 echo "Usage: $PROGNAME [-c|-u] [-r lowsid [-r highsid]] file" >&2 55 echo " $PROGNAME [-c|-u] [-n nsids] file" >&2 56 exit 2 57 } 58 59 lowsid= 60 highsid= 61 typeset -i nsids=0 62 diffflags= 63 64 while getopts "cn:r:u" c ; do 65 case $c in 66 c|u) 67 [[ -n "$diffflags" ]] && usage 68 diffflags="-$c" 69 ;; 70 n) 71 expr "X$OPTARG" : 'X[0-9]*$' >/dev/null || usage 72 nsids="$OPTARG" 73 ;; 74 r) 75 if [[ -n "$highsid" ]] ; then 76 usage 77 elif [[ -n "$lowsid" ]] ; then 78 highsid="$OPTARG" 79 else 80 lowsid="$OPTARG" 81 fi 82 ;; 83 *) 84 usage 85 ;; 86 esac 87 done 88 shift $(($OPTIND - 1)) 89 90 [[ -n "$lowsid" && $nsids -ne 0 ]] && usage 91 [[ $# -ne 1 ]] && usage 92 93 FILE=$1 94 95 [[ -r "$FILE" ]] || die "failed to open $FILE" 96 97 tmpf1=/tmp/sid1.$$ 98 tmpf2=/tmp/sid2.$$ 99 trap "rm -f $tmpf1 $tmpf2 ; exit" 0 1 2 3 15 100 101 # 102 # The main processing loop. A new SID triggers a printing of the diffs between 103 # the new SID and the last one. If there is no previous SID (if we're looking 104 # at the first one), no diff is printed. 105 # 106 if [[ -z "$highsid" ]] ; then 107 printing=1 108 else 109 printing=0 110 fi 111 112 typeset -i last=0 113 typeset -i count=0 114 115 $SCCS prt $FILE | while read LINE ; do 116 set - $LINE 117 118 if [[ $printing -eq 0 ]] ; then 119 if [[ "$2" = "$highsid" ]] ; then 120 printing=1 121 else 122 continue 123 fi 124 fi 125 126 if [[ $1 != "D" ]] ; then 127 echo "$LINE" 128 continue 129 fi 130 131 # We calculate `last' before printing the diff, and defer breaking out 132 # of the loop until after the diff, because we want to act upon the 133 # value during the diff. 134 [[ -n "$lowsid" && $printing -eq 1 && "$2" = "$lowsid" ]] && last=1 135 if [[ "$nsids" -ne 0 ]] ; then 136 count=$(($count + 1)) 137 [[ $count -gt $nsids ]] && last=1 138 fi 139 140 $SCCS get -s -p -k -r$2 $FILE > $tmpf1 141 if [[ -r $tmpf2 ]] ; then 142 diff -wt $diffflags $tmpf1 $tmpf2 143 if [[ $last -eq 0 ]] ; then 144 echo "________________________________________________________" 145 fi 146 fi 147 mv $tmpf1 $tmpf2 148 149 [[ $last -eq 1 ]] && break 150 151 echo "$LINE" # The new SID delta line 152 done 153