#!/bin/sh
#
# Decompress files of a PCP archive.
#
# Usage: logdecompress [-vn] [-d dir] archive
#
# Copyright (c) 2024 Ken McDonell, Inc.  All Rights Reserved.
# 
# This program 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.
# 
# This program 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 this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
#

. $PCP_DIR/etc/pcp.env

prog=`basename $0`
usage="Usage: $prog [-nv] [-d dir] archive"

tmp=/var/tmp/logdecompress.$$
status=1
trap "rm -f $tmp.*; exit \$status" 0 1 2 3 15

_decompress()
{
    if $showme
    then
	echo >&2 "+ $*"
    elif ! $*
    then
	echo >&2 "$* file failed"
	exit
    fi
}

showme=false
verbose=false
dir=''
while getopts 'd:nv\?' c
do
    case "$c"
    in
	d)
	    if [ -z "$OPTARG" ]
	    then
		echo >&2 "$prog: -c requires a dir argument"
		exit
	    fi
	    if [ ! -d "$OPTARG" ]
	    then
		echo >&2 "$prog: $OPTARG is not an existing directory"
		exit
	    fi
	    dir="$OPTARG"
	    ;;
	n)
	    showme=true
	    ;;
	v)
	    verbose=true
	    ;;
	\?)
	    echo >&2 "$usage"
	    status=0
	    exit
	    ;;
    esac
done

if [ $OPTIND != $# ]
then
    echo >&2 "$usage"
    exit
fi
shift `expr $OPTIND - 1`

archbase="`pmlogbasename $1`"
$verbose && echo >&2 "archbase=$archbase"

# for all the files that seem to be part of this archive,
# count the files and the number that are compressed
#
nfile=0
ncompress=0
for file in ${archbase}*
do
    [ ! -f "$file" ] && continue
    if [ "$archbase" = `pmlogbasename "$file"` ]
    then
	nfile=`expr $nfile + 1`
	case $file
	in
	    *.xz|*.lzma|*.bz2|*.bz|*.gz|*.Z|*.z)
		ncompress=`expr $ncompress + 1`
		if [ -z "$dir" ]
		then
		    outfile=`echo "$file" | sed -e 's/\.[^.]*$//'`
		else
		    outfile="$dir"/`basename "$file" | sed -e 's/\.[^.]*$//'`
		fi
		if [ -f "$outfile" ]
		then
		    echo >&2 "$prog: $outfile exists and will not be clobbered"
		    exit
		fi
		;;
	esac
    fi
done

if [ "$nfile" -eq 0 ]
then
    echo >&2 "No PCP archive files match \"$1\""
    exit
fi

if [ "$ncompress" -eq 0 ]
then
    $verbose && echo >&2 "No compresssed PCP archive files match \"$1\""
    echo "$archbase"
    status=0
    exit
fi
$verbose && echo >&2 "$ncompress of $nfile files in the archive are compressed"

for file in ${archbase}*
do
    [ ! -f "$file" ] && continue
    if [ "$archbase" = `pmlogbasename "$file"` ]
    then
	case $file
	in
	    *.xz)
		if [ -z "$dir" ]
		then
		    outfile=`basename "$file" .xz`
		    _decompress xz --decompress "$file"
		else
		    outfile="$dir"/`basename "$file" .xz`
		    _decompress xz --decompress --stdout "$file" >"$outfile"
		fi
		$verbose && echo >&2 "$outfile: decompressed"
		;;

	    *.lzma)
		if [ -z "$dir" ]
		then
		    outfile=`basename "$file" .lzma`
		    _decompress xz --decompress --format=lzma "$file"
		else
		    outfile="$dir"/`basename "$file" .lzma`
		    _decompress xz --decompress --format=lzma --stdout "$file" >"$outfile"
		fi
		$verbose && echo >&2 "$outfile: decompressed"
		;;

	    *.bz2)
		if [ -z "$dir" ]
		then
		    outfile=`basename "$file" .bz2`
		    _decompress bzip2 -d "$file"
		else
		    outfile="$dir"/`basename "$file" .bz2`
		    _decompress bzip2 -dc "$file" >"$outfile"
		fi
		$verbose && echo >&2 "$outfile: decompressed"
		;;

	    *.bz)
		if [ -z "$dir" ]
		then
		    outfile=`basename "$file" .bz`
		    _decompress bzip2 -d "$file"
		else
		    outfile="$dir"/`basename "$file" .bz`
		    _decompress bzip2 -dc "$file" >"$outfile"
		fi
		$verbose && echo >&2 "$outfile: decompressed"
		;;

	    *.gz)
		if [ -z "$dir" ]
		then
		    outfile=`basename "$file" .gz`
		    _decompress gzip -d "$file"
		else
		    outfile="$dir"/`basename "$file" .gz`
		    _decompress gzip -dc "$file" >"$outfile"
		fi
		$verbose && echo >&2 "$outfile: decompressed"
		;;

	    *.z)
		if [ -z "$dir" ]
		then
		    outfile=`basename "$file" .z`
		    _decompress gzip -d "$file"
		else
		    outfile="$dir"/`basename "$file" .z`
		    _decompress gzip -dc "$file" >"$outfile"
		fi
		$verbose && echo >&2 "$outfile: decompressed"
		;;

	    *.Z)
		echo >&2 TODO: $file
		;;

	    *)	# not compressed ... do nothing unless -d, and then
	    	# try ln(1), failing that cp(1)
		#
		if [ -n "$dir" ]
		then
		    outfile="$dir/`basename $file`"
		    if $showme
		    then
			echo >&2 "+ ln $file $outfile"
			echo >&2 "+ if that fails ... cp $file $outfile"
		    else
			if ! ln "$file" "$outfile" >$tmp.err 2>&1
			then
			    $verbose && cat >&2 $tmp.err
			    if ! cp "$file" "$outfile" >>$tmp.err 2>&1
			    then
				cat >&2 $tmp.err
				echo >&2 "Failed to link or copy $file"
				exit
			    else
				$verbose && echo >&2 "$outfile: copied"
			    fi
			else
			    $verbose && echo >&2 "$outfile: linked"
			fi
		    fi
		fi
		;;
	esac
    fi
done

if [ -z "$dir" ]
then
    echo "$archbase"
else
    echo "$dir/$archbase"
fi

status=0
exit
