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