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}

Reply via email to