Archive-Libarchive-Compress

 view release on metacpan or  search on metacpan

lib/Archive/Libarchive/Compress.pm  view on Meta::CPAN

use warnings;
use 5.020;
use experimental qw( postderef signatures );

package Archive::Libarchive::Compress 0.01 {

  use Carp ();
  use Path::Tiny ();
  use File::chdir;
  use Ref::Util qw( is_ref is_plain_scalarref is_plain_coderef );
  use Archive::Libarchive 0.04 qw( ARCHIVE_OK ARCHIVE_WARN );
  use FFI::C::Stat;

  # ABSTRACT: Recursively archive a directory (using libarchive)


  sub new ($class, %options) {
      Carp::croak("Required option: one of filename or memory")
        unless defined($options{filename} // $options{memory});
      Carp::croak("Exactly one of filename or memory is required")
        if defined($options{filename}) && defined($options{memory});

      if(defined $options{memory} && !(is_plain_scalarref $options{memory} && defined $options{memory}->$* && !is_ref $options{memory}->$*)) {
        Carp::croak("Option memory must be a scalar reference to a plain non-reference scalar");
      }

      Carp::croak("Entry is not a code reference")
        if defined $options{entry} && !is_plain_coderef $options{entry};

      my $self = bless {
        filename   => delete $options{filename},
        entry      => delete($options{entry}) // sub ($e) { return 1 },
        memory     => delete $options{memory},
        prep       => delete($options{prep}) // sub ($ar) { $ar->set_format_pax_restricted },
      }, $class;

      Carp::croak("Illegal options: @{[ sort keys %options ]}")
        if %options;

      return $self;
  }


  sub filename   ($self) { return $self->{filename}       }
  sub from       ($self) { return $self->{from}           }

  sub _archive ($self) {
    my $w = Archive::Libarchive::ArchiveWrite->new;
    my $e = Archive::Libarchive::Entry->new;

    $self->{prep}->($w);

    my $ret;

    if($self->filename) {
      $ret = $w->open_filename($self->filename);
    } else {
      $ret = $w->open_memory($self->{memory});
    }

    if($ret == ARCHIVE_WARN) {
      Carp::carp($w->error_string);
    } elsif($ret < ARCHIVE_WARN) {
      Carp::croak($w->error_string);
    }

    return($w,$e);
  }

  sub _iterate ($self, $w, $e, $path) {



( run in 0.388 second using v1.01-cache-2.11-cpan-63c85eba8c4 )