Improving config files filtering logic

This commit is contained in:
Pavel Shevaev 2025-04-24 20:41:38 +03:00
parent b67bb3da3c
commit 8c0604b9fa
1 changed files with 39 additions and 29 deletions

View File

@ -18,7 +18,7 @@ class ConfigGlobals
public readonly string $base_class;
public readonly string $build_dir;
//NOTE: it's a string since is serialized
public readonly ?string $files_overrider;
public readonly ?string $files_filter;
function __construct(
array $base_dirs,
@ -26,7 +26,7 @@ class ConfigGlobals
?string $worker_init_fn = null,
int $workers_num = 1,
string $base_class = '\ConfBase',
?string $files_overrider = null
?string $files_filter = null
)
{
$this->base_dirs = array_map(fn($path) => normalize_path($path), $base_dirs);
@ -34,7 +34,7 @@ class ConfigGlobals
$this->worker_init_fn = $worker_init_fn;
$this->workers_num = $workers_num;
$this->base_class = $base_class;
$this->files_overrider = $files_overrider;
$this->files_filter = $files_filter;
}
function initWorker(bool $is_master_proc)
@ -183,7 +183,8 @@ class ConfigManager
function fetchAll(bool $force = false) : \Generator
{
$result = $this->updateAll($force);
return $this->iterateCache($result->request->files);
$filtered = $this->filterConfigFiles($result->request->files);
return $this->iterateCache($filtered);
}
function fetchByPath(string $path) : ConfigCacheEntry
@ -200,14 +201,11 @@ class ConfigManager
function iterateCache(iterable $files) : \Generator
{
foreach($files as $file)
{
if(config_is_file($file))
{
$ce = $this->cache->getOrLoadByPath($file);
yield $ce;
}
}
}
function update(ConfigUpdateRequest $req) : ConfigUpdateResult
{
@ -220,22 +218,20 @@ class ConfigManager
$removed_files = [];
$this->_checkFileMap($req, $added_files, $removed_files);
$affected_files = $this->_getAffectedFiles($req, $added_files, $removed_files);
$affected_all_files = $this->_getAffectedFiles($req, $added_files, $removed_files);
$affected_conf_files = $this->filterConfigFiles($affected_all_files);
//NOTE: at this point taking into account only config files
$affected_files->filter(fn($file) => config_is_file($file));
config_log("Affected files: {$affected_files->count()}/{$req->files->count()}");
config_log("Affected configs: {$affected_conf_files->count()}/{$req->files->count()}");
$update_result = new ConfigUpdateResult();
$update_result->request = $req;
$update_result->affected_files = $affected_files;
$update_result->affected_files = $affected_conf_files;
$update_result->added_files = $added_files;
$update_result->removed_files = $removed_files;
$update_params = new ConfigCacheUpdateParams(
globals: $this->globals,
affected_files: $affected_files,
affected_files: $affected_conf_files,
verbose: $req->verbose
);
self::_updateCache($update_result, $update_params);
@ -243,11 +239,11 @@ class ConfigManager
//let's clear internal cache once the update procedure is done
$this->cache->clear();
$this->_updateFileMap($req, $affected_files, $added_files, $removed_files);
$this->_updateFileMap($req, $affected_conf_files, $added_files, $removed_files);
if($req->return_affected)
{
foreach($affected_files as $file)
foreach($affected_conf_files as $file)
{
$entry = $this->cache->getOrLoadByPath($file);
$update_result->affected_entries[] = $entry;
@ -259,6 +255,19 @@ class ConfigManager
return $update_result;
}
function filterConfigFiles(ConfigDirFiles|\taskman\artefact\TaskmanDirFiles $files) : ConfigDirFiles
{
if($files instanceof \taskman\artefact\TaskmanDirFiles)
$files = ConfigDirFiles::makeFromArtefactFiles($files);
$filtered = $this->globals->files_filter != null ?
call_user_func($this->globals->files_filter, $files) :
new ConfigDirFiles($files->getMap());
$filtered->filter(fn($file) => config_is_file($file));
return $filtered;
}
function updateAll(bool $force = false) : ConfigUpdateResult
{
$files = $this->scanFiles(extension: '.js');
@ -330,19 +339,19 @@ class ConfigManager
}
}
private function _updateFileMap(ConfigUpdateRequest $req, ConfigDirFiles $affected_files, array $added_files, array $removed_files)
private function _updateFileMap(ConfigUpdateRequest $req, ConfigDirFiles $affected_conf_files, array $added_files, array $removed_files)
{
$fs_cache_map = $this->getFileMap();
//TODO: traverse all affected files and update file map
foreach($affected_files as $file)
//TODO: traverse all affected config files and update file map
foreach($affected_conf_files as $file)
{
$cache_entry = $this->cache->getOrLoadByPath($file);
$fs_cache_map->updateDepsForEntry($cache_entry);
}
if($req->mode == ConfigUpdateMode::Force ||
$affected_files->count() > 0 ||
$affected_conf_files->count() > 0 ||
$added_files ||
$removed_files)
{
@ -420,10 +429,7 @@ class ConfigManager
function scanFiles(string $extension = '.conf.js', bool $verbose = false) : ConfigDirFiles
{
$res = config_scan_files($this->globals->base_dirs, $extension, $verbose);
if($this->globals->files_overrider != null)
$res = call_user_func($this->globals->files_overrider, $res);
return $res;
return config_scan_files($this->globals->base_dirs, $extension, $verbose);
}
private function _getMapPath() : string
@ -435,8 +441,11 @@ class ConfigManager
{
if(!is_file($this->_getMapPath()))
return null;
config_log("Loading file map");
return ConfigCacheFileMap::unserialize(ensure_read($this->_getMapPath()));
$t = microtime(true);
$data = ensure_read($this->_getMapPath());
$map = ConfigCacheFileMap::unserialize($data);
config_log("Loaded file map: " . kb($data) . ", " . round(microtime(true) - $t,2) . " sec.");
return $map;
}
private static function _makeMap(ConfigDirFiles $files) : ConfigCacheFileMap
@ -449,9 +458,10 @@ class ConfigManager
private function _saveFileMap()
{
$t = microtime(true);
$data = ConfigCacheFileMap::serialize($this->getFileMap());
config_log("Saving file map: " . kb($data));
ensure_write($this->_getMapPath(), $data);
config_log("Saved file map: " . kb($data) . ", " . round(microtime(true) - $t,2) . " sec.");
}
}