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();
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								}
							 |