summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorJoel Rosdahl <joel@rosdahl.net>2022-09-11 15:36:13 +0200
committerJoel Rosdahl <joel@rosdahl.net>2022-09-21 17:06:30 +0200
commit2e76e1384fbf347a16b752d2cfd1d8b1a794569b (patch)
tree86c6d8938e25ccbbd3144898cb06ae074ecfc525 /src/core
parenta03f14b7560f12eb28d6da1a60efc2bde4d2faf5 (diff)
downloadccache-2e76e1384fbf347a16b752d2cfd1d8b1a794569b.tar.gz
feat: Print result format version and no of files in --inspect
Diffstat (limited to 'src/core')
-rw-r--r--src/core/Result.cpp29
-rw-r--r--src/core/Result.hpp13
-rw-r--r--src/core/ResultInspector.cpp7
-rw-r--r--src/core/ResultInspector.hpp2
4 files changed, 40 insertions, 11 deletions
diff --git a/src/core/Result.cpp b/src/core/Result.cpp
index e2733778..e1da6457 100644
--- a/src/core/Result.cpp
+++ b/src/core/Result.cpp
@@ -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));
}
}
diff --git a/src/core/Result.hpp b/src/core/Result.hpp
index 805bcd0f..b1d0fcc7 100644
--- a/src/core/Result.hpp
+++ b/src/core/Result.hpp
@@ -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
{
diff --git a/src/core/ResultInspector.cpp b/src/core/ResultInspector.cpp
index 3ef88c6f..b27a3f1d 100644
--- a/src/core/ResultInspector.cpp
+++ b/src/core/ResultInspector.cpp
@@ -29,6 +29,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,
nonstd::span<const uint8_t> data)
diff --git a/src/core/ResultInspector.hpp b/src/core/ResultInspector.hpp
index 94a9b8c6..9fdd9d32 100644
--- a/src/core/ResultInspector.hpp
+++ b/src/core/ResultInspector.hpp
@@ -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;