#!/bin/sh
set -u
HERE="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
PM="$(cat "$HERE/package-manager.txt" 2>/dev/null || true)"
BEFORE="$HERE/packages-before.names"
CURRENT="$HERE/packages-current.names"
ADDED="$HERE/packages-added-current.names"
LOG="$HERE/rollback.log"

exec >>"$LOG" 2>&1

case "$PM" in
    opkg)
        opkg list-installed 2>/dev/null | awk '{print $1}' | sort -u >"$CURRENT"
        ;;
    apk)
        apk info 2>/dev/null | sort -u >"$CURRENT"
        ;;
    *)
        echo 'RESULT=STOP_ROLLBACK_PACKAGE_MANAGER_UNKNOWN'
        exit 1
        ;;
esac

: >"$ADDED"
while IFS= read -r pkg; do
    [ -n "$pkg" ] || continue
    grep -Fxq "$pkg" "$BEFORE" 2>/dev/null || printf '%s\n' "$pkg" >>"$ADDED"
done <"$CURRENT"

if [ -s "$ADDED" ]; then
    case "$PM" in
        opkg)
            # Remove top-level packages first, then any dependencies that were absent before.
            if [ -s "$HERE/requested-installed-by-step.txt" ]; then
                while IFS= read -r pkg; do
                    [ -n "$pkg" ] || continue
                    opkg remove "$pkg" 2>/dev/null || true
                done <"$HERE/requested-installed-by-step.txt"
            fi
            opkg list-installed 2>/dev/null | awk '{print $1}' | sort -u >"$CURRENT"
            : >"$ADDED"
            while IFS= read -r pkg; do
                [ -n "$pkg" ] || continue
                grep -Fxq "$pkg" "$BEFORE" 2>/dev/null || printf '%s\n' "$pkg" >>"$ADDED"
            done <"$CURRENT"
            if [ -s "$ADDED" ]; then
                while IFS= read -r pkg; do
                    [ -n "$pkg" ] || continue
                    opkg remove "$pkg" 2>/dev/null || true
                done <"$ADDED"
            fi
            ;;
        apk)
            if [ -s "$HERE/requested-installed-by-step.txt" ]; then
                apk del $(cat "$HERE/requested-installed-by-step.txt") 2>/dev/null || true
            fi
            ;;
    esac
fi

AFTER_COMMIT="$(git --git-dir=/root/.vm101-source.git --work-tree=/ rev-parse HEAD 2>/dev/null || true)"
AFTER_TREE="$(git --git-dir=/root/.vm101-source.git --work-tree=/ rev-parse 'HEAD^{tree}' 2>/dev/null || true)"
echo "AFTER_COMMIT=$AFTER_COMMIT"
echo "AFTER_TREE=$AFTER_TREE"
echo 'RESULT=PASS_TOOLSET_ROLLBACK_ATTEMPTED'
