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 (the "License"). 7 # You may not use this file except in compliance with the License. 8 # 9 # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 # or http://www.opensolaris.org/os/licensing. 11 # See the License for the specific language governing permissions 12 # and limitations under the License. 13 # 14 # When distributing Covered Code, include this CDDL HEADER in each 15 # file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 # If applicable, add the following below this CDDL HEADER, with the 17 # fields enclosed by brackets "[]" replaced with your own identifying 18 # information: Portions Copyright [yyyy] [name of copyright owner] 19 # 20 # CDDL HEADER END 21 # 22 # 23 # Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24 # Use is subject to license terms. 25 # 26 # ident "%Z%%M% %I% %E% SMI" 27 # 28 # 29 # Generates the list of source files that would get brought over with the 30 # specified subtree as a result of inc.flg and req.flg files. If no subtree 31 # is named, then the current directory is assumed. 32 # 33 # Based loosely on ON's version of Teamware's def.dir.flp. 34 # 35 36 ONBLDDIR=$(dirname $(whence $0)) 37 38 PATH=/usr/bin:${BUILD_TOOLS:-/opt}/teamware/bin:$ONBLDDIR 39 export PATH 40 PROG=`basename $0` 41 42 # 43 # The CDPATH variable causes ksh's `cd' builtin to emit messages to stdout 44 # under certain circumstances, which will screw up consumers of incflg() 45 # (and perhaps other things as well); unset it. 46 # 47 unset CDPATH 48 49 # 50 # Print the usage message and exit with an error. 51 # 52 usage() 53 { 54 echo "usage: $PROG [-r] [<dir>]" > /dev/stderr 55 exit 1 56 } 57 58 # 59 # Print the provided failure message and exit with an error. 60 # 61 fail() 62 { 63 echo $PROG: $@ > /dev/stderr 64 exit 1 65 } 66 67 # Find the files matching the pattern specified by the first argument in the 68 # directories named by the remaining arguments. Unlike def.dir.flp, print 69 # the name of the source file since we want to make a list of source files, 70 # not SCCS files. 71 # 72 find_files() 73 { 74 pat=$1 75 shift 76 77 if [ "$SCM_MODE" = "teamware" ] ; then 78 for dir; do 79 if [ -d $CODEMGR_WS/$dir ]; then 80 cd $CODEMGR_WS 81 find $dir -name "$pat" | \ 82 sed -n s:/SCCS/s.:/:p | prpath 83 cd - > /dev/null 84 fi 85 done 86 elif [ "$SCM_MODE" = "mercurial" ]; then 87 dirs="" 88 for dir; do 89 if [ -d $CODEMGR_WS/$dir ]; then 90 dirs="$dirs|${dir%/}" 91 fi 92 done 93 94 # Remove leading pipe before it can confuse egrep 95 dirs=${dirs#\|} 96 echo "$FILELIST" | egrep "^($dirs)/.*/${pat#s.}\$" | prpath 97 fi 98 } 99 100 # 101 # Echo the filename if it exists in the workspace. 102 # 103 echo_file() 104 { 105 [ -f $CODEMGR_WS/$1 ] && echo $1 | prpath 106 } 107 108 # 109 # Source the named script, specified as either a full path or a path relative 110 # to $CODEMGR_WS. Although def.dir.flp allows for situations in which the 111 # script is actually executed (rather than sourced), this feature has never 112 # been used in ON, since it precludes use of echo_file() and find_files(). 113 # 114 exec_file() 115 { 116 if [ "${1##/}" = "$1" ]; then 117 . $CODEMGR_WS/$1 118 else 119 . $1 120 fi 121 } 122 123 # 124 # Iterate up through all directories below the named directory, and 125 # execute any inc.flg's that may exist. 126 # 127 incflg() 128 { 129 cd $1 130 for i in * .*; do 131 case $i in 132 '*'|.|..) 133 ;; 134 inc.flg) 135 exec_file $1/$i 136 ;; 137 *) 138 if [ -d $i -a ! -h $i ]; then 139 incflg $1/$i 140 cd $1 141 fi 142 ;; 143 esac 144 done 145 } 146 147 # 148 # Convert the absolute pathnames named on input to relative pathnames (if 149 # necessary) and print them. 150 # 151 prpath() 152 { 153 # 154 # $CURTREE may be a subdirectory of $CODEMGR_WS, or it 155 # may be the root of $CODEMGR_WS. We want to strip it 156 # and end up with a relative path in either case, so the 157 # ?(/) pattern is important. If we don't do that, the 158 # dots/tree loop will go on forever. 159 # 160 reltree=${CURTREE##$CODEMGR_WS?(/)} 161 162 while read srcfile; do 163 if [ "$RELPATHS" != y ]; then 164 echo $srcfile 165 continue 166 fi 167 168 dots= 169 tree=$reltree 170 while [ "${srcfile##$tree}" = "$srcfile" ]; do 171 dots=../$dots 172 tree=`dirname $tree` 173 done 174 echo ${dots}${srcfile##$tree/} 175 done 176 } 177 178 which_scm | read SCM_MODE CODEMGR_WS || exit 1 179 180 if [[ $SCM_MODE == "unknown" ]]; then 181 fail "Unable to determine SCM type currently in use." 182 elif [[ $SCM_MODE == "mercurial" ]]; then 183 FILELIST=`hg manifest` 184 elif [[ $SCM_MODE != "teamware" ]]; then 185 fail "Unsupported SCM in use: $SCM_MODE" 186 fi 187 188 while getopts r flag; do 189 case $flag in 190 r) 191 RELPATHS=y 192 ;; 193 \?) 194 usage 195 ;; 196 esac 197 done 198 199 shift $((OPTIND - 1)) 200 201 [ $# -gt 1 ] && usage 202 203 CURTREE=`/bin/pwd` 204 205 # 206 # Determine the subtree being examined. 207 # 208 if [ $# -eq 0 ]; then 209 SUBTREE=$CURTREE 210 elif [ -d $1 ]; then 211 SUBTREE=$1 212 elif [ -d $CODEMGR_WS/$1 ]; then 213 SUBTREE=$CODEMGR_WS/$1 214 else 215 fail "neither \$CODEMGR_WS/$1 nor $1 exists as a directory" 216 fi 217 218 # 219 # Get the canonical path to the subtree. 220 # 221 cd $SUBTREE 222 SUBTREE=`/bin/pwd` 223 224 # 225 # Get the canonical path to the current directory. 226 # 227 cd $CURTREE 228 CURTREE=`/bin/pwd` 229 230 # 231 # Get the canonical path to the workspace. 232 # 233 cd $CODEMGR_WS 234 CODEMGR_WS=`/bin/pwd` 235 236 if [ "${SUBTREE##$CODEMGR_WS}" = "$SUBTREE" ]; then 237 fail "$SUBTREE is not a subtree of \$CODEMGR_WS" 238 fi 239 240 if [ "${CURTREE##$CODEMGR_WS}" = "$CURTREE" ]; then 241 fail "$CURTREE is not a subtree of \$CODEMGR_WS" 242 fi 243 244 # 245 # Find and execute all inc.flg's below our subtree. 246 # 247 incflg $SUBTREE 248 249 # 250 # Find and execute all req.flg's at or above our subtree. 251 # 252 TREE=$SUBTREE 253 while [ $TREE != $CODEMGR_WS ]; do 254 [ -f $TREE/req.flg ] && exec_file $TREE/req.flg 255 TREE=`dirname $TREE` 256 done 257 258 exit 0 259