From 0d8552c4597793262f4201dee98c73907c31d5bc Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 1 Nov 2013 16:52:18 -0400 Subject: cmSystemTools: Re-order extract_tar logic Simplify extraction message logic to be easier to follow and to write a newline before any error messages that may be produced. Also flip handling of the archive_write_header return code to handle success in the "then" case and failure in the "else" case. --- Source/cmSystemTools.cxx | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 8320ecf..34a1216 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1619,18 +1619,23 @@ bool extract_tar(const char* outFileName, bool verbose, archive_error_string(a)); break; } - if (verbose && extract) + if(verbose) { - cmSystemTools::Stdout("x "); - cmSystemTools::Stdout(archive_entry_pathname(entry)); - } - if(verbose && !extract) - { - list_item_verbose(stdout, entry); + if(extract) + { + cmSystemTools::Stdout("x "); + cmSystemTools::Stdout(archive_entry_pathname(entry)); + } + else + { + list_item_verbose(stdout, entry); + } + cmSystemTools::Stdout("\n"); } else if(!extract) { cmSystemTools::Stdout(archive_entry_pathname(entry)); + cmSystemTools::Stdout("\n"); } if(extract) { @@ -1644,15 +1649,7 @@ bool extract_tar(const char* outFileName, bool verbose, } r = archive_write_header(ext, entry); - if (r != ARCHIVE_OK) - { - cmSystemTools::Error("Problem with archive_write_header(): ", - archive_error_string(ext)); - cmSystemTools::Error("Current file: ", - archive_entry_pathname(entry)); - break; - } - else + if (r == ARCHIVE_OK) { copy_data(a, ext); r = archive_write_finish_entry(ext); @@ -1663,10 +1660,14 @@ bool extract_tar(const char* outFileName, bool verbose, break; } } - } - if (verbose || !extract) - { - cmSystemTools::Stdout("\n"); + else + { + cmSystemTools::Error("Problem with archive_write_header(): ", + archive_error_string(ext)); + cmSystemTools::Error("Current file: ", + archive_entry_pathname(entry)); + break; + } } } archive_read_close(a); -- cgit v0.12 From 4c383b52d0611c56679f96cbc99fc1d6683b5ca9 Mon Sep 17 00:00:00 2001 From: Brad King Date: Fri, 1 Nov 2013 16:52:22 -0400 Subject: cmake: Avoid '-E tar' failure to extract symlinks on Windows (#13251) If a symlink fails to extract and the host system is Windows then report a warning and skip the entry instead of failing. This will allow archives containing symbolic links to be extracted on Windows with somewhat gracefully degraded behavior. --- Source/cmSystemTools.cxx | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/Source/cmSystemTools.cxx b/Source/cmSystemTools.cxx index 34a1216..1ecda88 100644 --- a/Source/cmSystemTools.cxx +++ b/Source/cmSystemTools.cxx @@ -1660,6 +1660,14 @@ bool extract_tar(const char* outFileName, bool verbose, break; } } +#ifdef _WIN32 + else if(const char* linktext = archive_entry_symlink(entry)) + { + std::cerr << "cmake -E tar: warning: skipping symbolic link \"" + << archive_entry_pathname(entry) << "\" -> \"" + << linktext << "\"." << std::endl; + } +#endif else { cmSystemTools::Error("Problem with archive_write_header(): ", -- cgit v0.12