From 8a34189750f0aec91d9eea1a184a4fbb480823e1 Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Mon, 25 Dec 2023 16:09:51 +0100 Subject: [PATCH] Add tix-repository(8). Support renaming, splitting, and deleting ports via RENAMES. --- Makefile | 1 + share/man/man5/port.5 | 25 +++++++ share/man/man7/following-development.7 | 19 +++++ tix/Makefile | 1 + tix/tix-build.c | 6 ++ tix/tix-repository | 96 ++++++++++++++++++++++++++ 6 files changed, 148 insertions(+) create mode 100755 tix/tix-repository diff --git a/Makefile b/Makefile index 9a55b3c8..76f7ed4d 100644 --- a/Makefile +++ b/Makefile @@ -616,6 +616,7 @@ release-repository: sysroot $(SYSTEM_INITRD) $(SORTIX_RELEASE_DIR)/$(RELEASE)/re cp $(SORTIX_REPOSITORY_DIR)/$(HOST)/$$port.tix.tar.xz $(SORTIX_RELEASE_DIR)/$(RELEASE)/repository/$(HOST) && \ cp $(SORTIX_REPOSITORY_DIR)/$(HOST)/$$port.version $(SORTIX_RELEASE_DIR)/$(RELEASE)/repository/$(HOST); \ done + tix-repository --generation=3 $(SORTIX_RELEASE_DIR)/$(RELEASE)/repository/$(HOST) .PHONY: release-scripts release-scripts: \ diff --git a/share/man/man5/port.5 b/share/man/man5/port.5 index 6b7d0d1e..5daf3aa2 100644 --- a/share/man/man5/port.5 +++ b/share/man/man5/port.5 @@ -178,6 +178,18 @@ number matched in the first subexpression. .Sy ARCHIVE and .Sy VERSION_REGEX ) +.It Sy EDITION +An increasing number used to distinguish this edition of the package from any previous packages by +the same name. +A new pacckage with the same name and a different edition will considered a different package. +Upgrades will uninstall the old package and will not upgrade to the new edition as if the package +has stopped existing. +The +.Sy RENAMES +variable can be used in combination with +.Sy EDITION +to rename and split packages. +The default edition is 1. .It Sy LICENSE Primary license identifier for the installed files from the .Lk https://spdx.org/licenses/ "SPDX License List" . @@ -253,6 +265,19 @@ Locate new upstream versions of the port by searching .Sy RELEASE_SEARCH_PAGE using this regular expression matching the new version number in the first subexpression. +.It Sy RENAMES +Comma-separated list of package renames. +Each rename is expressed as the name of a package followed by a +.Sq "@" +and its +.Sy EDITION , +followed by a +.Sq ":" +and then a potentially-empty space separated list of replacement packages, each +taking the form of a replacement package name followed by +.Sq "@" +and then the replacement package +.Sy EDITION . .It Sy RUNTIME_DEPS Space delimited list of libraries (ports) needed at run time. Unsupported. diff --git a/share/man/man7/following-development.7 b/share/man/man7/following-development.7 index 065efc89..a0c998eb 100644 --- a/share/man/man7/following-development.7 +++ b/share/man/man7/following-development.7 @@ -69,6 +69,25 @@ releasing Sortix x.y, foo." to allow the maintainer to easily .Xr grep 1 for it after a release. .Sh CHANGES +.Ss Add tix-repository(8) +The new +.Xr tix-repository 8 +program is used to generate repository metadata in releases. +The new +.Sy EDITION +and +.Sy RENAMES +variables in +.Xr port 5 +are used to rename and split packages and requires a new +.Xr tix-build 8 . +.Pp +Tix must be upgraded: +.Bd -literal + cd /src/tix && + make clean && + make install +.Ed .Ss Support system upgrades and configuration in GRUB The GRUB configuration now implements the .Pa /etc diff --git a/tix/Makefile b/tix/Makefile index ff714318..38138d65 100644 --- a/tix/Makefile +++ b/tix/Makefile @@ -31,6 +31,7 @@ tix-iso-add \ tix-iso-bootconfig \ tix-iso-liveconfig \ tix-port \ +tix-repository \ MANPAGES8=\ tix-build.8 \ diff --git a/tix/tix-build.c b/tix/tix-build.c index efd99299..53533519 100644 --- a/tix/tix-build.c +++ b/tix/tix-build.c @@ -811,6 +811,9 @@ static void TixInfo(struct metainfo* minfo) // TODO: Shell escape the values if needed. fwrite_variable(tixinfo_fp, "TIX_VERSION", "3"); fwrite_variable(tixinfo_fp, "NAME", minfo->package_name); + const char* edition = metainfo_get(minfo, "EDITION", "pkg.edition"); + if ( edition ) + fwrite_variable(tixinfo_fp, "EDITION", edition); const char* version = metainfo_get(minfo, "VERSION", "VERSION"); if ( version ) fwrite_variable(tixinfo_fp, "VERSION", version); @@ -829,6 +832,9 @@ static void TixInfo(struct metainfo* minfo) else fwrite_variable(tixinfo_fp, "PREFIX", minfo->prefix); } + const char* renames = metainfo_get(minfo, "RENAMES", "pkg.renames"); + if ( renames ) + fwrite_variable(tixinfo_fp, "RENAMES", renames); } // TODO: After releasing Sortix 1.1, remove generation 2 compatibility. else diff --git a/tix/tix-repository b/tix/tix-repository new file mode 100755 index 00000000..d656cdcf --- /dev/null +++ b/tix/tix-repository @@ -0,0 +1,96 @@ +#!/bin/sh +# Copyright (c) 2023 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 repository + +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 + repository="$argument" + operand=2 + 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 "$repository" ]; then + echo "$0: error: No repository 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 + +cd "$repository" + +ls | +grep -E '\.tix.tar.xz$' | +grep -Eo '^[^.]*' | +LC_ALL=C sort -o packages.list + +true > renames.list +true > manifest.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 + sed -E "s/$/:$package/" "$package.manifest" >> manifest.list +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