summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrad King <brad.king@kitware.com>2010-08-17 19:20:32 (GMT)
committerCMake Topic Stage <kwrobot@kitware.com>2010-08-17 19:20:32 (GMT)
commitab90916638b8f000d9e55624f9ef891c9fc0e6da (patch)
treee76c5c09746a6adcdb76cd83aa46d9fd867655ee
parent30f676c75fa9d7177698d7ea03da0e17b83ca01e (diff)
parentfb41da4a6b648966e518cbe388b82bcde74f038e (diff)
downloadCMake-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.cxx74
-rw-r--r--Source/cmArchiveWrite.h14
-rw-r--r--Source/cmSystemTools.cxx3
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)