From bc33e0f0b6b1fdb010dcd4a49a78b827530052aa Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Tue, 22 Feb 2011 12:50:47 +0100 Subject: * ftparchive/multicompress.cc, apt-inst/deb/debfile.cc: - support xz compressor to create xz-compressed Indexes and be able to open data.tar.xz files --- ftparchive/contents.cc | 6 +++++- ftparchive/multicompress.cc | 1 + 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'ftparchive') diff --git a/ftparchive/contents.cc b/ftparchive/contents.cc index b761d9204..9e283cf33 100644 --- a/ftparchive/contents.cc +++ b/ftparchive/contents.cc @@ -317,9 +317,13 @@ bool ContentsExtract::Read(debDebFile &Deb) Member = Deb.GotoMember("data.tar.lzma"); Compressor = "lzma"; } + if (Member == 0) { + Member = Deb.GotoMember("data.tar.xz"); + Compressor = "xz"; + } if (Member == 0) { _error->Error(_("Internal error, could not locate member %s"), - "data.tar.{gz,bz2,lzma}"); + "data.tar.{gz,bz2,lzma,xz}"); return false; } diff --git a/ftparchive/multicompress.cc b/ftparchive/multicompress.cc index bb4beedf9..c33414a11 100644 --- a/ftparchive/multicompress.cc +++ b/ftparchive/multicompress.cc @@ -35,6 +35,7 @@ const MultiCompress::CompType MultiCompress::Compressors[] = {"gzip",".gz","gzip","-9n","-d",2}, {"bzip2",".bz2","bzip2","-9","-d",3}, {"lzma",".lzma","lzma","-9","-d",4}, + {"xz",".xz","xz","-6","-d",5}, {}}; // MultiCompress::MultiCompress - Constructor /*{{{*/ -- cgit v1.2.3-70-g09d2 From cb12d0a677b63b6faeaefeda475c466d66fed212 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Tue, 22 Feb 2011 13:24:40 +0100 Subject: * ftparchive/writer.cc: - ensure that Date and Valid-Until time strings are not localised --- debian/changelog | 8 +++++++- ftparchive/writer.cc | 5 +++++ 2 files changed, 12 insertions(+), 1 deletion(-) (limited to 'ftparchive') diff --git a/debian/changelog b/debian/changelog index bb0b11147..4712e80c4 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,10 +1,16 @@ + apt (0.8.11.6) UNRELEASED; urgency=low + [ Christian Perrier ] * Fix error in French translation of manpages (apt_preferences(5)). Merci, Rémi Vanicat. Closes: #613689 * Complete French manpage translation - -- Christian Perrier Fri, 18 Feb 2011 05:53:49 +0100 + [ David Kalnischkies ] + * ftparchive/writer.cc: + - ensure that Date and Valid-Until time strings are not localised + + -- David Kalnischkies Tue, 22 Feb 2011 13:22:58 +0100 apt (0.8.11.5) unstable; urgency=low diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc index 9cdca8d3e..80ec61ab9 100644 --- a/ftparchive/writer.cc +++ b/ftparchive/writer.cc @@ -925,6 +925,9 @@ ReleaseWriter::ReleaseWriter(string const &DB) Output = stdout; time_t const now = time(NULL); + + setlocale(LC_TIME, "C"); + char datestr[128]; if (strftime(datestr, sizeof(datestr), "%a, %d %b %Y %H:%M:%S UTC", gmtime(&now)) == 0) @@ -941,6 +944,8 @@ ReleaseWriter::ReleaseWriter(string const &DB) validstr[0] = '\0'; } + setlocale(LC_TIME, ""); + map Fields; Fields["Origin"] = ""; Fields["Label"] = ""; -- cgit v1.2.3-70-g09d2 From 3c54407f8783d5e27363eabf41dbc3d031526ffe Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Tue, 22 Feb 2011 14:49:16 +0100 Subject: add options to disable specific checksums for Indexes --- debian/changelog | 4 +- doc/apt-ftparchive.1.xml | 11 ++-- ftparchive/apt-ftparchive.cc | 2 + ftparchive/writer.cc | 143 ++++++++++++++++++++++++++----------------- ftparchive/writer.h | 6 +- 5 files changed, 101 insertions(+), 65 deletions(-) (limited to 'ftparchive') diff --git a/debian/changelog b/debian/changelog index 4712e80c4..bbb973b8f 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,4 +1,3 @@ - apt (0.8.11.6) UNRELEASED; urgency=low [ Christian Perrier ] @@ -9,8 +8,9 @@ apt (0.8.11.6) UNRELEASED; urgency=low [ David Kalnischkies ] * ftparchive/writer.cc: - ensure that Date and Valid-Until time strings are not localised + - add options to disable specific checksums for Indexes - -- David Kalnischkies Tue, 22 Feb 2011 13:22:58 +0100 + -- David Kalnischkies Tue, 22 Feb 2011 14:48:21 +0100 apt (0.8.11.5) unstable; urgency=low diff --git a/doc/apt-ftparchive.1.xml b/doc/apt-ftparchive.1.xml index 0090d21d9..8e5df1f36 100644 --- a/doc/apt-ftparchive.1.xml +++ b/doc/apt-ftparchive.1.xml @@ -526,11 +526,14 @@ for i in Sections do &apt-cmdblurb; - + , , - Generate MD5 sums. This defaults to on, when turned off the generated - index files will not have MD5Sum fields where possible. - Configuration Item: APT::FTPArchive::MD5 + Generate the given checksum. These options default to on, when turned off the generated + index files will not have the checksum fields where possible. + Configuration Items: APT::FTPArchive::Checksum and + APT::FTPArchive::Index::Checksum where + Index can be Packages, Sources or Release and + Checksum can be MD5, SHA1 or SHA256. diff --git a/ftparchive/apt-ftparchive.cc b/ftparchive/apt-ftparchive.cc index 0c29002e6..0762a2b28 100644 --- a/ftparchive/apt-ftparchive.cc +++ b/ftparchive/apt-ftparchive.cc @@ -949,6 +949,8 @@ int main(int argc, const char *argv[]) CommandLine::Args Args[] = { {'h',"help","help",0}, {0,"md5","APT::FTPArchive::MD5",0}, + {0,"sha1","APT::FTPArchive::SHA1",0}, + {0,"sha256","APT::FTPArchive::SHA256",0}, {'v',"version","version",0}, {'d',"db","APT::FTPArchive::DB",CommandLine::HasArg}, {'s',"source-override","APT::FTPArchive::SourceOverride",CommandLine::HasArg}, diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc index 80ec61ab9..d3a19ca28 100644 --- a/ftparchive/writer.cc +++ b/ftparchive/writer.cc @@ -59,6 +59,10 @@ FTWScanner::FTWScanner(string const &Arch): Arch(Arch) { ErrorPrinted = false; NoLinkAct = !_config->FindB("APT::FTPArchive::DeLinkAct",true); + + DoMD5 = _config->FindB("APT::FTPArchive::MD5",true); + DoSHA1 = _config->FindB("APT::FTPArchive::SHA1",true); + DoSHA256 = _config->FindB("APT::FTPArchive::SHA256",true); } /*}}}*/ // FTWScanner::Scanner - FTW Scanner /*{{{*/ @@ -308,9 +312,9 @@ PackagesWriter::PackagesWriter(string const &DB,string const &Overrides,string c DeLinkLimit = 0; // Process the command line options - DoMD5 = _config->FindB("APT::FTPArchive::MD5",true); - DoSHA1 = _config->FindB("APT::FTPArchive::SHA1",true); - DoSHA256 = _config->FindB("APT::FTPArchive::SHA256",true); + DoMD5 = _config->FindB("APT::FTPArchive::Packages::MD5",DoMD5); + DoSHA1 = _config->FindB("APT::FTPArchive::Packages::SHA1",DoSHA1); + DoSHA256 = _config->FindB("APT::FTPArchive::Packages::SHA256",DoSHA256); DoAlwaysStat = _config->FindB("APT::FTPArchive::AlwaysStat", false); DoContents = _config->FindB("APT::FTPArchive::Contents",true); NoOverride = _config->FindB("APT::FTPArchive::NoOverrideMsg",false); @@ -435,9 +439,12 @@ bool PackagesWriter::DoPackage(string FileName) unsigned int End = 0; SetTFRewriteData(Changes[End++], "Size", Size); - SetTFRewriteData(Changes[End++], "MD5sum", Db.MD5Res.c_str()); - SetTFRewriteData(Changes[End++], "SHA1", Db.SHA1Res.c_str()); - SetTFRewriteData(Changes[End++], "SHA256", Db.SHA256Res.c_str()); + if (DoMD5 == true) + SetTFRewriteData(Changes[End++], "MD5sum", Db.MD5Res.c_str()); + if (DoSHA1 == true) + SetTFRewriteData(Changes[End++], "SHA1", Db.SHA1Res.c_str()); + if (DoSHA256 == true) + SetTFRewriteData(Changes[End++], "SHA256", Db.SHA256Res.c_str()); SetTFRewriteData(Changes[End++], "Filename", NewFileName.c_str()); SetTFRewriteData(Changes[End++], "Priority", OverItem->Priority.c_str()); SetTFRewriteData(Changes[End++], "Status", 0); @@ -559,6 +566,9 @@ SourcesWriter::SourcesWriter(string const &BOverrides,string const &SOverrides, BufSize = 0; // Process the command line options + DoMD5 = _config->FindB("APT::FTPArchive::Sources::MD5",DoMD5); + DoSHA1 = _config->FindB("APT::FTPArchive::Sources::SHA1",DoSHA1); + DoSHA256 = _config->FindB("APT::FTPArchive::Sources::SHA256",DoSHA256); NoOverride = _config->FindB("APT::FTPArchive::NoOverrideMsg",false); // Read the override file @@ -608,13 +618,17 @@ bool SourcesWriter::DoPackage(string FileName) // Hash the file char *Start = Buffer; char *BlkEnd = Buffer + St.st_size; - MD5Summation MD5; - MD5.Add((unsigned char *)Start,BlkEnd - Start); + MD5Summation MD5; SHA1Summation SHA1; SHA256Summation SHA256; - SHA1.Add((unsigned char *)Start,BlkEnd - Start); - SHA256.Add((unsigned char *)Start,BlkEnd - Start); + + if (DoMD5 == true) + MD5.Add((unsigned char *)Start,BlkEnd - Start); + if (DoSHA1 == true) + SHA1.Add((unsigned char *)Start,BlkEnd - Start); + if (DoSHA256 == true) + SHA256.Add((unsigned char *)Start,BlkEnd - Start); // Add an extra \n to the end, just in case *BlkEnd++ = '\n'; @@ -708,19 +722,19 @@ bool SourcesWriter::DoPackage(string FileName) // Add the dsc to the files hash list string const strippedName = flNotDir(FileName); std::ostringstream ostreamFiles; - if (Tags.Exists("Files")) + if (DoMD5 == true && Tags.Exists("Files")) ostreamFiles << "\n " << string(MD5.Result()) << " " << St.st_size << " " << strippedName << "\n " << Tags.FindS("Files"); string const Files = ostreamFiles.str(); std::ostringstream ostreamSha1; - if (Tags.Exists("Checksums-Sha1")) + if (DoSHA1 == true && Tags.Exists("Checksums-Sha1")) ostreamSha1 << "\n " << string(SHA1.Result()) << " " << St.st_size << " " << strippedName << "\n " << Tags.FindS("Checksums-Sha1"); string const ChecksumsSha1 = ostreamSha1.str(); std::ostringstream ostreamSha256; - if (Tags.Exists("Checksums-Sha256")) + if (DoSHA256 == true && Tags.Exists("Checksums-Sha256")) ostreamSha256 << "\n " << string(SHA256.Result()) << " " << St.st_size << " " << strippedName << "\n " << Tags.FindS("Checksums-Sha256"); string const ChecksumsSha256 = ostreamSha256.str(); @@ -774,9 +788,12 @@ bool SourcesWriter::DoPackage(string FileName) unsigned int End = 0; SetTFRewriteData(Changes[End++],"Source",Package.c_str(),"Package"); - SetTFRewriteData(Changes[End++],"Files",Files.c_str()); - SetTFRewriteData(Changes[End++],"Checksums-Sha1",ChecksumsSha1.c_str()); - SetTFRewriteData(Changes[End++],"Checksums-Sha256",ChecksumsSha256.c_str()); + if (Files.empty() == false) + SetTFRewriteData(Changes[End++],"Files",Files.c_str()); + if (ChecksumsSha1.empty() == false) + SetTFRewriteData(Changes[End++],"Checksums-Sha1",ChecksumsSha1.c_str()); + if (ChecksumsSha256.empty() == false) + SetTFRewriteData(Changes[End++],"Checksums-Sha256",ChecksumsSha256.c_str()); if (Directory != "./") SetTFRewriteData(Changes[End++],"Directory",Directory.c_str()); SetTFRewriteData(Changes[End++],"Priority",BestPrio.c_str()); @@ -969,6 +986,10 @@ ReleaseWriter::ReleaseWriter(string const &DB) fprintf(Output, "%s: %s\n", (*I).first.c_str(), Value.c_str()); } + + DoMD5 = _config->FindB("APT::FTPArchive::Release::MD5",DoMD5); + DoSHA1 = _config->FindB("APT::FTPArchive::Release::SHA1",DoSHA1); + DoSHA256 = _config->FindB("APT::FTPArchive::Release::SHA256",DoSHA256); } /*}}}*/ // ReleaseWriter::DoPackage - Process a single package /*{{{*/ @@ -1001,19 +1022,26 @@ bool ReleaseWriter::DoPackage(string FileName) CheckSums[NewFileName].size = fd.Size(); - MD5Summation MD5; - MD5.AddFD(fd.Fd(), fd.Size()); - CheckSums[NewFileName].MD5 = MD5.Result(); - - fd.Seek(0); - SHA1Summation SHA1; - SHA1.AddFD(fd.Fd(), fd.Size()); - CheckSums[NewFileName].SHA1 = SHA1.Result(); - - fd.Seek(0); - SHA256Summation SHA256; - SHA256.AddFD(fd.Fd(), fd.Size()); - CheckSums[NewFileName].SHA256 = SHA256.Result(); + if (DoMD5 == true) + { + MD5Summation MD5; + MD5.AddFD(fd.Fd(), fd.Size()); + CheckSums[NewFileName].MD5 = MD5.Result(); + fd.Seek(0); + } + if (DoSHA1 == true) + { + SHA1Summation SHA1; + SHA1.AddFD(fd.Fd(), fd.Size()); + CheckSums[NewFileName].SHA1 = SHA1.Result(); + fd.Seek(0); + } + if (DoSHA256 == true) + { + SHA256Summation SHA256; + SHA256.AddFD(fd.Fd(), fd.Size()); + CheckSums[NewFileName].SHA256 = SHA256.Result(); + } fd.Close(); @@ -1025,37 +1053,40 @@ bool ReleaseWriter::DoPackage(string FileName) // --------------------------------------------------------------------- void ReleaseWriter::Finish() { - fprintf(Output, "MD5Sum:\n"); - for(map::const_iterator I = CheckSums.begin(); - I != CheckSums.end(); - ++I) + if (DoMD5 == true) { - fprintf(Output, " %s %16ld %s\n", - (*I).second.MD5.c_str(), - (*I).second.size, - (*I).first.c_str()); + fprintf(Output, "MD5Sum:\n"); + for(map::const_iterator I = CheckSums.begin(); + I != CheckSums.end(); ++I) + { + fprintf(Output, " %s %16ld %s\n", + (*I).second.MD5.c_str(), + (*I).second.size, + (*I).first.c_str()); + } } - - fprintf(Output, "SHA1:\n"); - for(map::const_iterator I = CheckSums.begin(); - I != CheckSums.end(); - ++I) + if (DoSHA1 == true) { - fprintf(Output, " %s %16ld %s\n", - (*I).second.SHA1.c_str(), - (*I).second.size, - (*I).first.c_str()); + fprintf(Output, "SHA1:\n"); + for(map::const_iterator I = CheckSums.begin(); + I != CheckSums.end(); ++I) + { + fprintf(Output, " %s %16ld %s\n", + (*I).second.SHA1.c_str(), + (*I).second.size, + (*I).first.c_str()); + } } - - fprintf(Output, "SHA256:\n"); - for(map::const_iterator I = CheckSums.begin(); - I != CheckSums.end(); - ++I) + if (DoSHA256 == true) { - fprintf(Output, " %s %16ld %s\n", - (*I).second.SHA256.c_str(), - (*I).second.size, - (*I).first.c_str()); + fprintf(Output, "SHA256:\n"); + for(map::const_iterator I = CheckSums.begin(); + I != CheckSums.end(); ++I) + { + fprintf(Output, " %s %16ld %s\n", + (*I).second.SHA256.c_str(), + (*I).second.size, + (*I).first.c_str()); + } } } - diff --git a/ftparchive/writer.h b/ftparchive/writer.h index 3796f79f6..ce0eab7af 100644 --- a/ftparchive/writer.h +++ b/ftparchive/writer.h @@ -60,6 +60,9 @@ class FTWScanner } public: + bool DoMD5; + bool DoSHA1; + bool DoSHA256; unsigned long DeLinkLimit; string InternalPrefix; @@ -103,9 +106,6 @@ class PackagesWriter : public FTWScanner public: // Some flags - bool DoMD5; - bool DoSHA1; - bool DoSHA256; bool DoAlwaysStat; bool NoOverride; bool DoContents; -- cgit v1.2.3-70-g09d2 From cd5b597cc855a535b35e88324191931c54c6fba0 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Tue, 22 Feb 2011 14:52:10 +0100 Subject: * ftparchive/writer.cc: - include xz-compressed Packages and Sources files in Release file --- debian/changelog | 4 +++- ftparchive/writer.cc | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'ftparchive') diff --git a/debian/changelog b/debian/changelog index bf72e350d..ebea1dac8 100644 --- a/debian/changelog +++ b/debian/changelog @@ -16,8 +16,10 @@ apt (0.8.10.3+squeeze1) UNRELEASED; urgency=low * ftparchive/multicompress.cc, apt-inst/deb/debfile.cc: - support xz compressor to create xz-compressed Indexes and be able to open data.tar.xz files + * ftparchive/writer.cc: + - include xz-compressed Packages and Sources files in Release file - -- David Kalnischkies Tue, 22 Feb 2011 12:47:31 +0100 + -- David Kalnischkies Tue, 22 Feb 2011 14:51:32 +0100 apt (0.8.10.3) unstable; urgency=low diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc index d7d699ddc..086c44390 100644 --- a/ftparchive/writer.cc +++ b/ftparchive/writer.cc @@ -911,10 +911,12 @@ ReleaseWriter::ReleaseWriter(string const &DB) AddPattern("Packages.gz"); AddPattern("Packages.bz2"); AddPattern("Packages.lzma"); + AddPattern("Packages.xz"); AddPattern("Sources"); AddPattern("Sources.gz"); AddPattern("Sources.bz2"); AddPattern("Sources.lzma"); + AddPattern("Sources.xz"); AddPattern("Release"); AddPattern("md5sum.txt"); -- cgit v1.2.3-70-g09d2 From dc7eb288ff95230f9a0f81c6b3485b6b06802480 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Thu, 24 Feb 2011 12:24:51 +0100 Subject: * ftparchive/contents.cc: - remove ExtractArchive codecopy from apt-inst/deb/debfile.cc --- apt-inst/deb/debfile.cc | 2 +- debian/changelog | 4 +++- ftparchive/contents.cc | 31 +++---------------------------- 3 files changed, 7 insertions(+), 30 deletions(-) (limited to 'ftparchive') diff --git a/apt-inst/deb/debfile.cc b/apt-inst/deb/debfile.cc index edd78adbb..2b1fdedc8 100644 --- a/apt-inst/deb/debfile.cc +++ b/apt-inst/deb/debfile.cc @@ -143,7 +143,7 @@ bool debDebFile::ExtractArchive(pkgDirStream &Stream) Compressor = "xz"; } if (Member == 0) - return _error->Error(_("Internal error, could not locate member")); + return _error->Error(_("Internal error, could not locate member %s"), "data.tar.{gz,bz2,lzma,xz}"); if (File.Seek(Member->Start) == false) return false; diff --git a/debian/changelog b/debian/changelog index 64da21779..6b2c35baf 100644 --- a/debian/changelog +++ b/debian/changelog @@ -17,8 +17,10 @@ apt (0.8.11.6) UNRELEASED; urgency=low - support download of xz-compressed indexes files * apt-pkg/deb/debsrcrecords.cc: - support xz-compressed source v3 debian.tar files + * ftparchive/contents.cc: + - remove ExtractArchive codecopy from apt-inst/deb/debfile.cc - -- David Kalnischkies Tue, 22 Feb 2011 18:14:17 +0100 + -- David Kalnischkies Wed, 23 Feb 2011 09:00:51 +0100 apt (0.8.11.5) unstable; urgency=low diff --git a/ftparchive/contents.cc b/ftparchive/contents.cc index 9e283cf33..eadced626 100644 --- a/ftparchive/contents.cc +++ b/ftparchive/contents.cc @@ -36,12 +36,13 @@ #include "contents.h" #include +#include #include #include #include #include #include -#include +#include /*}}}*/ // GenContents::~GenContents - Free allocated memory /*{{{*/ @@ -305,33 +306,7 @@ void GenContents::DoPrint(FILE *Out,GenContents::Node *Top, char *Buf) bool ContentsExtract::Read(debDebFile &Deb) { Reset(); - - // Get the archive member and positition the file - const ARArchive::Member *Member = Deb.GotoMember("data.tar.gz"); - const char *Compressor = "gzip"; - if (Member == 0) { - Member = Deb.GotoMember("data.tar.bz2"); - Compressor = "bzip2"; - } - if (Member == 0) { - Member = Deb.GotoMember("data.tar.lzma"); - Compressor = "lzma"; - } - if (Member == 0) { - Member = Deb.GotoMember("data.tar.xz"); - Compressor = "xz"; - } - if (Member == 0) { - _error->Error(_("Internal error, could not locate member %s"), - "data.tar.{gz,bz2,lzma,xz}"); - return false; - } - - // Extract it. - ExtractTar Tar(Deb.GetFile(),Member->Size,Compressor); - if (Tar.Go(*this) == false) - return false; - return true; + return Deb.ExtractArchive(*this); } /*}}}*/ // ContentsExtract::DoItem - Extract an item /*{{{*/ -- cgit v1.2.3-70-g09d2 From 03bef78461c6f443187b60799402624326843396 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sun, 27 Feb 2011 23:01:40 +0100 Subject: - load the supported compressors from configuration - support adding new compressors by configuration --- apt-pkg/aptconfiguration.cc | 74 ++++++++++++++++++++++++++++++++++++++++++--- apt-pkg/aptconfiguration.h | 26 ++++++++++++++++ debian/changelog | 4 ++- ftparchive/multicompress.cc | 59 +++++++++++++++++------------------- ftparchive/multicompress.h | 21 +++---------- ftparchive/writer.cc | 1 + 6 files changed, 133 insertions(+), 52 deletions(-) (limited to 'ftparchive') diff --git a/apt-pkg/aptconfiguration.cc b/apt-pkg/aptconfiguration.cc index 9ded431e8..2a441fce7 100644 --- a/apt-pkg/aptconfiguration.cc +++ b/apt-pkg/aptconfiguration.cc @@ -42,10 +42,7 @@ const Configuration::getCompressionTypes(bool const &Cached) { _config->CndSet("Acquire::CompressionTypes::lzma","lzma"); _config->CndSet("Acquire::CompressionTypes::gz","gzip"); - // Set default application paths to check for optional compression types - _config->CndSet("Dir::Bin::lzma", "/usr/bin/lzma"); - _config->CndSet("Dir::Bin::xz", "/usr/bin/xz"); - _config->CndSet("Dir::Bin::bzip2", "/bin/bzip2"); + setDefaultConfigurationForCompressors(); // accept non-list order as override setting for config settings on commandline std::string const overrideOrder = _config->Find("Acquire::CompressionTypes::Order",""); @@ -346,4 +343,73 @@ bool const Configuration::checkArchitecture(std::string const &Arch) { return (std::find(archs.begin(), archs.end(), Arch) != archs.end()); } /*}}}*/ +// setDefaultConfigurationForCompressors /*{{{*/ +void Configuration::setDefaultConfigurationForCompressors() { + // Set default application paths to check for optional compression types + _config->CndSet("Dir::Bin::lzma", "/usr/bin/lzma"); + _config->CndSet("Dir::Bin::xz", "/usr/bin/xz"); + _config->CndSet("Dir::Bin::bzip2", "/bin/bzip2"); +} + /*}}}*/ +// getCompressors - Return Vector of usbale compressors /*{{{*/ +// --------------------------------------------------------------------- +/* return a vector of compressors used by apt-ftparchive in the + multicompress functionality or to detect data.tar files */ +std::vector +const Configuration::getCompressors(bool const Cached) { + static std::vector compressors; + if (compressors.empty() == false) { + if (Cached == true) + return compressors; + else + compressors.clear(); + } + + setDefaultConfigurationForCompressors(); + + compressors.push_back(Compressor(".", "", "", "", "", 1)); + if (_config->Exists("Dir::Bin::gzip") == false || FileExists(_config->FindFile("Dir::Bin::gzip")) == true) + compressors.push_back(Compressor("gzip",".gz","gzip","-9n","-d",2)); + if (_config->Exists("Dir::Bin::bzip2") == false || FileExists(_config->FindFile("Dir::Bin::bzip2")) == true) + compressors.push_back(Compressor("bzip2",".bz2","bzip2","-9","-d",3)); + if (_config->Exists("Dir::Bin::lzma") == false || FileExists(_config->FindFile("Dir::Bin::lzma")) == true) + compressors.push_back(Compressor("lzma",".lzma","lzma","-9","-d",4)); + if (_config->Exists("Dir::Bin::xz") == false || FileExists(_config->FindFile("Dir::Bin::xz")) == true) + compressors.push_back(Compressor("xz",".xz","xz","-6","-d",5)); + + std::vector const comp = _config->FindVector("APT::Compressor"); + for (std::vector::const_iterator c = comp.begin(); + c != comp.end(); ++c) { + if (*c == "." || *c == "gzip" || *c == "bzip2" || *c == "lzma" || *c == "xz") + continue; + compressors.push_back(Compressor(c->c_str(), std::string(".").append(*c).c_str(), c->c_str(), "-9", "-d", 100)); + } + + return compressors; +} + /*}}}*/ +// Compressor constructor /*{{{*/ +// --------------------------------------------------------------------- +/* */ +Configuration::Compressor::Compressor(char const *name, char const *extension, + char const *binary, + char const *compressArg, char const *uncompressArg, + unsigned short const cost) { + std::string const config = string("APT:Compressor::").append(name).append("::"); + Name = _config->Find(std::string(config).append("Name"), name); + Extension = _config->Find(std::string(config).append("Extension"), extension); + Binary = _config->Find(std::string(config).append("Binary"), binary); + Cost = _config->FindI(std::string(config).append("Cost"), cost); + std::string const compConf = std::string(config).append("CompressArg"); + if (_config->Exists(compConf) == true) + CompressArgs = _config->FindVector(compConf); + else if (compressArg != NULL) + CompressArgs.push_back(compressArg); + std::string const uncompConf = std::string(config).append("UncompressArg"); + if (_config->Exists(uncompConf) == true) + UncompressArgs = _config->FindVector(uncompConf); + else if (uncompressArg != NULL) + UncompressArgs.push_back(uncompressArg); +} + /*}}}*/ } diff --git a/apt-pkg/aptconfiguration.h b/apt-pkg/aptconfiguration.h index dd339d841..e4bc5e683 100644 --- a/apt-pkg/aptconfiguration.h +++ b/apt-pkg/aptconfiguration.h @@ -82,6 +82,32 @@ public: /*{{{*/ */ bool static const checkArchitecture(std::string const &Arch); + /** \brief Representation of supported compressors */ + struct Compressor { + std::string Name; + std::string Extension; + std::string Binary; + std::vector CompressArgs; + std::vector UncompressArgs; + unsigned short Cost; + + Compressor(char const *name, char const *extension, char const *binary, + char const *compressArg, char const *uncompressArg, + unsigned short const cost); + Compressor() {}; + }; + + /** \brief Return a vector of Compressors supported for data.tar's + * + * \param Cached saves the result so we need to calculated it only once + * this parameter should ony be used for testing purposes. + * + * \return a vector of Compressors + */ + std::vector static const getCompressors(bool const Cached = true); + /*}}}*/ + private: /*{{{*/ + void static setDefaultConfigurationForCompressors(); /*}}}*/ }; /*}}}*/ diff --git a/debian/changelog b/debian/changelog index 6b2c35baf..499150d52 100644 --- a/debian/changelog +++ b/debian/changelog @@ -9,18 +9,20 @@ apt (0.8.11.6) UNRELEASED; urgency=low * ftparchive/multicompress.cc, apt-inst/deb/debfile.cc: - support xz compressor to create xz-compressed Indexes and be able to open data.tar.xz files + - load the supported compressors from configuration * ftparchive/writer.cc: - ensure that Date and Valid-Until time strings are not localised - add options to disable specific checksums for Indexes - include xz-compressed Packages and Sources files in Release file * apt-pkg/aptconfiguration.cc: - support download of xz-compressed indexes files + - support adding new compressors by configuration * apt-pkg/deb/debsrcrecords.cc: - support xz-compressed source v3 debian.tar files * ftparchive/contents.cc: - remove ExtractArchive codecopy from apt-inst/deb/debfile.cc - -- David Kalnischkies Wed, 23 Feb 2011 09:00:51 +0100 + -- David Kalnischkies Sun, 27 Feb 2011 23:00:07 +0100 apt (0.8.11.5) unstable; urgency=low diff --git a/ftparchive/multicompress.cc b/ftparchive/multicompress.cc index c33414a11..f82879015 100644 --- a/ftparchive/multicompress.cc +++ b/ftparchive/multicompress.cc @@ -30,13 +30,6 @@ using namespace std; -const MultiCompress::CompType MultiCompress::Compressors[] = - {{".","",0,0,0,1}, - {"gzip",".gz","gzip","-9n","-d",2}, - {"bzip2",".bz2","bzip2","-9","-d",3}, - {"lzma",".lzma","lzma","-9","-d",4}, - {"xz",".xz","xz","-6","-d",5}, - {}}; // MultiCompress::MultiCompress - Constructor /*{{{*/ // --------------------------------------------------------------------- @@ -49,7 +42,7 @@ MultiCompress::MultiCompress(string const &Output,string const &Compress, Outputter = -1; Input = 0; UpdateMTime = 0; - + /* Parse the compression string, a space separated lists of compresison types */ string::const_iterator I = Compress.begin(); @@ -62,13 +55,14 @@ MultiCompress::MultiCompress(string const &Output,string const &Compress, for (; I != Compress.end() && !isspace(*I); I++); // Find the matching compressor - const CompType *Comp = Compressors; - for (; Comp->Name != 0; Comp++) - if (stringcmp(Start,I,Comp->Name) == 0) + std::vector Compressors = APT::Configuration::getCompressors(); + std::vector::const_iterator Comp = Compressors.begin(); + for (; Comp != Compressors.end(); ++Comp) + if (stringcmp(Start,I,Comp->Name.c_str()) == 0) break; // Hmm.. unknown. - if (Comp->Name == 0) + if (Comp == Compressors.end()) { _error->Warning(_("Unknown compression algorithm '%s'"),string(Start,I).c_str()); continue; @@ -78,7 +72,7 @@ MultiCompress::MultiCompress(string const &Output,string const &Compress, Files *NewOut = new Files; NewOut->Next = Outputs; Outputs = NewOut; - NewOut->CompressProg = Comp; + NewOut->CompressProg = *Comp; NewOut->Output = Output+Comp->Extension; struct stat St; @@ -142,13 +136,14 @@ bool MultiCompress::GetStat(string const &Output,string const &Compress,struct s for (; I != Compress.end() && !isspace(*I); I++); // Find the matching compressor - const CompType *Comp = Compressors; - for (; Comp->Name != 0; Comp++) - if (stringcmp(Start,I,Comp->Name) == 0) + std::vector Compressors = APT::Configuration::getCompressors(); + std::vector::const_iterator Comp = Compressors.begin(); + for (; Comp != Compressors.end(); ++Comp) + if (stringcmp(Start,I,Comp->Name.c_str()) == 0) break; // Hmm.. unknown. - if (Comp->Name == 0) + if (Comp == Compressors.end()) continue; string Name = Output+Comp->Extension; @@ -269,13 +264,13 @@ bool MultiCompress::Finalize(unsigned long &OutSize) /* This opens the compressor, either in compress mode or decompress mode. FileFd is always the compressor input/output file, OutFd is the created pipe, Input for Compress, Output for Decompress. */ -bool MultiCompress::OpenCompress(const CompType *Prog,pid_t &Pid,int const &FileFd, - int &OutFd,bool const &Comp) +bool MultiCompress::OpenCompress(APT::Configuration::Compressor const &Prog, + pid_t &Pid,int const &FileFd,int &OutFd,bool const &Comp) { Pid = -1; // No compression - if (Prog->Binary == 0) + if (Prog.Binary.empty() == true) { OutFd = dup(FileFd); return true; @@ -310,15 +305,17 @@ bool MultiCompress::OpenCompress(const CompType *Prog,pid_t &Pid,int const &File SetCloseExec(STDOUT_FILENO,false); SetCloseExec(STDIN_FILENO,false); - - const char *Args[3]; - Args[0] = Prog->Binary; - if (Comp == true) - Args[1] = Prog->CompArgs; - else - Args[1] = Prog->UnCompArgs; - Args[2] = 0; - execvp(Args[0],(char **)Args); + + std::vector Args; + Args.push_back(Prog.Binary.c_str()); + std::vector const * const addArgs = + (Comp == true) ? &(Prog.CompressArgs) : &(Prog.UncompressArgs); + for (std::vector::const_iterator a = addArgs->begin(); + a != addArgs->end(); ++a) + Args.push_back(a->c_str()); + Args.push_back(NULL); + + execvp(Args[0],(char **)&Args[0]); cerr << _("Failed to exec compressor ") << Args[0] << endl; _exit(100); }; @@ -336,7 +333,7 @@ bool MultiCompress::OpenOld(int &Fd,pid_t &Proc) { Files *Best = Outputs; for (Files *I = Outputs; I != 0; I = I->Next) - if (Best->CompressProg->Cost > I->CompressProg->Cost) + if (Best->CompressProg.Cost > I->CompressProg.Cost) Best = I; // Open the file @@ -415,7 +412,7 @@ bool MultiCompress::Child(int const &FD) for (Files *I = Outputs; I != 0; I = I->Next) { if (I->CompressProc != -1) - ExecWait(I->CompressProc,I->CompressProg->Binary,false); + ExecWait(I->CompressProc, I->CompressProg.Binary.c_str(), false); } if (_error->PendingError() == true) diff --git a/ftparchive/multicompress.h b/ftparchive/multicompress.h index 3ac3b8fb2..19dede174 100644 --- a/ftparchive/multicompress.h +++ b/ftparchive/multicompress.h @@ -20,28 +20,18 @@ #include #include +#include #include #include class MultiCompress { - // Enumeration of all supported compressors - struct CompType - { - const char *Name; - const char *Extension; - const char *Binary; - const char *CompArgs; - const char *UnCompArgs; - unsigned char Cost; - }; - // An output file struct Files { string Output; - const CompType *CompressProg; - Files *Next; + APT::Configuration::Compressor CompressProg; + Files *Next; FileFd TmpFile; pid_t CompressProc; time_t OldMTime; @@ -51,10 +41,9 @@ class MultiCompress Files *Outputs; pid_t Outputter; mode_t Permissions; - static const CompType Compressors[]; - bool OpenCompress(const CompType *Prog,pid_t &Pid,int const &FileFd, - int &OutFd,bool const &Comp); + bool OpenCompress(APT::Configuration::Compressor const &Prog, + pid_t &Pid,int const &FileFd, int &OutFd,bool const &Comp); bool Child(int const &Fd); bool Start(); bool Die(); diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc index 9462ebe27..9f12cbf3d 100644 --- a/ftparchive/writer.cc +++ b/ftparchive/writer.cc @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include -- cgit v1.2.3-70-g09d2