mirror of
https://github.com/Kitware/CMake.git
synced 2026-01-04 12:49:36 -06:00
cmake: Distinguish '-E tar' warnings from errors copying data
The logic added by commit v3.12.0-rc1~62^2 (cmake: Teach '-E tar' to report errors copying data, 2018-05-16) incorrectly reports failure in the case of ARCHIVE_WARN. Convert this case to a warning. Fixes: #18496
This commit is contained in:
@@ -1703,6 +1703,32 @@ void list_item_verbose(FILE* out, struct archive_entry* entry)
|
|||||||
fflush(out);
|
fflush(out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool la_diagnostic(struct archive* ar, __LA_SSIZE_T r)
|
||||||
|
{
|
||||||
|
// See archive.h definition of ARCHIVE_OK for return values.
|
||||||
|
|
||||||
|
if (r >= ARCHIVE_OK) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (r >= ARCHIVE_WARN) {
|
||||||
|
const char* warn = archive_error_string(ar);
|
||||||
|
if (!warn) {
|
||||||
|
warn = "unknown warning";
|
||||||
|
}
|
||||||
|
std::cerr << "cmake -E tar: warning: " << warn << '\n';
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Error.
|
||||||
|
const char* err = archive_error_string(ar);
|
||||||
|
if (!err) {
|
||||||
|
err = "unknown error";
|
||||||
|
}
|
||||||
|
std::cerr << "cmake -E tar: error: " << err << '\n';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Return 'true' on success
|
// Return 'true' on success
|
||||||
bool copy_data(struct archive* ar, struct archive* aw)
|
bool copy_data(struct archive* ar, struct archive* aw)
|
||||||
{
|
{
|
||||||
@@ -1716,24 +1742,17 @@ bool copy_data(struct archive* ar, struct archive* aw)
|
|||||||
# endif
|
# endif
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
// Return value:
|
// See archive.h definition of ARCHIVE_OK for return values.
|
||||||
// * ARCHIVE_OK - read succeed
|
|
||||||
// * ARCHIVE_EOF - no more data to read left
|
|
||||||
r = archive_read_data_block(ar, &buff, &size, &offset);
|
r = archive_read_data_block(ar, &buff, &size, &offset);
|
||||||
if (r == ARCHIVE_EOF) {
|
if (r == ARCHIVE_EOF) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (r != ARCHIVE_OK) {
|
if (!la_diagnostic(ar, r)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
// Return value:
|
// See archive.h definition of ARCHIVE_OK for return values.
|
||||||
// * >= ARCHIVE_OK - write succeed
|
__LA_SSIZE_T const w = archive_write_data_block(aw, buff, size, offset);
|
||||||
// * < ARCHIVE_OK - write failed
|
if (!la_diagnostic(ar, w)) {
|
||||||
const __LA_SSIZE_T w_size =
|
|
||||||
archive_write_data_block(aw, buff, size, offset);
|
|
||||||
if (w_size < ARCHIVE_OK) {
|
|
||||||
cmSystemTools::Message("archive_write_data_block()",
|
|
||||||
archive_error_string(aw));
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1792,7 +1811,6 @@ bool extract_tar(const char* outFileName, bool verbose, bool extract)
|
|||||||
r = archive_write_header(ext, entry);
|
r = archive_write_header(ext, entry);
|
||||||
if (r == ARCHIVE_OK) {
|
if (r == ARCHIVE_OK) {
|
||||||
if (!copy_data(a, ext)) {
|
if (!copy_data(a, ext)) {
|
||||||
cmSystemTools::Error("Problem with copy_data");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
r = archive_write_finish_entry(ext);
|
r = archive_write_finish_entry(ext);
|
||||||
|
|||||||
Reference in New Issue
Block a user