Adding convenience fetch methods; Detect changed mode now uses the last run file to check for changes instead of result file
Publish PHP Package / docker (push) Successful in 7s
Details
Publish PHP Package / docker (push) Successful in 7s
Details
This commit is contained in:
parent
71acf66d82
commit
a199008a49
|
@ -12,11 +12,13 @@ require_once(__DIR__ . '/msgpack.inc.php');
|
|||
class ConfigGlobals
|
||||
{
|
||||
public readonly array $base_dirs;
|
||||
//NOTE: it's a string since is serialized
|
||||
public readonly ?string $worker_init_fn;
|
||||
public readonly int $workers_num;
|
||||
public readonly string $base_class;
|
||||
public readonly string $build_dir;
|
||||
public readonly mixed $files_overrider;
|
||||
//NOTE: it's a string since is serialized
|
||||
public readonly ?string $files_overrider;
|
||||
|
||||
function __construct(
|
||||
array $base_dirs,
|
||||
|
@ -24,7 +26,7 @@ class ConfigGlobals
|
|||
?string $worker_init_fn = null,
|
||||
int $workers_num = 1,
|
||||
string $base_class = '\ConfBase',
|
||||
callable $files_overrider = null
|
||||
?string $files_overrider = null
|
||||
)
|
||||
{
|
||||
$this->base_dirs = array_map(fn($path) => normalize_path($path), $base_dirs);
|
||||
|
@ -65,10 +67,9 @@ class ConfigUpdateRequest
|
|||
{
|
||||
public ConfigUpdateMode $mode;
|
||||
public ?ConfigDirFiles $files;
|
||||
public ?string $result_file;
|
||||
public ?\taskman\TaskmanFileChanges $file_changes;
|
||||
public bool $verbose = false;
|
||||
public bool $return_entries = false;
|
||||
public bool $return_affected = false;
|
||||
|
||||
private function __construct() {}
|
||||
|
||||
|
@ -83,7 +84,7 @@ class ConfigUpdateRequest
|
|||
return $req;
|
||||
}
|
||||
|
||||
static function detectChanged(string $result_file, \taskman\artefact\TaskmanDirFiles|ConfigDirFiles|null $files = null) : ConfigUpdateRequest
|
||||
static function detectChanged(\taskman\artefact\TaskmanDirFiles|ConfigDirFiles|null $files = null) : ConfigUpdateRequest
|
||||
{
|
||||
if($files instanceof \taskman\artefact\TaskmanDirFiles)
|
||||
$files = ConfigDirFiles::makeFromArtefactFiles($files);
|
||||
|
@ -91,7 +92,6 @@ class ConfigUpdateRequest
|
|||
$req = new ConfigUpdateRequest();
|
||||
$req->mode = ConfigUpdateMode::DetectChanged;
|
||||
$req->files = $files;
|
||||
$req->result_file = $result_file;
|
||||
return $req;
|
||||
}
|
||||
|
||||
|
@ -110,7 +110,7 @@ class ConfigUpdateRequest
|
|||
|
||||
class ConfigUpdateResult
|
||||
{
|
||||
public ConfigUpdateMode $mode;
|
||||
public ConfigUpdateRequest $request;
|
||||
|
||||
public ConfigDirFiles $affected_files;
|
||||
public array $affected_entries = array();
|
||||
|
@ -125,8 +125,8 @@ class ConfigUpdateResult
|
|||
|
||||
function isPatchPossible() : bool
|
||||
{
|
||||
return ($this->mode == ConfigUpdateMode::Selected ||
|
||||
$this->mode === ConfigUpdateMode::DetectChanged) &&
|
||||
return ($this->request->mode == ConfigUpdateMode::Selected ||
|
||||
$this->request->mode === ConfigUpdateMode::DetectChanged) &&
|
||||
count(array_filter($this->added_files, fn($f) => config_is_file($f))) == 0 &&
|
||||
count(array_filter($this->removed_files, fn($f) => config_is_file($f))) == 0;
|
||||
}
|
||||
|
@ -151,14 +151,8 @@ class ConfigManager
|
|||
return $this->globals;
|
||||
}
|
||||
|
||||
function getCache(ConfigGetMode $mode = ConfigGetMode::CacheOnly) : ConfigCache
|
||||
function getCache() : ConfigCache
|
||||
{
|
||||
if($mode != ConfigGetMode::CacheOnly)
|
||||
{
|
||||
foreach($this->getIterator($mode) as $ce)
|
||||
{}
|
||||
}
|
||||
|
||||
return $this->cache;
|
||||
}
|
||||
|
||||
|
@ -181,42 +175,34 @@ class ConfigManager
|
|||
return $this->file_map;
|
||||
}
|
||||
|
||||
function getByPath(string $file, ConfigGetMode $mode = ConfigGetMode::Auto, bool $normalize_path = true) : ConfigCacheEntry
|
||||
function fetchAll(bool $force = false) : \Generator
|
||||
{
|
||||
if($normalize_path)
|
||||
$file = normalize_path($file);
|
||||
|
||||
if($mode != ConfigGetMode::CacheOnly)
|
||||
{
|
||||
$cache_file = config_get_cache_path($this->globals, $file);
|
||||
|
||||
if($mode == ConfigGetMode::ForceUpdate || need_to_regen($cache_file, [$file]))
|
||||
{
|
||||
$base_dir = config_map_base_dir($this->globals->base_dirs, $file);
|
||||
$parser_type = null;
|
||||
$ce = _config_update_cache_entry($this->globals, $base_dir, $file, $cache_file, $parser_type);
|
||||
$this->cache->update($ce);
|
||||
}
|
||||
$result = $this->updateAll($force);
|
||||
return $this->iterateCache($result->request->files);
|
||||
}
|
||||
|
||||
return $this->cache->getOrLoadByPath($file);
|
||||
function fetchByPath(string $path) : ConfigCacheEntry
|
||||
{
|
||||
$path = realpath($path);
|
||||
$dir_files = ConfigDirFiles::makeFor($this);
|
||||
$dir_files->addFile($path);
|
||||
$request = ConfigUpdateRequest::selected($dir_files);
|
||||
$request->return_affected = true;
|
||||
$result = $this->update($request);
|
||||
return $result->affected_entries[0];
|
||||
}
|
||||
|
||||
function getIterator(ConfigGetMode $mode = ConfigGetMode::Auto, mixed $files = null, bool $normalize_path = false) : \Generator
|
||||
function iterateCache(iterable $files) : \Generator
|
||||
{
|
||||
if($files === null)
|
||||
{
|
||||
$files = $this->scanFiles();
|
||||
$normalize_path = false;
|
||||
}
|
||||
|
||||
$cache_entries = [];
|
||||
foreach($files as $file)
|
||||
{
|
||||
$ce = $this->getByPath($file, $mode, normalize_path: $normalize_path);
|
||||
if(config_is_file($file))
|
||||
{
|
||||
$ce = $this->cache->getOrLoadByPath($file);
|
||||
yield $ce;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function update(ConfigUpdateRequest $req) : ConfigUpdateResult
|
||||
{
|
||||
|
@ -237,7 +223,7 @@ class ConfigManager
|
|||
config_log("Affected files: {$affected_files->count()}");
|
||||
|
||||
$update_result = new ConfigUpdateResult();
|
||||
$update_result->mode = $req->mode;
|
||||
$update_result->request = $req;
|
||||
$update_result->affected_files = $affected_files;
|
||||
$update_result->added_files = $added_files;
|
||||
$update_result->removed_files = $removed_files;
|
||||
|
@ -254,7 +240,7 @@ class ConfigManager
|
|||
|
||||
$this->_updateFileMap($req, $affected_files, $added_files, $removed_files);
|
||||
|
||||
if($req->return_entries)
|
||||
if($req->return_affected)
|
||||
{
|
||||
foreach($affected_files as $file)
|
||||
{
|
||||
|
@ -263,9 +249,26 @@ class ConfigManager
|
|||
}
|
||||
}
|
||||
|
||||
touch($this->_getLastUpdateFile());
|
||||
|
||||
return $update_result;
|
||||
}
|
||||
|
||||
function updateAll(bool $force = false) : ConfigUpdateResult
|
||||
{
|
||||
$files = $this->scanFiles(extension: '.js');
|
||||
$result = $this->update($force ?
|
||||
ConfigUpdateRequest::force($files) :
|
||||
ConfigUpdateRequest::detectChanged($files)
|
||||
);
|
||||
return $result;
|
||||
}
|
||||
|
||||
function _getLastUpdateFile() : string
|
||||
{
|
||||
return $this->globals->build_dir . '/update.last';
|
||||
}
|
||||
|
||||
private function _updateCache(ConfigUpdateResult $result, ConfigCacheUpdateParams $params)
|
||||
{
|
||||
if($params->affected_files->isEmpty())
|
||||
|
@ -357,11 +360,13 @@ class ConfigManager
|
|||
{
|
||||
$affected_files = ConfigDirFiles::makeFor($this);
|
||||
|
||||
$last_run_file = $this->_getLastUpdateFile();
|
||||
|
||||
foreach($req->files->getMap() as $base_dir => $files)
|
||||
{
|
||||
foreach($files as $file)
|
||||
{
|
||||
if(need_to_regen($req->result_file, [$file]))
|
||||
if(need_to_regen($last_run_file, [$file]))
|
||||
{
|
||||
$affected_files->add($base_dir, $file);
|
||||
|
||||
|
|
14
pack.inc.php
14
pack.inc.php
|
@ -42,10 +42,12 @@ function config_pack_bundle(ConfigPackParams $params) : string
|
|||
|
||||
$packed_data = null;
|
||||
|
||||
$cache_entries = iterator_to_array($params->cache_entries);
|
||||
|
||||
if($params->binary_format == 1)
|
||||
{
|
||||
$packed_data = _config_pack_bundle_fmt1(
|
||||
$params->cache_entries,
|
||||
$cache_entries,
|
||||
$params->use_lz4,
|
||||
$params->use_config_refs,
|
||||
$params->version
|
||||
|
@ -54,7 +56,7 @@ function config_pack_bundle(ConfigPackParams $params) : string
|
|||
else if($params->binary_format == 2)
|
||||
{
|
||||
$packed_data = _config_pack_bundle_fmt2(
|
||||
$params->cache_entries,
|
||||
$cache_entries,
|
||||
$params->use_lz4,
|
||||
$params->use_config_refs,
|
||||
$params->version,
|
||||
|
@ -63,7 +65,7 @@ function config_pack_bundle(ConfigPackParams $params) : string
|
|||
else if($params->binary_format == 3)
|
||||
{
|
||||
$packed_data = _config_pack_bundle_fmt3(
|
||||
$params->cache_entries,
|
||||
$cache_entries,
|
||||
$params->use_lz4,
|
||||
$params->use_config_refs,
|
||||
$params->version,
|
||||
|
@ -75,7 +77,7 @@ function config_pack_bundle(ConfigPackParams $params) : string
|
|||
throw new Exception("Unknown binary format: {$params->binary_format}");
|
||||
|
||||
if($params->debug)
|
||||
config_log("Packed entries: " . sizeof($params->cache_entries) . ", total: " .
|
||||
config_log("Packed entries: " . count($cache_entries) . ", total: " .
|
||||
kb($packed_data) . ", format: {$params->binary_format}, lz4: " .
|
||||
var_export($params->use_lz4, true) . ", refs: " . var_export($params->use_config_refs, true) .
|
||||
", CRC: " . crc32($packed_data) .
|
||||
|
@ -115,7 +117,7 @@ function config_patch_bundle(ConfigPackParams $params, string $packed_data) : st
|
|||
|
||||
//NOTE: strids are stored as CRCs, potential collision may happen (error will be raised during build)
|
||||
function _config_pack_bundle_fmt1(
|
||||
iterable $cache_entries,
|
||||
array $cache_entries,
|
||||
bool $use_lz4,
|
||||
bool $use_config_refs,
|
||||
int $version) : string
|
||||
|
@ -173,7 +175,7 @@ function _config_pack_bundle_fmt1(
|
|||
//NOTE: strids are stored as lookup strings, and actually an array of lookup string indices
|
||||
// (each path item separated by '/' is stored as an array item)
|
||||
function _config_pack_bundle_fmt2(
|
||||
iterable $cache_entries,
|
||||
array $cache_entries,
|
||||
bool $use_lz4,
|
||||
bool $use_config_refs,
|
||||
int $version,
|
||||
|
|
Loading…
Reference in New Issue