#! /bin/sh
# ^^ THIS SHELL NEEDS BUILT-IN echo TO DO LOOP BELOW EFFICIENTLY.
# $Header: /home/jerry/.lib/at_cron/RCS/mhlinks.build,v 1.4 92/08/09 23:32:44 jerry mh_contrib $
###	mhlinks.build - build database for 'mhlinks' program
###	Usage: mhlinks.build [output file]
##
##	mhlinks.build BUILDS A DATABASE FOR THE mhlinks COMMAND.
##	THE DATABASE LISTS EACH MESSAGE FILE, SORTED BY I-NUMBER.
##	THE DEFAULT FILENAME IS <MH-dir>/mhlinks.list; YOU CAN CHANGE
##	THAT BY GIVING A PATHNAME ON THE COMMAND LINE.
##
##	THE FILE IS ACTUALLY COMPRESSED AND HAS A '.Z' AT THE END...
##	BUT YOU SHOULD *NOT* ADD A .Z TO YOUR NAME.
##
##	mhlinks.build ONLY LOOKS INTO THE FOLDERS IN YOUR MH MAIL DIRECTORY.
##	IT WON'T LOOK INTO ANYTHING BESIDES DIRECTORIES.  THAT'S BECAUSE
##	THE READ-ONLY FOLDERS OR SYMLINKS MIGHT POINT TO ANOTHER FILESYSTEM,
##	WHERE THE I-NUMBERS DON'T MAKE SENSE.
#
#	NOTE TO HACKERS: TABSTOPS SET AT 4 IN THIS CODE
#
#	USE AT YOUR OWN RISK.  SEEMS TO WORK, BUT IT'S YOUR RESPONSIBILITY!
#	PLEASE TELL ME ABOUT BUGS AND FIXES: Jerry Peek, jerry@ora.com

colrm=/usr/ucb/colrm		# DELETES COLUMNS (YOU CAN ADAPT TO USE cut -c)
compress=/usr/ucb/compress	# COMPRESSES FROM stdin TO stdout
find=/bin/find				# MUST HAVE A -ls OPERATOR
lastinum=					# INITIALIZE I-NUMBER OF PREVIOUS FILE
mh=/usr/local/mh			# WHERE MH COMMANDS LIVE
mhdir="`$mh/mhpath +`"		# MH MAIL DIRECTORY
sort=/bin/sort

outfile=${1-$mhdir/mhlinks.list}.Z
> "$outfile"
if [ ! -w "$outfile" ]
then
	echo "`basename $0`: can't write to output file '$outfile'." 1>&2
	exit 1
fi

# GO TO MH DIRECTORY SO FOLDER NAMES WILL BE SAME AS DIRECTORY NAMES.
cd $mhdir || exit 1
# GET LIST OF TOP-LEVEL DIRECTORIES WITH INNER find AND GIVE TO 
# OUTER find LIKE afolder bfolder inbox ETC.  DO THIS TO MAKE
# FILE PATHNAMES NEAT FOR INNER find.  (IS THERE A BETTER WAY?)
$find `$find * -prune -type d -print` -name '[1-9]*' -type f -ls |
# STRIP OUT MIDDLE OF EACH LINE, LEAVE I-NUMBER AND PATHNAME:
$colrm 7 65 |
# SORT ASCII, NOT NUMERIC (DOES IT MATTER?):
$sort |
# BUILD A LINE THAT HAS ONE I-NUMBER AND ALL ITS PATHNAMES:
while read inum path
do
	case "$inum" in
	"$lastinum")
		paths="$paths $path"
		;;
	*)	# MAKE SURE THAT THERE'S A SPACE AFTER LAST PATHNAME
		# SO THAT ALL PATHS WILL HAVE SPACE AROUND THEM (FOR MATCHING):
		echo "$lastinum $paths "
		lastinum="$inum"
		paths="$path"
		;;
	esac
done |
# COMPRESS AS THE DATA FLIES BY... TO SAVE SPACE:
$compress > $outfile

# NEED TO CHECK FOR ERRORS
