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