Add ZIP archive format and LZMA compress support to libarchive-wrapper

This will be needed to use cmArchiveWrire in cmCPackArchiveGenerator
with the same feature set as before. Note that adding zip
support to libarchive-wrapper would also makes it easy to add
a new -E zip command to cmake commands.
This commit is contained in:
Eric NOULARD 2010-08-13 17:49:47 +02:00
parent 4663356079
commit b50c15915a
3 changed files with 52 additions and 7 deletions

View File

@ -47,7 +47,7 @@ struct cmArchiveWrite::Callback
};
//----------------------------------------------------------------------------
cmArchiveWrite::cmArchiveWrite(std::ostream& os, Compress c):
cmArchiveWrite::cmArchiveWrite(std::ostream& os, Compress c, Type t):
Stream(os),
Archive(archive_write_new()),
Disk(archive_read_disk_new()),
@ -79,11 +79,47 @@ cmArchiveWrite::cmArchiveWrite(std::ostream& os, Compress c):
return;
}
break;
case CompressLZMA:
if(archive_write_set_compression_lzma(this->Archive) != ARCHIVE_OK)
{
this->Error = "archive_write_set_compression_lzma: ";
this->Error += archive_error_string(this->Archive);
return;
}
break;
};
archive_read_disk_set_standard_lookup(this->Disk);
if(archive_write_set_format_pax_restricted(this->Archive) != ARCHIVE_OK)
#if !defined(_WIN32) || defined(__CYGWIN__)
if (archive_read_disk_set_standard_lookup(this->Disk) != ARCHIVE_OK)
{
this->Error = "archive_write_set_format_pax_restricted: ";
this->Error = "archive_read_disk_set_standard_lookup: ";
this->Error += archive_error_string(this->Archive);
return;;
}
#endif
switch (t)
{
case TypeZIP:
if(archive_write_set_format_zip(this->Archive) != ARCHIVE_OK)
{
this->Error = "archive_write_set_format_zip: ";
this->Error += archive_error_string(this->Archive);
return;
}
break;
case TypeTAR:
if(archive_write_set_format_pax_restricted(this->Archive) != ARCHIVE_OK)
{
this->Error = "archive_write_set_format_pax_restricted: ";
this->Error += archive_error_string(this->Archive);
return;
}
break;
}
// do not pad the last block!!
if (archive_write_set_bytes_in_last_block(this->Archive, 1))
{
this->Error = "archive_write_set_bytes_in_last_block: ";
this->Error += archive_error_string(this->Archive);
return;
}

View File

@ -32,11 +32,19 @@ public:
{
CompressNone,
CompressGZip,
CompressBZip2
CompressBZip2,
CompressLZMA
};
/** Archive Type */
enum Type
{
TypeTAR,
TypeZIP
};
/** Construct with output stream to which to write archive. */
cmArchiveWrite(std::ostream& os, Compress c = CompressNone);
cmArchiveWrite(std::ostream& os, Compress c = CompressNone, Type = TypeTAR);
~cmArchiveWrite();
/**

View File

@ -1732,7 +1732,8 @@ bool cmSystemTools::CreateTar(const char* outFileName,
}
cmArchiveWrite a(fout, (gzip? cmArchiveWrite::CompressGZip :
(bzip2? cmArchiveWrite::CompressBZip2 :
cmArchiveWrite::CompressNone)));
cmArchiveWrite::CompressNone)),
cmArchiveWrite::TypeTAR);
a.SetVerbose(verbose);
for(std::vector<cmStdString>::const_iterator i = files.begin();
i != files.end(); ++i)