diff options
Diffstat (limited to 'build_tools/clarch/larch/run/xpack')
| -rwxr-xr-x | build_tools/clarch/larch/run/xpack | 122 | 
1 files changed, 122 insertions, 0 deletions
| diff --git a/build_tools/clarch/larch/run/xpack b/build_tools/clarch/larch/run/xpack new file mode 100755 index 0000000..0ebe158 --- /dev/null +++ b/build_tools/clarch/larch/run/xpack @@ -0,0 +1,122 @@ +#! /bin/bash +# +# xpack -  simple tool for handling self-extracting archives +# +# Author: Michael Towers <gradgrind[at]online[dot]de> +# +#    xpack is free software; you can redistribute it and/or modify +#    it under the terms of the GNU General Public License as published by +#    the Free Software Foundation; either version 2 of the License, or +#    (at your option) any later version. +# +#    xpack is distributed in the hope that it will be useful, +#    but WITHOUT ANY WARRANTY; without even the implied warranty of +#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +#    GNU General Public License for more details. +# +#    You should have received a copy of the GNU General Public License +#    along with xpack; if not, write to the Free Software Foundation, Inc., +#    51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA +# +#---------------------------------------------------------------------------- +# +# version 1.1 + +# This script serves both as packer and extracter, according to the name used +# to invoke it. When invoked as 'xpack', it will copy itself to the archive +# file (passed on the command line) and then append a tar.gz archive of the +# source directory (passed on the command line). E.g. +#     ./xpack path/to/archive xarchive +# To extract the archive, simply run the resulting archive file, passing a +# directory into which it should be unpacked on the command line. E.g. +#          ./xarchive newpath/to/directory +# or,      bash xarchive newpath/to/directory + +if [ "$( basename "$0" )" != "xpack" ]; then +    # extract archive +    if [ ! -d "$1" ]; then +        echo "ERROR: Destination directory not found" +        echo "Usage:" +        echo "  ${APP}  <directory>  - Unpack this archive to <directory> (which must exist)" +        exit 1 +    fi + +# The following lines allow the implementation of the '-r' option to xpack. +# The version of this script which is copied to the generated archive file will, +# in that case, have the '#+#' removed. +#+#    # test if the script is started by root user. If not, exit +#+#    if [ $UID -ne 0 ]; then +#+#        echo "Only root can run $0"; exit 1 +#+#    fi + +    echo "Extracting archive to $1" +    let "SKIP = $( grep --binary-files=text -n -m 1 "^#__ARCHIVE__" "$0" | cut -d ':' -f 1 ) + 1" + +    tail -n +$SKIP "$0" | tar -xzC "$1" +    exit 0 +fi + +usage () { +    echo +    echo "Usage:" +    echo "  ${APP}  [-dr] <directory> <archive file>" +    echo "             Create self-extracting archive from <directory>" +    echo +    echo "          -d    Don't include the base directory" +    echo "          -r    Require root permissions for extracting" +    echo +    exit 1 +} + +NOBASE="" +ROOT="" +while getopts ":dr" Option +do +  case ${Option} in +    d ) NOBASE="-d" ;; +    r ) ROOT="-r" ;; +    * ) usage ;; +  esac +done +shift $((${OPTIND} - 1)) + +if [ ! -d "$1" ]; then +    echo "ERROR: Source directory not found" +    usage +fi + +if [ -e "$2" ]; then +    echo "ERROR: Destination file exists" +    usage +fi + +cp $0 $2 +if [ $? -ne 0 ]; then +    echo "ERROR: Cannot write to destination file" +    usage +fi + +if [ -n "${ROOT}" ]; then +    if [ $UID -ne 0 ]; then +        echo "Only root can use the -r opton" +        exit 1 +    fi +    sed -i 's|^#+#||g' $2 +fi + +DIR="$( readlink -f $1 )" +BASE="." +if [ -z "${NOBASE}" ]; then +    DIR="$( dirname ${DIR} )" +    if [ $? -ne 0 ]; then echo "dirname -f ${DIR} ... failed"; usage; fi +    BASE="$( basename $1 )" +fi + +# tar to standard output adds a load of nulls to the output, +# which is a bit untidy and results in warnings, so do it this way: +tar czf $2_ -C ${DIR} ${BASE} +cat $2_ >> $2 +rm $2_ + +# DO NOT delete the next line, which MUST be the last line of 'xpack' +#__ARCHIVE__ | 
