| line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
|
1
|
|
|
|
|
|
|
package Slackware::Slackget::Base; |
|
2
|
|
|
|
|
|
|
|
|
3
|
2
|
|
|
2
|
|
50151
|
use warnings; |
|
|
2
|
|
|
|
|
4
|
|
|
|
2
|
|
|
|
|
75
|
|
|
4
|
2
|
|
|
2
|
|
10
|
use strict; |
|
|
2
|
|
|
|
|
5
|
|
|
|
2
|
|
|
|
|
11169
|
|
|
5
|
|
|
|
|
|
|
|
|
6
|
|
|
|
|
|
|
require XML::Simple ; |
|
7
|
|
|
|
|
|
|
require Slackware::Slackget::PackageList; |
|
8
|
|
|
|
|
|
|
require Slackware::Slackget::Package; |
|
9
|
|
|
|
|
|
|
require Slackware::Slackget::File; |
|
10
|
|
|
|
|
|
|
require Slackware::Slackget::Media; |
|
11
|
|
|
|
|
|
|
require Slackware::Slackget::MediaList ; |
|
12
|
|
|
|
|
|
|
require Slackware::Slackget::Date ; |
|
13
|
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
|
|
15
|
|
|
|
|
|
|
=head1 NAME |
|
16
|
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
Slackware::Slackget::Base - A module which centralize some base methods usefull to slack-get |
|
18
|
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
=head1 VERSION |
|
20
|
|
|
|
|
|
|
|
|
21
|
|
|
|
|
|
|
Version 1.0.4 |
|
22
|
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
=cut |
|
24
|
|
|
|
|
|
|
|
|
25
|
|
|
|
|
|
|
our $VERSION = '1.0.4'; |
|
26
|
|
|
|
|
|
|
eval 'use XML::Parser'; |
|
27
|
|
|
|
|
|
|
if($@) { |
|
28
|
|
|
|
|
|
|
warn("XML::Parser is not installed. XML processing operations will be very slow.\n"); |
|
29
|
|
|
|
|
|
|
} else { |
|
30
|
|
|
|
|
|
|
$XML::Simple::PREFERRED_PARSER='XML::Parser' ; |
|
31
|
|
|
|
|
|
|
} |
|
32
|
|
|
|
|
|
|
|
|
33
|
|
|
|
|
|
|
|
|
34
|
|
|
|
|
|
|
=head1 SYNOPSIS |
|
35
|
|
|
|
|
|
|
|
|
36
|
|
|
|
|
|
|
This module centralize bases tasks like package directory compilation, etc. This class is mainly designed to be a wrapper so it can change a lot before the release. |
|
37
|
|
|
|
|
|
|
|
|
38
|
|
|
|
|
|
|
use Slackware::Slackget::Base; |
|
39
|
|
|
|
|
|
|
|
|
40
|
|
|
|
|
|
|
my $base = Slackware::Slackget::Base->new(); |
|
41
|
|
|
|
|
|
|
my $packagelist = $base->compil_packages_directory('/var/log/packages/'); |
|
42
|
|
|
|
|
|
|
$packagelist = $base->load_list_from_xml_file('installed.xml'); |
|
43
|
|
|
|
|
|
|
|
|
44
|
|
|
|
|
|
|
=cut |
|
45
|
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
sub new |
|
47
|
|
|
|
|
|
|
{ |
|
48
|
0
|
|
|
0
|
|
|
my ($class,$config) = @_ ; |
|
49
|
0
|
0
|
0
|
|
|
|
return undef if(!defined($config) or ref($config) ne 'Slackware::Slackget::Config') ; |
|
50
|
0
|
|
|
|
|
|
my $self = {CONF => $config}; |
|
51
|
0
|
|
|
|
|
|
bless($self,$class); |
|
52
|
0
|
|
|
|
|
|
return $self; |
|
53
|
|
|
|
|
|
|
} |
|
54
|
|
|
|
|
|
|
|
|
55
|
|
|
|
|
|
|
=head1 CONSTRUCTOR |
|
56
|
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
=head2 new |
|
58
|
|
|
|
|
|
|
|
|
59
|
|
|
|
|
|
|
Take no arguments. |
|
60
|
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
my $base = Slackware::Slackget::Base->new(); |
|
62
|
|
|
|
|
|
|
|
|
63
|
|
|
|
|
|
|
=head1 FUNCTIONS |
|
64
|
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
=cut |
|
66
|
|
|
|
|
|
|
|
|
67
|
|
|
|
|
|
|
=head2 ls |
|
68
|
|
|
|
|
|
|
|
|
69
|
|
|
|
|
|
|
take a directory as argument and return an array wich contain all things in this directory. |
|
70
|
|
|
|
|
|
|
|
|
71
|
|
|
|
|
|
|
my @config_files = $base->ls('/etc/slack-get/') ; |
|
72
|
|
|
|
|
|
|
|
|
73
|
|
|
|
|
|
|
=cut |
|
74
|
|
|
|
|
|
|
|
|
75
|
|
|
|
|
|
|
sub ls |
|
76
|
|
|
|
|
|
|
{ |
|
77
|
0
|
|
|
0
|
|
|
my $self = shift; |
|
78
|
0
|
|
|
|
|
|
my $dir = shift; |
|
79
|
0
|
0
|
|
|
|
|
if (! opendir( DIR, $dir) ) |
|
80
|
|
|
|
|
|
|
{ |
|
81
|
0
|
|
|
|
|
|
warn "unable to open $dir : $!."; |
|
82
|
0
|
|
|
|
|
|
return undef; |
|
83
|
|
|
|
|
|
|
} |
|
84
|
0
|
|
|
|
|
|
my @files = grep !/(?:^\.$)|(?:^\.\$)|(?:^\.\.)/, readdir DIR; |
|
85
|
0
|
|
|
|
|
|
closedir DIR; |
|
86
|
0
|
|
|
|
|
|
for(my $k=0; $k<=$#files;$k++) |
|
87
|
|
|
|
|
|
|
{ |
|
88
|
0
|
0
|
|
|
|
|
if($files[$k] !~ /^(\.\.|\.)$/) |
|
89
|
|
|
|
|
|
|
{ |
|
90
|
0
|
|
|
|
|
|
$files[$k] = $dir.'/'.$files[$k] ; |
|
91
|
|
|
|
|
|
|
} |
|
92
|
|
|
|
|
|
|
} |
|
93
|
0
|
|
|
|
|
|
return @files; |
|
94
|
|
|
|
|
|
|
} |
|
95
|
|
|
|
|
|
|
|
|
96
|
|
|
|
|
|
|
=head2 dir2files |
|
97
|
|
|
|
|
|
|
|
|
98
|
|
|
|
|
|
|
take at leat one directory in argument and recursively follow all subdirectories. Return an array containing all files encounter but WITHOUT symblic links. |
|
99
|
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
my @config_files = $base->dir2files('/etc','/usr/local/etc', "/$ENV{HOME}/etc/") ; |
|
101
|
|
|
|
|
|
|
|
|
102
|
|
|
|
|
|
|
=cut |
|
103
|
|
|
|
|
|
|
|
|
104
|
|
|
|
|
|
|
sub dir2files |
|
105
|
|
|
|
|
|
|
{ |
|
106
|
0
|
|
|
0
|
|
|
my $self = shift; |
|
107
|
0
|
|
|
|
|
|
my @f_files = (); |
|
108
|
|
|
|
|
|
|
|
|
109
|
0
|
|
|
|
|
|
foreach my $a (@_) |
|
110
|
|
|
|
|
|
|
{ |
|
111
|
|
|
|
|
|
|
# print STDERR "[DEBUG] [dir2files] treating $a\n"; |
|
112
|
0
|
0
|
0
|
|
|
|
unless(-d $a or -l $a) |
|
113
|
|
|
|
|
|
|
{ |
|
114
|
|
|
|
|
|
|
# print STDERR "\t[DEBUG] [dir2files] file $a is not a directory nor a symlink, pushing on files stack\n"; |
|
115
|
0
|
|
|
|
|
|
push @f_files,$a; |
|
116
|
|
|
|
|
|
|
} |
|
117
|
|
|
|
|
|
|
else |
|
118
|
|
|
|
|
|
|
{ |
|
119
|
|
|
|
|
|
|
# print STDERR "\t[DEBUG] [dir2files] file $a is a directory or a symlink\n"; |
|
120
|
0
|
0
|
|
|
|
|
unless(-l $a) |
|
121
|
|
|
|
|
|
|
{ |
|
122
|
|
|
|
|
|
|
# print STDERR "\t[DEBUG] [dir2files] file $a is a directory : recurse\n"; |
|
123
|
0
|
|
|
|
|
|
@f_files = (@f_files,$self->dir2files($self->ls($a))); |
|
124
|
|
|
|
|
|
|
} |
|
125
|
|
|
|
|
|
|
# else |
|
126
|
|
|
|
|
|
|
# { |
|
127
|
|
|
|
|
|
|
# print "\t[dir2files] $a is a symlink\n"; |
|
128
|
|
|
|
|
|
|
# } |
|
129
|
|
|
|
|
|
|
} |
|
130
|
|
|
|
|
|
|
} |
|
131
|
0
|
|
|
|
|
|
return @f_files; |
|
132
|
|
|
|
|
|
|
} |
|
133
|
|
|
|
|
|
|
|
|
134
|
|
|
|
|
|
|
=head2 compil_packages_directory |
|
135
|
|
|
|
|
|
|
|
|
136
|
|
|
|
|
|
|
take a directory where are store installed packages files and return a Slackware::Slackget::PackageList object |
|
137
|
|
|
|
|
|
|
|
|
138
|
|
|
|
|
|
|
my $packagelist = $base->compil_packages_directory('/var/log/packages/'); |
|
139
|
|
|
|
|
|
|
|
|
140
|
|
|
|
|
|
|
=cut |
|
141
|
|
|
|
|
|
|
|
|
142
|
|
|
|
|
|
|
sub compil_packages_directory |
|
143
|
|
|
|
|
|
|
{ |
|
144
|
0
|
|
|
0
|
|
|
my ($self,$dir,$packagelist) = @_; |
|
145
|
|
|
|
|
|
|
# print STDERR "[DEBUG] [compil_packages_directory] getting the following packages list : \"$packagelist\"\n"; |
|
146
|
|
|
|
|
|
|
# print STDERR "[DEBUG] [compil_packages_directory] compiling directory \"$dir\"\n"; |
|
147
|
0
|
|
|
|
|
|
my @files = $self->dir2files($dir); |
|
148
|
0
|
|
|
|
|
|
$|=1; |
|
149
|
|
|
|
|
|
|
# print STDERR "[DEBUG] number of entry in files array : ",scalar(@files),"\n"; |
|
150
|
|
|
|
|
|
|
# print STDERR "[DEBUG] entry in \@files :\n",join "\n",@files,"\n"; |
|
151
|
0
|
|
|
|
|
|
my $ref; |
|
152
|
0
|
0
|
|
|
|
|
if($packagelist) |
|
153
|
|
|
|
|
|
|
{ |
|
154
|
0
|
|
|
|
|
|
my $tmp_packagelist = new Slackware::Slackget::PackageList('encoding'=>$self->{CONF}->{common}->{'file-encoding'}); |
|
155
|
0
|
|
|
|
|
|
while (defined(my $p = $packagelist->Shift())) |
|
156
|
|
|
|
|
|
|
{ |
|
157
|
|
|
|
|
|
|
# print "treat : $p (",$p->get_id(),")\n"; |
|
158
|
|
|
|
|
|
|
# ; |
|
159
|
0
|
0
|
0
|
|
|
|
if(defined($p) && -e $self->{CONF}->{common}->{'packages-history-dir'}.'/'.$p->get_id()) |
|
160
|
|
|
|
|
|
|
{ |
|
161
|
|
|
|
|
|
|
# print "adding $p\n"; |
|
162
|
0
|
|
|
|
|
|
$tmp_packagelist->add( $p ); |
|
163
|
|
|
|
|
|
|
} |
|
164
|
|
|
|
|
|
|
} |
|
165
|
0
|
|
|
|
|
|
$tmp_packagelist->index_list ; |
|
166
|
0
|
|
|
|
|
|
$packagelist=$tmp_packagelist; |
|
167
|
|
|
|
|
|
|
} |
|
168
|
|
|
|
|
|
|
# print join(' :: ', $packagelist->get_indexes()); |
|
169
|
0
|
0
|
|
|
|
|
$packagelist = new Slackware::Slackget::PackageList('encoding'=>$self->{CONF}->{common}->{'file-encoding'}) unless($packagelist); |
|
170
|
0
|
0
|
|
|
|
|
if(scalar(@files) < 1){ |
|
171
|
0
|
|
|
|
|
|
warn "The directory \"$dir\" is empty or contains no packages.\n" ; |
|
172
|
0
|
|
|
|
|
|
return $packagelist; |
|
173
|
|
|
|
|
|
|
} |
|
174
|
|
|
|
|
|
|
# print STDERR "Slackware::Slackget::PackageList reference : $packagelist\n"; |
|
175
|
0
|
|
|
|
|
|
my $pg_idx=0; |
|
176
|
0
|
|
|
|
|
|
my $mark = int(scalar(@files)/20); |
|
177
|
0
|
|
|
|
|
|
my $msg = "[slack-get] compiling $dir (1 mark = $mark packages) : ["; |
|
178
|
0
|
|
|
|
|
|
printf($msg); |
|
179
|
0
|
|
|
|
|
|
print " "x20 ; |
|
180
|
0
|
|
|
|
|
|
my $pstr= '0 %'; |
|
181
|
0
|
|
|
|
|
|
print "] $pstr"; |
|
182
|
0
|
|
|
|
|
|
my $mark_idx=0; |
|
183
|
0
|
|
|
|
|
|
my $percent_idx=0; |
|
184
|
0
|
|
|
|
|
|
foreach (@files) |
|
185
|
|
|
|
|
|
|
{ |
|
186
|
|
|
|
|
|
|
# NOTE: The system call is very slow compared to the built-in regular expressions ;) |
|
187
|
|
|
|
|
|
|
# $_ = `basename $_`; |
|
188
|
|
|
|
|
|
|
# chomp; |
|
189
|
0
|
|
|
|
|
|
$_ =~ /^.*\/([^\/]*)$/; |
|
190
|
|
|
|
|
|
|
#my $file_md5 = `LC_ALL=C md5sum $_ | awk '{print \$1}'`; |
|
191
|
|
|
|
|
|
|
#chomp($file_md5); |
|
192
|
|
|
|
|
|
|
# print "searching if $1 is already indexed in the list : ",$packagelist->get_indexed($_),"\n"; |
|
193
|
0
|
0
|
|
|
|
|
if(!defined($packagelist->get_indexed($1)) )#or ($packagelist->get_indexed($_)->getValue('package-file-checksum') ne $file_md5)) |
|
194
|
|
|
|
|
|
|
{ |
|
195
|
|
|
|
|
|
|
# print STDERR "[DEBUG] in Slackware::Slackget::Base, method compil_packages_directory file-encoding=$self->{CONF}->{common}->{'file-encoding'}\n"; |
|
196
|
0
|
|
|
|
|
|
my $sg_file = new Slackware::Slackget::File ($_,'file-encoding' => $self->{CONF}->{common}->{'file-encoding'}) ; |
|
197
|
0
|
0
|
|
|
|
|
die $! unless $sg_file; |
|
198
|
0
|
|
|
|
|
|
my @file = $sg_file->Get_file(); |
|
199
|
|
|
|
|
|
|
|
|
200
|
|
|
|
|
|
|
# print STDERR "[DEBUG] instanciate new package : \"$1\"\n"; |
|
201
|
0
|
|
|
|
|
|
$ref->{$1}= new Slackware::Slackget::Package ($1); |
|
202
|
0
|
0
|
|
|
|
|
next unless($ref->{$1}) ; |
|
203
|
|
|
|
|
|
|
# print STDERR "[DEBUG] package reference is $ref->{$1}\n"; |
|
204
|
0
|
|
|
|
|
|
my $pack = $ref->{$1}; |
|
205
|
0
|
|
|
|
|
|
for(my $k=0;$k<=$#file;$k++) |
|
206
|
|
|
|
|
|
|
{ |
|
207
|
|
|
|
|
|
|
# NOTE: trying to fix a bug reporting by Adi Spivak |
|
208
|
0
|
0
|
|
|
|
|
next if(!defined($file[$k])); |
|
209
|
0
|
0
|
|
|
|
|
if($file[$k] =~ /^PACKAGE NAME:\s+(.*)$/) |
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
210
|
|
|
|
|
|
|
{ |
|
211
|
0
|
|
|
|
|
|
my $name = $1; |
|
212
|
0
|
0
|
0
|
|
|
|
unless(defined($pack->getValue('name')) or defined($pack->getValue('version')) or defined($pack->getValue('architecture')) or defined($pack->getValue('package-version'))) |
|
|
|
|
0
|
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
213
|
|
|
|
|
|
|
{ |
|
214
|
|
|
|
|
|
|
# print STDERR "[DEBUG] Package forced to be renamed.\n"; |
|
215
|
0
|
|
|
|
|
|
$pack->_setId($name); |
|
216
|
0
|
|
|
|
|
|
$pack->fill_object_from_package_name(); |
|
217
|
|
|
|
|
|
|
} |
|
218
|
|
|
|
|
|
|
|
|
219
|
|
|
|
|
|
|
} |
|
220
|
|
|
|
|
|
|
elsif($file[$k] =~ /^COMPRESSED PACKAGE SIZE:\s+(.*) K$/) |
|
221
|
|
|
|
|
|
|
{ |
|
222
|
|
|
|
|
|
|
# print STDERR "[DEBUG] setting param 'compressed-size' to $1\n"; |
|
223
|
0
|
|
|
|
|
|
$pack->set_value('compressed-size',$1); |
|
224
|
|
|
|
|
|
|
} |
|
225
|
|
|
|
|
|
|
elsif($file[$k] =~ /^UNCOMPRESSED PACKAGE SIZE:\s+(.*) K$/) |
|
226
|
|
|
|
|
|
|
{ |
|
227
|
|
|
|
|
|
|
# print STDERR "[DEBUG] setting param 'uncompressed-size' to $1\n"; |
|
228
|
0
|
|
|
|
|
|
$pack->set_value('uncompressed-size',$1); |
|
229
|
|
|
|
|
|
|
} |
|
230
|
|
|
|
|
|
|
elsif($file[$k] =~ /^PACKAGE LOCATION:\s+(.*) K$/) |
|
231
|
|
|
|
|
|
|
{ |
|
232
|
|
|
|
|
|
|
# print STDERR "[DEBUG] setting param 'location' to $1\n"; |
|
233
|
0
|
|
|
|
|
|
$pack->set_value('location',$1); |
|
234
|
|
|
|
|
|
|
} |
|
235
|
|
|
|
|
|
|
elsif($file[$k]=~/PACKAGE DESCRIPTION:/) |
|
236
|
|
|
|
|
|
|
{ |
|
237
|
0
|
|
|
|
|
|
my $tmp = ""; |
|
238
|
0
|
|
|
|
|
|
$k++; |
|
239
|
0
|
|
0
|
|
|
|
while($file[$k]!~/FILE LIST:/ or $file[$k]!~/\.\//) |
|
240
|
|
|
|
|
|
|
{ |
|
241
|
|
|
|
|
|
|
# NOTE: this line was originally added to fix the bug reported by Adi Spivak but it doesn't work well |
|
242
|
0
|
0
|
0
|
|
|
|
last if(!defined($file[$k]) or $file[$k]=~ /^\.\//); |
|
243
|
0
|
0
|
|
|
|
|
$tmp .= "\t\t\t$file[$k]" if( $file[$k] !~ /FILE\s*LIST\s*:\s*/); |
|
244
|
0
|
|
|
|
|
|
$k++; |
|
245
|
|
|
|
|
|
|
} |
|
246
|
|
|
|
|
|
|
# print STDERR "[DEBUG] setting param 'description' to $tmp\n"; |
|
247
|
0
|
|
|
|
|
|
$pack->set_value('description',"$tmp\n\t\t"); |
|
248
|
|
|
|
|
|
|
### NOTE: On my system, with 586 packages installed the difference between with or without including the file list is very important |
|
249
|
|
|
|
|
|
|
### NOTE: with the file list the installed.xml file size is near 11 MB |
|
250
|
|
|
|
|
|
|
### NOTE: without the file list, the size is only 400 KB !! |
|
251
|
|
|
|
|
|
|
### NOTE: So I have decided that the file list is not include by default |
|
252
|
0
|
0
|
|
|
|
|
if(defined($self->{'include-file-list'})) |
|
253
|
|
|
|
|
|
|
{ |
|
254
|
0
|
|
|
|
|
|
$pack->set_value('file-list',join("\t\t\t",@file[($k+1)..$#file])."\n\t\t"); |
|
255
|
|
|
|
|
|
|
} |
|
256
|
0
|
|
|
|
|
|
last; |
|
257
|
|
|
|
|
|
|
} |
|
258
|
|
|
|
|
|
|
} |
|
259
|
|
|
|
|
|
|
# print STDERR "[DEBUG] calling Slackware::Slackget::Package->clean_description() on package $pack\n"; |
|
260
|
0
|
|
|
|
|
|
$pack->clean_description(); |
|
261
|
|
|
|
|
|
|
# print STDERR "[DEBUG] calling Slackware::Slackget::Package->grab_info_from_description() on package $pack\n"; |
|
262
|
0
|
|
|
|
|
|
$pack->grab_info_from_description(); |
|
263
|
|
|
|
|
|
|
# $pack->set_value('package-file-checksum',$file_md5); |
|
264
|
|
|
|
|
|
|
# print STDERR "[DEBUG] calling Slackware::Slackget::PackageList->add() on package $pack\n"; |
|
265
|
0
|
|
|
|
|
|
$packagelist->add($pack); |
|
266
|
0
|
|
|
|
|
|
$sg_file->Close(); |
|
267
|
|
|
|
|
|
|
|
|
268
|
|
|
|
|
|
|
} |
|
269
|
|
|
|
|
|
|
# else |
|
270
|
|
|
|
|
|
|
# { |
|
271
|
|
|
|
|
|
|
# print STDERR "[DEBUG] package $_ skipped (already in cache)\n"; |
|
272
|
|
|
|
|
|
|
# } |
|
273
|
0
|
|
|
|
|
|
$pg_idx++; |
|
274
|
0
|
|
|
|
|
|
$percent_idx++; |
|
275
|
0
|
|
|
|
|
|
print "\b" x length($pstr); |
|
276
|
0
|
|
|
|
|
|
$pstr = $percent_idx/scalar(@files) * 100; |
|
277
|
0
|
|
|
|
|
|
$pstr =~ /^([^\.]+)/; |
|
278
|
0
|
|
|
|
|
|
$pstr = $1 ; |
|
279
|
0
|
|
|
|
|
|
$pstr .= " %"; |
|
280
|
0
|
|
|
|
|
|
print $pstr; |
|
281
|
0
|
0
|
|
|
|
|
if($pg_idx == $mark) |
|
282
|
|
|
|
|
|
|
{ |
|
283
|
0
|
|
|
|
|
|
$mark_idx++; |
|
284
|
0
|
|
|
|
|
|
print "\b"x (40 + length($msg)); |
|
285
|
0
|
|
|
|
|
|
print $msg; |
|
286
|
0
|
|
|
|
|
|
print '#' x $mark_idx; |
|
287
|
0
|
|
|
|
|
|
print ' ' x (20 - $mark_idx); |
|
288
|
0
|
|
|
|
|
|
print "] $pstr"; |
|
289
|
0
|
|
|
|
|
|
$pg_idx=0; |
|
290
|
|
|
|
|
|
|
} |
|
291
|
|
|
|
|
|
|
} |
|
292
|
0
|
|
|
|
|
|
print " (",scalar(@files)," packages examined)\n"; |
|
293
|
0
|
|
|
|
|
|
return $packagelist; |
|
294
|
|
|
|
|
|
|
} |
|
295
|
|
|
|
|
|
|
|
|
296
|
|
|
|
|
|
|
|
|
297
|
|
|
|
|
|
|
=head2 load_installed_list_from_xml_file |
|
298
|
|
|
|
|
|
|
|
|
299
|
|
|
|
|
|
|
Load the data for filling the list from an XML file. Return a Slackware::Slackget::PackageList. This method is design for reading a installed.xml file. |
|
300
|
|
|
|
|
|
|
|
|
301
|
|
|
|
|
|
|
$packagelist = $base->load_installed_list_from_xml_file('installed.xml'); |
|
302
|
|
|
|
|
|
|
|
|
303
|
|
|
|
|
|
|
=cut |
|
304
|
|
|
|
|
|
|
|
|
305
|
|
|
|
|
|
|
sub load_installed_list_from_xml_file { |
|
306
|
0
|
|
|
0
|
|
|
my ($self,$file) = @_; |
|
307
|
0
|
|
|
|
|
|
my $package_list = new Slackware::Slackget::PackageList ; |
|
308
|
0
|
|
|
|
|
|
my $xml_in = XML::Simple::XMLin($file,KeyAttr => {'package' => 'id'}); |
|
309
|
0
|
|
|
|
|
|
foreach my $pack_name (keys(%{$xml_in->{'package'}})){ |
|
|
0
|
|
|
|
|
|
|
|
310
|
0
|
|
|
|
|
|
my $package = new Slackware::Slackget::Package ($pack_name); |
|
311
|
0
|
|
|
|
|
|
foreach my $key (keys(%{$xml_in->{'package'}->{$pack_name}})){ |
|
|
0
|
|
|
|
|
|
|
|
312
|
0
|
|
|
|
|
|
$package->set_value($key,$xml_in->{'package'}->{$pack_name}->{$key}) ; |
|
313
|
|
|
|
|
|
|
} |
|
314
|
0
|
|
|
|
|
|
$package_list->add($package); |
|
315
|
|
|
|
|
|
|
} |
|
316
|
0
|
|
|
|
|
|
return $package_list; |
|
317
|
|
|
|
|
|
|
} |
|
318
|
|
|
|
|
|
|
|
|
319
|
|
|
|
|
|
|
|
|
320
|
|
|
|
|
|
|
=head2 load_packages_list_from_xml_file |
|
321
|
|
|
|
|
|
|
|
|
322
|
|
|
|
|
|
|
Load the data for filling the list from an XML file. Return a hashref built on this model : |
|
323
|
|
|
|
|
|
|
|
|
324
|
|
|
|
|
|
|
my $hashref = { |
|
325
|
|
|
|
|
|
|
'key' => Slackware::Slackget::PackageList, |
|
326
|
|
|
|
|
|
|
... |
|
327
|
|
|
|
|
|
|
}; |
|
328
|
|
|
|
|
|
|
|
|
329
|
|
|
|
|
|
|
Ex: |
|
330
|
|
|
|
|
|
|
|
|
331
|
|
|
|
|
|
|
my $hashref = { |
|
332
|
|
|
|
|
|
|
'slackware' => blessed(Slackware::Slackget::PackageList), |
|
333
|
|
|
|
|
|
|
'slacky' => blessed(Slackware::Slackget::PackageList), |
|
334
|
|
|
|
|
|
|
'audioslack' => blessed(Slackware::Slackget::PackageList), |
|
335
|
|
|
|
|
|
|
'linuxpackages' => blessed(Slackware::Slackget::PackageList), |
|
336
|
|
|
|
|
|
|
}; |
|
337
|
|
|
|
|
|
|
|
|
338
|
|
|
|
|
|
|
This method is design for reading a packages.xml file. |
|
339
|
|
|
|
|
|
|
|
|
340
|
|
|
|
|
|
|
$hashref = $base->load_packages_list_from_xml_file('packages.xml'); |
|
341
|
|
|
|
|
|
|
|
|
342
|
|
|
|
|
|
|
=cut |
|
343
|
|
|
|
|
|
|
|
|
344
|
|
|
|
|
|
|
sub load_packages_list_from_xml_file { |
|
345
|
0
|
|
|
0
|
|
|
my ($self,$file) = @_; |
|
346
|
0
|
|
|
|
|
|
my $ref = {}; |
|
347
|
0
|
|
|
|
|
|
my $start = time(); |
|
348
|
0
|
|
|
|
|
|
$|=1 ; |
|
349
|
|
|
|
|
|
|
# print "[DEBUG Slackware::Slackget::Base->load_packages_list_from_xml_file()] Going to parse '$file'\n"; |
|
350
|
0
|
|
|
|
|
|
print "[slack-get] loading packages list..."; |
|
351
|
0
|
|
|
|
|
|
$XML::Simple::PREFERRED_PARSER='XML::Parser' ; |
|
352
|
0
|
|
|
|
|
|
my $xml_in = XML::Simple::XMLin($file,KeyAttr => {'package' => 'id'}, ForceArray => ['dependencies','dependency','required','suggested']); |
|
353
|
0
|
|
|
|
|
|
print "ok (loaded in ", time() - $start," sec.)\n"; |
|
354
|
|
|
|
|
|
|
# print "[DEBUG Slackware::Slackget::Base->load_packages_list_from_xml_file()] '$file' correctly parsed in ", time() - $start," sec.\n" ; |
|
355
|
0
|
|
|
|
|
|
foreach my $group (keys(%{$xml_in})){ |
|
|
0
|
|
|
|
|
|
|
|
356
|
0
|
|
|
|
|
|
my $package_list = new Slackware::Slackget::PackageList ; |
|
357
|
0
|
|
|
|
|
|
foreach my $pack_name (keys(%{$xml_in->{$group}->{'package'}})){ |
|
|
0
|
|
|
|
|
|
|
|
358
|
0
|
|
|
|
|
|
my $package = new Slackware::Slackget::Package ($pack_name); |
|
359
|
0
|
|
|
|
|
|
foreach my $key (keys(%{$xml_in->{$group}->{'package'}->{$pack_name}})){ |
|
|
0
|
|
|
|
|
|
|
|
360
|
0
|
0
|
|
|
|
|
if($key eq 'date') |
|
361
|
|
|
|
|
|
|
{ |
|
362
|
0
|
|
|
|
|
|
$package->set_value($key,Slackware::Slackget::Date->new(%{$xml_in->{$group}->{'package'}->{$pack_name}->{$key}})); |
|
|
0
|
|
|
|
|
|
|
|
363
|
|
|
|
|
|
|
} |
|
364
|
|
|
|
|
|
|
else |
|
365
|
|
|
|
|
|
|
{ |
|
366
|
0
|
|
|
|
|
|
$package->set_value($key,$xml_in->{$group}->{'package'}->{$pack_name}->{$key}) ; |
|
367
|
|
|
|
|
|
|
} |
|
368
|
|
|
|
|
|
|
|
|
369
|
|
|
|
|
|
|
} |
|
370
|
0
|
|
|
|
|
|
$package_list->add($package); |
|
371
|
|
|
|
|
|
|
} |
|
372
|
0
|
|
|
|
|
|
$ref->{$group} = $package_list; |
|
373
|
|
|
|
|
|
|
} |
|
374
|
0
|
|
|
|
|
|
return $ref; |
|
375
|
|
|
|
|
|
|
} |
|
376
|
|
|
|
|
|
|
|
|
377
|
|
|
|
|
|
|
|
|
378
|
|
|
|
|
|
|
=head2 load_media_list_from_xml_file |
|
379
|
|
|
|
|
|
|
|
|
380
|
|
|
|
|
|
|
Load a server list from a medias.xml file. |
|
381
|
|
|
|
|
|
|
|
|
382
|
|
|
|
|
|
|
$serverlist = $base->load_server_list_from_xml_file('servers.xml'); |
|
383
|
|
|
|
|
|
|
|
|
384
|
|
|
|
|
|
|
=cut |
|
385
|
|
|
|
|
|
|
|
|
386
|
|
|
|
|
|
|
sub load_media_list_from_xml_file { |
|
387
|
0
|
|
|
0
|
|
|
my ($self,$file) = @_; |
|
388
|
0
|
|
|
|
|
|
print "[slack-get] loading media file : $file\n"; |
|
389
|
0
|
|
|
|
|
|
my $server_list = new Slackware::Slackget::MediaList ; |
|
390
|
0
|
|
|
|
|
|
my $xml_in = XML::Simple::XMLin($file,KeyAttr => {'media' => 'id'}); |
|
391
|
|
|
|
|
|
|
# require Data::Dumper ; |
|
392
|
|
|
|
|
|
|
# print Data::Dumper::Dumper($xml_in); |
|
393
|
0
|
|
|
|
|
|
foreach my $server_name (keys(%{$xml_in->{'media'}})){ |
|
|
0
|
|
|
|
|
|
|
|
394
|
0
|
|
|
|
|
|
my $server = new Slackware::Slackget::Media ($server_name); |
|
395
|
0
|
|
|
|
|
|
$server->fill_object_from_xml( $xml_in->{media}->{$server_name} ); |
|
396
|
|
|
|
|
|
|
# $server->print_info ;print "\n\n"; |
|
397
|
0
|
|
|
|
|
|
$server_list->add($server); |
|
398
|
|
|
|
|
|
|
} |
|
399
|
0
|
|
|
|
|
|
return $server_list; |
|
400
|
|
|
|
|
|
|
} |
|
401
|
|
|
|
|
|
|
|
|
402
|
|
|
|
|
|
|
=head2 load_server_list_from_xml_file |
|
403
|
|
|
|
|
|
|
|
|
404
|
|
|
|
|
|
|
An allias for load_media_list_from_xml_file(). Given for backward compatibility |
|
405
|
|
|
|
|
|
|
|
|
406
|
|
|
|
|
|
|
=cut |
|
407
|
|
|
|
|
|
|
|
|
408
|
|
|
|
|
|
|
sub load_server_list_from_xml_file{ |
|
409
|
0
|
|
|
0
|
|
|
my ($self,$file) = @_; |
|
410
|
0
|
|
|
|
|
|
$self->load_media_list_from_xml_file($file); |
|
411
|
|
|
|
|
|
|
} |
|
412
|
|
|
|
|
|
|
|
|
413
|
|
|
|
|
|
|
|
|
414
|
|
|
|
|
|
|
=head2 set_include_file_list |
|
415
|
|
|
|
|
|
|
|
|
416
|
|
|
|
|
|
|
By default the file list is not include in the installed.xml for some size consideration (on my system including the file list into installed.xml make him grow 28 times ! It passed from 400 KB to 11 MB), |
|
417
|
|
|
|
|
|
|
|
|
418
|
|
|
|
|
|
|
So you can use this method to include the file list into installed.xml. BE carefull, to use it BEFORE compil_packages_directory() ! |
|
419
|
|
|
|
|
|
|
|
|
420
|
|
|
|
|
|
|
$base->set_include_file_list(); |
|
421
|
|
|
|
|
|
|
$packagelist = $base->compil_packages_directory(); |
|
422
|
|
|
|
|
|
|
|
|
423
|
|
|
|
|
|
|
=cut |
|
424
|
|
|
|
|
|
|
|
|
425
|
|
|
|
|
|
|
sub set_include_file_list{ |
|
426
|
0
|
|
|
0
|
|
|
my $self = shift; |
|
427
|
0
|
|
|
|
|
|
$self->{'include-file-list'} = 1; |
|
428
|
|
|
|
|
|
|
} |
|
429
|
|
|
|
|
|
|
|
|
430
|
|
|
|
|
|
|
=head2 ldd |
|
431
|
|
|
|
|
|
|
|
|
432
|
|
|
|
|
|
|
Like the UNIX command ldd. Do a ldd system call on a list of files and return an array of dependencies. |
|
433
|
|
|
|
|
|
|
|
|
434
|
|
|
|
|
|
|
my @dependecies = $base->ldd('/usr/bin/gcc', '/usr/bin/perl', '/bin/awk') ; |
|
435
|
|
|
|
|
|
|
|
|
436
|
|
|
|
|
|
|
=cut |
|
437
|
|
|
|
|
|
|
|
|
438
|
|
|
|
|
|
|
sub ldd |
|
439
|
|
|
|
|
|
|
{ |
|
440
|
0
|
|
|
0
|
|
|
my $self = shift ; |
|
441
|
0
|
|
|
|
|
|
my @dep = (); |
|
442
|
0
|
|
|
|
|
|
foreach (@_) |
|
443
|
|
|
|
|
|
|
{ |
|
444
|
0
|
|
|
|
|
|
foreach my $l (`ldd $_`) |
|
445
|
|
|
|
|
|
|
{ |
|
446
|
0
|
0
|
|
|
|
|
if($l=~ /^\s*([^\s]*)\s*=>.*/) # linux-gate.so.1 => (0xffffe000) : we only want linux-gate.so.1 |
|
447
|
|
|
|
|
|
|
{ |
|
448
|
0
|
|
|
|
|
|
push @dep,$1 ; |
|
449
|
|
|
|
|
|
|
} |
|
450
|
|
|
|
|
|
|
} |
|
451
|
|
|
|
|
|
|
} |
|
452
|
0
|
|
|
|
|
|
return @dep; |
|
453
|
|
|
|
|
|
|
} |
|
454
|
|
|
|
|
|
|
|
|
455
|
|
|
|
|
|
|
=head1 AUTHOR |
|
456
|
|
|
|
|
|
|
|
|
457
|
|
|
|
|
|
|
DUPUIS Arnaud, C<< >> |
|
458
|
|
|
|
|
|
|
|
|
459
|
|
|
|
|
|
|
=head1 BUGS |
|
460
|
|
|
|
|
|
|
|
|
461
|
|
|
|
|
|
|
Please report any bugs or feature requests to |
|
462
|
|
|
|
|
|
|
C, or through the web interface at |
|
463
|
|
|
|
|
|
|
L. |
|
464
|
|
|
|
|
|
|
I will be notified, and then you'll automatically be notified of progress on |
|
465
|
|
|
|
|
|
|
your bug as I make changes. |
|
466
|
|
|
|
|
|
|
|
|
467
|
|
|
|
|
|
|
=head1 SUPPORT |
|
468
|
|
|
|
|
|
|
|
|
469
|
|
|
|
|
|
|
You can find documentation for this module with the perldoc command. |
|
470
|
|
|
|
|
|
|
|
|
471
|
|
|
|
|
|
|
perldoc Slackware-Slackget |
|
472
|
|
|
|
|
|
|
|
|
473
|
|
|
|
|
|
|
|
|
474
|
|
|
|
|
|
|
You can also look for information at: |
|
475
|
|
|
|
|
|
|
|
|
476
|
|
|
|
|
|
|
=over 4 |
|
477
|
|
|
|
|
|
|
|
|
478
|
|
|
|
|
|
|
=item * Infinity Perl website |
|
479
|
|
|
|
|
|
|
|
|
480
|
|
|
|
|
|
|
L |
|
481
|
|
|
|
|
|
|
|
|
482
|
|
|
|
|
|
|
=item * slack-get specific website |
|
483
|
|
|
|
|
|
|
|
|
484
|
|
|
|
|
|
|
L |
|
485
|
|
|
|
|
|
|
|
|
486
|
|
|
|
|
|
|
=item * RT: CPAN's request tracker |
|
487
|
|
|
|
|
|
|
|
|
488
|
|
|
|
|
|
|
L |
|
489
|
|
|
|
|
|
|
|
|
490
|
|
|
|
|
|
|
=item * AnnoCPAN: Annotated CPAN documentation |
|
491
|
|
|
|
|
|
|
|
|
492
|
|
|
|
|
|
|
L |
|
493
|
|
|
|
|
|
|
|
|
494
|
|
|
|
|
|
|
=item * CPAN Ratings |
|
495
|
|
|
|
|
|
|
|
|
496
|
|
|
|
|
|
|
L |
|
497
|
|
|
|
|
|
|
|
|
498
|
|
|
|
|
|
|
=item * Search CPAN |
|
499
|
|
|
|
|
|
|
|
|
500
|
|
|
|
|
|
|
L |
|
501
|
|
|
|
|
|
|
|
|
502
|
|
|
|
|
|
|
=back |
|
503
|
|
|
|
|
|
|
|
|
504
|
|
|
|
|
|
|
=head1 ACKNOWLEDGEMENTS |
|
505
|
|
|
|
|
|
|
|
|
506
|
|
|
|
|
|
|
=head1 COPYRIGHT & LICENSE |
|
507
|
|
|
|
|
|
|
|
|
508
|
|
|
|
|
|
|
Copyright 2005 DUPUIS Arnaud, All Rights Reserved. |
|
509
|
|
|
|
|
|
|
|
|
510
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify it |
|
511
|
|
|
|
|
|
|
under the same terms as Perl itself. |
|
512
|
|
|
|
|
|
|
|
|
513
|
|
|
|
|
|
|
=cut |
|
514
|
|
|
|
|
|
|
|
|
515
|
|
|
|
|
|
|
1; # End of Slackware::Slackget::Base |