Home | History | Annotate | Line # | Download | only in sets
culldeps revision 1.1
      1  1.1  dyoung #!/bin/sh
      2  1.1  dyoung #
      3  1.1  dyoung # culldeps
      4  1.1  dyoung #
      5  1.1  dyoung # Filter redundant dependencies.
      6  1.1  dyoung #
      7  1.1  dyoung # Emit all the dependencies on the standard input to the standard
      8  1.1  dyoung # output EXCEPT the dependencies which can be derived from other
      9  1.1  dyoung # dependencies by the transitive rule. For example, omit both A C
     10  1.1  dyoung # and A D from
     11  1.1  dyoung #
     12  1.1  dyoung # 	A B
     13  1.1  dyoung # 	B C
     14  1.1  dyoung # 	C D
     15  1.1  dyoung # 	A C
     16  1.1  dyoung # 	A D
     17  1.1  dyoung #
     18  1.1  dyoung # because A C can be derived from A B and B C by transitivity,
     19  1.1  dyoung # and A D can be derived from A B, B C, C D by transitivity.
     20  1.1  dyoung #
     21  1.1  dyoung 
     22  1.1  dyoung SCRATCH=$(mktemp -d /var/tmp/$0.XXXXXX)
     23  1.1  dyoung NEXTLEFTOVERS=$SCRATCH/leftovers0
     24  1.1  dyoung LASTJOIN=$SCRATCH/join0
     25  1.1  dyoung NEXTJOIN=$SCRATCH/join1
     26  1.1  dyoung TAB="	"
     27  1.1  dyoung 
     28  1.1  dyoung sort -k 1 > $LASTJOIN
     29  1.1  dyoung 
     30  1.1  dyoung LEFTOVERS=$LASTJOIN
     31  1.1  dyoung 
     32  1.1  dyoung while [ $(wc -l $LASTJOIN | awk '{ print $1; }') -ne 0 ]; do
     33  1.1  dyoung 
     34  1.1  dyoung 	#
     35  1.1  dyoung 	# From dependencies X-requires-Y in $LEFTOVERS and Y-requires-Z in
     36  1.1  dyoung 	# $LASTJOIN, produce dependencies X-requires-Z and write them to
     37  1.1  dyoung 	# $NEXTJOIN.
     38  1.1  dyoung 	#
     39  1.1  dyoung 	sort -k 2 < $LEFTOVERS | join -1 2 -2 1 -o '1.1 2.2' - $LASTJOIN | \
     40  1.1  dyoung 	    sort -u > $NEXTJOIN
     41  1.1  dyoung 	if [ ${DEBUG:-0} -gt 0 ]; then
     42  1.1  dyoung 		echo "### filtered ###" 1>&2
     43  1.1  dyoung 		join -t "$TAB" $NEXTJOIN $LEFTOVERS | sort 1>&2
     44  1.1  dyoung 		echo "###" 1>&2
     45  1.1  dyoung 	fi
     46  1.1  dyoung 
     47  1.1  dyoung 	#
     48  1.1  dyoung 	# Filter out of $LEFTOVERS all of the dependencies X-requires-Z, which
     49  1.1  dyoung 	# were produced in the previous step. Write the new leftovers to
     50  1.1  dyoung 	# $NEXTLEFTOVERS.
     51  1.1  dyoung 	#
     52  1.1  dyoung 	join -v 2 -t "$TAB" $NEXTJOIN $LEFTOVERS | sort -u > $NEXTLEFTOVERS
     53  1.1  dyoung 
     54  1.1  dyoung 	#
     55  1.1  dyoung 	# Swap output files before repeating. 
     56  1.1  dyoung 	#
     57  1.1  dyoung 	LASTJOIN=$NEXTJOIN
     58  1.1  dyoung 	if [ $(basename $NEXTJOIN) = join0 ]; then
     59  1.1  dyoung 		NEXTJOIN=$SCRATCH/join1
     60  1.1  dyoung 	else
     61  1.1  dyoung 		NEXTJOIN=$SCRATCH/join0
     62  1.1  dyoung 	fi
     63  1.1  dyoung 	LEFTOVERS=$NEXTLEFTOVERS
     64  1.1  dyoung 	if [ $(basename $NEXTLEFTOVERS) = leftovers0 ]; then
     65  1.1  dyoung 		NEXTLEFTOVERS=$SCRATCH/leftovers1
     66  1.1  dyoung 	else
     67  1.1  dyoung 		NEXTLEFTOVERS=$SCRATCH/leftovers0
     68  1.1  dyoung 	fi
     69  1.1  dyoung done
     70  1.1  dyoung 
     71  1.1  dyoung #
     72  1.1  dyoung # Output all of the dependencies that were not culled and clean up.
     73  1.1  dyoung #
     74  1.1  dyoung cat $LEFTOVERS
     75  1.1  dyoung rm -r $SCRATCH
     76