#! /bin/bash

# Usage: 
#    $0 
#    $0 dir1/ dirN*/

# Find all archives in the dir*/ directories and set up the svn:ignore
# property to ignore the unpacked files.
#
# Also, always ignore directory "unpacked/".

BASENAME=$(basename $0)

test -z "${TMP_DIR}" && TMP_DIR="/tmp"
TMP_DIR="${TMP_DIR}/tmp-${BASENAME}-$$"
mkdir "${TMP_DIR}"

set -ue

# To make the trap portable between bash and dash, we need to trap
# "signal" 0 ("EXIT") and rely on it for the cleanup:
## trap "rm -rf '${TMP_DIR}'" 0 1 2 3 15
trap "rm -rf '${TMP_DIR}'" EXIT
trap "exit 1" HUP INT QUIT TERM

IGNORE_FILE="${TMP_DIR}/ignore.lst"

for DIR in ${1+"$@"}
do 
    test -d "${DIR}" || continue;
    (
        cd "${DIR}";
        rm -f "${IGNORE_FILE}"
        touch "${IGNORE_FILE}"
        for EXT in tar tgz tbz2 tar.gz tar.bz2 txz tar.xz zip 7z
        do
            ## set -x;
            if [ "$(echo *.${EXT})" != "*.${EXT}" ]
            then
                # Archive file of type ${EXT} exists:
                for ARCHIVE in *.${EXT}
                do
                    case "${ARCHIVE}" in
                        *.zip) 
                            unzip -l "${ARCHIVE}" \
                            | awk '/^----/,/$eof/{if(NF==4)print $NF}' \
                            | grep -v '^----'
                            ;;
                        *.7z)
                            7z l "${ARCHIVE}" \
                                | awk '/^----/,/$eof/{print $NF}' \
                                | head -n -2 \
                                | grep -v '^----'
                            ;;

                        *) tar tf "${ARCHIVE}" ;;
                    esac \
                        | sed 's/^\.\///' \
                        | awk -F/ '{print $1}'
                done
            fi
        done \
            | cat - <(echo unpacked) <(if svn pl . | grep -q svn:ignore; then \
                          svn pg svn:ignore .; \
                      fi) \
            | grep . \
            | sort -u \
            > "${IGNORE_FILE}"
        echo ""
        echo "${DIR}:"
        ## echo "${IGNORE_FILE}:"
        cat -n "${IGNORE_FILE}"
        if [ -s "${IGNORE_FILE}" ]
        then
            svn ps svn:ignore -F "${IGNORE_FILE}" .
        fi
    ) 
done
