Package: debpool Severity: wishlist Tags: patch Attached is a patch that lets debpool handle bzip2 compression in addition to gzip, and in fact any number of compression algorithms in a dynamical fashion (could come in handy when somebody wants lzma support).
Attached are also a rewritten Gzip module and a new Bzip2 module, both implementing the simple OO interface needed (rewriting Gzip.pm to use Compress::Zlib is actually a separate matter, but the relevant subroutines (new, Compress_File, Error, and Name) can simply be copied to the existing Gzip.pm). I've omitted the trivial addition to Config.pm. -- Magnus Holmgren [EMAIL PROTECTED]
Gzip.pm
Description: application/perl-module
Bzip2.pm
Description: application/perl-module
--- debpool-0.2.3/bin/debpool +++ debpool-0.2.4/bin/debpool 2007-03-19 16:33:46.363875256 +0100 @@ -89,11 +89,21 @@ use DebPool::Dirs qw(:functions :vars); # Directory management use DebPool::DB qw(:functions :vars); # Various databases use DebPool::GnuPG qw(:functions :vars); # GnuPG interaction routines -use DebPool::Gzip qw(:functions :vars); # Gzip interaction routines use DebPool::Logging qw(:functions :facility :level); # Logging routines use DebPool::Packages qw(:functions :vars); # Distribution databases use DebPool::Signal qw(:functions :vars); # Handle signals +my @compression_methods; + +if ($Options{'compress_dists'}) { + require DebPool::Gzip; # Gzip interaction routines + push @compression_methods, new DebPool::Gzip; +} +if ($Options{'bzcompress_dists'}) { + require DebPool::Bzip2; # Bzip2 interaction routines + push @compression_methods, new DebPool::Bzip2; +} + # Before we do anything else, let's find out if we need to act as a daemon, # and if so, whether we can manage to pull it off. @@ -446,19 +456,21 @@ # If we're compressing distribution files, do that here. - my($gzfile); - if ($Options{'compress_dists'}) { - $gzfile = Gzip_File($file); - - if (!defined($gzfile)) { - my($msg) = "Couldn't create compressed file: "; - $msg .= $DebPool::Gzip::Error; - Log_Message($msg, LOG_GENERAL, LOG_ERROR); + my @zfiles; - unlink($file); - next; - } - } + foreach my $method (@compression_methods) { + my $zfile = $method->Compress_File($file); + + if (!defined($zfile)) { + my($msg) = "Couldn't create compressed file ("; + $msg .= $method->Name . "): "; + $msg .= $method->Error; + Log_Message($msg, LOG_GENERAL, LOG_ERROR); + unlink($file, @zfiles); + next ARCH_LOOP; + } + push @zfiles, $zfile; + } # If we're doing Release files, now is the time for triples. @@ -479,10 +491,7 @@ $msg .= $DebPool::Release::Error; Log_Message($msg, LOG_GENERAL, LOG_ERROR); - unlink($file); - if (defined($gzfile)) { - unlink($gzfile); - } + unlink($file, @zfiles); next; } @@ -494,11 +503,7 @@ $msg .= $DebPool::GnuPG::Error; Log_Message($msg, LOG_GENERAL, LOG_ERROR); - unlink($file); - - if (defined($gzfile)) { - unlink($gzfile); - } + unlink($file, @zfiles); if (defined($relfile)) { unlink($relfile); @@ -511,7 +516,7 @@ # Install {Packages,Sources}{,.gz} - if (!Install_List(@triple, $file, $gzfile)) { + if (!Install_List(@triple, $file, @zfiles)) { my($msg) = "Couldn't install distribution files for "; $msg .= "$dist/$section/${arch}: " . $DebPool::Packages::Error; @@ -521,8 +526,8 @@ unlink($file); } - if (defined($gzfile) && -e $gzfile) { - unlink($gzfile); + foreach (@zfiles) { + unlink if -e; } if (defined($relfile) && -e $relfile) { @@ -560,8 +565,9 @@ $pushfile =~ s/${dist}\///; push(@rel_filelist, $pushfile); - if (defined($gzfile)) { - push(@rel_filelist, $pushfile . '.gz'); + foreach (@zfiles) { + my ($ext) = m{\.([^/]+)$}; # List context! + push(@rel_filelist, "${pushfile}.${ext}"); } if (defined($relfile)) { --- debpool-0.2.3/share/DebPool/Packages.pm +++ debpool-0.2.4/share/DebPool/Packages.pm 2007-03-19 16:36:01.181347481 +0100 @@ -1192,7 +1192,7 @@ use DebPool::Config qw(:vars); use DebPool::Dirs qw(:functions); - my($archive, $component, $architecture, $listfile, $gzfile) = @_; + my($archive, $component, $architecture, $listfile, @zfiles) = @_; my($dists_file_mode) = $Options{'dists_file_mode'}; my($inst_file) = "$Options{'dists_dir'}/"; @@ -1206,11 +1206,14 @@ return 0; } - if (defined($gzfile) && !Move_File($gzfile, "${inst_file}.gz", + foreach my $zfile (@zfiles) { + my ($ext) = $zfile =~ m{\.([^/]+)$}; + if (!Move_File($zfile, "${inst_file}.${ext}", $dists_file_mode)) { - $Error = "Couldn't install gzipped distribution file '$gzfile' "; - $Error .= "to '${inst_file}.gz': ${DebPool::Util::Error}"; - return 0; + $Error = "Couldn't install compressed distribution file '$zfile' "; + $Error .= "to '${inst_file}${ext}': ${DebPool::Util::Error}"; + return 0; + } } return 1; --- debpool-0.2.3/share/DebPool/Release.pm +++ debpool-0.2.4/share/DebPool/Release.pm 2007-03-18 09:35:22.779559043 +0100 @@ -93,6 +93,8 @@ 'Sources', 'Packages.gz', 'Sources.gz', + 'Packages.bz2', + 'Sources.bz2', ); ### File lexicals
pgpvImgJNkIm4.pgp
Description: PGP signature