Splux Linux

source-based Linux using SPS

SPS · log · files · refs · tags · releases · people · languages · GitHub · file

bin/pkmark


Shell

3239 bytes at 2909919 · GitHub

#!/bin/sh
# Change whether installed packages are explicit roots.

sps_prog=pkmark
sps_bin_dir=$(CDPATH= cd -P "$(dirname "$0")" 2>/dev/null && pwd) || exit 1
if [ -z "${SPS_LIBDIR+x}" ]; then
    if [ -r "$sps_bin_dir/../lib/common.sh" ]; then
        SPS_LIBDIR=$sps_bin_dir/../lib
    else
        SPS_LIBDIR=$sps_bin_dir/../lib/sps
    fi
fi
if ! . "$SPS_LIBDIR/common.sh"; then
    printf '%s\n' "pkmark: cannot load $SPS_LIBDIR/common.sh" >&2
    exit 1
fi
sps_load_config || exit $?

usage()
{
    printf '%s\n' 'usage: pkmark explicit PACKAGE...'
    printf '%s\n' '       pkmark dependency PACKAGE...'
}

case ${1-} in
    explicit|dependency) mode=$1; shift ;;
    -h|--help) usage; exit 0 ;;
    *) usage >&2; exit "$SPS_EX_USAGE" ;;
esac
[ "$#" -gt 0 ] || { usage >&2; exit "$SPS_EX_USAGE"; }

[ -d "$SPS_DB/installed" ] && [ ! -L "$SPS_DB/installed" ] ||
    sps_die "$SPS_EX_DATABASE" "installed database is missing or unsafe"
[ -f "$SPS_DB/world" ] && [ ! -L "$SPS_DB/world" ] ||
    sps_die "$SPS_EX_DATABASE" "world database is missing or unsafe"
awk -v sps_action=world-validate -v sps_program=pkmark \
    -f "$SPS_LIBDIR/db.awk" "$SPS_DB/world" ||
    sps_die "$SPS_EX_DATABASE" "world database is malformed"

requested=
for package
do
    sps_validate_package_name "$package" ||
        sps_die "$SPS_EX_USAGE" "invalid package name '$package'"
    [ -d "$SPS_DB/installed/$package" ] && [ ! -L "$SPS_DB/installed/$package" ] ||
        sps_die "$SPS_EX_NOTFOUND" "package '$package' is not installed"
    case " $requested " in
        *" $package "*) sps_die "$SPS_EX_USAGE" "package '$package' was specified more than once" ;;
    esac
    requested="$requested $package"
done

sps_lock_owned=0
trap 'status=$?; sps_lock_release; [ -n "${tmp-}" ] && rm -f "$tmp"; exit "$status"' 0
trap 'exit 130' 1 2 3 15
sps_lock_acquire "$SPS_DB" ||
    sps_die "$SPS_EX_DATABASE" "package database is locked: '$SPS_DB/.lock'"

tmp=$(mktemp "$SPS_DB/.world-new.XXXXXX") ||
    sps_die "$SPS_EX_DATABASE" "cannot stage world database"
cp "$SPS_DB/world" "$tmp" || sps_die "$SPS_EX_DATABASE" "cannot stage world database"

for package
do
    if [ "$mode" = explicit ]; then
        if ! grep -F -x -e "$package" "$tmp" >/dev/null 2>&1; then
            printf '%s\n' "$package" >>"$tmp" ||
                sps_die "$SPS_EX_DATABASE" "cannot update world database"
        fi
    else
        next=$(mktemp "$SPS_DB/.world-filter.XXXXXX") ||
            sps_die "$SPS_EX_DATABASE" "cannot stage world database"
        awk -v p="$package" '$0 != p { print }' "$tmp" >"$next" || {
            rm -f "$next"
            sps_die "$SPS_EX_DATABASE" "cannot update world database"
        }
        mv -f "$next" "$tmp" || sps_die "$SPS_EX_DATABASE" "cannot update world database"
    fi
done
LC_ALL=C sort -u "$tmp" -o "$tmp" || sps_die "$SPS_EX_DATABASE" "cannot sort world database"
mv -f "$tmp" "$SPS_DB/world" || sps_die "$SPS_EX_DATABASE" "cannot commit world database"
tmp=

sps_date=$(date '+%Y-%m-%d' 2>/dev/null || printf '%s' unknown)
for package
do
    printf '%s mark %s %s\n' "$sps_date" "$package" "$mode" >>"$SPS_DB/history" 2>/dev/null || :
    printf '%s: marked %s as %s\n' "$sps_prog" "$package" "$mode"
done
exit 0