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?

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;
-	}
+	my $json = eval { $self->get_json( $self->_go_mod_normalize($module) . '/@latest' ) };
+	$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;
 			}
 		}
 		$ret = { Module => $module, Version => $version };
 	}
 
+	$self->{version_info} = $ret;
+
 	return $ret;
 }
 

Reply via email to