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
|
/* Initialize and reorder arguments, then call the actual argument
|
||||||
processor. */
|
processor. */
|
||||||
static void initAndRun(int argc, char * * argv)
|
static void initAndRun(int argc, char * * argv)
|
||||||
|
@ -44,6 +53,10 @@ static void initAndRun(int argc, char * * argv)
|
||||||
if (sigaction(SIGINT, &act, &oact))
|
if (sigaction(SIGINT, &act, &oact))
|
||||||
throw SysError("installing handler for SIGINT");
|
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. */
|
/* Put the arguments in a vector. */
|
||||||
Strings args, remaining;
|
Strings args, remaining;
|
||||||
while (argc--) args.push_back(*argv++);
|
while (argc--) args.push_back(*argv++);
|
||||||
|
@ -72,7 +85,11 @@ static void initAndRun(int argc, char * * argv)
|
||||||
string arg = *i;
|
string arg = *i;
|
||||||
if (arg == "--verbose" || arg == "-v")
|
if (arg == "--verbose" || arg == "-v")
|
||||||
verbosity = (Verbosity) ((int) verbosity + 1);
|
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 */
|
buildVerbosity = lvlError; /* lowest */
|
||||||
else if (arg == "--help") {
|
else if (arg == "--help") {
|
||||||
printHelp();
|
printHelp();
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <cerrno>
|
#include <cerrno>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
@ -223,6 +224,7 @@ void writeStringToFile(const Path & path, const string & s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
LogType logType = ltPretty;
|
||||||
Verbosity verbosity = lvlError;
|
Verbosity verbosity = lvlError;
|
||||||
|
|
||||||
static int nestingLevel = 0;
|
static int nestingLevel = 0;
|
||||||
|
@ -236,13 +238,28 @@ Nest::Nest()
|
||||||
|
|
||||||
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)
|
void Nest::open(Verbosity level, const format & f)
|
||||||
{
|
{
|
||||||
if (level <= verbosity) {
|
if (level <= verbosity) {
|
||||||
|
if (logType == ltEscapes)
|
||||||
|
cerr << "\033[" << escVerbosity(level) << "p";
|
||||||
printMsg_(level, f);
|
printMsg_(level, f);
|
||||||
nest = true;
|
nest = true;
|
||||||
nestingLevel++;
|
nestingLevel++;
|
||||||
|
@ -254,10 +271,13 @@ void printMsg_(Verbosity level, const format & f)
|
||||||
{
|
{
|
||||||
checkInterrupt();
|
checkInterrupt();
|
||||||
if (level > verbosity) return;
|
if (level > verbosity) return;
|
||||||
string spaces;
|
string prefix;
|
||||||
|
if (logType == ltPretty)
|
||||||
for (int i = 0; i < nestingLevel; i++)
|
for (int i = 0; i < nestingLevel; i++)
|
||||||
spaces += "| ";
|
prefix += "| ";
|
||||||
cerr << format("%1%%2%\n") % spaces % f.str();
|
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. */
|
/* Messages. */
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
ltPretty, /* nice, nested output */
|
||||||
|
ltEscapes, /* nesting indicated using escape codes (for log2xml) */
|
||||||
|
ltFlat /* no nesting */
|
||||||
|
} LogType;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
lvlError,
|
lvlError,
|
||||||
lvlInfo,
|
lvlInfo,
|
||||||
|
@ -109,7 +116,8 @@ typedef enum {
|
||||||
lvlVomit
|
lvlVomit
|
||||||
} Verbosity;
|
} Verbosity;
|
||||||
|
|
||||||
extern Verbosity verbosity; /* supress msgs > this */
|
extern LogType logType;
|
||||||
|
extern Verbosity verbosity; /* suppress msgs > this */
|
||||||
|
|
||||||
class Nest
|
class Nest
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue