From d0f700c958aaa0c020bee0d3fe8ed27839f89941 Mon Sep 17 00:00:00 2001 From: Pavel Shevaev Date: Thu, 17 Apr 2025 12:08:22 +0300 Subject: [PATCH] Incapsulating update logic better --- config.inc.php | 97 ++++++++++++++++++++++++++++---------------------- 1 file changed, 55 insertions(+), 42 deletions(-) diff --git a/config.inc.php b/config.inc.php index 77ef68c..52542c0 100644 --- a/config.inc.php +++ b/config.inc.php @@ -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);