home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
ade-misc-src.tgz
/
ade-misc-src.tar
/
scripts
/
packfiles.sh
< prev
next >
Wrap
Linux/UNIX/POSIX Shell Script
|
1996-10-13
|
7KB
|
263 lines
#! /bin/sh
#
# Create archives in a destination directory from files in an input tree
# using manifest files listed on stdin.
#
# Takes the following arguments:
#
# --to=<dir> The directory in which to create the archives,
# typically something like "ADE-dist:951208".
#
# --from=<dir> The root of the tree containing the files named in
# the manifest files whose names are read from stdin.
# Typically something like "ADE-src" or "ADE-bin".
#
# --tmp=<dir> A temporary directory in which to create temporary
# subdirs used in creating the archives.
#
# --tgz Build gzip compresed tar archives rather than
# lha archives. This is a more portable format
# and is used for things like source archives, which
# are potentially useful on non-Amiga systems.
#
# Builds the output file name from components of the input manifest file
# pathname and the version number read from an associated Product-Info file.
#
# The associated product info file for each archive is found either by
# looking for an appropriate *-pi file in the manifests subdir, or from the
# Product-Info in the same directory as the manifests subdir.
#
# For example, if the manifest file is "fsf/cpio/manifests/bin", then the
# archive filename will be something like "cpio-X.Y-bin.lha" where X.Y is
# read from the Product-Info file in "fsf/cpio".
#
# As another example, if the manifest file is "manifests/GNU-Startup-bin"
# then the archive filename will be "GNU-Startup-bin.lha".
# Process the options and remember them for future use.
artype="lha"
to=
from=
tmp=
prev=
for option
do
# If the previous option needs an argument, assign it.
if test -n "$prev"; then
eval "$prev=\$option"
prev=
continue
fi
case "$option" in
-*=*) optarg=`/bin/echo "$option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
*) optarg= ;;
esac
case "$option" in
--to) prev=to ;;
--to=*) to="$optarg" ;;
--from) prev=from ;;
--from=*) from="$optarg" ;;
--tmp) prev=tmp ;;
--tmp=*) tmp="$optarg" ;;
--tgz) artype="tgz" ;;
-*) { echo "error: $option: invalid option" 1>&2; exit 1; } ;;
esac
done
# Verify that we have all the options we expect to have.
if test -z "$to"; then
echo "error: no --to=<dir> argument given" 1>&2
exit 1
fi
if test -z "$from"; then
echo "error: no --from=<dir> argument given" 1>&2
exit 1
fi
if test -z "$tmp"; then
echo "error: no --tmp=<dir> argument given" 1>&2
exit 1
fi
# Check to see that the output directory exists. If not, create it.
if test ! -d "$to"
then
echo "mkdir -p $to"
mkdir -p $to
fi
# Check to see that the temporary directory exists. If not, create it.
WORKDIR="$tmp/GNUpack"
if test ! -d "$WORKDIR"
then
echo "mkdir -p $WORKDIR"
mkdir -p $WORKDIR
fi
# Read and process each manifest file from stdin.
while read manifest
do
echo "Processing $manifest ..."
# Locate the product info files (if any) that corresponds
# to this manifest file. There may be one that is the same
# name as the manifest file but with "-pi" appended, and there
# may be one in the parent directory of the location where the
# manifest file is found. If there are two, they must agree
# on the version number. If neither exist, there is no version
# number (which is OK).
vers1=""
vers2=""
pifilein=""
mdot=`dirname $manifest`
mdotdot=`dirname $mdot`
product=`basename $mdotdot`
if test -f "$mdotdot/Product-Info"
then
pifilein=$mdotdot/Product-Info
product=`pitool -b -u -F "%N" -f - $pifilein`
vers1=`pitool -b -u -F "%V" -f - $pifilein`
fi
if test -f "$manifest-pi"
then
pifilein=$manifest-pi
product=`pitool -b -u -F "%N" -f - $pifilein`
vers2=`pitool -b -u -F "%V" -f - $pifilein`
fi
if test -n "$vers1" -a -n "$vers2"
then
if test "$vers1" != "$vers2"
then
echo "WARNING - conflicting version numbers $vers1 and $vers2" 2>&1
vers1=""
fi
fi
if test "$vers2" = "?.?"
then
version=""
elif test "$vers1" = "?.?"
then
version=""
elif test -n "$vers2"
then
version=$vers2
elif test -n "$vers1"
then
version=$vers1
else
version=""
fi
# Now create the name of the archive.
#
# If the manifest file is from our special global manifest file
# directory, then the name of the archive is just the name of the
# manifest file.
#
# Otherwise we start with the product name, tack on a version
# number if one exists, and then tack on the name of the manifest
# file as a qualifier.
#
# Finally we tack on the archive type.
if test "$mdot" = "manifests"
then
archive="`basename $manifest`"
else
archive="$product"
if test -n "$version"
then
archive="$archive-$version"
fi
archive="$archive-`basename $manifest`"
fi
archive="$archive.$artype"
# Verify that we have an input Product-Info file
pifileout="$to/$archive.pi"
if test -z "$pifilein"
then
echo "WARNING: no product info file found to generate $pifileout - skipped"
continue
fi
# Check to see if this archive already exists. If so, skip
# creating one. This allows us to restart a failed build of
# an complete archive directory. The tradeoff is that when
# we want to replace an archive, we have to first delete it
# manually.
if test -f $to/$archive
then
#echo "$to/$archive exists, not superceded"
if test -f $pifileout
then
true
#echo "$pifileout exists, not superceded"
else
# Install a copy of the product info file alongside the archive.
echo " cp $pifilein $pifileout"
cp $pifilein $pifileout
fi
continue
fi
# Remove any old trash and create a fresh working directory.
if test -d $WORKDIR
then
sleep 2
echo " rm -rf $WORKDIR/*"
rm -rf $WORKDIR/*
fi
absmanifest=`pwd`/$manifest
# Make a tar archive in $WORKDIR of all the files in the manifest.
# The files listed in the manifests files are relative to the
# directory specified in the --from arg.
if test "$artype" = "tgz"
then
echo " (cd $from && tar -cp -T $absmanifest -f - | gzip -9 >$WORKDIR/tar.out.gz)"
(cd $from && tar -cp -T $absmanifest -f - | gzip -9 >$WORKDIR/tar.out.gz)
# If what we want is a compressed tar archive, just copy to the destination.
echo " (cd $WORKDIR && cp tar.out.gz $to/$archive)"
(cd $WORKDIR && cp tar.out.gz $to/$archive)
else
# If what we want is an lha archive, then we have to go through
# more contortions, including working around a couple bugs in lha
# where lha fails to preserve the case of directory names and also
# fails to archive files if more than a single arg is given to it.
echo " (cd $from && tar -cp -T $absmanifest -f $WORKDIR/tar.out)"
(cd $from && tar -cp -T $absmanifest -f $WORKDIR/tar.out)
echo " (cd $WORKDIR/ && tar -xpf tar.out && rm tar.out)"
(cd $WORKDIR/ && tar -xpf tar.out && rm tar.out)
echo " (cd $WORKDIR && lha -mraxeq a $archive * && cp $archive $to/$archive)"
here=`pwd`
cd $WORKDIR
for file in *
do
lha -mraxeq a $archive $file
done
cp $archive $to/$archive
cd $here
fi
# Install a copy of the product info file alongside the archive.
echo " cp $pifilein $pifileout"
cp $pifilein $pifileout
done