Archive-SCS

 view release on metacpan or  search on metacpan

lib/Archive/SCS.pm  view on Meta::CPAN

use v5.34;
use warnings;
use Object::Pad 0.73;

class Archive::SCS 1.09;

use stable 0.031 'isa';

use Archive::SCS::CityHash qw(cityhash64 cityhash64_hex cityhash64_as_hex);
use Carp 'croak';
use List::Util 1.45 qw(first uniqstr);
use Module::Load 'load';
use Path::Tiny 0.054 'path';

use Archive::SCS::Directory;
use Archive::SCS::HashFS;
use Archive::SCS::HashFS2;
use Archive::SCS::Zip;

field @formats = qw( HashFS2 HashFS Directory Zip );

field @mounts;
field %entries;

my @ROOTS = ('', 'locale');


method formats () {
  @formats
}


method set_formats {
  load __PACKAGE__ . "::$_" for @_;
  @formats = @_;
  return $self;
}


method format_module ($path) {
  my $header = '';
  if (! $path->is_dir) {
    open my $fh, '<:raw', $path or croak
      sprintf "%s: $!", $path->basename;
    read $fh, $header, 8 or croak
      sprintf "%s: $!", $path->basename;
    close $fh;
  }

  my @modules = map { __PACKAGE__ . "::$_" } @formats;
  my $module = first { $_->handles_path($path, $header) } @modules or croak
    sprintf "%s: No suitable format handler found", $path->basename;
  return $module;
}


method mount ($mountable) {
  if ( not $mountable isa Archive::SCS::Mountable ) {
    my $path = path $mountable;
    my $format = $self->format_module($path);
    $mountable = $format->new(path => $path);
  }
  my $basename = $mountable->path->basename;

  $self->is_mounted($mountable) and croak
    sprintf "%s: Already mounted", $basename;

  my $mount = $mountable->mount;
  $mount->read_dir_tree(@ROOTS);
  push @mounts, $mount;
  push $entries{$_}->@*, $mount for my @entries = $mount->entries;

  return $mount;
}


method unmount ($mount) {
  if ( not $mount isa Archive::SCS::Mountable ) {
    my $path = path $mount;
    $mount = first { $path->realpath eq $_->path->realpath } @mounts or croak
      sprintf "%s: Not mounted", $path->basename;
  }

  $mount->unmount;



( run in 2.110 seconds using v1.01-cache-2.11-cpan-5a3173703d6 )