File Coverage

blib/lib/MDV/Distribconf/Utils.pm
Criterion Covered Total %
statement 61 68 89.7
branch 14 22 63.6
condition 12 19 63.1
subroutine 7 7 100.0
pod 2 2 100.0
total 96 118 81.3


line stmt bran cond sub pod time code
1             package MDV::Distribconf::Utils;
2              
3 3     3   24 use strict;
  3         6  
  3         92  
4 3     3   16 use warnings;
  3         7  
  3         88  
5 3     3   34 use MDV::Packdrakeng;
  3         7  
  3         104  
6 3     3   26 use Digest::MD5;
  3         6  
  3         104  
7 3     3   3946 use Devel::Peek;
  3         1273  
  3         18  
8              
9             our ($VERSION) = (qq$Revision$ =~ /(\d+)/)[0];
10              
11             =head1 NAME
12              
13             MDV::Distribconf::Utils
14              
15             =head1 DESCRIPTION
16              
17             Contains basic functions used by Distribconf
18              
19             =head1 FUNCTIONS
20              
21             =head2 hdlist_vs_dir($hdlistfile, @dirs)
22              
23             Return two arrayrefs about rpms included only in hdlist or in directories
24              
25             =cut
26              
27             sub hdlist_vs_dir {
28 2     2 1 9 my ($hdlist, @dir) = @_;
29 2         9 my (@only_pack, @only_dir);
30 2         0 my @rpms;
31 2         5 foreach my $dir (@dir) {
32 2         269 push(@rpms, glob("$dir/*.rpm"));
33             }
34 2         18 @rpms = sort { ($b =~ m:.*/+(.*):)[0] cmp ($a =~ m:([^/]+)$:)[0] } @rpms;
  2         34  
35 2 50 33     60 if (-f $hdlist and my $pack = MDV::Packdrakeng->open(archive => $hdlist)) {
36 2         61954 my $hdlisttime = (stat($hdlist))[9];
37 2         28 my (undef, $files, undef) = $pack->getcontent();
38 2 50       66 my @hdrs = sort { $b cmp $a } map { "$_.rpm" } @{$files || []};
  1         4  
  2         11  
  2         8  
39 2         7 my ($r, $h) = ("", "");
40 2   100     4 do {
41 4   100     32 my $base_r = ($r =~ m:([^/]+)$:)[0] || '';
42 4         8 my $comp = ($base_r cmp $h);
43 4 100       41 my $st_d = $r ? (stat($r))[9] : 0;
44 4 50 33     35 if ($comp < 0 || !defined($st_d)) { push(@only_pack, $h); }
  0 100 66     0  
    50          
45 1         4 elsif ($comp > 0) { push(@only_dir, $base_r); }
46             elsif ($r && ($st_d > $hdlisttime)) {
47 0         0 push(@only_pack, $h);
48 0         0 push(@only_dir, ($r =~ m:.*/+(.*):)[0]);
49             }
50              
51 4 100       12 if ($comp <= 0) {
52 3   100     11 $h = shift(@hdrs) || '';
53             }
54 4 50       11 if ($comp >= 0) {
55 4   50     23 $r = shift(@rpms) || '';
56             }
57             } while (scalar(@rpms) || scalar(@hdrs));
58             } else {
59 0         0 return(undef, [ map { m:.*/+(.*):; $1 } @rpms ]);
  0         0  
  0         0  
60             }
61 2         16 return (\@only_pack, \@only_dir);
62             }
63              
64             =head2 checkmd5($md5file, @files)
65              
66             Return an array ref to unsync file found and a hashref containing
67             files and their found md5.
68              
69             =cut
70              
71             sub checkmd5 {
72 2     2 1 9 my ($md5file, @files) = @_;
73 2         5 my %foundmd5;
74 2         5 foreach my $file (@files) {
75 4         26 my ($basename) = $file =~ m:.*/+([^/]*)$:; #: vi syntax coloring
76 4 50       174 if (open(my $hfile, "<", $file)) {
77 4         36 my $ctx = Digest::MD5->new;
78 4         90 $ctx->addfile($hfile);
79 4         37 close($hfile);
80 4         51 $foundmd5{$basename} = $ctx->hexdigest;
81             } else {
82 0         0 $foundmd5{$basename} = '';
83             }
84             }
85 2 50       73 open(my $hmd5, "<", $md5file) or return([ keys %foundmd5 ], \%foundmd5);
86 2         7 my %md5;
87 2         30 while (<$hmd5>) {
88 4         10 chomp;
89 4         9 s/#.*//;
90 4 50       22 /^(.{32}) (.*)/ or next;
91 4         34 $md5{$2} = $1;
92             }
93 2         19 close($hmd5);
94 2   50     12 my @badfiles = grep { $foundmd5{$_} ne ($md5{$_} || '') } keys %foundmd5;
  4         18  
95 2         16 return (\@badfiles, \%foundmd5);
96             }
97              
98             1;
99              
100             __END__