Actually, this should avoid a lot of stupid mistakes... I'm assuming actual flavors ALWAYS match something in the flavor list.
This probably wants a full bulk to validate. Index: bin/port-check-pkgname =================================================================== RCS file: bin/port-check-pkgname diff -N bin/port-check-pkgname --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ bin/port-check-pkgname 3 Nov 2021 15:41:06 -0000 @@ -0,0 +1,65 @@ +#! /usr/bin/perl + +# ex:ts=8 sw=4: +# +# Copyright (c) 2021 Marc Espie <es...@openbsd.org> +# +# 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. + +use strict; +use warnings; + +package OpenBSD::PackageName::Check; +use OpenBSD::PackageName; + +sub parse_and_run +{ + my $self = shift; + my ($fullpkgname, $revision, $epoch, $flavor_list); + for (@ARGV) { + if (m/^FULLPKGNAME\=(.*)/) { + $fullpkgname = $1; + } elsif (m/^REVISION\=(.+)/) { + $revision = $1; + } elsif (m/^EPOCH\=(.+)/) { + $epoch = $1; + } elsif (m/^FLAVOR_LIST=(.*)/) { + $flavor_list = $1; + } + } + $revision //= -1; + $epoch //= -1; + my $okay_flavors = {map {($_, 1)} split(/\s+/, $flavor_list) }; + my $rc = 0; + my $v = OpenBSD::PackageName->from_string($fullpkgname); + if ($v->{version}->p != $revision) { + print STDERR "Fatal: REVISION does not match\n"; + print STDERR "\tFULLPKGNAME=$fullpkgname REVISION=$revision\n"; + $rc = 1; + } + if ($v->{version}->v != $epoch) { + print STDERR "Fatal: EPOCH does not match\n"; + print STDERR "\tFULLPKGNAME=$fullpkgname EPOCH=$revision\n"; + $rc = 1; + } + for my $f (keys %{$v->{flavors}}) { + if (!exists $okay_flavors->{$f}) { + print STDERR "Fatal: FLAVOR $f does not exist\n"; + print STDERR "\tFULLPKGNAME=$fullpkgname admissible flavors=$flavor_list\n"; + $rc = 1; + } + } + return $rc; +} + +exit(__PACKAGE__->parse_and_run); Index: mk/bsd.port.mk =================================================================== RCS file: /cvs/ports/infrastructure/mk/bsd.port.mk,v retrieving revision 1.1556 diff -u -p -r1.1556 bsd.port.mk --- mk/bsd.port.mk 13 Sep 2021 15:40:02 -0000 1.1556 +++ mk/bsd.port.mk 3 Nov 2021 15:41:06 -0000 @@ -2132,6 +2132,7 @@ ${_CACHE_REPO}${_p}: # The real package ${_pkg_cookie${_S}}: + @${_PERLSCRIPT}/port-check-pkgname FULLPKGNAME="${FULLPKGNAME${_S}}" REVISION="${REVISION${_S}}" EPOCH="${EPOCH${_S}}" FLAVOR_LIST="${FLAVORS}" @${_PBUILD} install -d ${PACKAGE_REPOSITORY_MODE} ${_PKG_REPO${_S}} ${_TMP_REPO} . if ${FETCH_PACKAGES:L} != "no" && !defined(_TRIED_FETCHING_${_PACKAGE_COOKIE${_S}}) @${_INSTALL_CACHE_REPO}