#!/bin/bash

# Finds ports that are using the unified python portgroup incorrectly.

# Ports using the unified python portgroup.
NAMES=$(port info --subports --index --line name:^py- | sed -E -n -e 's/^py[[:digit:]]{2}-//' -e 's/,.*$//p')

# Count them.
TOTALPYPORTS=$(echo $NAMES | wc -w)

PROBLEMPORTS=""
DEPENDENCYPROBLEMS=0
DEFAULTVERSIONPROBLEMS=0
DOCDIRPROBLEMS=0
LIVECHECKPROBLEMS=0
for NAME in $NAMES; do
    STUBPORT=py-$NAME
    STUBFILE="$(port file $STUBPORT)"
    
    DEPS=$(port info --depends_lib --depends_build --depends_run --index --line $STUBPORT | sed 's/[^[:space:]]*://g')
    
    # If the port declares dependencies correctly, get the default python version.
    # If the port declares dependencies incorrectly, this will be empty.
    DEFAULTVERSION=$(echo $DEPS | sed -E -n "s/^py([[:digit:]]{2})-$NAME$/\1/p")
    
    if [ -z "$DEFAULTVERSION" ]; then
        printf "%s declares dependencies even in the stub port\n" $STUBPORT
        DEPENDENCYPROBLEMS=$(($DEPENDENCYPROBLEMS + 1))
        PROBLEMPORTS="$PROBLEMPORTS $STUBPORT"
    else
        # Get the file of the default subport. If the default is set incorrectly, this will be empty.
        FILE="$(port file py$DEFAULTVERSION-$NAME 2>/dev/null)"
        if [ -z "$FILE" ]; then
            printf "%s declares default python version %s but does not offer python version %s\n" $STUBPORT $DEFAULTVERSION $DEFAULTVERSION
            DEFAULTVERSIONPROBLEMS=$(($DEFAULTVERSIONPROBLEMS + 1))
            PROBLEMPORTS="$PROBLEMPORTS $STUBPORT"
        fi
    fi
    if [ -n "$(grep -E '\$\{?prefix\}?/share/doc/\$\{?name\}?' "$STUBFILE")" ]; then
        printf "%s installs documentation that will conflict between subports\n" $STUBPORT
        DOCDIRPROBLEMS=$(($DOCDIRPROBLEMS + 1))
        PROBLEMPORTS="$PROBLEMPORTS $STUBPORT"
    fi
    if [ -z "$(grep -E 'livecheck\.type[[:space:]]+none' "$STUBFILE")" ]; then
        printf "%s enables livecheck even in the subports\n" $STUBPORT
        LIVECHECKPROBLEMS=$(($LIVECHECKPROBLEMS + 1))
        PROBLEMPORTS="$PROBLEMPORTS $STUBPORT"
    fi
done

TOTALPROBLEMS=$(($DEPENDENCYPROBLEMS + $DEFAULTVERSIONPROBLEMS + $DOCDIRPROBLEMS + $LIVECHECKPROBLEMS))

echo
printf "Out of %d ports using the unified python portgroup, there are %d problems.\n" $TOTALPYPORTS $TOTALPROBLEMS

if [ $DEPENDENCYPROBLEMS -gt 0 ]; then
    echo
    printf "%d ports have dependency problems. Dependencies should only be declared in subports.\n" $DEPENDENCYPROBLEMS
    echo "Enclose dependencies and all other \"real\" port actions in an \"if {\${name} != \${subport}}\" block."
fi

if [ $DEFAULTVERSIONPROBLEMS -gt 0 ]; then
    echo
    printf "%d ports have default python version problems. python.default_version needs to be\n" $DEFAULTVERSIONPROBLEMS
    echo "set to one of the values you set in python.versions."
fi

if [ $DOCDIRPROBLEMS -gt 0 ]; then
    echo
    printf "%d ports have documentation directory problems. In ports with subports, documentation\n" $DOCDIRPROBLEMS
    echo "should be installed into \${prefix}/share/doc/\${subport} rather than \${prefix}/share/doc/\${name}."
fi

if [ $LIVECHECKPROBLEMS -gt 0 ]; then
    echo
    printf "%d ports have livecheck problems. Livecheck should only be enabled in the stub port.\n" $LIVECHECKPROBLEMS
    echo "Livecheck directives should be enclosed in an \"if {\${name} == \${subport}}\" block;"
    echo "in the \"else\" part, set livecheck.type to none."
fi

if [ $TOTALPROBLEMS -gt 0 ]; then
    echo
    echo "The maintainers of these ports are:"
    echo
    port info --maintainers --index --line $PROBLEMPORTS | tr ',' '\n' | sort -u
fi