summaryrefslogtreecommitdiffstats
path: root/bin/metas/perl
blob: c1ca14e5337e31fe021ef8cd28a4823597f6139e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#!/usr/bin/env perl

use warnings 'FATAL' => 'all';
use strict;

use File::Fetch;
use IO::Handle; # for autoflush

my $PROG = 'perl-cpan';

sub err
{
	print STDERR @_;
	exit 2;	
}

sub distsearch
{
	my ($dist) = @_;

	# Refresh our local list of distributions if needed.
	my $var = $ENV{'PKGVAR'}
		or die "$PROG: PKGVAR env variable is unset\n";

	if (! -f "$var/cpan" || -M "$var/cpan" > 1) {
		print STDERR "Refreshing local CPAN distribution list...";
		system qq{cpandists >'$var/cpan' 2>/dev/null};
		err("FAILED\n") unless $? == 0;
		print STDERR "OK\n";
	}

	open DISTS, '<', "$var/cpan" or err("$PROG: open: $!");
	while (<DISTS>) {
		my @f = split;
		next unless lc $f[0] 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'} || 'ftp://cpan.pair.com';
	my $url = "${mirror}/authors/id/${cpath}";

	print STDERR "Downloading $file... ";
	my $ff = File::Fetch->new('uri' => $url);
	err("FAILED\n") unless $ff->fetch();
	print STDERR "OK\n";
}

sub main
{
	my $pkg = shift or die "Usage: $PROG [package name]\n";
	my $dist = $pkg;

	$dist = "app-$dist" if $dist =~ s/^perl-// == 0;
	
	STDERR->autoflush(1);
	my ($realname, $cpath) = distsearch($dist);
	die "$PROG: failed to find perl dist similar to $dist\n"
		unless $realname;
	fetchdist($cpath);

	my $srch = 'http://search.cpan.org';
	print <<"END_META";
url
$srch/dist/$realname

source
$srch/CPAN/authors/id/$cpath

END_META

	my $file = $cpath; $file =~ s{^.*/}{};
	system 'perl-dist', $file;
	return $?;
}

exit main(@ARGV);