#!/bin/sh
#
# Makeself version 2.1.x
#  by Stephane Peter <megastep@megastep.org>
#
# $Id: makeself.sh,v 1.51 2004/09/07 22:16:53 megastep Exp $
#
# Utility to create self-extracting tar.gz archives.
# The resulting archive is a file holding the tar.gz archive with
# a small Shell script stub that uncompresses the archive to a temporary
# directory and then executes a given script from withing that directory.
#
# Makeself home page: http://www.megastep.org/makeself/
#
# Version 2.0 is a rewrite of version 1.0 to make the code easier to read and maintain.
#
# Version history :
# - 1.0 : Initial public release
# - 1.1 : The archive can be passed parameters that will be passed on to
#         the embedded script, thanks to John C. Quillan
# - 1.2 : Package distribution, bzip2 compression, more command line options,
#         support for non-temporary archives. Ideas thanks to Francois Petitjean
# - 1.3 : More patches from Bjarni R. Einarsson and Francois Petitjean:
#         Support for no compression (--nocomp), script is no longer mandatory,
#         automatic launch in an xterm, optional verbose output, and -target
#         archive option to indicate where to extract the files.
# - 1.4 : Improved UNIX compatibility (Francois Petitjean)
#         Automatic integrity checking, support of LSM files (Francois Petitjean)
# - 1.5 : Many bugfixes. Optionally disable xterm spawning.
# - 1.5.1 : More bugfixes, added archive options -list and -check.
# - 1.5.2 : Cosmetic changes to inform the user of what's going on with big
#           archives (Quake III demo)
# - 1.5.3 : Check for validity of the DISPLAY variable before launching an xterm.
#           More verbosity in xterms and check for embedded command's return value.
#           Bugfix for Debian 2.0 systems that have a different "print" command.
# - 1.5.4 : Many bugfixes. Print out a message if the extraction failed.
# - 1.5.5 : More bugfixes. Added support for SETUP_NOCHECK environment variable to
#           bypass checksum verification of archives.
# - 1.6.0 : Compute MD5 checksums with the md5sum command (patch from Ryan Gordon)
# - 2.0   : Brand new rewrite, cleaner architecture, separated header and UNIX ports.
# - 2.0.1 : Added --copy
# - 2.1.0 : Allow multiple tarballs to be stored in one archive, and incremental updates.
#           Added --nochown for archives
#           Stopped doing redundant checksums when not necesary
# - 2.1.1 : Work around insane behavior from certain Linux distros with no 'uncompress' command
#           Cleaned up the code to handle error codes from compress. Simplified the extraction code.
# - 2.1.2 : Some bug fixes. Use head -n to avoid problems.
# - 2.1.3 : Bug fixes with command line when spawning terminals.
#           Added --tar for archives, allowing to give arbitrary arguments to tar on the contents of the archive.
#           Added --noexec to prevent execution of embedded scripts.
#           Added --nomd5 and --nocrc to avoid creating checksums in archives.
#           Added command used to create the archive in --info output.
#           Run the embedded script through eval.
# - 2.1.4 : Fixed --info output.
#           Generate random directory name when extracting files to . to avoid problems. (Jason Trent)
#           Better handling of errors with wrong permissions for the directory containing the files. (Jason Trent)
#           Avoid some race conditions (Ludwig Nussel)
#
# (C) 1998-2004 by Stéphane Peter <megastep@megastep.org>
#
# This software is released under the terms of the GNU GPL version 2 and above
# Please read the license at http://www.gnu.org/copyleft/gpl.html
#

MS_VERSION=2.1.4
MS_COMMAND="$0"

for f in "${1+"$@"}"; do
	MS_COMMAND="$MS_COMMAND \\\\
	\\\"$f\\\""
done

# Procedures

MS_Usage()
{
	echo "Usage: $0 [params] archive_dir file_name label [startup_script] [args]"
	echo "params can be one or more of the following :"
	echo "    --version | -v  : Print out Makeself version number and exit"
	echo "    --help | -h     : Print out this help message"
	echo "    --gzip          : Compress using gzip (default if detected)"
	echo "    --bzip2         : Compress using bzip2 instead of gzip"
	echo "    --compress      : Compress using the UNIX 'compress' command"
	echo "    --nocomp        : Do not compress the data"
	echo "    --notemp        : The archive will create archive_dir in the"
	echo "                      current directory and uncompress in ./archive_dir"
	echo "    --copy          : Upon extraction, the archive will first copy itself to"
	echo "                      a temporary directory"
	echo "    --append        : Append more files to an existing Makeself archive"
	echo "                      The label and startup scripts will then be ignored"
	echo "    --current       : Files will be extracted to the current directory."
	echo "                      Implies --notemp."
	echo "    --nomd5         : Don't calculate an MD5 for archive"
	echo "    --nocrc         : Don't calculate a CRC for archive"
	echo "    --header file   : Specify location of the header script"
	echo "    --follow        : Follow the symlinks in the archive"
	echo "    --nox11         : Disable automatic spawn of a xterm"
	echo "    --nowait        : Do not wait for user input after executing embedded"
	echo "                      program from an xterm"
	echo "    --lsm file      : LSM file describing the package"
	echo
	echo "Do not forget to give a fully qualified startup script name"
	echo "(i.e. with a ./ prefix if inside the archive)."
	exit 1
}

# Default settings
if type gzip 2>&1 > /dev/null; then
	COMPRESS=gzip
else
	COMPRESS=Unix
fi
KEEP=n
CURRENT=n
NOX11=n
APPEND=n
COPY=none
TAR_ARGS=cvf
HEADER=`dirname $0`/makeself-header.sh

# LSM file stuff
LSM_CMD="echo No LSM. >> \"\$archname\""

while true
do
	case "$1" in
	--version | -v)
	echo Makeself version $MS_VERSION
	exit 0
	;;
	--bzip2)
	COMPRESS=bzip2
	shift
	;;
	--gzip)
	COMPRESS=gzip
	shift
	;;
	--compress)
	COMPRESS=Unix
	shift
	;;
	--nocomp)
	COMPRESS=none
	shift
	;;
	--notemp)
	KEEP=y
	shift
	;;
	--copy)
	COPY=copy
	shift
	;;
	--current)
	CURRENT=y
	KEEP=y
	shift
	;;
	--header)
	HEADER="$2"
	shift 2
	;;
	--follow)
	TAR_ARGS=cvfh
	shift
	;;
	--nox11)
	NOX11=y
	shift
	;;
	--nowait)
	shift
	;;
	--nomd5)
	NOMD5=y
	shift
	;;
	--nocrc)
	NOCRC=y
	shift
	;;
	--append)
	APPEND=y
	shift
	;;
	--lsm)
	LSM_CMD="cat \"$2\" >> \"\$archname\""
	shift 2
	;;
	-h | --help)
	MS_Usage
	;;
	-*)
	echo Unrecognized flag : "$1"
	MS_Usage
	;;
	*)
	break
	;;
	esac
done

archdir="$1"
archname="$2"

if test "$APPEND" = y; then
	if test $# -lt 2; then
	MS_Usage
	fi

	# Gather the info from the original archive
	OLDENV=`sh "$archname" --dumpconf`
	if test $? -ne 0; then
	echo "Unable to update archive: $archname" >&2
	exit 1
	else
	eval "$OLDENV"
	fi
else
	if test "$KEEP" = n -a $# = 3; then
	echo "ERROR: Making a temporary archive with no embedded command does not make sense!" >&2
	echo
	MS_Usage
	fi
	# We don't really want to create an absolute directory...
	if test "$CURRENT" = y; then
	archdirname="."
	else
	archdirname=`basename "$1"`
	fi

	if test $# -lt 3; then
	MS_Usage
	fi

	LABEL="$3"
	SCRIPT="$4"
	test x$SCRIPT = x || shift 1
	shift 3
	SCRIPTARGS="$*"
fi

if test "$KEEP" = n -a "$CURRENT" = y; then
	echo "ERROR: It is A VERY DANGEROUS IDEA to try to combine --notemp and --current." >&2
	exit 1
fi

case $COMPRESS in
gzip)
	GZIP_CMD="gzip -c9"
	GUNZIP_CMD="gzip -cd"
	;;
bzip2)
	GZIP_CMD="bzip2 -9"
	GUNZIP_CMD="bzip2 -d"
	;;
Unix)
	GZIP_CMD="compress -cf"
	GUNZIP_CMD="exec 2>&-; uncompress -c || test \\\$? -eq 2 || gzip -cd"
	;;
none)
	GZIP_CMD="cat"
	GUNZIP_CMD="cat"
	;;
esac

tmpfile="${TMPDIR:=/tmp}/mkself$$"

if test -f $HEADER; then
	oldarchname="$archname"
	archname="$tmpfile"
	# Generate a fake header to count its lines
	SKIP=0
	. $HEADER
	SKIP=`cat "$tmpfile" |wc -l`
	# Get rid of any spaces
	SKIP=`expr $SKIP`
	rm -f "$tmpfile"
	echo Header is $SKIP lines long >&2

	archname="$oldarchname"
else
	echo "Unable to open header file: $HEADER" >&2
	exit 1
fi

echo

if test "$APPEND" = n; then
	if test -f "$archname"; then
		echo "WARNING: Overwriting existing file: $archname" >&2
	fi
fi

USIZE=`du -ks $archdir | cut -f1`
DATE=`LC_ALL=C date`

if test "." = "$archdirname"; then
	if test "$KEEP" = n; then
		archdirname="makeself-$$-`date +%Y%m%d%H%M%S`"
	fi
fi

echo About to compress $USIZE KB of data...
echo Adding files to archive named \"$archname\"...
(cd "$archdir" && ( tar $TAR_ARGS - * | eval "$GZIP_CMD" ) >> "$tmpfile") || { echo Aborting: Archive directory not found or temporary file: "$tmpfile" could not be created.; rm -f "$tmpfile"; exit 1; }
echo >> "$tmpfile" >&- # try to close the archive

fsize=`cat "$tmpfile" | wc -c | tr -d " "`

# Compute the checksums

md5sum=00000000000000000000000000000000
crcsum=0000000000

if test "$NOCRC" = y; then
	echo "skipping crc at user request"
else
	crcsum=`cat "$tmpfile" | CMD_ENV=xpg4 cksum | sed -e 's/ /Z/' -e 's/	/Z/' | cut -dZ -f1`
	echo "CRC: $crcsum"
fi

# Try to locate a MD5 binary
OLD_PATH=$PATH
PATH=${GUESS_MD5_PATH:-"$OLD_PATH:/bin:/usr/bin:/sbin:/usr/local/ssl/bin:/usr/local/bin:/opt/openssl/bin"}
MD5_PATH=`type -p md5sum`
MD5_PATH=${MD5_PATH:-`type -p md5`}
PATH=$OLD_PATH

if test "$NOMD5" = y; then
	echo "skipping md5sum at user request"
else
	if test -x "$MD5_PATH"; then
		md5sum=`cat "$tmpfile" | "$MD5_PATH" | cut -b-32`;
		echo "MD5: $md5sum"
	else
		echo "MD5: none, md5sum binary not found"
	fi
fi

if test "$APPEND" = y; then
	mv "$archname" "$archname".bak || exit

	# Prepare entry for new archive
	filesizes="$filesizes $fsize"
	CRCsum="$CRCsum $crcsum"
	MD5sum="$MD5sum $md5sum"
	USIZE=`expr $USIZE + $OLDUSIZE`
	# Generate the header
	. $HEADER
	# Append the original data
	tail -n +$OLDSKIP "$archname".bak >> "$archname"
	# Append the new data
	cat "$tmpfile" >> "$archname"

	chmod +x "$archname"
	rm -f "$archname".bak
	echo Self-extractible archive \"$archname\" successfully updated.
else
	filesizes="$fsize"
	CRCsum="$crcsum"
	MD5sum="$md5sum"

	# Generate the header
	. $HEADER

	# Append the compressed tar data after the stub
	echo
	cat "$tmpfile" >> "$archname"
	chmod +x "$archname"
	echo Self-extractible archive \"$archname\" successfully created.
fi
rm -f "$tmpfile"
