diff --git a/lib/MetaCPAN/Query/Release.pm b/lib/MetaCPAN/Query/Release.pm index 41d43f631..fd851fcef 100644 --- a/lib/MetaCPAN/Query/Release.pm +++ b/lib/MetaCPAN/Query/Release.pm @@ -560,11 +560,28 @@ sub all_by_author { } sub versions { - my ( $self, $dist ) = @_; + my ( $self, $dist, $versions ) = @_; my $size = $dist eq 'perl' ? 1000 : 250; + + my $query; + + if ( @{$versions} ) { + $query = { + bool => { + must => [ + { term => { distribution => $dist } }, + { terms => { version => $versions } }, + ] + } + }; + } + else { + $query = { term => { distribution => $dist } }; + } + my $body = { - query => { term => { distribution => $dist } }, + query => $query, size => $size, sort => [ { date => 'desc' } ], fields => [ diff --git a/lib/MetaCPAN/Server/Controller/Release.pm b/lib/MetaCPAN/Server/Controller/Release.pm index 44c2f3003..e277fbff1 100644 --- a/lib/MetaCPAN/Server/Controller/Release.pm +++ b/lib/MetaCPAN/Server/Controller/Release.pm @@ -86,9 +86,21 @@ sub all_by_author : Path('all_by_author') : Args(1) { sub versions : Path('versions') : Args(1) { my ( $self, $c, $dist ) = @_; + my %params = %{ $c->req->params }{qw( plain versions )}; $c->add_dist_key($dist); $c->cdn_max_age('1y'); - $c->stash_or_detach( $self->model($c)->versions($dist) ); + my $data = $self->model($c) + ->versions( $dist, [ split /,/, $params{versions} || '' ] ); + + if ( $params{plain} ) { + my $data = join "\n", + map { join "\t", @{$_}{qw/ version download_url /} } + @{ $data->{releases} }; + $c->res->body($data); + } + else { + $c->stash_or_detach($data); + } } sub top_uploaders : Path('top_uploaders') : Args() {