Incapsulating update logic better
This commit is contained in:
parent
c4ca9831f1
commit
d0f700c958
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue