]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
feat: Print result format version and no of files in --inspect
authorJoel Rosdahl <joel@rosdahl.net>
Sun, 11 Sep 2022 13:36:13 +0000 (15:36 +0200)
committerJoel Rosdahl <joel@rosdahl.net>
Wed, 21 Sep 2022 15:06:30 +0000 (17:06 +0200)
src/core/Result.cpp
src/core/Result.hpp
src/core/ResultInspector.cpp
src/core/ResultInspector.hpp

index e2733778c64c93acb187a44aa546c12e29ccecc1..e1da64577a4a0c6e99f48eeaa8be4830f77b82d9 100644 (file)
@@ -176,22 +176,29 @@ Deserializer::Deserializer(nonstd::span<const uint8_t> data) : m_data(data)
 void
 Deserializer::visit(Deserializer::Visitor& visitor) const
 {
+  Header header;
+
   CacheEntryDataReader reader(m_data);
-  const auto result_format_version = reader.read_int<uint8_t>();
-  if (result_format_version != k_format_version) {
+  header.format_version = reader.read_int<uint8_t>();
+  if (header.format_version != k_format_version) {
+    visitor.on_header(header);
     throw Error(FMT("Unknown result format version: {} != {}",
-                    result_format_version,
+                    header.format_version,
                     k_format_version));
   }
 
-  const auto n_files = reader.read_int<uint8_t>();
-  if (n_files >= k_max_raw_file_entries) {
-    throw Error(FMT(
-      "Too many raw file entries: {} > {}", n_files, k_max_raw_file_entries));
+  header.n_files = reader.read_int<uint8_t>();
+  if (header.n_files >= k_max_raw_file_entries) {
+    visitor.on_header(header);
+    throw Error(FMT("Too many raw file entries: {} > {}",
+                    header.n_files,
+                    k_max_raw_file_entries));
   }
 
+  visitor.on_header(header);
+
   uint8_t file_number;
-  for (file_number = 0; file_number < n_files; ++file_number) {
+  for (file_number = 0; file_number < header.n_files; ++file_number) {
     const auto marker = reader.read_int<uint8_t>();
     switch (marker) {
     case k_embedded_file_marker:
@@ -215,9 +222,9 @@ Deserializer::visit(Deserializer::Visitor& visitor) const
     }
   }
 
-  if (file_number != n_files) {
-    throw Error(
-      FMT("Too few entries (read {}, expected {})", file_number, n_files));
+  if (file_number != header.n_files) {
+    throw Error(FMT(
+      "Too few entries (read {}, expected {})", file_number, header.n_files));
   }
 }
 
index 805bcd0f899337d40308a01b22d6ca9f1f14bbcb..b1d0fcc79d6818b5140d375ac6bc3971e8686fc5 100644 (file)
@@ -95,11 +95,19 @@ public:
   // Read a result from `data`.
   Deserializer(nonstd::span<const uint8_t> data);
 
+  struct Header
+  {
+    uint8_t format_version = 0;
+    uint8_t n_files = 0;
+  };
+
   class Visitor
   {
   public:
     virtual ~Visitor() = default;
 
+    virtual void on_header(const Header& header);
+
     virtual void on_embedded_file(uint8_t file_number,
                                   FileType file_type,
                                   nonstd::span<const uint8_t> data) = 0;
@@ -118,6 +126,11 @@ private:
                         uint8_t file_number) const;
 };
 
+inline void
+Deserializer::Visitor::on_header(const Header& /*header*/)
+{
+}
+
 // This class knows how to serialize a result cache entry.
 class Serializer : public core::Serializer
 {
index 3ef88c6f974e7592f68ec04d2d18f96afa909b10..b27a3f1d3375b5b374fc0eaf39d7460f3dad4a4e 100644 (file)
@@ -28,6 +28,13 @@ ResultInspector::ResultInspector(FILE* stream) : m_stream(stream)
 {
 }
 
+void
+ResultInspector::on_header(const Result::Deserializer::Header& header)
+{
+  PRINT(m_stream, "Result format version: {}\n", header.format_version);
+  PRINT(m_stream, "Number of files: {}\n", header.n_files);
+}
+
 void
 ResultInspector::on_embedded_file(uint8_t file_number,
                                   Result::FileType file_type,
index 94a9b8c67ed142d28d9601eefeb54b428f1a2a1e..9fdd9d32f7941170856115f14dc16fe8c2bccf21 100644 (file)
@@ -31,6 +31,8 @@ class ResultInspector : public Result::Deserializer::Visitor
 public:
   ResultInspector(FILE* stream);
 
+  void on_header(const Result::Deserializer::Header& header) override;
+
   void on_embedded_file(uint8_t file_number,
                         Result::FileType file_type,
                         nonstd::span<const uint8_t> data) override;