Skip to content

Instantly share code, notes, and snippets.

@JaHIY
Created April 4, 2015 16:19
Show Gist options
  • Save JaHIY/dc74e17d0b07a8fc69ce to your computer and use it in GitHub Desktop.
Save JaHIY/dc74e17d0b07a8fc69ce to your computer and use it in GitHub Desktop.
convert perl module to PKGBUILD through metacpan API
#!/usr/bin/env perl
use strict;
use warnings;
use utf8::all;
use Carp;
use HTTP::Tiny;
use JSON qw(decode_json);
use Template;
use URI;
use Data::Dumper;
my $HEADER = '# Maintainer: Kars Wang <jaklsy AT gmail.com>';
my $API_URL = 'http://api.metacpan.org/v0';
sub main {
( my $dist_name = $_[0] ) =~ s/::/-/g;
my $pkg_name = sprintf 'perl-%s', lc $dist_name;
my $request_uri = URI->new( join( '/', $API_URL, 'release', $dist_name ) );
my $http = HTTP::Tiny->new;
my $response = $http->post( $request_uri->canonical );
croak 'HTTP failed!' if not $response->{success};
croak 'No content!' if not $response->{content};
my $json = decode_json $response->{content};
croak sprintf('error! code:%d, message:%s', $response->{code}, $response->{message}) if defined $response->{code};
my $dist_version = $json->{version};
my $dist_desc = $json->{abstract};
my @dist_depends;
if ( defined ( my $requires_ref = $json->{metadata}->{prereqs}->{runtime}->{requires} ) ) {
my %runtime_requires = %{ $requires_ref };
@dist_depends = map { ( my $n = $_ ) =~ s/::/-/g; sprintf q{'perl-%s>=%s'}, lc $n, $runtime_requires{$_}; } keys %runtime_requires;
}
my @dist_checkdepends;
if ( defined ( my $requires_ref = $json->{metadata}->{prereqs}->{test}->{requires} ) ) {
my %test_requires = %{ $requires_ref };
@dist_checkdepends = map { ( my $n = $_ ) =~ s/::/-/g; sprintf q{'perl-%s>=%s'}, lc $n, $test_requires{$_}; } keys %test_requires;
}
my @dist_makedepends;
if ( defined ( my $requires_ref = $json->{metadata}->{prereqs}->{build}->{requires} ) ) {
my %build_requires = %{ $requires_ref };
@dist_makedepends = map { ( my $n = $_ ) =~ s/::/-/g; sprintf q{'perl-%s>=%s'}, lc $n, $build_requires{$_}; } keys %build_requires;
}
my @dist_provides = map { sprintf q{'perl-%s=%s'}, lc $_, $dist_version; } grep { $_ ne $dist_name } map { ( my $n = $_ ) =~ s/::/-/g; $n; } @{ $json->{provides} };
my $download_url = $json->{download_url};
my ( $author_field ) = $download_url =~ m{^https?:\/\/cpan\.metacpan\.org\/authors\/id\/(.*)\/[^/]+\.tar\.gz$};
my $template = Template->new;
$template->process(\*DATA, {
header => $HEADER,
dist_name => $dist_name,
pkg_name => $pkg_name,
dist_version => $dist_version,
dist_desc => $dist_desc,
dist_depends => join( ' ', @dist_depends ),
dist_checkdepends => join( ' ', @dist_checkdepends ),
dist_makedepends => join( ' ', @dist_makedepends ),
dist_provides => join( ' ', @dist_provides ),
author_field => $author_field,
});
}
main @ARGV;
__END__
[% header %]
pkgname='[% pkg_name %]'
pkgver=[% dist_version %]
pkgrel=1
pkgdesc='[% dist_desc %]'
_dist='[% dist_name %]'
arch=('any')
url="https://metacpan.org/release/$_dist"
license=('PerlArtistic')
depends=('perl' [% dist_depends %])
checkdepends=([% dist_checkdepends %])
makedepends=([% dist_makedepends %])
provides=([% dist_provides %])
options=('!emptydirs' 'purge')
source=("http://search.cpan.org/CPAN/authors/id/[% author_field %]/$_dist-$pkgver.tar.gz")
sha256sums=('SKIP')
build() (
cd "$srcdir/$_dist-$pkgver"
unset PERL5LIB PERL_MM_OPT PERL_LOCAL_LIB_ROOT
export PERL_MM_USE_DEFAULT=1 PERL_AUTOINSTALL=--skipdeps
/usr/bin/perl Makefile.PL
make
)
check() (
cd "$srcdir/$_dist-$pkgver"
unset PERL5LIB PERL_MM_OPT PERL_LOCAL_LIB_ROOT
export PERL_MM_USE_DEFAULT=1
make test
)
package() (
cd "$srcdir/$_dist-$pkgver"
unset PERL5LIB PERL_MM_OPT PERL_LOCAL_LIB_ROOT
make install INSTALLDIRS=vendor DESTDIR="$pkgdir"
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment