* 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
					
				
					 3 changed files with 52 additions and 7 deletions
				
			
		|  | @ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue