/** * @param string $liveDirectory * @param string $srcDirectory * @param array $writeableDirectories * @param array $cacheDirectories * @param string $subDirectory * * @throws CmsException */ protected function updateLive($liveDirectory, $srcDirectory, $writeableDirectories, $cacheDirectories, $subDirectory = '') { if (!is_dir($srcDirectory)) { throw new CmsException(902, __METHOD__, __LINE__, array('msg' => sprintf('source directory %s not exists', $srcDirectory))); } // create live directory if (!is_dir($liveDirectory)) { FS::createDirIfNotExists($liveDirectory, true, 0755); } // set directory rights if (!empty($subDirectory) && $this->isInsideDirectory($subDirectory, $writeableDirectories)) { // writeable FS::chmod($liveDirectory, 0777); } else { FS::chmod($liveDirectory, 0755); } // get info of the directories $liveDirInfo = $this->getDirectoryAsArray($liveDirectory); $srcDirInfo = $this->getDirectoryAsArray($srcDirectory); // delete live directories foreach ($liveDirInfo['directories'] as $liveSubDirectoryName => $liveSubDirectory) { if ($this->isInsideDirectory($subDirectory . $liveSubDirectoryName, $writeableDirectories)) { FS::chmod($liveSubDirectory, 0777); continue; } if (!isset($srcDirInfo['directories'][$liveSubDirectoryName])) { FS::rmdir($liveDirectory); } } // delete live files foreach ($liveDirInfo['files'] as $liveFileName => $liveFilePathName) { if ($this->isInsideDirectory($subDirectory . $liveFileName, $writeableDirectories)) { FS::chmod($liveFilePathName, 0777); continue; } if (!isset($srcDirInfo['files'][$liveFileName])) { FS::rmFile($liveFilePathName); } } // copy source directories foreach ($srcDirInfo['directories'] as $srcSubDirectoryName => $srcSubDirectory) { $subDirPathName = $subDirectory . $srcSubDirectoryName . DIRECTORY_SEPARATOR; $newLiveDirectory = FS::joinPath($liveDirectory, $srcSubDirectoryName); $this->updateLive($newLiveDirectory, $srcSubDirectory, $writeableDirectories, $cacheDirectories, $subDirPathName); } // copy source files foreach ($srcDirInfo['files'] as $srcFileName => $srcFilePathName) { $newLiveFilePathName = FS::joinPath($liveDirectory, $srcFileName); FS::copyFile($srcFilePathName, $newLiveFilePathName); if ($this->isInsideDirectory($subDirectory . $srcFileName, $writeableDirectories)) { FS::chmod($newLiveFilePathName, 0777); } else { FS::chmod($newLiveFilePathName, 0755); } } }