/** * @param ResourceMap $map * @return array */ private function getModified(ResourceMap $map) { $modified = []; foreach ($map->getMap() as $compiledResource => $sourceFiles) { $maxTimestamp = max(array_values($this->preCompileHelper->getTimestamps($sourceFiles))); $compiledTimestamp = 0; if ($this->config->IsAddTimestamp) { $compiledWithTimestamp = $this->timestampHelper->findFileWithTimestamp($compiledResource); if ($compiledWithTimestamp) { $data = $this->preCompileHelper->getTimestamps([$compiledWithTimestamp]); $compiledTimestamp = end($data); } } else { $data = $this->preCompileHelper->getTimestamps([$compiledResource]); $compiledTimestamp = end($data); } if ($maxTimestamp > $compiledTimestamp) { $modified[] = $compiledResource; } } return $modified; }
/** * @param Package $p * @param ResourceMap $compilationMap Aggregated compilation map. * @param array $modified Array of final Resource files that must be recompiled. * @return CompilerSetup */ public function getRecompileTargets(Package $p, ResourceMap $compilationMap, array $modified) { $recompileSource = []; $unmodifiedFlipped = array_flip(array_keys($compilationMap->getMap())); // Key is the original source file $recompileSourceFlipped = []; foreach ($modified as $resource) { unset($unmodifiedFlipped[$resource]); $resourceSources = $compilationMap->getMapFor($resource); // This should not happen. Modified file that didn't have a map should not be present here. if (is_null($resourceSources)) { continue; } $recompileSourceFlipped = array_merge($recompileSourceFlipped, array_flip($resourceSources)); } while (count($recompileSource) < count($recompileSourceFlipped)) { $recompileSource = array_keys($recompileSourceFlipped); // Find all foreach (array_keys($unmodifiedFlipped) as $unmodifiedTarget) { $sourceFiles = $compilationMap->getMapFor($unmodifiedTarget); if (!is_array($sourceFiles)) { $sourceFiles = [$sourceFiles]; } if (array_intersect($sourceFiles, $recompileSource)) { unset($unmodifiedFlipped[$unmodifiedTarget]); $recompileSourceFlipped = array_merge($recompileSourceFlipped, array_flip($sourceFiles)); } } } $setup = new CompilerSetup($p); if ($unmodifiedFlipped) { $setup->Unchanged->add(array_keys($unmodifiedFlipped)); } if ($recompileSource) { $setup->CompileTarget->add($recompileSource); } return $setup; }