305 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
		
		
			
		
	
	
			305 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| 
								 | 
							
								import sys.FileSystem;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class CompileCache
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								   public static var hasCache = false;
							 | 
						||
| 
								 | 
							
								   public static var compileCache:String;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function init(inDefines:Map<String, String>) : Bool
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      compileCache = "";
							 | 
						||
| 
								 | 
							
								      hasCache = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (inDefines.exists("HXCPP_COMPILE_CACHE"))
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         compileCache = inDefines.get("HXCPP_COMPILE_CACHE");
							 | 
						||
| 
								 | 
							
								         compileCache = compileCache.split("\\").join("/");
							 | 
						||
| 
								 | 
							
								         // Don't get upset by trailing slash
							 | 
						||
| 
								 | 
							
								         while(compileCache.length>1)
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            var l = compileCache.length;
							 | 
						||
| 
								 | 
							
								            var last = compileCache.substr(l-1);
							 | 
						||
| 
								 | 
							
								            if (last=="/")
							 | 
						||
| 
								 | 
							
								               compileCache = compileCache.substr(0,l-1);
							 | 
						||
| 
								 | 
							
								            else
							 | 
						||
| 
								 | 
							
								               break;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								         if (!FileSystem.exists(compileCache))
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            try{
							 | 
						||
| 
								 | 
							
								               PathManager.mkdir(compileCache);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								               Log.error("Could not create compiler cache directory \"" + compileCache + "\"");
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								         if (FileSystem.exists(compileCache) && FileSystem.isDirectory(compileCache))
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            hasCache = true;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								         else
							 | 
						||
| 
								 | 
							
								         {
							 | 
						||
| 
								 | 
							
								            Log.error("Could not find compiler cache \"" + compileCache + "\"");
							 | 
						||
| 
								 | 
							
								            //throw "Could not find compiler cache: " + compileCache;
							 | 
						||
| 
								 | 
							
								         }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (hasCache)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         Log.info("", "\x1b[33;1mUsing compiler cache: " + compileCache + "\x1b[0m");
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      return hasCache;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*
							 | 
						||
| 
								 | 
							
								   public static function getPchCacheName(inProject:String,hash:String,header:String, inExt:String)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      var dir = compileCache + "/" + inProject + "/pch" + hash.substr(0,8);
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         if (!FileSystem.exists(dir))
							 | 
						||
| 
								 | 
							
								            PathManager.mkdir(dir);
							 | 
						||
| 
								 | 
							
								      } catch(e:Dynamic) { }
							 | 
						||
| 
								 | 
							
								      return dir + "/" + header + inExt;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function getPchDir(inProject:String,hash:String)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      var dir = compileCache + "/" + inProject + "/pch" + hash.substr(0,8);
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         if (!FileSystem.exists(dir))
							 | 
						||
| 
								 | 
							
								            PathManager.mkdir(dir);
							 | 
						||
| 
								 | 
							
								      } catch(e:Dynamic) { }
							 | 
						||
| 
								 | 
							
								      return dir;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function getCacheName(inProject:String,hash:String,inExt:String)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      var dir = compileCache + "/" + inProject + "/" + hash.substr(0,2);
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         if (!FileSystem.exists(dir))
							 | 
						||
| 
								 | 
							
								            PathManager.mkdir(dir);
							 | 
						||
| 
								 | 
							
								      } catch(e:Dynamic) { }
							 | 
						||
| 
								 | 
							
								      return dir + "/" + hash.substr(2) + inExt;
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function clear(inDays:Int,inMB:Int,inLogInfo:Bool,inProject:String)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        var projects = FileSystem.readDirectory(compileCache);
							 | 
						||
| 
								 | 
							
								        var deleted = 0;
							 | 
						||
| 
								 | 
							
								        var total = 0;
							 | 
						||
| 
								 | 
							
								        var t0 = haxe.Timer.stamp();
							 | 
						||
| 
								 | 
							
								        var tooOld = Date.now().getTime() - inDays * 24 * 3600 * 1000.0;
							 | 
						||
| 
								 | 
							
								        var sizeKB:Float = 0;
							 | 
						||
| 
								 | 
							
								        var fileInfo = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        for(project in projects)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								           if (inProject!=null && inProject!=project)
							 | 
						||
| 
								 | 
							
								              continue;
							 | 
						||
| 
								 | 
							
								           var projectHasDirs = false;
							 | 
						||
| 
								 | 
							
								           var projDir = compileCache + "/" + project;
							 | 
						||
| 
								 | 
							
								           if(!FileSystem.isDirectory(projDir))
							 | 
						||
| 
								 | 
							
								               continue;
							 | 
						||
| 
								 | 
							
								           var dirs = FileSystem.readDirectory(projDir);
							 | 
						||
| 
								 | 
							
								           for(dir in dirs)
							 | 
						||
| 
								 | 
							
								           {
							 | 
						||
| 
								 | 
							
								              var path = projDir + "/" + dir;
							 | 
						||
| 
								 | 
							
								              if(!FileSystem.isDirectory(path)) {
							 | 
						||
| 
								 | 
							
								                  FileSystem.deleteFile(path);
							 | 
						||
| 
								 | 
							
								                  continue;
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								              if (dir.length!=2 && dir!="lib" && dir.substr(0,3)!="pch" )
							 | 
						||
| 
								 | 
							
								              {
							 | 
						||
| 
								 | 
							
								                 Log.warn('bad cache name "$dir" found - try manually clearing');
							 | 
						||
| 
								 | 
							
								                 continue;
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								              var dirFiles = FileSystem.readDirectory(path);
							 | 
						||
| 
								 | 
							
								              var allDeleted = true;
							 | 
						||
| 
								 | 
							
								              for(file in dirFiles)
							 | 
						||
| 
								 | 
							
								              {
							 | 
						||
| 
								 | 
							
								                 total++;
							 | 
						||
| 
								 | 
							
								                 var filename = path + "/" + file;
							 | 
						||
| 
								 | 
							
								                 var doDelete = true;
							 | 
						||
| 
								 | 
							
								                 if (inDays>0)
							 | 
						||
| 
								 | 
							
								                 {
							 | 
						||
| 
								 | 
							
								                    var info = FileSystem.stat(filename);
							 | 
						||
| 
								 | 
							
								                    var atime = info.atime;
							 | 
						||
| 
								 | 
							
								                    var time = atime==null ? info.mtime.getTime() :
							 | 
						||
| 
								 | 
							
								                                Math.max(info.atime.getTime(),info.mtime.getTime() );
							 | 
						||
| 
								 | 
							
								                    if (time>=tooOld)
							 | 
						||
| 
								 | 
							
								                       doDelete = false;
							 | 
						||
| 
								 | 
							
								                 }
							 | 
						||
| 
								 | 
							
								                 else if (inMB>0)
							 | 
						||
| 
								 | 
							
								                 {
							 | 
						||
| 
								 | 
							
								                    var info = FileSystem.stat(filename);
							 | 
						||
| 
								 | 
							
								                    var atime = info.atime;
							 | 
						||
| 
								 | 
							
								                    var time = atime==null ? info.mtime.getTime() :
							 | 
						||
| 
								 | 
							
								                                Math.max(info.atime.getTime(),info.mtime.getTime() );
							 | 
						||
| 
								 | 
							
								                    fileInfo.push( {filename:filename, time:time, size:info.size } );
							 | 
						||
| 
								 | 
							
								                    sizeKB += info.size/1024;
							 | 
						||
| 
								 | 
							
								                    doDelete = false;
							 | 
						||
| 
								 | 
							
								                 }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                 if (doDelete)
							 | 
						||
| 
								 | 
							
								                 {
							 | 
						||
| 
								 | 
							
								                    try
							 | 
						||
| 
								 | 
							
								                    {
							 | 
						||
| 
								 | 
							
								                    FileSystem.deleteFile(filename);
							 | 
						||
| 
								 | 
							
								                    deleted++;
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                    catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								                    {
							 | 
						||
| 
								 | 
							
								                       Log.warn('Could not delete $filename');
							 | 
						||
| 
								 | 
							
								                    }
							 | 
						||
| 
								 | 
							
								                 }
							 | 
						||
| 
								 | 
							
								                 else
							 | 
						||
| 
								 | 
							
								                    allDeleted = false;
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								              if (allDeleted)
							 | 
						||
| 
								 | 
							
								              {
							 | 
						||
| 
								 | 
							
								                 try
							 | 
						||
| 
								 | 
							
								                 {
							 | 
						||
| 
								 | 
							
								                    FileSystem.deleteDirectory(path);
							 | 
						||
| 
								 | 
							
								                 }
							 | 
						||
| 
								 | 
							
								                 catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								                 {
							 | 
						||
| 
								 | 
							
								                    Log.warn('Could not delete directory $path');
							 | 
						||
| 
								 | 
							
								                 }
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								              else
							 | 
						||
| 
								 | 
							
								                 projectHasDirs = true;
							 | 
						||
| 
								 | 
							
								           }
							 | 
						||
| 
								 | 
							
								           if (!projectHasDirs)
							 | 
						||
| 
								 | 
							
								           {
							 | 
						||
| 
								 | 
							
								              try
							 | 
						||
| 
								 | 
							
								              {
							 | 
						||
| 
								 | 
							
								                 FileSystem.deleteDirectory(projDir);
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								              catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								              {
							 | 
						||
| 
								 | 
							
								                Log.warn('Could not delete directory $projDir');
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								           }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								          
							 | 
						||
| 
								 | 
							
								        if (inMB*1024<sizeKB)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								           // newest first
							 | 
						||
| 
								 | 
							
								           fileInfo.sort( function(a,b) return a.time > b.time ? -1 : 1 );
							 | 
						||
| 
								 | 
							
								           var keepKB:Float = inMB*1024;
							 | 
						||
| 
								 | 
							
								           for(info in fileInfo)
							 | 
						||
| 
								 | 
							
								           {
							 | 
						||
| 
								 | 
							
								              if (keepKB>0)
							 | 
						||
| 
								 | 
							
								              {
							 | 
						||
| 
								 | 
							
								                 sizeKB -= info.size/1024;
							 | 
						||
| 
								 | 
							
								                 keepKB -= info.size/1024;
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								              else
							 | 
						||
| 
								 | 
							
								              {
							 | 
						||
| 
								 | 
							
								                 try
							 | 
						||
| 
								 | 
							
								                 {
							 | 
						||
| 
								 | 
							
								                    FileSystem.deleteFile(info.filename);
							 | 
						||
| 
								 | 
							
								                    deleted++;
							 | 
						||
| 
								 | 
							
								                 }
							 | 
						||
| 
								 | 
							
								                 catch(e:Dynamic)
							 | 
						||
| 
								 | 
							
								                 {
							 | 
						||
| 
								 | 
							
								                   Log.warn('Could not delete ${info.filename}');
							 | 
						||
| 
								 | 
							
								                 }
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								           }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var t = haxe.Timer.stamp()-t0;
							 | 
						||
| 
								 | 
							
								        var projString = inProject==null ? "" : ' from project $inProject';
							 | 
						||
| 
								 | 
							
								        var message = inMB > 0 ?
							 | 
						||
| 
								 | 
							
								             'Cache: removed $deleted/$total files$projString, leaving ' + Std.int(sizeKB/1024) + 'MB, in $t seconds' :
							 | 
						||
| 
								 | 
							
								             'Cache: removed $deleted/$total files$projString in $t seconds';
							 | 
						||
| 
								 | 
							
								        if (inLogInfo)
							 | 
						||
| 
								 | 
							
								           Log.info(message);
							 | 
						||
| 
								 | 
							
								        else
							 | 
						||
| 
								 | 
							
								           Log.v(message);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch(error:Dynamic)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         Log.warn("Error cleaning cache: " + error);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								   public static function list(inDetails:Bool,inProject:String)
							 | 
						||
| 
								 | 
							
								   {
							 | 
						||
| 
								 | 
							
								      try
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        Sys.println('Cache Directory: $compileCache');
							 | 
						||
| 
								 | 
							
								        var t0 = haxe.Timer.stamp();
							 | 
						||
| 
								 | 
							
								        var files = new Array<String>();
							 | 
						||
| 
								 | 
							
								        var projects = FileSystem.readDirectory(compileCache);
							 | 
						||
| 
								 | 
							
								        var size = 0.0;
							 | 
						||
| 
								 | 
							
								        var count = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        for(project in projects)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								           if (inProject!=null && inProject!=project)
							 | 
						||
| 
								 | 
							
								              continue;
							 | 
						||
| 
								 | 
							
								           var projSize = size;
							 | 
						||
| 
								 | 
							
								           var projCount = count;
							 | 
						||
| 
								 | 
							
								           var projDir = compileCache + "/" + project;
							 | 
						||
| 
								 | 
							
								           if(!FileSystem.isDirectory(projDir))
							 | 
						||
| 
								 | 
							
								               continue;
							 | 
						||
| 
								 | 
							
								           var dirs = FileSystem.readDirectory(projDir);
							 | 
						||
| 
								 | 
							
								           for(dir in dirs)
							 | 
						||
| 
								 | 
							
								           {
							 | 
						||
| 
								 | 
							
								              var path = projDir + "/" + dir;
							 | 
						||
| 
								 | 
							
								              if(!FileSystem.isDirectory(path))
							 | 
						||
| 
								 | 
							
								                  continue;
							 | 
						||
| 
								 | 
							
								              var dirFiles = FileSystem.readDirectory(path);
							 | 
						||
| 
								 | 
							
								              for(file in dirFiles)
							 | 
						||
| 
								 | 
							
								              {
							 | 
						||
| 
								 | 
							
								                 var filename = path + "/" + file;
							 | 
						||
| 
								 | 
							
								                 var info = FileSystem.stat(filename);
							 | 
						||
| 
								 | 
							
								                 if (inDetails)
							 | 
						||
| 
								 | 
							
								                 {
							 | 
						||
| 
								 | 
							
								                    var atime = info.atime;
							 | 
						||
| 
								 | 
							
								                    if (atime==null || atime.getTime()<info.mtime.getTime())
							 | 
						||
| 
								 | 
							
								                       atime = info.mtime;
							 | 
						||
| 
								 | 
							
								                    Sys.println('$filename : ${info.size} bytes, $atime');
							 | 
						||
| 
								 | 
							
								                 }
							 | 
						||
| 
								 | 
							
								                 count++;
							 | 
						||
| 
								 | 
							
								                 size += info.size;
							 | 
						||
| 
								 | 
							
								              }
							 | 
						||
| 
								 | 
							
								              //files = files.concat(dirFiles);
							 | 
						||
| 
								 | 
							
								           }
							 | 
						||
| 
								 | 
							
								           projSize = Std.int( (size - projSize)/1024 );
							 | 
						||
| 
								 | 
							
								           projCount = count - projCount;
							 | 
						||
| 
								 | 
							
								           Sys.println('Project $project\t: ${projSize}k in $projCount files');
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        var k = Std.int(size/1024);
							 | 
						||
| 
								 | 
							
								        var t = haxe.Timer.stamp()-t0;
							 | 
						||
| 
								 | 
							
								        var projString = inProject==null ? "" : ' in project $inProject';
							 | 
						||
| 
								 | 
							
								        Sys.println('Found: ${k}k in $count files$projString in $t seconds');
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      catch(error:Dynamic)
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								         Log.warn("Error accessing cache: " + error);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								   }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |