sortix-mirror/tix/tix-repository
Jonas 'Sortie' Termansen bec38edc55 Add networked package management.
This change implements a full suite of networked tix package management,
with support for installation, upgrading, uninstallation; with signed
release metadata and support for incompatible changes across releases.

Add tix(8) package management program with common subcommands.

Add tix-upgrade(8) that upgrades installations via the network.

Add tix-autoupgrade(8) daemon for unattended upgrades and offer to enable
it during sysinstall(8).

Add tix-clean(8) for cleaning temporary and cached tix files.

Add tix-collection(8) features and metadata for signing and upgrading.

Add tix-fetch(8) that downloads files from releases and channels and
verifies the signatures.

Add tix-metabuild(8) support for release metadata and signing.

Add tix-release(8) that creates releases and channels, and signs their
information or publication.

Add tix-uninstall(8) for uninstalling packages.

Add installtest --network-upgrade test for whether network upgrades work.

Move metadata from upgrade.conf(5) to collection.conf(5).

Document all the tix package management programs.

Promote the libssl, signify, wget, and xz packages to the minimal set, so
minimal installations are able to install more packages.
2025-02-19 13:34:16 +01:00

119 lines
3.2 KiB
Bash
Executable file

#!/bin/sh
# Copyright (c) 2023, 2024 Jonas 'Sortie' Termansen.
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
# tix-repository
# Generate repository metadata.
set -e
generation=3
unset command
unset directory
operand=1
dashdash=
previous_option=
for argument do
if [ -n "$previous_option" ]; then
eval $previous_option=\$argument
previous_option=
continue
fi
case $argument in
*=?*) parameter=$(expr "X$argument" : '[^=]*=\(.*\)' || true) ;;
*=) parameter= ;;
*) parameter=yes ;;
esac
case $dashdash$argument in
--) dashdash=yes ;;
--generation=*) generation=$parameter ;;
--generation) previous_option=generation ;;
-*) echo "$0: unrecognized option $argument" >&2
exit 1 ;;
*)
if [ $operand = 1 ]; then
command="$argument"
operand=2
elif [ $operand = 2 ]; then
directory="$argument"
operand=3
else
echo "$0: unexpected extra operand $argument" >&2
exit 1
fi
;;
esac
done
if [ -n "$previous_option" ]; then
echo "$0: option '$argument' requires an argument" >&2
exit 1
fi
if [ -z "$command" ]; then
echo "$0: error: No command was specified" >&2
exit 1
fi
if [ -z "$directory" ]; then
echo "$0: error: No directory was specified" >&2
exit 1
fi
if [ "$generation" != 3 ]; then
echo "$0: error: --generation=$generation is not supported by this version" >&2
exit 1
fi
case "$command" in
metadata)
cd "$directory"
ls |
grep -E '\.tix.tar.xz$' |
grep -Eo '^[^.]*' |
LC_ALL=C sort -o packages.list
true > dependencies.list
true > renames.list
true > manifest.list
true > sets.list
for package in $(cat packages.list); do
tar -xOf "$package.tix.tar.xz" "tix/tixinfo/$package" > "$package.info"
tar -xOf "$package.tix.tar.xz" "tix/manifest/$package" > "$package.manifest"
sha256sum "$package.tix.tar.xz" > "$package.tix.tar.xz.sha256sum"
tix-vars -d '' "$package.info" RENAMES | tr , '\n' | sed -E '/^$/d' >> renames.list
(printf "%s: " "$package" && tix-vars -d '' "$package.info" RUNTIME_DEPS | sed -E 's/ +$//') >> dependencies.list
sed -E "s/$/:$package/" "$package.manifest" >> manifest.list
if [ "$(tix-vars -d false "$package.info" IS_SET)" = true ]; then
echo "$package" >> sets.list
fi
done
LC_ALL=C sort -t: -k1,1 manifest.list -o manifest.list
find -type f '!' -name 'sha256sum' '!' -name '*.sha256sum' -exec sha256sum '{}' '+' |
sed -E 's, \./, ,' |
LC_ALL=C sort -k 2 > sha256sum
;;
*)
echo "$0: error: unknown command: $command" >&2
exit 1
esac