support/script/scancpan: generate hash file
PATCH 1/1 support/script/scancpan: generate hash file
retrieve md5&sha256 from metacpan.org, and store them in the hash file for each package.
--- support/scripts/scancpan | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
support/scripts/scancpan +26 -0
@@ -481,6 +481,7 @@ use Pod::Usage; use File::Basename; use Module::CoreList; use HTTP::Tiny; +use Safe; use MetaCPAN::API::Tiny; my ($help, $man, $quiet, $force, $recommend, $test, $host);
@@ -505,9 +506,22 @@ my %need_dlopen; # name -> 1 if requires dynamic library my %deps_build; # name -> list of host dependencies my %deps_runtime; # name -> list of target dependencies my %license_files; # name -> list of license files +my %checksum; # author -> list of checksum my $mcpan = MetaCPAN::API::Tiny->new(); my $ua = HTTP::Tiny->new(); +sub get_checksum { + my ($url) = @_; + my($path) = $url =~ m|^[^:/?#]+://[^/?#]*([^?#]*)|; + my($basename, $dirname) = fileparse( $path ); + unless ($checksum{$dirname}) { + my $response = $ua->get(qq{http://cpan.metacpan.org${dirname}CHECKSUMS}); + $checksum{$dirname} = $response->{content}; + } + my $chksum = Safe->new->reval($checksum{$dirname}); + return $chksum->{$basename}, $basename; +} + sub get_manifest { my ($author, $distname, $version) = @_; my $url = qq{http://api.metacpan.org/source/${author}/${distname}-${version}/MANIFEST};
@@ -608,6 +622,7 @@ while (my ($distname, $dist) = each %dist) { my $dirname = q{package/} . $fsname; my $cfgname = $dirname . q{/Config.in}; my $mkname = $dirname . q{/} . $fsname . q{.mk}; + my $hashname = $dirname . q{/} . $fsname . q{.hash}; my $brname = brname( $fsname ); mkdir $dirname unless -d $dirname; if ($need_target{$distname} && ($force || !-f $cfgname)) {
@@ -675,6 +690,17 @@ while (my ($distname, $dist) = each %dist) { say {$fh} qq{\$(eval \$(host-perl-package))} if $need_host{$distname}; close $fh; } + if ($force || !-f $hashname) { + my($checksum, $filename) = get_checksum($dist->{download_url}); + my $md5 = $checksum->{md5}; + my $sha256 = $checksum->{sha256}; + say qq{write ${hashname}} unless $quiet; + open my $fh, q{>}, $hashname; + say {$fh} qq{# retrieved by scancpan from http://cpan.metacpan.org/}; + say {$fh} qq{md5 ${md5} ${filename}}; + say {$fh} qq{sha256 ${sha256} ${filename}}; + close $fh; + } } my %pkg;
--
2.1.0
PATCH 1/1 support/script/scancpan: generate hash file
Quoted 56 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
"Francois" == Francois Perrad <[email protected]> writes:
retrieve md5&sha256 from metacpan.org, and store them in the hash file for each package.
Signed-off-by Francois Perrad <[email protected]>--- support/scripts/scancpan | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)support/scripts/scancpan +15
-0@@ -481,6 +481,7 @@ use Pod::Usage; use File::Basename; use Module::CoreList; use HTTP::Tiny; +use Safe; use MetaCPAN::API::Tiny; my ($help, $man, $quiet, $force, $recommend, $test, $host);@@ -505,9 +506,22 @@ my %need_dlopen; # name -> 1 if requires dynamic library my %deps_build; # name -> list of host dependencies my %deps_runtime; # name -> list of target dependencies my %license_files; # name -> list of license files +my %checksum; # author -> list of checksum my $mcpan = MetaCPAN::API::Tiny->new(); my $ua = HTTP::Tiny->new(); +sub get_checksum { + my ($url) = @_; + my($path) = $url =~ m|^[^:/?#]+://[^/?#]*([^?#]*)|; + my($basename, $dirname) = fileparse( $path ); + unless ($checksum{$dirname}) { + my $response = $ua->get(qq{http://cpan.metacpan.org${dirname}CHECKSUMS}); + $checksum{$dirname} = $response->{content}; + } + my $chksum = Safe->new->reval($checksum{$dirname}); + return $chksum->{$basename}, $basename; +} + sub get_manifest { my ($author, $distname, $version) = @_; my $url = qq{http://api.metacpan.org/source/${author}/${distname}-${version}/MANIFEST};@@ -608,6 +622,7 @@ while (my ($distname, $dist) = each %dist) { my $dirname = q{package/} . $fsname; my $cfgname = $dirname . q{/Config.in}; my $mkname = $dirname . q{/} . $fsname . q{.mk}; + my $hashname = $dirname . q{/} . $fsname . q{.hash}; my $brname = brname( $fsname ); mkdir $dirname unless -d $dirname; if ($need_target{$distname} && ($force || !-f $cfgname)) {@@ -675,6 +690,17 @@ while (my ($distname, $dist) = each %dist) { say {$fh} qq{\$(eval \$(host-perl-package))} if $need_host{$distname}; close $fh;
support/scripts/scancpan while (my ($distname, $dist) = each %dist) { · line 701
Quoted 10 lines
support/scripts/scancpan +9
-0} + if ($force || !-f $hashname) { + my($checksum, $filename) = get_checksum($dist->{download_url}); + my $md5 = $checksum->{md5}; + my $sha256 = $checksum->{sha256}; + say qq{write ${hashname}} unless $quiet; + open my $fh, q{>}, $hashname; + say {$fh} qq{# retrieved by scancpan from http://cpan.metacpan.org/}; + say {$fh} qq{md5 ${md5} ${filename}}; + say {$fh} qq{sha256 ${sha256} ${filename}};
I don't know perl, but is there any reason for this odd indentation in the .hash files? Normally we use:
type\thash filename
(the *sum programs output 2 spaces between hash and filename)
Signature · 1 line
Bye, Peter Korsgaard
PATCH 1/1 support/script/scancpan: generate hash file
In reply to Francois PerradDear Francois Perrad,
Quoted 4 lines · Francois Perrad
retrieve md5&sha256 from metacpan.org, and store them in the hash file for each package.
Signed-off-by Francois Perrad <[email protected]>
Thanks, I've applied your patch to the next branch, after removing the odd indentation for the md5 case, as noted by Peter.
Thomas
Signature · 3 lines
Thomas Petazzoni, CTO, Free Electrons Embedded Linux, Kernel and Android engineering http://free-electrons.com