Improving config files filtering logic
This commit is contained in:
parent
b67bb3da3c
commit
8c0604b9fa
|
@ -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
|
||||
|
@ -201,11 +202,8 @@ class ConfigManager
|
|||
{
|
||||
foreach($files as $file)
|
||||
{
|
||||
if(config_is_file($file))
|
||||
{
|
||||
$ce = $this->cache->getOrLoadByPath($file);
|
||||
yield $ce;
|
||||
}
|
||||
$ce = $this->cache->getOrLoadByPath($file);
|
||||
yield $ce;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue