forked from lix-project/lix
* Nix now has three different formats for the log information it
writes to stderr: - `pretty': the old nested style (default) - `escapes': uses escape codes to indicate nesting and message level; can be processed using `log2xml' - `flat': just plain text, no nesting These can be set using `--log-type TYPE' or the NIX_LOG_TYPE environment variable.
This commit is contained in:
parent
79bb0008ec
commit
777e13b94b
|
@ -18,6 +18,15 @@ void sigintHandler(int signo)
|
|||
}
|
||||
|
||||
|
||||
void setLogType(string lt)
|
||||
{
|
||||
if (lt == "pretty") logType = ltPretty;
|
||||
else if (lt == "escapes") logType = ltEscapes;
|
||||
else if (lt == "flat") logType = ltFlat;
|
||||
else throw UsageError("unknown log type");
|
||||
}
|
||||
|
||||
|
||||
/* Initialize and reorder arguments, then call the actual argument
|
||||
processor. */
|
||||
static void initAndRun(int argc, char * * argv)
|
||||
|
@ -44,6 +53,10 @@ static void initAndRun(int argc, char * * argv)
|
|||
if (sigaction(SIGINT, &act, &oact))
|
||||
throw SysError("installing handler for SIGINT");
|
||||
|
||||
/* Process the NIX_LOG_TYPE environment variable. */
|
||||
char * lt = getenv("NIX_LOG_TYPE");
|
||||
if (lt) setLogType(lt);
|
||||
|
||||
/* Put the arguments in a vector. */
|
||||
Strings args, remaining;
|
||||
while (argc--) args.push_back(*argv++);
|
||||
|
@ -72,7 +85,11 @@ static void initAndRun(int argc, char * * argv)
|
|||
string arg = *i;
|
||||
if (arg == "--verbose" || arg == "-v")
|
||||
verbosity = (Verbosity) ((int) verbosity + 1);
|
||||
else if (arg == "--build-output" || arg == "-B")
|
||||
else if (arg == "--log-type") {
|
||||
++i;
|
||||
if (i == args.end()) throw UsageError("`--log-type' requires an argument");
|
||||
setLogType(*i);
|
||||
} else if (arg == "--build-output" || arg == "-B")
|
||||
buildVerbosity = lvlError; /* lowest */
|
||||
else if (arg == "--help") {
|
||||
printHelp();
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include <iostream>
|
||||
#include <cerrno>
|
||||
#include <cstdio>
|
||||
#include <sstream>
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
|
@ -223,6 +224,7 @@ void writeStringToFile(const Path & path, const string & s)
|
|||
}
|
||||
|
||||
|
||||
LogType logType = ltPretty;
|
||||
Verbosity verbosity = lvlError;
|
||||
|
||||
static int nestingLevel = 0;
|
||||
|
@ -236,13 +238,28 @@ Nest::Nest()
|
|||
|
||||
Nest::~Nest()
|
||||
{
|
||||
if (nest) nestingLevel--;
|
||||
if (nest) {
|
||||
nestingLevel--;
|
||||
if (logType == ltEscapes)
|
||||
cerr << "\033[q";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static string escVerbosity(Verbosity level)
|
||||
{
|
||||
int l = (int) level;
|
||||
ostringstream st;
|
||||
st << l;
|
||||
return st.str();
|
||||
}
|
||||
|
||||
|
||||
void Nest::open(Verbosity level, const format & f)
|
||||
{
|
||||
if (level <= verbosity) {
|
||||
if (logType == ltEscapes)
|
||||
cerr << "\033[" << escVerbosity(level) << "p";
|
||||
printMsg_(level, f);
|
||||
nest = true;
|
||||
nestingLevel++;
|
||||
|
@ -254,10 +271,13 @@ void printMsg_(Verbosity level, const format & f)
|
|||
{
|
||||
checkInterrupt();
|
||||
if (level > verbosity) return;
|
||||
string spaces;
|
||||
string prefix;
|
||||
if (logType == ltPretty)
|
||||
for (int i = 0; i < nestingLevel; i++)
|
||||
spaces += "| ";
|
||||
cerr << format("%1%%2%\n") % spaces % f.str();
|
||||
prefix += "| ";
|
||||
else if (logType == ltEscapes && level != lvlInfo)
|
||||
prefix = "\033[" + escVerbosity(level) + "s";
|
||||
cerr << format("%1%%2%\n") % prefix % f.str();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -100,6 +100,13 @@ void writeStringToFile(const Path & path, const string & s);
|
|||
|
||||
/* Messages. */
|
||||
|
||||
|
||||
typedef enum {
|
||||
ltPretty, /* nice, nested output */
|
||||
ltEscapes, /* nesting indicated using escape codes (for log2xml) */
|
||||
ltFlat /* no nesting */
|
||||
} LogType;
|
||||
|
||||
typedef enum {
|
||||
lvlError,
|
||||
lvlInfo,
|
||||
|
@ -109,7 +116,8 @@ typedef enum {
|
|||
lvlVomit
|
||||
} Verbosity;
|
||||
|
||||
extern Verbosity verbosity; /* supress msgs > this */
|
||||
extern LogType logType;
|
||||
extern Verbosity verbosity; /* suppress msgs > this */
|
||||
|
||||
class Nest
|
||||
{
|
||||
|
|
Loading…
Reference in a new issue