Skip to content

Commit 9fecda8

Browse files
preserve the original version string(s) before inflating them into objects (not yet exposed as an API)
1 parent 1abd4d2 commit 9fecda8

File tree

1 file changed

+26
-23
lines changed

1 file changed

+26
-23
lines changed

lib/Module/Metadata.pm

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ sub _parse_fh {
514514
my ($self, $fh) = @_;
515515

516516
my( $in_pod, $seen_end, $need_vers ) = ( 0, 0, 0 );
517-
my( @packages, %vers, %pod, @pod );
517+
my( @packages, %vers_raw, %vers, %pod, @pod );
518518
my $package = 'main';
519519
my $pod_sect = '';
520520
my $pod_data = '';
@@ -590,43 +590,39 @@ sub _parse_fh {
590590
push( @packages, $package ) unless grep( $package eq $_, @packages );
591591
$need_vers = defined $version ? 0 : 1;
592592

593-
if ( not exists $vers{$package} and defined $version ){
594-
# Upgrade to a version object.
595-
my $dwim_version = eval { _dwim_version($version) };
596-
croak "Version '$version' from $self->{filename} does not appear to be valid:\n$line\n\nThe fatal error was: $@\n"
597-
unless defined $dwim_version; # "0" is OK!
598-
$vers{$package} = $dwim_version;
593+
if ( not exists $vers_raw{$package}[0] and defined $version ){
594+
$vers_raw{$package} = [ $version, $line ];
599595
}
600596

601597
# VERSION defined with full package spec, i.e. $Module::VERSION
602598
} elsif ( $version_fullname && $version_package ) {
603599
push( @packages, $version_package ) unless grep( $version_package eq $_, @packages );
604600
$need_vers = 0 if $version_package eq $package;
605601

606-
unless ( defined $vers{$version_package} && length $vers{$version_package} ) {
607-
$vers{$version_package} = $self->_evaluate_version_line( $version_sigil, $version_fullname, $line );
602+
unless ( defined $vers_raw{$version_package}[0] && length $vers_raw{$version_package}[0] ) {
603+
$vers_raw{$version_package} = [ $self->_evaluate_version_line( $version_sigil, $version_fullname, $line ), $line ];
608604
}
609605

610606
# first non-comment line in undeclared package main is VERSION
611-
} elsif ( $package eq 'main' && $version_fullname && !exists($vers{main}) ) {
607+
} elsif ( $package eq 'main' && $version_fullname && !exists($vers_raw{main}[0]) ) {
612608
$need_vers = 0;
613609
my $v = $self->_evaluate_version_line( $version_sigil, $version_fullname, $line );
614-
$vers{$package} = $v;
610+
$vers_raw{$package} = [ $v, $line ];
615611
push( @packages, 'main' );
616612

617613
# first non-comment line in undeclared package defines package main
618-
} elsif ( $package eq 'main' && !exists($vers{main}) && $line =~ /\w/ ) {
614+
} elsif ( $package eq 'main' && !exists($vers_raw{main}[0]) && $line =~ /\w/ ) {
619615
$need_vers = 1;
620-
$vers{main} = '';
616+
$vers_raw{main} = [ '', $line ];
621617
push( @packages, 'main' );
622618

623619
# only keep if this is the first $VERSION seen
624620
} elsif ( $version_fullname && $need_vers ) {
625621
$need_vers = 0;
626622
my $v = $self->_evaluate_version_line( $version_sigil, $version_fullname, $line );
627623

628-
unless ( defined $vers{$package} && length $vers{$package} ) {
629-
$vers{$package} = $v;
624+
unless ( exists $vers_raw{$package}[0] && length $vers{$package}[0] ) {
625+
$vers_raw{$package} = [ $v, $line ];
630626
}
631627
}
632628

@@ -636,6 +632,20 @@ sub _parse_fh {
636632
$pod{$pod_sect} = $pod_data;
637633
}
638634

635+
# Upgrade the found versions into version objects
636+
foreach my $package (keys %vers_raw) {
637+
# watch out for autovivification at the first level of the hash
638+
delete($vers_raw{$package}), next if not exists $vers_raw{$package}[0];
639+
my $version = eval { _dwim_version($vers_raw{$package}[0]) };
640+
641+
croak "Version '$vers_raw{$package}[0]' from $self->{filename} does not appear to be valid:\n$vers_raw{$package}[1]\n\nThe fatal error was: $@\n"
642+
unless defined $version; # "0" is OK!
643+
644+
$vers_raw{$package} = $vers_raw{$package}[0];
645+
$vers{$package} = $version;
646+
}
647+
648+
$self->{versions_raw} = \%vers_raw;
639649
$self->{versions} = \%vers;
640650
$self->{packages} = \@packages;
641651
$self->{pod} = \%pod;
@@ -683,14 +693,7 @@ sub _evaluate_version_line {
683693
croak "Could not get version from $self->{filename} by executing:\n$eval\n\nThe fatal error was: $@\n"
684694
if $@;
685695

686-
# Upgrade it into a version object
687-
my $version = eval { _dwim_version($result) };
688-
689-
# FIXME: $eval is not the right thing to print here
690-
croak "Version '$result' from $self->{filename} does not appear to be valid:\n$eval\n\nThe fatal error was: $@\n"
691-
unless defined $version; # "0" is OK!
692-
693-
return $version;
696+
return $result;
694697
}
695698
}
696699

0 commit comments

Comments
 (0)