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.

Reply via email to