Incapsulating update logic better

This commit is contained in:
Pavel Shevaev 2025-04-17 12:08:22 +03:00
parent c4ca9831f1
commit d0f700c958
1 changed files with 55 additions and 42 deletions

View File

@ -37,9 +37,43 @@ class ConfigGlobals
enum ConfigUpdateMode : int enum ConfigUpdateMode : int
{ {
case Full = 1; case All = 1;
case RelativeToBundle = 2; case AllChanged = 2;
case ChangedOnly = 3; case Patch = 3;
}
class ConfigUpdateRequest
{
public ConfigUpdateMode $mode;
public ?ConfigDirFiles $files;
public ?string $result_file;
private function __construct() {}
static function all(?ConfigDirFiles $files = null) : ConfigUpdateRequest
{
$update = new ConfigUpdateRequest();
$update->mode = ConfigUpdateMode::All;
$update->files = $files;
return $update;
}
static function allChanged(string $result_file, ?ConfigDirFiles $files = null) : ConfigUpdateRequest
{
$update = new ConfigUpdateRequest();
$update->mode = ConfigUpdateMode::Patch;
$update->files = $files;
$update->result_file = $result_file;
return $update;
}
static function patch(ConfigDirFiles $files) : ConfigUpdateRequest
{
$update = new ConfigUpdateRequest();
$update->mode = ConfigUpdateMode::Patch;
$update->files = $files;
return $update;
}
} }
class ConfigManager class ConfigManager
@ -92,36 +126,18 @@ class ConfigManager
return $this->file_map; return $this->file_map;
} }
function updateCache( function updateCache(ConfigUpdateRequest $req, bool $verbose = false) : ConfigCacheUpdateResult
ConfigUpdateMode $update_mode,
ConfigDirFiles $input_files = null,
?string $result_bundle_file = null,
bool $verbose = false
) : ConfigCacheUpdateResult
{ {
config_log("Updating cache, mode {$update_mode->value}..."); config_log("Updating cache, mode {$req->mode->value}...");
if($input_files === null && $update_mode === ConfigUpdateMode::ChangedOnly) if($req->files === null)
throw new Exception("input_files argument is required for ChangedOnly mode"); $req->files = $this->scanFiles(extension: '.js', verbose: $verbose);
if($input_files === null)
$input_files = $this->scanFiles(extension: '.js', verbose: $verbose);
$added_files = []; $added_files = [];
$removed_files = []; $removed_files = [];
$this->_checkFileMap( $this->_checkFileMap($req, $added_files, $removed_files);
$update_mode,
$input_files,
$added_files,
$removed_files
);
$affected_files = $this->_getAffectedFiles( $affected_files = $this->_getAffectedFiles($req, $removed_files);
$update_mode,
$result_bundle_file,
$input_files,
$removed_files
);
//NOTE: at this poine taking into account only config files //NOTE: at this poine taking into account only config files
$affected_files->filter(fn($file) => str_ends_with($file, '.conf.js')); $affected_files->filter(fn($file) => str_ends_with($file, '.conf.js'));
@ -156,39 +172,36 @@ class ConfigManager
return $update_result; return $update_result;
} }
private function _checkFileMap(ConfigUpdateMode $update_mode, ConfigDirFiles $input_files, array &$added_files, array &$removed_files) private function _checkFileMap(ConfigUpdateRequest $req, array &$added_files, array &$removed_files)
{ {
$fs_cache_map = $this->_getFileMap($update_mode != ConfigUpdateMode::ChangedOnly ? $input_files : null); $fs_cache_map = $this->_getFileMap($req->mode != ConfigUpdateMode::Patch ? $req->files : null);
if($update_mode === ConfigUpdateMode::Full || $update_mode === ConfigUpdateMode::RelativeToBundle) if($req->mode === ConfigUpdateMode::All || $req->mode === ConfigUpdateMode::AllChanged)
{ {
list($added_files, $removed_files) = $fs_cache_map->compare($input_files->getAllFiles()); list($added_files, $removed_files) = $fs_cache_map->compare($req->files->getAllFiles());
config_log("File map added: ".count($added_files).", removed: ".count($removed_files)); config_log("File map added: ".count($added_files).", removed: ".count($removed_files));
} }
} }
private function _getAffectedFiles(ConfigUpdateMode $update_mode, ?string $result_bundle_file, ConfigDirFiles $input_files, array $removed_files) : ConfigDirFiles private function _getAffectedFiles(ConfigUpdateRequest $req, array $removed_files) : ConfigDirFiles
{ {
$fs_cache_map = $this->getFileMap(); $fs_cache_map = $this->getFileMap();
$affected_files = null; $affected_files = null;
if($update_mode === ConfigUpdateMode::Full) if($req->mode === ConfigUpdateMode::All)
{ {
$affected_files = $input_files; $affected_files = $req->files;
} }
else if($update_mode === ConfigUpdateMode::RelativeToBundle) else if($req->mode === ConfigUpdateMode::AllChanged)
{ {
if($result_bundle_file === null)
throw new Exception("result_bundle_file argument is required");
$affected_files = ConfigDirFiles::makeFor($this); $affected_files = ConfigDirFiles::makeFor($this);
foreach($input_files->getMap() as $base_dir => $files) foreach($req->files->getMap() as $base_dir => $files)
{ {
foreach($files as $file) foreach($files as $file)
{ {
if(need_to_regen($result_bundle_file, [$file])) if(need_to_regen($req->result_file, [$file]))
{ {
$affected_files->add($base_dir, $file); $affected_files->add($base_dir, $file);
@ -214,11 +227,11 @@ class ConfigManager
} }
} }
} }
else if($update_mode === ConfigUpdateMode::ChangedOnly) else if($req->mode === ConfigUpdateMode::Patch)
{ {
$affected_files = ConfigDirFiles::makeFor($this); $affected_files = ConfigDirFiles::makeFor($this);
foreach($input_files as $file) foreach($req->files as $file)
{ {
$affected_files->addFile($file, unique: true); $affected_files->addFile($file, unique: true);