190 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| import haxe.io.Bytes;
 | |
| import sys.io.Process;
 | |
| 
 | |
| #if haxe4
 | |
| import sys.thread.Mutex;
 | |
| #elseif neko
 | |
| import neko.vm.Mutex;
 | |
| #else
 | |
| import cpp.vm.Mutex;
 | |
| #end
 | |
| 
 | |
| #if neko
 | |
| import neko.Lib;
 | |
| #else
 | |
| import cpp.Lib;
 | |
| #end
 | |
| 
 | |
| class Log
 | |
| {
 | |
|    public static var mute:Bool= false;
 | |
|    public static var quiet:Bool = false;
 | |
|    public static var verbose:Bool = false;
 | |
| 
 | |
|    public  static var colorSupported:Null<Bool> = null;
 | |
|    private static var sentWarnings = new Map<String,Bool>();
 | |
| 
 | |
|    public static var printMutex:Mutex;
 | |
| 
 | |
|    public static inline var RED = "\x1b[31m";
 | |
|    public static inline var YELLOW = "\x1b[33m";
 | |
|    public static inline var WHITE = "\x1b[37m";
 | |
|    public static inline var NORMAL = "\x1b[0m";
 | |
|    public static inline var BOLD = "\x1b[1m";
 | |
|    public static inline var ITALIC = "\x1b[3m";
 | |
| 
 | |
|    public static function initMultiThreaded()
 | |
|    {
 | |
|      if (printMutex==null)
 | |
|         printMutex = new Mutex();
 | |
|    }
 | |
| 
 | |
|    public static function e(message:String):Void
 | |
|    {
 | |
|       error(message);
 | |
|    }
 | |
|    public static function error(message:String, verboseMessage:String = "", e:Dynamic = null, terminate:Bool = true):Void
 | |
|    {
 | |
|       var output;
 | |
|       if (verbose && verboseMessage != "")
 | |
|       {
 | |
|          output = "\x1b[31;1mError:\x1b[0m\x1b[1m " + verboseMessage + "\x1b[0m\n";
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|          if (message=="")
 | |
|             output = "\x1b[31;1mError\x1b[0m\n";
 | |
|          else
 | |
|             output = "\x1b[31;1mError:\x1b[0m \x1b[1m" + message + "\x1b[0m\n";
 | |
|       }
 | |
|       if (printMutex!=null)
 | |
|          printMutex.acquire();
 | |
|       Sys.stderr().write(Bytes.ofString(stripColor(output)));
 | |
|       if (printMutex!=null)
 | |
|          printMutex.release();
 | |
| 
 | |
|       if ((verbose || !terminate) && e != null)
 | |
|          Lib.rethrow(e);
 | |
| 
 | |
|       if (terminate)
 | |
|          Tools.exit(1);
 | |
|    }
 | |
| 
 | |
|    public static function info(message:String, verboseMessage:String = ""):Void
 | |
|    {
 | |
|       if (!mute)
 | |
|       {
 | |
|          if (printMutex!=null)
 | |
|             printMutex.acquire();
 | |
|          if (verbose && verboseMessage != "")
 | |
|          {
 | |
|             println(verboseMessage);
 | |
|          }
 | |
|          else if (message != "")
 | |
|          {
 | |
|             println(message);
 | |
|          }
 | |
|          if (printMutex!=null)
 | |
|             printMutex.release();
 | |
|       }
 | |
|    }
 | |
|    inline public static function v(verboseMessage:String):Void
 | |
|    {
 | |
|       Log.info("",verboseMessage);
 | |
|    }
 | |
| 
 | |
|    public static function lock():Void
 | |
|    {
 | |
|       if (printMutex!=null)
 | |
|         printMutex.acquire();
 | |
|    }
 | |
| 
 | |
|    public static function unlock():Void
 | |
|    {
 | |
|       if (printMutex!=null)
 | |
|         printMutex.release();
 | |
|    }
 | |
| 
 | |
| 
 | |
|    public static function print(message:String):Void
 | |
|    {
 | |
|       if (printMutex!=null)
 | |
|         printMutex.acquire();
 | |
|       Sys.print(stripColor(message));
 | |
|          if (printMutex!=null)
 | |
|             printMutex.release();
 | |
|    }
 | |
| 
 | |
|    public static function println(message:String):Void
 | |
|    {
 | |
|       if (printMutex!=null)
 | |
|         printMutex.acquire();
 | |
|       Sys.println(stripColor(message));
 | |
|       if (printMutex!=null)
 | |
|          printMutex.release();
 | |
|    }
 | |
| 
 | |
|    private static function stripColor(output:String):String
 | |
|    {
 | |
|       if (colorSupported == null)
 | |
|       {
 | |
|          if (!BuildTool.isWindows)
 | |
|          {
 | |
|             var result = -1;
 | |
|             try
 | |
|             {
 | |
|                var process = new Process ("tput", [ "colors" ]);
 | |
|                result = process.exitCode ();
 | |
|                process.close ();
 | |
|             }
 | |
|             catch (e:Dynamic) {};
 | |
| 
 | |
|             colorSupported = (result == 0);
 | |
|          }
 | |
|          else
 | |
|          {
 | |
|             colorSupported = (Sys.getEnv("TERM") == "xterm" || Sys.getEnv("ANSICON") != null);
 | |
|          }
 | |
|       }
 | |
| 
 | |
|       if (colorSupported)
 | |
|       {
 | |
|          return output;
 | |
|       }
 | |
|       else
 | |
|       {
 | |
|          var colorCodes:EReg = ~/\x1b\[[^m]+m/g;
 | |
|          return colorCodes.replace(output, "");
 | |
|       }
 | |
|    }
 | |
| 
 | |
|    public static function warn(message:String, verboseMessage:String = "", allowRepeat:Bool = false):Void
 | |
|    {
 | |
|       if (!mute)
 | |
|       {
 | |
|          var output = "";
 | |
|          if (verbose && verboseMessage != "")
 | |
|          {
 | |
|             output = "\x1b[33;1mWarning:\x1b[0m \x1b[1m" + verboseMessage + "\x1b[0m";
 | |
|          }
 | |
|          else if (message != "")
 | |
|          {
 | |
|             output = "\x1b[33;1mWarning:\x1b[0m \x1b[1m" + message + "\x1b[0m";
 | |
|          }
 | |
| 
 | |
|          if (!allowRepeat && sentWarnings.exists (output))
 | |
|          {
 | |
|             return;
 | |
|          }
 | |
| 
 | |
|          sentWarnings.set(output, true);
 | |
| 
 | |
|          if (printMutex!=null)
 | |
|             printMutex.acquire();
 | |
|          println(output);
 | |
|          if (printMutex!=null)
 | |
|             printMutex.release();
 | |
|       }
 | |
|    }
 | |
| }
 |