diff --git a/cache.inc.php b/cache.inc.php index 95bd30c..b95ced1 100644 --- a/cache.inc.php +++ b/cache.inc.php @@ -268,8 +268,11 @@ class ConfigCacheFileMap return array_keys($this->file2deps[$file]); } - function differs(array $files) : bool + function differs(ConfigDirFiles|\taskman\artefact\TaskmanDirFiles|array $files) : bool { + if(!is_array($files)) + $files = $files->getAllFiles(); + $this_files = array_keys($this->file2deps); return count($files) !== count($this_files) || diff --git a/config.inc.php b/config.inc.php index 78787fc..d030495 100644 --- a/config.inc.php +++ b/config.inc.php @@ -56,6 +56,7 @@ class ConfigUpdateRequest public ConfigUpdateMode $mode; public ?ConfigDirFiles $files; public ?string $result_file; + public ?\taskman\TaskmanFileChanges $file_changes; private function __construct() {} @@ -76,7 +77,16 @@ class ConfigUpdateRequest return $req; } - static function patch(ConfigDirFiles $files) : ConfigUpdateRequest + static function patch(\taskman\TaskmanFileChanges $file_changes, ConfigDirFiles $files) : ConfigUpdateRequest + { + $req = new ConfigUpdateRequest(); + $req->mode = ConfigUpdateMode::Patch; + $req->files = $files; + $req->file_changes = $file_changes; + return $req; + } + + static function selected(ConfigDirFiles $files) : ConfigUpdateRequest { $req = new ConfigUpdateRequest(); $req->mode = ConfigUpdateMode::Patch; @@ -109,7 +119,7 @@ class ConfigManager return $this->cache; } - function getArtifactFilesSpec() : array + function getArtefactFilesSpec() : array { return [$this->globals->base_dirs, ['.js']]; } @@ -215,14 +225,15 @@ class ConfigManager } else if($req->mode === ConfigUpdateMode::Patch) { - foreach($req->files as $file) + if($req->file_changes != null) { - //TODO: is it robust enough? - //TODO: we should make difference between changed and added! - if(file_exists($file)) - $added_files[] = $file; - else - $removed_files[] = $file; + foreach($req->files as $file) + { + if($req->file_changes->isCreated($file)) + $added_files[] = $file; + else if($req->file_changes->isDeleted($file)) + $removed_files[] = $file; + } } } } @@ -295,17 +306,6 @@ class ConfigManager { $affected_files = ConfigDirFiles::makeFor($this); - foreach($req->files as $file) - { - //removed config special case - if(str_ends_with($file, '.conf.js') && in_array($file, $removed_files)) - { - //NOTE: let it be for now, rebuilds the whole bundle - $affected_files = $this->scanFiles(extension: '.conf.js'); - return $affected_files; - } - } - foreach($req->files as $file) { $affected_files->addFile($file, unique: true);