Files
CMake/Source/cmConfigureLog.h
Brad King 6c40e0b25e ConfigureLog: Version individual events instead of the whole log
In order to support multiple log versions without buffering the
entire log, move versioning to the level of individual events.
Multiple versions of an event may then be logged consecutively.

Issue: #23200
2022-12-16 10:12:25 -05:00

69 lines
1.8 KiB
C++

/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
file Copyright.txt or https://cmake.org/licensing for details. */
#pragma once
#include <memory>
#include <string>
#include <vector>
#include <cm/string_view>
#include "cmsys/FStream.hxx"
namespace Json {
class StreamWriter;
}
class cmMakefile;
class cmConfigureLog
{
public:
/** Construct with the log directory and a sorted list of enabled log
versions. The latest log version will be enabled regardless. */
cmConfigureLog(std::string logDir, std::vector<unsigned long> logVersions);
~cmConfigureLog();
/** Return true if at least one of the log versions in the given sorted
list is enabled. */
bool IsAnyLogVersionEnabled(std::vector<unsigned long> const& v) const;
void WriteBacktrace(cmMakefile const& mf);
void EnsureInit();
void BeginEvent(std::string const& kind);
void EndEvent();
void BeginObject(cm::string_view key);
void EndObject();
// TODO other value types
void WriteValue(cm::string_view key, std::nullptr_t);
void WriteValue(cm::string_view key, bool value);
void WriteValue(cm::string_view key, int value);
void WriteValue(cm::string_view key, std::string const& value);
void WriteValue(cm::string_view key, std::vector<std::string> const& list);
void WriteTextBlock(cm::string_view key, cm::string_view text);
void WriteLiteralTextBlock(cm::string_view key, cm::string_view text);
void WriteLiteralTextBlock(cm::string_view key, std::string const& text)
{
this->WriteLiteralTextBlock(key, cm::string_view{ text });
}
private:
std::string LogDir;
std::vector<unsigned long> LogVersions;
cmsys::ofstream Stream;
unsigned Indent = 0;
bool Opened = false;
std::unique_ptr<Json::StreamWriter> Encoder;
cmsys::ofstream& BeginLine();
void EndLine();
void WriteEscape(unsigned char c);
};