(there are two diffs, the man page for src, and the tool itself)

This is supposed to live in /usr/ports/infrastructure/bin

Index: pkg_check-version
===================================================================
RCS file: pkg_check-version
diff -N pkg_check-version
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ pkg_check-version   27 Feb 2021 10:12:21 -0000
@@ -0,0 +1,139 @@
+#! /usr/bin/perl
+
+# ex:ts=8 sw=4:
+# $OpenBSD$
+#
+# 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::VersionCheck::State;
+our @ISA = qw(OpenBSD::State);
+
+use OpenBSD::State;
+
+sub handle_options
+{
+       my $state = shift;
+
+       $state->SUPER::handle_options('Hv', '[Hv] pkg-name ...');
+       if (@ARGV == 0) {
+               $state->usage;
+       }
+}
+
+package OpenBSD::PackageName::dewey;
+sub human_print
+{
+       my ($self, $state) = @_;
+       $state->say("\tversion (split): #1", join(' ', @{$self->{deweys}}));
+       if ($self->{suffix} eq '') {
+               $state->say("\tno suffix");
+       } else {
+               $state->say("\twith suffix: #1 #2", $self->{suffix},
+                   $self->{suffix_value});
+       }
+}
+
+package OpenBSD::PackageName::version;
+sub human_print
+{
+       my ($self, $state) = @_;
+       $self->{dewey}->human_print($state);
+       if (defined $self->{p}) {
+               $state->say("\tREVISION: #1", $self->{p});
+       } else {
+               $state->say("\tno REVISION");
+       }
+       if (defined $self->{v}) {
+               $state->say("\tEPOCH: #1", $self->{v});
+       } else {
+               $state->say("\tno EPOCH");
+       }
+}
+
+package OpenBSD::PackageName::Name;
+sub human_print
+{
+       my ($self, $state) = @_;
+       $state->say("\tstem: #1", $self->{stem});
+       $self->{version}->human_print($state);
+       $state->say("\tflavors: #1", 
+           join(' ', (sort keys %{$self->{flavors}})));
+}
+
+sub add_to_stems
+{
+       my ($self, $h) = @_;
+       push(@{$h->{$self->to_pattern}}, $self);
+}
+
+package OpenBSD::PackageName::Stem;
+sub human_print
+{
+       my ($self, $state) = @_;
+       $state->say("\tstem = #1", $self->{stem});
+}
+
+sub add_to_stems
+{
+       # nothing to do for "pure stems"
+}
+
+package OpenBSD::VersionCheck;
+
+use OpenBSD::PackageName;
+
+sub parse_and_run
+{
+       my $self = shift;
+       my $rc = 0;
+       my $state = OpenBSD::VersionCheck::State->new('pkg-check_version');
+       $state->handle_options;
+       my $by_stem = {};
+       for my $name (@ARGV) {
+               my $v = OpenBSD::PackageName->from_string($name);
+               if ($state->opt('H')) {
+                       $state->say("#1:", $name);
+                       $v->human_print($state);
+               }
+               my @issues = $v->has_issues;
+               if (@issues > 0) {
+                       for my $s (@issues) {
+                               $state->errsay("#1: #2", $name, $s);
+                               $rc = 1;
+                       }
+               } elsif ($state->opt('v')) {
+                       $state->errsay("#1 has no issues", $name);
+               }
+               $v->add_to_stems($by_stem);
+       }
+       for my $stem (sort keys %$by_stem) {
+               my $list = $by_stem->{$stem};
+               if (@$list == 1 && !$state->opt('v')) {
+                       next;
+               }
+               my $h = $state->opt('v') ?
+                   "#1 sorts as (older to newer): #2" :
+                   "#1 sorted: #2";
+               $state->say($h, $stem,
+                   join(' ', map {$_->to_string} 
+                       sort {$a->compare($b)} @$list));
+       }
+       return $rc;
+}
+
+exit(__PACKAGE__->parse_and_run);





Index: Makefile
===================================================================
RCS file: /cvs/src/share/man/man1/Makefile,v
retrieving revision 1.17
diff -u -p -r1.17 Makefile
--- Makefile    12 Nov 2019 16:39:10 -0000      1.17
+++ Makefile    27 Feb 2021 10:11:59 -0000
@@ -7,8 +7,8 @@ MAN=    clang-local.1 help.1 intro.1 gcc-lo
 MAN+=  build-debug-info.1 check-lib-depends.1 clean-old-distfiles.1 \
        dpb-replay.1 dpb.1 \
        outdated-perl-ports.1 \
-       pkg_check-problems.1 pkg_check-manpages.1 pkg_outdated.1 \
-       pkg_subst.1 \
+       pkg_check-problems.1 pkg_check-manpages.1 pkg_check-version.1 \
+       pkg_outdated.1 pkg_subst.1 \
        port-getpkgpath-helper.1 port-resolve-lib-helper.1 \
        port-search-helper.1 \
        portbump.1 portcheck.1 portgen.1 \
Index: pkg_check-version.1
===================================================================
RCS file: pkg_check-version.1
diff -N pkg_check-version.1
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ pkg_check-version.1 27 Feb 2021 10:11:59 -0000
@@ -0,0 +1,55 @@
+.\"    $OpenBSD$
+.\"
+.\" 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.
+.\"
+.Dd $Mdocdate$
+.Dt PKG_CHECK-VERSION 1
+.Os
+.Sh NAME
+.Nm pkg_check-version
+.Nd verify parsing and ordering of package names.
+.Sh SYNOPSIS
+.Nm
+.Op Fl Hv
+.Ar pkgname ...
+.Sh DESCRIPTION
+.Nm
+takes a list of
+.Ar pkgname
+and processes them.
+.Bl -bullet -compact
+.It 
+each name is parsed and checked for issues.
+.It
+in addition, comparable names (same stem and same flavor) are sorted
+from older to newer version.
+.El
+.Pp
+Options are as follows:
+.Bl -tag -width Hv
+.It Fl H
+displays a human-readable version of each
+.Ar pkgname
+(full version parsing, including known suffixes, dewey numbers parsing,
+REVISION, EPOCH, flavor markers).
+.It Fl v
+verbose mode, which will explicitly state
+.Ar pkgname
+with no issues and sort one element lists.
+.El
+.Sh SEE ALSO
+.Xr packages-specs 7 
+.Sh AUTHORS
+.An Marc Espie Aq Mt es...@openbsd.org

Reply via email to