diff options
author | Brad King <brad.king@kitware.com> | 2010-08-17 19:20:32 (GMT) |
---|---|---|
committer | CMake Topic Stage <kwrobot@kitware.com> | 2010-08-17 19:20:32 (GMT) |
commit | ab90916638b8f000d9e55624f9ef891c9fc0e6da (patch) | |
tree | e76c5c09746a6adcdb76cd83aa46d9fd867655ee | |
parent | 30f676c75fa9d7177698d7ea03da0e17b83ca01e (diff) | |
parent | fb41da4a6b648966e518cbe388b82bcde74f038e (diff) | |
download | CMake-ab90916638b8f000d9e55624f9ef891c9fc0e6da.zip CMake-ab90916638b8f000d9e55624f9ef891c9fc0e6da.tar.gz CMake-ab90916638b8f000d9e55624f9ef891c9fc0e6da.tar.bz2 |
Merge topic 'libarchive-wrapper'
fb41da4 Add Compress compress support to libarchive-wrapper
1a3ad5c Add XZ compress support to libarchive-wrapper
b50c159 Add ZIP archive format and LZMA compress support to libarchive-wrapper
4663356 cmArchiveWrite: Fix signed/unsigned again
-rw-r--r-- | Source/cmArchiveWrite.cxx | 74 | ||||
-rw-r--r-- | Source/cmArchiveWrite.h | 14 | ||||
-rw-r--r-- | Source/cmSystemTools.cxx | 3 |
3 files changed, 77 insertions, 14 deletions
diff --git a/Source/cmArchiveWrite.cxx b/Source/cmArchiveWrite.cxx index 88874aa..d9e4742 100644 --- a/Source/cmArchiveWrite.cxx +++ b/Source/cmArchiveWrite.cxx @@ -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()), @@ -63,6 +63,14 @@ cmArchiveWrite::cmArchiveWrite(std::ostream& os, Compress c): return; } break; + case CompressCompress: + if(archive_write_set_compression_compress(this->Archive) != ARCHIVE_OK) + { + this->Error = "archive_write_set_compression_compress: "; + this->Error += archive_error_string(this->Archive); + return; + } + break; case CompressGZip: if(archive_write_set_compression_gzip(this->Archive) != ARCHIVE_OK) { @@ -79,11 +87,55 @@ 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; + case CompressXZ: + if(archive_write_set_compression_xz(this->Archive) != ARCHIVE_OK) + { + this->Error = "archive_write_set_compression_xz: "; + 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_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_format_pax_restricted: "; + this->Error = "archive_write_set_bytes_in_last_block: "; this->Error += archive_error_string(this->Archive); return; } @@ -216,24 +268,24 @@ bool cmArchiveWrite::AddData(const char* file, size_t size) size_t nleft = size; while(nleft > 0) { - cmsys_ios::streamsize nnext = static_cast<cmsys_ios::streamsize>( - nleft > sizeof(buffer)? sizeof(buffer) : nleft); - fin.read(buffer, nnext); + typedef cmsys_ios::streamsize ssize_type; + size_t const nnext = nleft > sizeof(buffer)? sizeof(buffer) : nleft; + ssize_type const nnext_s = static_cast<ssize_type>(nnext); + fin.read(buffer, nnext_s); // Some stream libraries (older HPUX) return failure at end of // file on the last read even if some data were read. Check // gcount instead of trusting the stream error status. - if(fin.gcount() != nnext) + if(static_cast<size_t>(fin.gcount()) != nnext) { break; } - if(archive_write_data(this->Archive, buffer, - static_cast<size_t>(nnext)) != nnext) + if(archive_write_data(this->Archive, buffer, nnext) != nnext_s) { this->Error = "archive_write_data: "; this->Error += archive_error_string(this->Archive); return false; } - nleft -= static_cast<size_t>(nnext); + nleft -= nnext; } if(nleft > 0) { diff --git a/Source/cmArchiveWrite.h b/Source/cmArchiveWrite.h index 92c0c73..3e3b2f0 100644 --- a/Source/cmArchiveWrite.h +++ b/Source/cmArchiveWrite.h @@ -31,12 +31,22 @@ public: enum Compress { CompressNone, + CompressCompress, CompressGZip, - CompressBZip2 + CompressBZip2, + CompressLZMA, + CompressXZ + }; + + /** 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(); /** diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index a26452c..0e0a770 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -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) |