Improving lazy checks for stale artefacts; Adding artefacts stale check bench timings
Publish PHP Package / docker (push) Successful in 6s Details

This commit is contained in:
Pavel Shevaev 2025-04-23 20:33:16 +03:00
parent c0caa504a9
commit e5f15251d7
2 changed files with 44 additions and 16 deletions

View File

@ -87,17 +87,30 @@ class TaskmanArtefact
function isSourcesAffected(int $idx) : bool function isSourcesAffected(int $idx) : bool
{ {
return isset($this->sources_affected[$idx]) && $this->sources_affected[$idx]; if(!isset($this->sources_affected[$idx]))
{
$file_changes = $this->task->getFileChanges();
$sources = $file_changes != null ? $this->getChangedSources($idx) : $this->getSources($idx);
$this->sources_affected[$idx] = is_stale($this->getPath(), $sources);
}
return $this->sources_affected[$idx];
} }
function getAffectedSourcesIndices() : array function getAffectedSourcesIndices() : array
{ {
return array_keys($this->sources_affected); $indices = array();
foreach($this->sources_affected as $idx => $is_affected)
{
if($is_affected)
$indices[] = $idx;
}
return $indices;
} }
function isStale() : bool function isStale() : bool
{ {
return count($this->sources_affected) > 0; return count($this->getAffectedSourcesIndices()) > 0;
} }
function initSources() function initSources()
@ -106,7 +119,7 @@ class TaskmanArtefact
$all_src_specs = $this->getSourcesSpec(); $all_src_specs = $this->getSourcesSpec();
//let's process a convenience special case //let's process a convenience special case
if(count($all_src_specs) > 0 && !is_array($all_src_specs[0])) if(count($all_src_specs) > 0 && !is_array($all_src_specs[0]) && !is_int($all_src_specs[0]))
$all_src_specs = [$all_src_specs]; $all_src_specs = [$all_src_specs];
foreach($all_src_specs as $src_idx => $src_spec) foreach($all_src_specs as $src_idx => $src_spec)
@ -146,6 +159,18 @@ class TaskmanArtefact
); );
} }
} }
//references another artefact by its index
else if(is_int($src_spec))
{
$src_artefact = $this->task->getArtefact($src_spec);
foreach($src_artefact->getSourcesSpec() as $src_idx => $_)
{
$this->setSourcesFn($src_idx, fn() => $src_artefact->getSources($src_idx));
if($file_changes != null)
$this->setSourcesChangedFn($src_idx, fn() => $src_artefact->getChangedSources($src_idx));
}
}
else else
throw new Exception("Unknown artefact '{$this->getPath()}' source type" . gettype($src_spec)); throw new Exception("Unknown artefact '{$this->getPath()}' source type" . gettype($src_spec));
} }
@ -153,17 +178,13 @@ class TaskmanArtefact
function checkAffectedSources() : bool function checkAffectedSources() : bool
{ {
$file_changes = $this->task->getFileChanges(); //let's check if any source is affected
foreach($this->getSourcesSpec() as $src_idx => $src_spec) foreach($this->getSourcesSpec() as $src_idx => $src_spec)
{ {
$sources = $file_changes != null ? $this->getChangedSources($src_idx) : $this->getSources($src_idx); if($this->isSourcesAffected($src_idx))
if(is_stale($this->getPath(), $sources))
{
$this->sources_affected[$src_idx] = true;
return true; return true;
} }
}
return false; return false;
} }
} }

View File

@ -168,19 +168,26 @@ class TaskmanTask
try try
{ {
if($this->getArtefacts() && !$this->_checkIfArtefactsStale()) $level = count($TASKMAN_STACK);
if($this->getArtefacts())
{
$bench = microtime(true);
$stale_found = $this->_checkIfArtefactsStale();
log(0, "***** ".str_repeat('-', $level)."task '" . $this->getName() . "' artefacts check done(" .
round(microtime(true)-$bench,2) . '/' .round(microtime(true)-$TASKMAN_START_TIME,2) . " sec.) *****\n");
if(!$stale_found)
{ {
$this->has_run[$args_str] = true; $this->has_run[$args_str] = true;
return; return;
} }
}
$this->is_running = true; $this->is_running = true;
$this->args = $args; $this->args = $args;
$TASKMAN_STACK[] = $this; $TASKMAN_STACK[] = $this;
$level = count($TASKMAN_STACK)-1;
log(0, "***** ".str_repeat('-', $level)."task '" . $this->getName() . "' start *****\n"); log(0, "***** ".str_repeat('-', $level)."task '" . $this->getName() . "' start *****\n");
if(!$TASKMAN_NO_DEPS) if(!$TASKMAN_NO_DEPS)