/** * Creates complete archive. * * @param string $directory * @param string $filename */ public function createArchive($directory, $filename, $removeAfter) { $buildDirectory = ''; $directories = array('acptemplates', 'files', 'pip', 'templates'); $directory = FileUtil::addTrailingSlash($this->source->sourceDirectory . $directory); $location = ''; // skip if no directory was given if (!is_dir($directory)) { throw new SystemException('Given directory "' . $directory . '" is not valid.'); } $buildDirectory = FileUtil::addTrailingSlash($this->source->buildDirectory); $location = $buildDirectory . $filename; $package = new TarWriter($location, true); // read correct directory for languages $languagesInRoot = true; $languagesExist = false; if (file_exists($directory . self::LANGUAGE_DIR) && is_dir($directory . self::LANGUAGE_DIR)) { $languagesExist = true; $xml = new XML($directory . 'package.xml'); $nodes = $xml->getChildren(); foreach ($nodes as $node) { if ($node->getName() != 'instructions') { continue; } $subNodes = $xml->getChildren($node); foreach ($subNodes as $subNode) { if ($subNode->getName() != 'languages') { continue; } if (substr($xml->getCDATA($subNode), 0, strlen(self::LANGUAGE_DIR) + 1) == self::LANGUAGE_DIR . '/') { $languagesInRoot = false; } } } } // if files should be in root skip languages directory and copy language files into root if ($languagesExist && $languagesInRoot) { $this->excludeFiles[] = self::LANGUAGE_DIR; $files = DirectoryUtil::getInstance($directory . self::LANGUAGE_DIR . '/', false)->getFilesObj(SORT_DESC); foreach ($files as $filename => $obj) { if ($filename == '.svn') { continue; } # $obj->isDir()) continue; copy($directory . self::LANGUAGE_DIR . '/' . $filename, $directory . $filename); // register them for removing PackageHelper::registerTemporaryFile($directory . $filename); } } // try to open directory $dir = DirectoryUtil::getInstance($directory, false); foreach ($dir->getFiles() as $filename) { // skip files if (in_array($filename, $this->excludeFiles)) { continue; } if ($this->ignoreDotFiles && substr($filename, 0, 1) == '.' && !in_array($filename, $this->allowedDotFiles)) { continue; } /* easteregg if ($filename == 'package.xml') { copy($directory.$filename, $directory.$filename.'.bak'); $new = file_get_contents($directory.$filename); $new = str_replace('</packageinformation>', '<!--meta name="generator" content="PackageBuilder'.(SHOW_VERSION_NUMBER ? ' v'.PACKAGE_VERSION : '').'"--></packageinformation>', $new); file_put_contents($directory.$filename, $new); } */ // handle files if (!is_dir($directory . $filename)) { // add file $package->add($directory . $filename, '', $directory); /* easteregg if ($filename == 'package.xml') { unlink($directory.$filename); rename($directory.$filename.'.bak', $directory.$filename); } */ continue; } // skip directories if (in_array($filename, $directories)) { // create tarball from special directories $archive = new TarWriter($buildDirectory . $filename . '.tar', false); $this->addFilesRecursive($archive, $directory, $filename, $filename . '/'); $archive->create(); // add previously created tarball $package->add($buildDirectory . $filename . '.tar', '', $buildDirectory); } else { // add sourceDirectory $this->addFilesRecursive($package, $directory, $filename); } } // create complete package $package->create(); // cleanup, remove previous created tarballs DirectoryUtil::destroy($this->source->buildDirectory); $dir = DirectoryUtil::getInstance($this->source->buildDirectory); $dir->removePattern('/.*\\.tar$/'); if ($removeAfter) { PackageHelper::registerTemporaryFile($location); } return $location; }