Aaron Bieber writes: > Andrew Hewus Fresh writes: > >> 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? > > As mentioned in irc - this is leftover and we don't actually hit the > condition anyway. >> >> >>> + 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? >>
Here is a version that moves all the version checks into get_ver_info. Really it just removes the duplicate I had >.>
diff 9ae2711eb3404621b05283a43f79a65b656ddf47 /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,8 @@ 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; - } + my $json = $self->get_ver_info($module); if ($module =~ m/v\d$/) { $json->{Name} = ( split '/', $module )[-2]; @@ -90,6 +86,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 +130,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,28 +210,36 @@ sub _go_mod_normalize sub get_ver_info { my ( $self, $module ) = @_; - my $version_list = $self->get( $module . '/@v/list' ); + + # We already ran, skip re-running. + return $self->{version_info} if defined $self->{version_info}; + + my $json; + my $version_list = eval { $self->get( $module . '/@v/list' ) }; my $version = "v0.0.0"; - my $ret; + $version_list //= ""; + # If list isn't populated, it's likely that upstream doesn't follow # semver, this means we will have to fallback to @latest to get the # version information. if ($version_list eq "") { - $ret = $self->get_json( $self->_go_mod_normalize($module) . '/@latest' ); + $json = $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)) { + if ($a->compare($b) == -1) { $version = $v; } } - $ret = { Module => $module, Version => $version }; + $json = { Module => $module, Version => $version }; } - return $ret; + $self->{version_info} = $json; + + return $json; } sub name_new_port