On Tue, Jan 26, 2021 at 05:23:30PM -0700, Aaron Bieber wrote: > Hi, > > Recently a program was found that caused breakage in 'portgen go'. The > breakage was two fold: > > 1) https://proxy.golang.org/qvl.io/promplot/@latest returns unexpected > results. This caused portgen to bomb out. > 2) Even it 1) had worked, the logic in 'get_ver_info' was broken and it > picked the wrong version. > > This diff changes things so we first try to get our version from > '/@latest'. If that fails, we call `get_ver_info` which pulls down the > full list of versions from the '/@v/list' endpoint. > > Thanks to afresh1 for showing me the neat '//=' perl trick! > > Tested with: > portgen go qvl.io/promplot > > as well as a number of other ports. > > OK? Cluesticks? >
This seems OK to me, a couple of comments though, but it's up to you whether you change anything. > diff 6a862af059a42a1899fe9a62461b2acfc0f8eedc /usr/ports > blob - 89f2c7297409ef9d54fd1bdde73cf1829c742ff3 > file + infrastructure/lib/OpenBSD/PortGen/Port/Go.pm > --- infrastructure/lib/OpenBSD/PortGen/Port/Go.pm > +++ infrastructure/lib/OpenBSD/PortGen/Port/Go.pm > @@ -67,12 +67,9 @@ sub _go_determine_name > # Some modules end in "v1" or "v2", if we find one of these, we need > # to set PKGNAME to something up a level > my ( $self, $module ) = @_; > - my $json = $self->get_json( $self->_go_mod_normalize($module) . > '/@latest' ); > > - if ($json->{Version} =~ m/incompatible/) { > - my $msg = "${module} $json->{Version} is incompatible with Go > modules."; > - croak $msg; > - } Do you still need to check for "incompatible" someplace? > + my $json = eval { $self->get_json( $self->_go_mod_normalize($module) . > '/@latest' ) }; Should this eval'd check for `@latest` be in `get_ver_info`? If not, why not? Perhaps `get_ver_info` should be: sub get_ver_info { my ($self, $module) = @_; return $self->{ver_info} if $self->{ver_info}; my $ver_info = do { local $@; eval { local $SIG{__DIE__}; $self->_get_latest_ver_info($module) } }; unless ($version) { my $version = $self->_get_versions($module)->[0]; croak("Unable to find a version for $module") unless $version; $ver_info = { Module => $module, Version => $version }; } return $self->{ver_info} = $ver_info; } > + $json //= $self->get_ver_info($module); > > if ($module =~ m/v\d$/) { > $json->{Name} = ( split '/', $module )[-2]; > @@ -81,6 +78,7 @@ sub _go_determine_name > } > > $json->{Module} = $module; > + $self->{version_info} = $json; > > return $json; > } > @@ -90,6 +88,7 @@ sub get_dist_info > my ( $self, $module ) = @_; > > my $json = $self->_go_determine_name($module); > + > my ($dist, $mods) = $self->_go_mod_info($json); > $json->{License} = $self->_go_lic_info($module); > > @@ -133,7 +132,7 @@ sub _go_mod_info > > my $mod = $self->get($self->_go_mod_normalize($json->{Module}) . > "/\@v/$json->{Version}.mod"); > my ($module) = $mod =~ /\bmodule\s+(.*?)\s/; > - > + > unless ( $json->{Module} eq $module ) { > my $msg = "Module $json->{Module} doesn't match $module"; > croak $msg; > @@ -213,6 +212,10 @@ sub _go_mod_normalize > sub get_ver_info > { > my ( $self, $module ) = @_; > + > + # We already ran, skip re-running. > + return $self->{version_info} if defined $self->{version_info}; > + > my $version_list = $self->get( $module . '/@v/list' ); > my $version = "v0.0.0"; > my $ret; > @@ -227,13 +230,15 @@ sub get_ver_info > for my $v ( @parts ) { > my $a = > OpenBSD::PackageName::version->from_string($version); > my $b = OpenBSD::PackageName::version->from_string($v); > - if ($a->compare($b)) { > + if ($a->compare($b) == -1) { > $version = $v; > } > } I think this Schwartzian transform is a bit easier for me to understand what is going on, but either way this is a good bugfix. Index: lib/OpenBSD/PortGen/Port/Go.pm =================================================================== RCS file: /cvs/ports/infrastructure/lib/OpenBSD/PortGen/Port/Go.pm,v retrieving revision 1.7 diff -u -p -r1.7 Go.pm --- lib/OpenBSD/PortGen/Port/Go.pm 16 Jan 2021 23:38:13 -0000 1.7 +++ lib/OpenBSD/PortGen/Port/Go.pm 27 Jan 2021 02:42:30 -0000 @@ -223,14 +223,10 @@ sub get_ver_info if ($version_list eq "") { $ret = $self->get_json( $self->_go_mod_normalize($module) . '/@latest' ); } else { - my @parts = split("\n", $version_list); - for my $v ( @parts ) { - my $a = OpenBSD::PackageName::version->from_string($version); - my $b = OpenBSD::PackageName::version->from_string($v); - if ($a->compare($b)) { - $version = $v; - } - } + ($version) = map { $_->[0] } + sort { $b->[1]->compare($a->[1]) } + map { [ $_, OpenBSD::PackageName::version->from_string($_) } + split("\n", $version_list); $ret = { Module => $module, Version => $version }; } > $ret = { Module => $module, Version => $version }; > } > > + $self->{version_info} = $ret; > + > return $ret; > } > -- andrew - http://afresh1.com A printer consists of three main parts: the case, the jammed paper tray and the blinking red light.