/** * Builds a package * * @param integer $source id or instance of a source * @param PackageReader $package required and optional packages * @param string $directory source directory * @param string $filename the filename * @param mixed $excludeFiles files to exclude while packing archive * @param boolean $ignoreDotFiles should files beginning with a dot be ignored * @param boolean $removeAfter should temporary files be removed afterwards */ public function __construct($source, PackageReader $package, $directory, $filename, $excludeFiles = array(), $ignoreDotFiles = true, $removeAfter = false, $allowedDotFiles = array()) { // read source $this->source = $source instanceof Source ? $source : new Source($source); // read package $this->package = $package->getPackageData(); if (!isset($this->package['name'])) { throw new SystemException('Missing package name in "' . $directory . '", package.xml is not valid'); } $this->ignoreDotFiles = $ignoreDotFiles; // add additional files whitch should be allowed if (!empty($allowedDotFiles)) { if (!is_array($allowedDotFiles)) { $allowedDotFiles = array($allowedDotFiles); } $this->allowedDotFiles = array_merge($this->allowedDotFiles, $allowedDotFiles); } // add additional files whitch should be excluded if (!empty($excludeFiles)) { if (!is_array($excludeFiles)) { $excludeFiles = array($excludeFiles); } $this->excludeFiles = array_merge($this->excludeFiles, $excludeFiles); } // get data for filename $data = array('pn' => $this->package['name'], 'pv' => $this->package['version'], 'pr' => 'r' . $this->source->revision, 't' => DateUtil::formatTime('%Y-%m-%d %H:%M:%S', TIME_NOW, false)); // set archive name $this->filename = PackageHelper::getArchiveName($filename, $data); // mark package as built $buildDirectory = FileUtil::addTrailingSlash($this->source->buildDirectory); $location = $buildDirectory . $this->filename; PackageHelper::addPackageData($this->package['name'], $location); // check requirements $this->verifyPackages('requiredpackage', $directory); $this->verifyPackages('optionalpackage', $directory); // intialize archive $location = $this->createArchive($directory, $this->filename, $removeAfter); // do not move files created on-the-fly if (PackageHelper::isTemporaryFile($location)) { $this->location = $location; return; } // register file require_once PB_DIR . 'lib/data/source/file/SourceFileEditor.class.php'; $sourceFile = SourceFileEditor::create($this->source->sourceID, $location, 'package'); $this->location = $sourceFile->getPath(); }
/** * Builds a WCFSetup. * * @param array $packages * @param string $outputDirectory */ public function createWcfSetup(array $packages, $outputDirectory = '') { // ensure output directory is set and exists if (empty($outputDirectory)) { $outputDirectory = $this->source->buildDirectory; } else { if (!is_dir($outputDirectory)) { FileUtil::makePath($outputDirectory); } } $outputDirectory = FileUtil::addTrailingSlash($outputDirectory); // create temporarily directory $hash = StringUtil::getRandomID(); $buildDirectory = $outputDirectory . $hash . '/'; // populate install directory $this->cloneDirectory($buildDirectory, 'install/files'); $this->cloneDirectory($buildDirectory, 'install/lang'); $this->cloneDirectory($buildDirectory, 'install/packages'); // populate setup directory $this->cloneDirectory($buildDirectory, 'setup/db'); $this->cloneDirectory($buildDirectory, 'setup/lang'); $this->cloneDirectory($buildDirectory, 'setup/license'); $this->cloneDirectory($buildDirectory, 'setup/template'); // copy packages foreach ($packages as $package) { if (!file_exists($package)) { throw new SystemException("Required package '" . $package . "' not found."); } copy($package, $buildDirectory . 'install/packages/' . basename($package)); } // create wcf setup $wcfSetup = new TarWriter($outputDirectory . 'WCFSetup.tar.gz', true); $wcfSetup->add(array($buildDirectory . 'install', $buildDirectory . 'setup'), '', $buildDirectory); $wcfSetup->create(); // remove temoprarily directory $this->deleteDirectory($buildDirectory); @rmdir($buildDirectory); // set path $path = $outputDirectory . 'WCFSetup.tar.gz'; require_once PB_DIR . 'lib/data/source/file/SourceFileEditor.class.php'; $sourceFile = SourceFileEditor::create($this->source->sourceID, $path, 'wcfsetup', $this->profileName); $this->path = $sourceFile->getPath(); }