diff --git a/Build.PL b/Build.PL index 7783acb..706ec77 100644 --- a/Build.PL +++ b/Build.PL @@ -6,21 +6,22 @@ my $builder = Module::Build->new( module_name => 'cpanspec', license => 'perl', dist_author => 'Steven Pritchard ', - dist_version => '1.61', + dist_version => '1.62', requires => { - 'Archive::Tar' => 0, - 'Archive::Zip' => 0, - 'File::Basename' => 0, - 'FileHandle' => 0, - 'Getopt::Long' => 0, - 'locale' => 0, - 'LWP::UserAgent' => 0, - 'Module::CoreList' => 0, - 'POSIX' => 0, - 'Parse::CPAN::Packages' => 0, - 'Pod::Usage' => 0, - 'Text::Autoformat' => 0, - 'YAML' => 0, + 'Archive::Tar' => 0, + 'Archive::Zip' => 0, + 'File::Basename' => 0, + 'FileHandle' => 0, + 'Getopt::Long' => 0, + 'locale' => 0, + 'LWP::UserAgent' => 0, + 'Module::CoreList' => 0, + 'POSIX' => 0, + 'Parse::CPAN::Packages' => 0, + 'Pod::Usage' => 0, + 'Text::Autoformat' => 0, + 'YAML' => 0, + 'Pod::Simple::TextContent' => 0, }, script_files => [ 'cpanspec', diff --git a/Changes b/Changes index cfda385..751e749 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,7 @@ +0.62 + +* Improve auto-detection of %description and Summary. + 0.61 2006-03-11 * Add this file. diff --git a/cpanspec b/cpanspec index 7501175..96b7e4c 100755 --- a/cpanspec +++ b/cpanspec @@ -10,7 +10,7 @@ # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # -# $Id: cpanspec,v 1.12 2006/03/22 21:50:38 stevenpritchard Exp $ +# $Id: cpanspec,v 1.13 2006/03/23 01:57:12 stevenpritchard Exp $ my $NAME="cpanspec"; my $VERSION='1.62'; @@ -187,6 +187,7 @@ use Pod::Usage; use File::Basename; use LWP::UserAgent; use Parse::CPAN::Packages; +use Pod::Simple::TextContent; # Apparently gets pulled in by another module. #use Cwd; @@ -349,9 +350,53 @@ sub extract($$$) { sub get_description(%) { my %args=@_; + my $pm=""; + my ($summary, $description); + + my $path=$args{module}; + $path=~s,::,/,g; + my @pmfiles=("$args{name}-$args{version}/lib/$path.pm"); + do { + push(@pmfiles, "$args{name}-$args{version}/$path.pm"); + } while ($path=~s,^[^/]+/,,); + push(@pmfiles, "$args{name}-$args{version}/$args{module}") + if ($args{module} !~ /::/); + + for my $file (@pmfiles) { + $pm=(grep { $_ eq $file or $_ eq "./$file" } + list_files($args{archive}, $args{type}))[0]; + last if $pm; + } + + if ($pm) { + verbose "Trying to fetch description from $pm..."; + + if (my $content=extract($args{archive}, $args{type}, $pm)) { + my $parser=Pod::Simple::TextContent->new() + or die "Pod::Simple::TextContent->new() failed: $!\n"; + $parser->no_whining(1); + my $rendered=""; + $parser->output_string(\$rendered); + $parser->parse_string_document($content); + if ($parser->content_seen and $rendered) { + if ($rendered=~/DESCRIPTION\s+(\S.*?)\n\n/s) { + $description=$1; + } + if ($rendered=~/NAME\s*$args{module}\s[-\s]*(\S[^\n]*)/s) { + $summary=$1; + } + return($description, $summary) if (defined($description)); + } + } else { + warn "Failed to read $pm from $args{filename}" + . ($args{type} eq 'tar' + ? (": " . $args{archive}->error()) : "") . "\n"; + } + } + + if (my $readme=(sort { $a cmp $b } (grep /README/i, @{$args{files}}))[0]) { + verbose "Trying to fetch description from $readme..."; - my $readme=(sort { $a cmp $b } (grep /README/i, @{$args{files}}))[0]; - if ($readme) { if (my $content=extract($args{archive}, $args{type}, "$args{name}-$args{version}/$readme")) { $content=~s/\r//g; # Why people use DOS text, I'll never understand. @@ -359,16 +404,17 @@ sub get_description(%) { $string=~s/^\n+//; if ((my @tmp=split "\n", $string) > 2 and $string !~ /^[#\-=]/) { - return $string; + return($string, undef); } } } else { warn "Failed to read $readme from $args{filename}" - . ($args{type} eq 'tar' ? (": " . $args{archive}->error()) : "") . "\n"; + . ($args{type} eq 'tar' + ? (": " . $args{archive}->error()) : "") . "\n"; } } - return undef; + return(undef, undef); } # Set locale to en_US.UTF8 so that dates in changelog will be correct @@ -492,13 +538,14 @@ for my $file (@ARGV) { . "/" . $file; $source=~s/$version/\%{version}/; - my $description=get_description( - archive => $archive, - type => $type, - filename => $file, - name => $name, - version => $version, - files => \@files, + my ($description,$summary)=get_description( + archive => $archive, + type => $type, + filename => $file, + name => $name, + module => $module, + version => $version, + files => \@files, ); if (defined($description) and $description) { @@ -512,6 +559,8 @@ for my $file (@ARGV) { $description="$module Perl module"; } + $summary="$module Perl module" if (!defined($summary)); + my @doc=sort { $a cmp $b } grep { !/\// and !/\.(pl|xs|h|c|pm|in|pod)$/i @@ -719,7 +768,7 @@ for my $file (@ARGV) { Name: $prefix$name Version: $version Release: $release$disttag -Summary: $module Perl module +Summary: $summary License: $license Group: Development/Libraries URL: $url