#!/bin/bash
# 2009 Etersoft www.etersoft.ru
# Author: Vitaly Lipatov <lav@etersoft.ru>
# Public domain

# FILE
# bzip FILE with pzip2 (if exists) or bzip2
bzipit()
{
	local PBZIPIT
	PBZIPIT=`which pbzip2 2>/dev/null`
	if [ -n "$PBZIPIT" ] ; then
		echog -n " with pzip2..."
		$PBZIPIT -9 -f $1
		return $?
	else
		echog -n " with bzip2..."
		bzip -f --best $1
		return $?
	fi
}

# TODO: use external converter?
# $1 - zip name $2 - tar name
conv_zip_to_tar()
{
	local RZ=$(realpath "$1")
	local RT=$(realpath "$2")
	# FIXME: use normal mktempdir
	mkdir $1.tmpdir || fatal
	cd $1.tmpdir || fatal
	# unzip or remove broken file
	a= unzip -q "$RZ" && tar cf "$RT" ./* || { rm -fv "$RT" ; return 1; }
	cd ..
	rm -rf $1.tmpdir
}

# TODO: use external converter?
# $1 - rar name $2 - tar name
conv_rar_to_tar()
{
	local RZ=$(realpath "$1")
	local RT=$(realpath "$2")
	# FIXME: use normal mktempdir
	mkdir $1.tmpdir || fatal
	cd $1.tmpdir || fatal
	# unzip or remove broken file
	a= unrar x "$RZ" && tar cf "$RT" ./* || { rm -fv "$RT" ; return 1; }
	cd ..
	rm -rf $1.tmpdir
}

get_archive_type()
{
	file "$1" | grep -q "Zip archive data" && echo "zip" && return
	file "$1" | grep -q "RAR archive data" && echo "rar" && return
	return 1
}

# TODO: use bzipit
copy_tarball_to_tar_bz2()
{
	local SNAME=$1
	local TNAME=$2

	#echo SNAME: $SNAME
	test -r "$SNAME" || return 1
	# copying from tar.bz2
	if [ ! ${SNAME/.tar.bz2/} = "$SNAME" ] ; then
		#echo O tar.bz2
		cp -fv "$SNAME" "$TNAME"
		return
	fi

	if [ ! ${SNAME/.tar.gz/} = "$SNAME" ] ; then
		gunzip -c "$SNAME" | bzip -c > "$TNAME"
		return
	fi

	# FIXME: matchs with .tarNNN
	if [ ! ${SNAME/.tar/} = "$SNAME" ] ; then
		bzip -c "$SNAME" > "$TNAME"
		return
	fi

	fatal "Can't repack $SNAME to tar.bz2"
}

copy_tarball_to_tar()
{
	local SNAME=$1
	local TNAME=$2

	test -r "$SNAME" || return 1
	# copying from tar.bz2
	if [ ! ${SNAME/.tar.bz2/} = "$SNAME" ] ; then
		bunzip -c "$SNAME" > "$TNAME"
		return
	fi

	if [ ! ${SNAME/.tar.gz/} = "$SNAME" ] ; then
		gunzip -c "$SNAME" > "$TNAME"
		return
	fi

	if [ ! ${SNAME/.tgz/} = "$SNAME" ] ; then
		gunzip -c "$SNAME" > "$TNAME"
		return
	fi

	# FIXME: matchs with .tarNNN
	if [ ! ${SNAME/.tar/} = "$SNAME" ] ; then
		cp -fv "$SNAME" "$TNAME"
		return
	fi

	# TODO: use conv_$type_to_tar (type may be undetected)
	if [ "$(get_archive_type $SNAME)" = "zip" ] ; then
		conv_zip_to_tar $SNAME $TNAME && return
	fi

	# TODO: use conv_$type_to_tar (type may be undetected)
	if [ "$(get_archive_type $SNAME)" = "rar" ] ; then
		conv_rar_to_tar $SNAME $TNAME && return
	fi

	fatal "Can't repack $SNAME to tar"
}

# DIR FILE
make_md5sum()
{
	cd "$1"
	if [ -n "$2" ] ; then
		rm -f $2.md5
		md5sum -b $2 > $2.md5
	else
		rm -f MD5SUM
		md5sum -b * >MD5SUM
	fi
	cd -
}

