#!/usr/bin/env sh

set -e

if test -z "$APK_SYNC_PACKAGES_DIR"; then
	printf >&2 "The APK_SYNC_PACKAGES_DIR environment variable is not set!\n"
	exit 1
fi

WORLD="/etc/apk/world"
OLD_BACKUP="$HOME/.local/share/apk-sync/apk_world_$(date -u -Im)"

cleanup() {
	rm -f "$NEW_STATE_TMP"
}
NEW_WORLD_TMP="$(mktemp -p /tmp alpineworld.XXXXXX)"
trap 'cleanup' EXIT

# Backup WORLD and create a new one based on the files
mkdir -p "$HOME/.local/share/apk-sync"
printf >&2 "Backing up '%s' to '%s'.\n" "$WORLD" "$OLD_BACKUP"
sort -u -o "$OLD_BACKUP" "$WORLD"
printf >&2 "Reading files from '%s' to '%s'.\n" "$APK_SYNC_PACKAGES_DIR" "$NEW_WORLD_TMP"
cat "$APK_SYNC_PACKAGES_DIR/"* | grep -v '^\s*#\|^$' | sort -u -o "$NEW_WORLD_TMP"

# Present changes and wait for confirmation if there are any removals
printf >&2 "\nAdding:\n"
comm -13 "$OLD_BACKUP" "$NEW_WORLD_TMP"
printf >&2 "\nRemoving:\n"
REMOVALS="$(comm -23 "$OLD_BACKUP" "$NEW_WORLD_TMP")"
echo "$REMOVALS"
if test -n "$REMOVALS"; then
	printf >&2 "\nProceed with the update? (press Enter or ^C) "
	read -r NOOP
fi
export NOOP # Just to make shellcheck shut up

# Overwrite WORLD and run apk
printf >&2 "Updating '%s'.\n" "$WORLD"
doas sh -c "cat $NEW_WORLD_TMP > $WORLD"
doas apk upgrade
rm -f "$NEW_WORLD_TMP"

cleanup
