diff options
Diffstat (limited to 'urpm/md5sum.pm')
-rw-r--r-- | urpm/md5sum.pm | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/urpm/md5sum.pm b/urpm/md5sum.pm new file mode 100644 index 00000000..c94fb96e --- /dev/null +++ b/urpm/md5sum.pm @@ -0,0 +1,64 @@ +package urpm::md5sum; + +use urpm; +use urpm::util; +use urpm::msg; + + +#- parse an MD5SUM file from a mirror +sub from_MD5SUM { + my ($md5sum_file, $f) = @_; + my $basename = basename($f); + + my ($retrieved_md5sum) = map { + my ($md5sum, $file) = m|(\S+)\s+(?:\./)?(\S+)|; + $file && $file eq $basename ? $md5sum : @{[]}; + } cat_($md5sum_file); + + $retrieved_md5sum; +} + +sub from_MD5SUM__or_warn { + my ($urpm, $md5sum_file, $basename) = @_; + $urpm->{log}(N("examining %s file", $md5sum_file)); + my $retrieved_md5sum = from_MD5SUM($md5sum_file, $basename) + or $urpm->{log}(N("warning: md5sum for %s unavailable in MD5SUM file", $basename)); + return $retrieved_md5sum; +} + +sub on_local_medium { + my ($urpm, $medium, $force) = @_; + if ($force) { + #- force downloading the file again, else why a force option has been defined ? + delete $medium->{md5sum}; + } else { + $medium->{md5sum} ||= compute_on_local_medium($urpm, $medium); + } + $medium->{md5sum}; +} + +sub compute_on_local_medium { + my ($urpm, $medium) = @_; + + require urpm; #- help perl_checker + my $f = urpm::statedir_hdlist_or_synthesis($urpm, $medium); + $urpm->{log}(N("computing md5sum of existing source hdlist (or synthesis) [%s]", $f)); + -e $f && compute($f); +} + +sub compute { + my ($file) = @_; + eval { require Digest::MD5 }; + if ($@) { + #- Use an external command to avoid depending on perl + return (split ' ', `/usr/bin/md5sum '$file'`)[0]; + } else { + my $ctx = Digest::MD5->new; + open my $fh, $file or return ''; + $ctx->addfile($fh); + close $fh; + return $ctx->hexdigest; + } +} + +1; |