Procházet zdrojové kódy

cli tar: extend supported compression methods

AJIOB před 1 měsícem
rodič
revize
e4e29aeb66
21 změnil soubory, kde provedl 196 přidání a 1 odebrání
  1. 24 0
      Help/manual/cmake.1.rst
  2. 5 0
      Help/release/dev/cli-tar-compression-method.rst
  3. 33 0
      Source/cmcmd.cxx
  4. 25 0
      Tests/RunCMake/CommandLineTar/RunCMakeTest.cmake
  5. 1 0
      Tests/RunCMake/CommandLineTar/bad-compression-method-different-result.txt
  6. 1 0
      Tests/RunCMake/CommandLineTar/bad-compression-method-different-stderr.txt
  7. 1 0
      Tests/RunCMake/CommandLineTar/bad-compression-method-duplicate-result.txt
  8. 1 0
      Tests/RunCMake/CommandLineTar/bad-compression-method-duplicate-stderr.txt
  9. 1 0
      Tests/RunCMake/CommandLineTar/bad-compression-method-unknown-result.txt
  10. 1 0
      Tests/RunCMake/CommandLineTar/bad-compression-method-unknown-stderr.txt
  11. 1 1
      Tests/RunCMake/CommandLineTar/compression-level-lzma.cmake
  12. 10 0
      Tests/RunCMake/CommandLineTar/compression-method-bzip2.cmake
  13. 10 0
      Tests/RunCMake/CommandLineTar/compression-method-deflate.cmake
  14. 10 0
      Tests/RunCMake/CommandLineTar/compression-method-gzip.cmake
  15. 10 0
      Tests/RunCMake/CommandLineTar/compression-method-lzma.cmake
  16. 10 0
      Tests/RunCMake/CommandLineTar/compression-method-lzma2.cmake
  17. 10 0
      Tests/RunCMake/CommandLineTar/compression-method-none.cmake
  18. 11 0
      Tests/RunCMake/CommandLineTar/compression-method-ppmd.cmake
  19. 10 0
      Tests/RunCMake/CommandLineTar/compression-method-store.cmake
  20. 10 0
      Tests/RunCMake/CommandLineTar/compression-method-xz.cmake
  21. 11 0
      Tests/RunCMake/CommandLineTar/compression-method-zstd.cmake

+ 24 - 0
Help/manual/cmake.1.rst

@@ -1509,6 +1509,30 @@ Available commands are:
 
     Specify modification time recorded in tarball entries.
 
+  .. option:: --cmake-tar-compression-method=<compression-method>
+
+    .. versionadded:: 4.3
+
+    The ``<compression-method>`` must be one of the following:
+
+    * ``none`` or ``store`` - no compression is used
+    * ``deflate`` or ``gzip`` - Deflate-based
+    * ``bzip2`` - BZip2-based
+    * ``lzma`` - LZMA-based
+    * ``lzma2`` or ``xz`` - LZMA2-based
+    * ``ppmd`` - PPMd-based
+
+      This compression method is only supported by the ``7zip`` archive format.
+
+    * ``zstd`` - Zstandard-based
+
+    This is the second variant for the compression method selection.
+    It provide more compression methods, that the classic ``tar``-like interface.
+    You can use any of them.
+
+    The default value depends on the :option:`--format <cmake-E_tar --format>`
+    option value and described in the corresponding section.
+
   .. option:: --cmake-tar-compression-level=<compression-level>
 
     .. versionadded:: 4.3

+ 5 - 0
Help/release/dev/cli-tar-compression-method.rst

@@ -0,0 +1,5 @@
+cli-tar-compression-method
+--------------------------
+
+* The :manual:`cmake(1)` ``-E tar`` tool supports specifying compression method
+  via ``--cmake-tar-compression-method`` option

+ 33 - 0
Source/cmcmd.cxx

@@ -1657,6 +1657,39 @@ int cmcmd::ExecuteCMakeCommand(std::vector<std::string> const& args,
             compressionLevel =
               static_cast<decltype(compressionLevel)>(compressionLevelLong);
             compressionLevelFlagPassed = true;
+          } else if (cmHasLiteralPrefix(arg,
+                                        "--cmake-tar-compression-method=")) {
+            std::string const& compressionMethodStr = arg.substr(31);
+            if (compressionMethodStr == "none" ||
+                compressionMethodStr == "store") {
+              compress = cmSystemTools::TarCompressNone;
+              ++nCompress;
+            } else if (compressionMethodStr == "deflate" ||
+                       compressionMethodStr == "gzip") {
+              compress = cmSystemTools::TarCompressGZip;
+              ++nCompress;
+            } else if (compressionMethodStr == "bzip2") {
+              compress = cmSystemTools::TarCompressBZip2;
+              ++nCompress;
+            } else if (compressionMethodStr == "lzma") {
+              compress = cmSystemTools::TarCompressLZMA;
+              ++nCompress;
+            } else if (compressionMethodStr == "lzma2" ||
+                       compressionMethodStr == "xz") {
+              compress = cmSystemTools::TarCompressXZ;
+              ++nCompress;
+            } else if (compressionMethodStr == "zstd") {
+              compress = cmSystemTools::TarCompressZstd;
+              ++nCompress;
+            } else if (compressionMethodStr == "ppmd") {
+              compress = cmSystemTools::TarCompressPPMd;
+              ++nCompress;
+            } else {
+              cmSystemTools::Error(
+                cmStrCat("Unknown --cmake-tar-compression-method value: '",
+                         compressionMethodStr, '\''));
+              return 1;
+            }
           } else if (cmHasLiteralPrefix(arg, "--files-from=")) {
             std::string const& files_from = arg.substr(13);
             if (!cmTarFilesFrom(files_from, files)) {

+ 25 - 0
Tests/RunCMake/CommandLineTar/RunCMakeTest.cmake

@@ -94,6 +94,31 @@ if (test_3_8_0)
   run_cmake(compression-level-zip-zstd)
 endif()
 
+# Check the --cmake-tar-compression-method option
+external_command_test(bad-compression-method-unknown
+  tar cvf bad.tar "--cmake-tar-compression-method=bad-method"
+    ${CMAKE_CURRENT_LIST_DIR}/test-file.txt
+)
+external_command_test(bad-compression-method-duplicate
+  tar cvzf bad.tar "--cmake-tar-compression-method=gzip"
+    ${CMAKE_CURRENT_LIST_DIR}/test-file.txt
+)
+external_command_test(bad-compression-method-different
+  tar cvzf bad.tar "--cmake-tar-compression-method=none"
+    ${CMAKE_CURRENT_LIST_DIR}/test-file.txt
+)
+
+run_cmake(compression-method-none)
+run_cmake(compression-method-store)
+run_cmake(compression-method-bzip2)
+run_cmake(compression-method-gzip)
+run_cmake(compression-method-deflate)
+run_cmake(compression-method-xz)
+run_cmake(compression-method-lzma2)
+run_cmake(compression-method-lzma)
+run_cmake(compression-method-zstd)
+run_cmake(compression-method-ppmd)
+
 # Extracting only selected files or directories
 run_cmake(zip-filtered)
 

+ 1 - 0
Tests/RunCMake/CommandLineTar/bad-compression-method-different-result.txt

@@ -0,0 +1 @@
+1

+ 1 - 0
Tests/RunCMake/CommandLineTar/bad-compression-method-different-stderr.txt

@@ -0,0 +1 @@
+^CMake Error: Can only compress a tar file one way; at most one flag of z, j, or J may be used$

+ 1 - 0
Tests/RunCMake/CommandLineTar/bad-compression-method-duplicate-result.txt

@@ -0,0 +1 @@
+1

+ 1 - 0
Tests/RunCMake/CommandLineTar/bad-compression-method-duplicate-stderr.txt

@@ -0,0 +1 @@
+^CMake Error: Can only compress a tar file one way; at most one flag of z, j, or J may be used$

+ 1 - 0
Tests/RunCMake/CommandLineTar/bad-compression-method-unknown-result.txt

@@ -0,0 +1 @@
+1

+ 1 - 0
Tests/RunCMake/CommandLineTar/bad-compression-method-unknown-stderr.txt

@@ -0,0 +1 @@
+^CMake Error: Unknown --cmake-tar-compression-method value: 'bad-method'$

+ 1 - 1
Tests/RunCMake/CommandLineTar/compression-level-lzma.cmake

@@ -1,4 +1,4 @@
-set(OUTPUT_NAME "test.tar.zstd")
+set(OUTPUT_NAME "test.tar.lzma")
 
 set(COMPRESSION_FLAGS cvf)
 set(COMPRESSION_OPTIONS --format=pax --lzma --cmake-tar-compression-level=9)

+ 10 - 0
Tests/RunCMake/CommandLineTar/compression-method-bzip2.cmake

@@ -0,0 +1,10 @@
+set(OUTPUT_NAME "test.tar.bz2")
+
+set(COMPRESSION_FLAGS cvf)
+set(COMPRESSION_OPTIONS --format=paxr --cmake-tar-compression-method=bzip2)
+
+set(DECOMPRESSION_FLAGS xvf)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("425a68" LIMIT 3 HEX)

+ 10 - 0
Tests/RunCMake/CommandLineTar/compression-method-deflate.cmake

@@ -0,0 +1,10 @@
+set(OUTPUT_NAME "test.tar.gz")
+
+set(COMPRESSION_FLAGS -cvf)
+set(COMPRESSION_OPTIONS --format=gnutar --cmake-tar-compression-method=deflate)
+
+set(DECOMPRESSION_FLAGS -xvf)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("1f8b" LIMIT 2 HEX)

+ 10 - 0
Tests/RunCMake/CommandLineTar/compression-method-gzip.cmake

@@ -0,0 +1,10 @@
+set(OUTPUT_NAME "test.tar.gz")
+
+set(COMPRESSION_FLAGS -cvf)
+set(COMPRESSION_OPTIONS --format=gnutar --cmake-tar-compression-method=gzip)
+
+set(DECOMPRESSION_FLAGS -xvf)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("1f8b" LIMIT 2 HEX)

+ 10 - 0
Tests/RunCMake/CommandLineTar/compression-method-lzma.cmake

@@ -0,0 +1,10 @@
+set(OUTPUT_NAME "test.tar.lzma")
+
+set(COMPRESSION_FLAGS cvf)
+set(COMPRESSION_OPTIONS --format=pax --cmake-tar-compression-method=lzma)
+
+set(DECOMPRESSION_FLAGS xvf)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("5d0000[08]00[04]" LIMIT 5 HEX)

+ 10 - 0
Tests/RunCMake/CommandLineTar/compression-method-lzma2.cmake

@@ -0,0 +1,10 @@
+set(OUTPUT_NAME "test.tar.xz")
+
+set(COMPRESSION_FLAGS cvf)
+set(COMPRESSION_OPTIONS --cmake-tar-compression-method=lzma2)
+
+set(DECOMPRESSION_FLAGS xvf)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("fd377a585a00" LIMIT 6 HEX)

+ 10 - 0
Tests/RunCMake/CommandLineTar/compression-method-none.cmake

@@ -0,0 +1,10 @@
+set(OUTPUT_NAME "test.tar")
+
+set(COMPRESSION_FLAGS cvf)
+set(COMPRESSION_OPTIONS --format=gnutar --cmake-tar-compression-method=none)
+
+set(DECOMPRESSION_FLAGS xvf)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("7573746172202000" OFFSET 257 LIMIT 8 HEX)

+ 11 - 0
Tests/RunCMake/CommandLineTar/compression-method-ppmd.cmake

@@ -0,0 +1,11 @@
+set(OUTPUT_NAME "test.7z")
+
+set(COMPRESSION_FLAGS cvf)
+set(COMPRESSION_OPTIONS --format=7zip --cmake-tar-compression-method=ppmd)
+
+set(DECOMPRESSION_FLAGS xvf)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+# libarchive 3.8.2 enables a checksum feature; older versions do not.
+check_magic("377abcaf271c" LIMIT 6 HEX)

+ 10 - 0
Tests/RunCMake/CommandLineTar/compression-method-store.cmake

@@ -0,0 +1,10 @@
+set(OUTPUT_NAME "test.tar")
+
+set(COMPRESSION_FLAGS cvf)
+set(COMPRESSION_OPTIONS --format=gnutar --cmake-tar-compression-method=store)
+
+set(DECOMPRESSION_FLAGS xvf)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("7573746172202000" OFFSET 257 LIMIT 8 HEX)

+ 10 - 0
Tests/RunCMake/CommandLineTar/compression-method-xz.cmake

@@ -0,0 +1,10 @@
+set(OUTPUT_NAME "test.tar.xz")
+
+set(COMPRESSION_FLAGS cvf)
+set(COMPRESSION_OPTIONS --cmake-tar-compression-method=xz)
+
+set(DECOMPRESSION_FLAGS xvf)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+check_magic("fd377a585a00" LIMIT 6 HEX)

+ 11 - 0
Tests/RunCMake/CommandLineTar/compression-method-zstd.cmake

@@ -0,0 +1,11 @@
+set(OUTPUT_NAME "test.tar.zstd")
+
+set(COMPRESSION_FLAGS cvf)
+set(COMPRESSION_OPTIONS --cmake-tar-compression-method=zstd)
+
+set(DECOMPRESSION_FLAGS xvf)
+
+include(${CMAKE_CURRENT_LIST_DIR}/roundtrip.cmake)
+
+# libarchive 3.8.2 enables a checksum feature; older versions do not.
+check_magic("^28b52ffd0[04][56]8$" LIMIT 6 HEX)