lib/Debian/File.pm
changeset 1 05c025e89571
equal deleted inserted replaced
0:0d30ea853889 1:05c025e89571
       
     1 package Debian::File;
       
     2 
       
     3 use strict;
       
     4 use warnings;
       
     5 
       
     6 use IO::File;
       
     7 use Digest::MD5;
       
     8 use Carp;
       
     9 
       
    10 sub new {
       
    11     my $class = ref $_[0] ? ref shift : shift;
       
    12     my $self = bless {}, $class;
       
    13     my $description = shift;
       
    14     my %args = @_;
       
    15 
       
    16     @{$self}{keys %args} = values %args;
       
    17 
       
    18     foreach my $a (qw/prefix current_prefix/) {
       
    19 	$self->{$a} =~ s/\/$//;
       
    20     }
       
    21 
       
    22     my @fields = split " ", $description;
       
    23 
       
    24     if (@fields == 5) {
       
    25 	@{$self}{qw/md5 size section part file/} = @fields;
       
    26     } elsif (@fields == 3) {
       
    27 	@{$self}{qw/md5 size file/} = @fields;
       
    28     } else {
       
    29 	croak "Unknown format: $_\n";
       
    30     }
       
    31 
       
    32     $self->check;   # will croak
       
    33     return $self;
       
    34 }
       
    35 
       
    36 sub md5 { $_[0]->{md5} }
       
    37 sub size { $_[0]->{size} }
       
    38 sub section { $_[0]->{section} }
       
    39 sub part { $_[0]->{part} }
       
    40 sub file { $_[0]->{file} }
       
    41 sub prefix { $_[0]->{prefix} }
       
    42 sub path { join "/", @{$_[0]}{qw/prefix file/} }
       
    43 sub component { $_[0] =~ /^(.*?)\// ? $1 : "main" }
       
    44 
       
    45 sub check {
       
    46     my $self = shift;
       
    47 
       
    48 
       
    49     my $file = join "/", $self->{current_prefix} ? $self->{current_prefix} : $self->{prefix}, $self->file;
       
    50     my $size = $self->size;
       
    51     my $md5 = $self->md5;
       
    52 
       
    53     croak "File does not exist: $file\n"  if !-f $file;
       
    54     croak "Size mismatch: $file (" . (-s _) . " != $size)\n" if not $size == (-s _);
       
    55 
       
    56     my $digest = new Digest::MD5;
       
    57     my $fh = new IO::File $file or croak "Can't open <$file: $!\n";
       
    58     $digest->addfile($fh);
       
    59 
       
    60     croak "MD5 mismatch: $file\n" if not $digest->hexdigest eq $md5;
       
    61 }
       
    62 
       
    63 1;
       
    64 
       
    65 # vim:sts=4 sw=4 aw ai sm: