]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
Refactor printing of compression statistics
authorJoel Rosdahl <joel@rosdahl.net>
Thu, 22 Jul 2021 18:53:44 +0000 (20:53 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Thu, 22 Jul 2021 20:32:30 +0000 (22:32 +0200)
src/ccache.cpp
src/storage/primary/PrimaryStorage.hpp
src/storage/primary/PrimaryStorage_compress.cpp

index f5e4b19d3fb1f148c045909a456137fcfd092f83..08d2669727ba92c0a729aa66684a7846dede91b6 100644 (file)
@@ -1943,6 +1943,41 @@ log_result_to_stats_log(Context& ctx)
     .log_result(ctx.args_info.input_file, *result_id);
 }
 
+static void
+print_compression_statistics(const storage::primary::CompressionStatistics& cs)
+{
+  const double ratio = cs.compr_size > 0
+                         ? static_cast<double>(cs.content_size) / cs.compr_size
+                         : 0.0;
+  const double savings = ratio > 0.0 ? 100.0 - (100.0 / ratio) : 0.0;
+
+  const std::string on_disk_size_str =
+    Util::format_human_readable_size(cs.on_disk_size);
+  const std::string cache_size_str =
+    Util::format_human_readable_size(cs.compr_size + cs.incompr_size);
+  const std::string compr_size_str =
+    Util::format_human_readable_size(cs.compr_size);
+  const std::string content_size_str =
+    Util::format_human_readable_size(cs.content_size);
+  const std::string incompr_size_str =
+    Util::format_human_readable_size(cs.incompr_size);
+
+  PRINT(stdout,
+        "Total data:            {:>8s} ({} disk blocks)\n",
+        cache_size_str,
+        on_disk_size_str);
+  PRINT(stdout,
+        "Compressed data:       {:>8s} ({:.1f}% of original size)\n",
+        compr_size_str,
+        100.0 - savings);
+  PRINT(stdout, "  - Original data:     {:>8s}\n", content_size_str);
+  PRINT(stdout,
+        "  - Compression ratio: {:>5.3f} x  ({:.1f}% space savings)\n",
+        ratio,
+        savings);
+  PRINT(stdout, "Incompressible data:   {:>8s}\n", incompr_size_str);
+}
+
 static void
 finalize_at_exit(Context& ctx)
 {
@@ -2490,8 +2525,13 @@ handle_main_options(int argc, const char* const* argv)
     case 'x': // --show-compression
     {
       ProgressBar progress_bar("Scanning...");
-      ctx.storage.primary.print_compression_statistics(
-        [&](double progress) { progress_bar.update(progress); });
+      const auto compression_statistics =
+        ctx.storage.primary.get_compression_statistics(
+          [&](double progress) { progress_bar.update(progress); });
+      if (isatty(STDOUT_FILENO)) {
+        PRINT_RAW(stdout, "\n\n");
+      }
+      print_compression_statistics(compression_statistics);
       break;
     }
 
index 2361b10083984ce6a6753a7eebc8da6bf10e0a48..958394876fa53215b3bdf553f6e544b3d5f7e0ff 100644 (file)
 
 #include <third_party/nonstd/optional.hpp>
 
+#include <cstdint>
+
 class Config;
 
 namespace storage {
 namespace primary {
 
+struct CompressionStatistics
+{
+  uint64_t compr_size;
+  uint64_t content_size;
+  uint64_t incompr_size;
+  uint64_t on_disk_size;
+};
+
 class PrimaryStorage
 {
 public:
@@ -74,7 +84,8 @@ public:
 
   // --- Compression ---
 
-  void print_compression_statistics(const ProgressReceiver& progress_receiver);
+  CompressionStatistics
+  get_compression_statistics(const ProgressReceiver& progress_receiver) const;
 
   void recompress(nonstd::optional<int8_t> level,
                   const ProgressReceiver& progress_receiver);
index 5bd95be89fd46e8ce206f579d0b3710ced9d817e..892a27b21e141b3ea1ae5c8ff9f2bcbb20174a49 100644 (file)
@@ -219,14 +219,11 @@ recompress_file(RecompressionStatistics& statistics,
   LOG("Recompression of {} done", cache_file.path());
 }
 
-void
-PrimaryStorage::print_compression_statistics(
-  const ProgressReceiver& progress_receiver)
+CompressionStatistics
+PrimaryStorage::get_compression_statistics(
+  const ProgressReceiver& progress_receiver) const
 {
-  uint64_t on_disk_size = 0;
-  uint64_t compr_size = 0;
-  uint64_t content_size = 0;
-  uint64_t incompr_size = 0;
+  CompressionStatistics cs{};
 
   for_each_level_1_subdir(
     m_config.cache_dir(),
@@ -236,15 +233,15 @@ PrimaryStorage::print_compression_statistics(
 
       for (size_t i = 0; i < files.size(); ++i) {
         const auto& cache_file = files[i];
-        on_disk_size += cache_file.lstat().size_on_disk();
+        cs.on_disk_size += cache_file.lstat().size_on_disk();
 
         try {
           auto file = open_file(cache_file.path(), "rb");
           auto reader = create_reader(cache_file, file.get());
-          compr_size += cache_file.lstat().size();
-          content_size += reader->content_size();
+          cs.compr_size += cache_file.lstat().size();
+          cs.content_size += reader->content_size();
         } catch (core::Error&) {
-          incompr_size += cache_file.lstat().size();
+          cs.incompr_size += cache_file.lstat().size();
         }
 
         sub_progress_receiver(1.0 / 2 + 1.0 * i / files.size() / 2);
@@ -252,39 +249,7 @@ PrimaryStorage::print_compression_statistics(
     },
     progress_receiver);
 
-  if (isatty(STDOUT_FILENO)) {
-    PRINT_RAW(stdout, "\n\n");
-  }
-
-  const double ratio =
-    compr_size > 0 ? static_cast<double>(content_size) / compr_size : 0.0;
-  const double savings = ratio > 0.0 ? 100.0 - (100.0 / ratio) : 0.0;
-
-  const std::string on_disk_size_str =
-    Util::format_human_readable_size(on_disk_size);
-  const std::string cache_size_str =
-    Util::format_human_readable_size(compr_size + incompr_size);
-  const std::string compr_size_str =
-    Util::format_human_readable_size(compr_size);
-  const std::string content_size_str =
-    Util::format_human_readable_size(content_size);
-  const std::string incompr_size_str =
-    Util::format_human_readable_size(incompr_size);
-
-  PRINT(stdout,
-        "Total data:            {:>8s} ({} disk blocks)\n",
-        cache_size_str,
-        on_disk_size_str);
-  PRINT(stdout,
-        "Compressed data:       {:>8s} ({:.1f}% of original size)\n",
-        compr_size_str,
-        100.0 - savings);
-  PRINT(stdout, "  - Original data:     {:>8s}\n", content_size_str);
-  PRINT(stdout,
-        "  - Compression ratio: {:>5.3f} x  ({:.1f}% space savings)\n",
-        ratio,
-        savings);
-  PRINT(stdout, "Incompressible data:   {:>8s}\n", incompr_size_str);
+  return cs;
 }
 
 void