Skip to content

Commit 3217c31

Browse files
committed
don't always sort changelog entries
Some changelogs have unusual orders, or have made mistakes with versioning. But most change logs will have the most recent releases at the beginning or the end of the file. If the first or last release found matches the version we are looking for, just use the order of the file as is. Only sort the entries if it isn't found at the start or end.
1 parent b64e10a commit 3217c31

File tree

1 file changed

+34
-14
lines changed

1 file changed

+34
-14
lines changed

lib/MetaCPAN/Web/Model/API/Changes.pm

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,37 @@ sub release_changes {
2929
my @releases = _releases($content);
3030

3131
my @changelogs;
32-
while ( my $r = shift @releases ) {
33-
if ( _versions_cmp( $r->{version_parsed}, $version ) == 0 ) {
34-
$r->{current} = 1;
35-
push @changelogs, $r;
36-
if ( $opts{include_dev} ) {
37-
for my $dev_r (@releases) {
38-
last
39-
if !$dev_r->{dev};
40-
push @changelogs, $dev_r;
41-
}
32+
33+
if ( _versions_cmp( $releases[-1]->{version_parsed}, $version ) == 0 )
34+
{
35+
@releases = reverse @releases;
36+
}
37+
elsif (
38+
_versions_cmp( $releases[0]->{version_parsed}, $version ) == 0 )
39+
{
40+
# noop
41+
}
42+
else {
43+
@releases = sort {
44+
_versions_cmp( $b->{version_parsed}, $a->{version_parsed} )
45+
} @releases;
46+
if ( _versions_cmp( $releases[0]->{version_parsed}, $version )
47+
!= 0 )
48+
{
49+
@releases = ();
50+
}
51+
}
52+
53+
if (@releases) {
54+
my $current = shift @releases;
55+
$current->{current} = 1;
56+
push @changelogs, $current;
57+
58+
if ( $opts{include_dev} ) {
59+
for my $dev_r (@releases) {
60+
last
61+
if !$dev_r->{dev};
62+
push @changelogs, $dev_r;
4263
}
4364
}
4465
}
@@ -104,9 +125,8 @@ sub _releases {
104125
my $changelog
105126
= MetaCPAN::Web::Model::API::Changes::Parser->parse($content);
106127

107-
my @releases
108-
= sort { _versions_cmp( $b->{version_parsed}, $a->{version_parsed} ) }
109-
map {
128+
my @releases = map {
129+
;
110130
my $v = _parse_version( $_->{version} );
111131
my $trial = $_->{version} =~ /-TRIAL$/
112132
|| $_->{note} && $_->{note} =~ /\bTRIAL\b/;
@@ -117,7 +137,7 @@ sub _releases {
117137
trial => $trial,
118138
dev => $dev,
119139
};
120-
} @{ $changelog->{releases} || [] };
140+
} @{ $changelog->{releases} || [] };
121141
return @releases;
122142
}
123143

0 commit comments

Comments
 (0)