#!/usr/bin/bash
#
# Updates devel_packages in https://src.opensuse.org/openSUSE/Factory/src/branch/main/pkgs/_meta/devel_packages
#
#  syntax:
#      get <pkg>
#      set <prj> <pkg>
#      rm  <prj> <pkg>
#      sync
#
#  DEVEL_PACKAGES env should point to the devel_packages clone from
#  repo above, otherwise will look in CWD
#

set +e

function getdevel {
    local pkg="$1"
    awk "{ if ( \$1 == \"$pkg\" ) print \$2 }" "$DEVEL_PACKAGES"
}

function setdevel {
    local prj="$1"
    local pkg="$2"
    if [ x"$prj" == "x" ] || [ x"$pkg" == "x" ]; then
        echo "devel_update set <prj> <pkg>"
        exit 10
    fi

    cat <(awk "{ if ( \$1 != \"$pkg\" ) print }" "$DEVEL_PACKAGES") <(echo $pkg $prj) | sort -d > "$DEVEL_PACKAGES".$$
    mv "$DEVEL_PACKAGES".$$ "$DEVEL_PACKAGES"
}

function rmdevel {
    local prj="$1"
    local pkg="$2"
    if [ x"$prj" == "x" ] || [ x"$pkg" == "x" ]; then
        echo "devel_update rm <prj> <pkg>"
        exit 10
    fi

    awk "{ if ( ! ( \$1 == \"$pkg\" && \$2 == \"$prj\" ) ) print }" "$DEVEL_PACKAGES" > "$DEVEL_PACKAGES".$$
    mv "$DEVEL_PACKAGES".$$ "$DEVEL_PACKAGES"
}

if [ -z "$DEVEL_PACKAGES" ]; then
    DEVEL_PACKAGES=./devel_packages
fi

if ! [ -w "$DEVEL_PACKAGES" ] || ! [ -e "$DEVEL_PACKAGES" ] ; then
    echo "The DEVEL_PACKAGES ($DEVEL_PACKAGES) file is not writable or doesn't exist"
    exit 0
fi

case "$1" in
    get)
        shift
        getdevel "$@"
        ;;
    set)
        shift
        prj=$(getdevel "$2")
        if [ x"$prj" != "x" ]; then
            rmdevel "$prj" "$2"
        fi
        setdevel "$@"
        ;;
    rm)
        shift
        rmdevel "$@"
        ;;
    sync)
        warning=0
        badpkgs=""
        tmp="$DEVEL_PACKAGES.new.$$"
        pkgs=$(osc ls openSUSE:Factory)

        # add new packages
        for pkg in $pkgs; do
            if [ "${pkg/*:*/IGNORE}" == "IGNORE" ]; then
                continue
            fi

            grep -q "^$pkg\( \|\$\)" "$DEVEL_PACKAGES"
            if [ $? -ne 0 ]; then
                echo -n "$pkg -> "
                devel=$(osc develproject openSUSE:Factory $pkg 2> /dev/null)
                devel=${devel/\/*/}
                if [ -z "$devel" ]; then
                    devel=$(osc rq list -s accepted -P openSUSE:Factory -p $pkg -t submit | grep "^\s*submit:.* -> openSUSE:Factory\$" | sed -e "s,^\s*submit:\s*\([^/]\+\)/${pkg}@.*,\1," | uniq)
                    c=$(echo "$devel" | grep -c .)
                    if [ $c -ne 1 ]; then
                        badpkgs="$badpkgs $pkg"
                        warning=1
                        devel="***** UNKNOWN"
                    fi
                fi

                echo "$pkg $devel" >> $tmp
                echo "$devel"
            fi
        done

        # remove deleted packages
        for pkg in $(awk '{ print $1 }' < "$DEVEL_PACKAGES"); do
            if [[ " $pkgs " != *[[:space:]]"$pkg"[[:space:]]* ]]; then
                echo "removing $pkg"
                d=$(getdevel "$pkg")
                if [ -n "$d" ]; then
                    rmdevel "$d" "$pkg"
                fi
            fi
        done

        if [ -e "$tmp" ]; then
            cat "$DEVEL_PACKAGES" "$tmp" | sort > "$DEVEL_PACKAGES.$$"
            rm "$tmp"
            mv "$DEVEL_PACKAGES.$$" "$DEVEL_PACKAGES"
        fi

        # set devel change in last 10 days
        osc rq list -t change_devel -D 10 -P openSUSE:Factory -s accepted |
            grep 'change_devel:\s\+openSUSE:Factory/' |
            sed -e 's,^\s*change_devel:\s*openSUSE:Factory/\([a-zA-Z0-9_+-]\+\)\s*developed in \([a-zA-Z0-9_+:-]\+\)/\1\s*$,\2 \1,' |
            while read line; do
                setdevel ${line/ */} ${line/* /};
            done

        if [ $warning -ne 0 ]; then
            echo " **** WARNING ****" > /dev/stderr
            echo "Could not fix some packages. Manual intervention required:$badpkgs" > /dev/stderr
        fi

        ;;
    *)
        echo " devel_update (get,set,rm,sync) ...."

esac
