125
=item get_deb_member_list
127
Helper method. Pass it the name of the deb and it will return the list of
132
sub get_deb_member_list {
134
my $file=$this->filename;
135
my $members=$this->deb_member_list;
137
unless (defined $members) {
138
$members = [ map { chomp; $_ } $this->runpipe(1, "ar -t '$file'") ];
139
$this->deb_member_list($members);
120
145
=item getcontrolfile
122
147
Helper method. Pass it the name of a control file, and it will pull it out
142
167
" tar xf - './$file' &&".
143
168
" cat '$file'; cd /; rm -rf /tmp/tar_out.$$)";
145
my $getcontrol = "ar -p '$file' control.tar.gz | gzip -dc | ".tar_out($controlfile)." 2>/dev/null";
171
my $controlmember = first { /^control\.tar/ }
172
$this->get_deb_member_list;
173
if (! defined $controlmember) {
174
die 'Cannot find control member!';
175
} elsif ($controlmember eq 'control.tar.gz') {
176
$controlcomp = 'gzip -dc';
177
} elsif ($controlmember eq 'control.tar.xz') {
178
$controlcomp = 'xz -dc';
179
} elsif ($controlmember eq 'control.tar') {
180
$controlcomp = 'cat';
182
die 'Unknown control member!';
184
my $getcontrol = "ar -p '$file' $controlmember | $controlcomp | ".tar_out($controlfile)." 2>/dev/null";
146
185
return $this->runpipe(1, $getcontrol);
189
=item get_datamember_cmd
191
Helper method. Pass it the name of the deb and it will return the raw
192
command needed to extract the data.tar member.
196
sub get_datamember_cmd {
198
my $file=$this->filename;
201
my $datamember = first { /^data\.tar/ }
202
$this->get_deb_member_list;
203
if (! defined $datamember) {
204
die 'Cannot find data member!';
205
} elsif ($datamember eq 'data.tar.gz') {
206
$datacomp = 'gzip -dc';
207
} elsif ($datamember eq 'data.tar.bz2') {
208
$datacomp = 'bzip2 -dc';
209
} elsif ($datamember eq 'data.tar.xz') {
210
$datacomp = 'xz -dc';
211
} elsif ($datamember eq 'data.tar.lzma') {
212
$datacomp = 'xz -dc';
213
} elsif ($datamember eq 'data.tar') {
216
die 'Unknown data member!';
219
return "ar -p '$file' $datamember | $datacomp";
152
224
Implement the scan method to read a deb file.
210
282
# Read in the list of all files.
211
283
# Note that tar doesn't supply a leading '/', so we have to add that.
213
285
if ($this->have_dpkg_deb) {
214
@filelist=map { chomp; s:\./::; "/$_" }
215
$this->runpipe(0, "dpkg-deb --fsys-tarfile '$file' | tar tf -");
286
$datamember_cmd = "dpkg-deb --fsys-tarfile '$file'";
218
@filelist=map { chomp; s:\./::; "/$_" }
219
$this->runpipe(0, "ar -p '$file' data.tar.gz | gzip -dc | tar tf -");
289
$datamember_cmd = $this->get_datamember_cmd($file);
291
my @filelist=map { chomp; s:\./::; "/$_" }
292
$this->runpipe(0, "$datamember_cmd | tar tf -");
221
293
$this->filelist(\@filelist);
223
295
# Read in the scripts, if any.
244
316
or die "Unpacking of '$file' failed: $!";
247
$this->do("ar -p $file data.tar.gz | gzip -dc | (cd ".$this->unpacked_tree."; tar xpf -)")
319
my $datamember_cmd = $this->get_datamember_cmd($file);
321
$this->do("$datamember_cmd | (cd ".$this->unpacked_tree."; tar xpf -)")
248
322
or die "Unpacking of '$file' failed: $!";