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

Reply via email to