/** * @param Package $p * @param ResourceCollection $collection * @return ResourceMap */ public function getMap(Package $p, ResourceCollection $collection) { $sourceFiles = $collection->get(self::FILTER); $filePath = $this->getPath($p); $map = new ResourceMap(); if ($sourceFiles) { $map->map($sourceFiles, $filePath); } return $map; }
/** * Get map of the expected result when this action will be executed * @param Package $p * @param ResourceCollection $collection * @return ResourceMap */ public function getMap(Package $p, ResourceCollection $collection) { $map = new ResourceMap(); $sourceFiles = $collection->get($this->filter); if (!$sourceFiles) { return $map; } if ($this->getActionType() == GulpActionType::CONCATENATE) { $map->map($sourceFiles, $this->generateSingleFileName($p, $sourceFiles)); } else { foreach ($sourceFiles as $filePath) { $map->map($filePath, $this->moveToTargetDirectory($p, $filePath)); } } return $map; }
/** * @param Package $p * @param IGulpAction[] $actions * @param ResourceCollection $collection * @return CompilerSetup */ private function preCompileActions(Package $p, array $actions, ResourceCollection $collection) { $modifiedCollection = clone $collection; /** @var ResourceMap $modifiedMap */ $modifiedMap = new ResourceMap(); // Detect changes. foreach ($actions as $action) { $action->setTargetDir($this->config->TargetDirectory); $map = $action->getMap($p, $modifiedCollection); $map->apply($modifiedCollection); $modifiedMap->modify($map); } $modified = $this->getModified($modifiedMap); $setup = $this->preCompileHelper->getRecompileTargets($p, $modifiedMap, $modified); // All resource files that have an unmodified target resource. $unmodifiedSourceFiles = []; foreach ($setup->Unchanged as $unmodifiedTarget) { $data = $modifiedMap->getMapFor($unmodifiedTarget); $unmodifiedSourceFiles = array_merge($unmodifiedSourceFiles, is_array($data) ? $data : [$data]); } // Upend source resource files that were not used to create any package. foreach ($collection as $resource) { // File will be used to recompile. if ($setup->CompileTarget->hasResource($resource)) { continue; } // File used for a library that was not modified. if (in_array($resource, $unmodifiedSourceFiles)) { continue; } // Else file is not modified at all. $setup->CompileTarget->add($resource); } // Rename target files to target files with timestamp. if ($this->config->IsAddTimestamp) { foreach ($setup->Unchanged->get() as $unchanged) { $setup->Unchanged->replace($unchanged, $this->timestampHelper->findFileWithTimestamp($unchanged)); } } return $setup; }
/** * @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; }