#!/usr/bin/env perl use warnings 'FATAL' => 'all'; use strict; use File::Fetch; use IO::Handle; # for autoflush use Cwd; my $PROG = 'preps/perl'; my %BADNAMES = ('perl-libwww' => 'libwww-perl'); sub err { print STDERR "$PROG: ", @_, "\n"; exit 1; } sub matchdist { my($dist) = @_; # Refresh our local list of distributions if needed. my $var = $ENV{'PKGVAR'} or err('PKGVAR env variable is unset'); if(!-f "$var/cpan.dists" || -M "$var/cpan.dists" > 1) { print STDERR "$PROG: Refreshing local CPAN data.\n"; my $cwd = getcwd(); chdir $var or die "chdir: $!"; system 'fetchcpan'; exit 1 unless($? == 0); chdir $cwd or die "chdir: $!"; } open(DISTS, '<', "$var/cpan.dists") or err("open: $!"); while() { my @f = split; my $d = lc $f[0]; $d =~ tr/-_/--/s; next unless($d eq lc($dist)); close(DISTS); return ($f[0], $f[2]); } close(DISTS); return (); } sub fetchdist { my($cpath) = @_; my $file = $cpath; $file =~ s{^.*/}{}; if(-f $file) { print STDERR "$file already downloaded.\n"; return; } my $mirror = $ENV{'CPANMIRROR'} || 'https://mirror.leaseweb.net/CPAN/'; my $url = "${mirror}/authors/id/${cpath}"; print STDERR "Downloading $file... "; my $ff = File::Fetch->new('uri' => $url); die "FAILED\n" unless($ff->fetch()); print STDERR "OK\n"; } sub main { my $dist = shift or die "usage: $PROG [package name]\n"; my $guess; if($BADNAMES{$dist}){ $dist = $BADNAMES{$dist}; }elsif($dist =~ s/^perl-// == 0){ $guess = 1; $dist = "app-$dist"; } STDERR->autoflush(1); my ($realname, $cpath) = matchdist($dist); unless($realname){ if($guess){ return 100 }else{ ## If its a perl- package tell prepkg to cleanup. print STDERR qq{$PROG: failed to find perl dist similar to '$dist'\n}; return 101 } } fetchdist($cpath); print <<"END_META"; url https://metacpan.org/release/$realname source http://search.cpan.org/CPAN/authors/id/$cpath END_META my $file = $cpath; $file =~ s{.*/}{}; system 'perl-dist' => $file; return $? >> 8; } exit main(@ARGV);