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
{
case Full = 1;
case RelativeToBundle = 2;
case ChangedOnly = 3;
case All = 1;
case AllChanged = 2;
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
@ -92,36 +126,18 @@ class ConfigManager
return $this->file_map;
}
function updateCache(
ConfigUpdateMode $update_mode,
ConfigDirFiles $input_files = null,
?string $result_bundle_file = null,
bool $verbose = false
) : ConfigCacheUpdateResult
function updateCache(ConfigUpdateRequest $req, 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)
throw new Exception("input_files argument is required for ChangedOnly mode");
if($input_files === null)
$input_files = $this->scanFiles(extension: '.js', verbose: $verbose);
if($req->files === null)
$req->files = $this->scanFiles(extension: '.js', verbose: $verbose);
$added_files = [];
$removed_files = [];
$this->_checkFileMap(
$update_mode,
$input_files,
$added_files,
$removed_files
);
$this->_checkFileMap($req, $added_files, $removed_files);
$affected_files = $this->_getAffectedFiles(
$update_mode,
$result_bundle_file,
$input_files,
$removed_files
);
$affected_files = $this->_getAffectedFiles($req, $removed_files);
//NOTE: at this poine taking into account only config files
$affected_files->filter(fn($file) => str_ends_with($file, '.conf.js'));
@ -156,39 +172,36 @@ class ConfigManager
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));
}
}
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();
$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);
foreach($input_files->getMap() as $base_dir => $files)
foreach($req->files->getMap() as $base_dir => $files)
{
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);
@ -214,11 +227,11 @@ class ConfigManager
}
}
}
else if($update_mode === ConfigUpdateMode::ChangedOnly)
else if($req->mode === ConfigUpdateMode::Patch)
{
$affected_files = ConfigDirFiles::makeFor($this);
foreach($input_files as $file)
foreach($req->files as $file)
{
$affected_files->addFile($file, unique: true);