CPAN-Tarball-Patch

 view release on metacpan or  search on metacpan

META.json  view on Meta::CPAN

{
   "abstract" : "Patch a CPAN tarball, via CPAN::Distroprefs mechanism",
   "author" : [
      "Thibault Duponchelle <thibault.duponchelle@gmail.com>"
   ],
   "dynamic_config" : 1,
   "generated_by" : "ExtUtils::MakeMaker version 7.70, CPAN::Meta::Converter version 2.150010",
   "license" : [
      "artistic_2"
   ],
   "meta-spec" : {
      "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",

META.yml  view on Meta::CPAN

---
abstract: 'Patch a CPAN tarball, via CPAN::Distroprefs mechanism'
author:
  - 'Thibault Duponchelle <thibault.duponchelle@gmail.com>'
build_requires:
  ExtUtils::MakeMaker: '0'
  Test::More: '0'
configure_requires:
  ExtUtils::MakeMaker: '0'
dynamic_config: 1
generated_by: 'ExtUtils::MakeMaker version 7.70, CPAN::Meta::Converter version 2.150010'
license: artistic_2

lib/CPAN/Tarball/Patch.pm  view on Meta::CPAN

use strict;
use warnings;

use Archive::Tar;
use File::Basename;
use Cwd;
use File::Find;

=head1 NAME

CPAN::Tarball::Patch - Patch a CPAN tarball, via CPAN::Distroprefs mechanism

=head1 VERSION

Version 0.020000

=cut

our $VERSION = '0.020000';


=head1 SYNOPSIS

Patching a tarball using C<CPAN::Distroprefs>

    use CPAN::Tarball::Patch;

    my $patcher = CPAN::Tarball::Patch->new("$ENV{"HOME"}/.local/share/.cpan/prefs/", "$ENV{"HOME"}/.local/share/.cpan/patches/");

    $patcher->patch("CONTRA/Acme-LSD-0.04.tar.gz");
    # The argument format is NOT flexible since it would be used for matching by CPAN::Distroprefs
    # In other words, it should be: AUTHOR/tarball.tar.gz
    
As of today, this module internal functioning and API is not fixed, do not use it yet (or at your risks).

=cut

sub new {
    my $class = shift;
    my $prefs_dir = shift;
    my $patches_dir = shift;

    defined $prefs_dir or die "Need to pass prefs_dir parameter";
    defined $patches_dir or die "Need to pass patches_dir parameter";

    my $self = bless {}, $class;
    $self->{prefs_dir} = $prefs_dir;
    $self->{patches_dir} = $patches_dir;
    $self->{start_dir} = getcwd;

    return $self;
}

sub patches {
    my $self = shift;
    my $distribution = shift;

    defined $distribution or die "Need to pass distribution parameter";

    my $prefs_folder = $self->{prefs_dir};
    my $patches_folder = $self->{patches_dir};

    use CPAN::Distroprefs;
    use YAML;

    my %arg = (
        distribution => $distribution,
    );

    my %ext = ( yml => 'YAML' );
    my $finder = CPAN::Distroprefs->find($prefs_folder, \%ext);
    my @patches = ();
    while (my $result = $finder->next) {
        die $result->as_string if $result->is_fatal;
        warn($result->as_string), next if $result->is_warning;
        for my $pref (@{ $result->prefs }) {
            if ($pref->matches(\%arg)) {
                foreach my $patch ($pref->data->{patches}->@*) {
                    push @patches, $patch;
                }
            }
        }
    }

    return map  { File::Spec->catfile($self->{patches_dir}, $_) } @patches;
}



( run in 1.476 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )