crit 0.0.16

Rust cross-compiler
Documentation
#!/bin/bash
unset IFS
set -euo pipefail

usage() {
    printf "Usage: %s <OPTIONS> <source>\n" "$0"
    printf "\n"
    printf -- "-C <dir>\tChange directory (default: .)\n"
    printf -- "-a <app>\tCustomize app name (required)\n"
    printf -- "-h\t\tShow usage menu\n"
}

DIR='.'
APP=''

while [ "$#" -ge 1 ]; do
    case "$1" in
    '-C')
        shift

        if [ "$#" -eq 0 ]; then
            usage
        fi

        DIR="$1"
        shift
        ;;
    '-a')
        shift

        if [ "$#" -eq 0 ]; then
            usage
        fi

        APP="$1"
        shift
        ;;
    '-h')
        usage
        exit
        ;;
    *)
        break
        ;;
    esac
done

if [ "$#" != '1' ]; then
    usage
    exit 1
fi

SOURCE="$1"

if [ -z "$APP" ]; then
    usage
    exit 1
fi

SOURCE_ABS="$(readlink -f "$DIR/$SOURCE")"
PORTS="$DIR/$APP-ports"
mkdir -p "$PORTS"
PORTS_ABS="$(readlink -f "$PORTS")"

find "$SOURCE_ABS" -type d -depth 1 -print0 | while IFS= read -r -d '' D; do
    D="${D#"$SOURCE_ABS"/}"
    MODE='--mode=0755'

    if [ "$(find "$SOURCE_ABS/$D" -type f -name '*.*')" != '' ]; then
        MODE='--mode=0644'
    fi

    cd "$SOURCE_ABS/$D"
    tar "$MODE" -czf "$PORTS_ABS/$APP-$D.tgz" -- *
    cd "$SOURCE_ABS"
done

echo "tarballs copied to \"$PORTS\""