2025-01-22 16:18:30 +01:00

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