. */ require_once 'phing/tasks/system/MatchingTask.php'; require_once 'phing/tasks/ext/phar/IterableFileSet.php'; require_once 'phing/tasks/ext/phar/PharMetadata.php'; /** * Package task for {@link http://ru.php.net/manual/en/book.phar.php Phar technology}. * * @package phing.tasks.ext * @author Alexey Shockov * @since 2.4.0 */ class PharPackageTask extends MatchingTask { /** * @var PhingFile */ private $destinationFile; /** * @var int */ private $compression = Phar::NONE; /** * Base directory, from where local package paths will be calculated. * * @var PhingFile */ private $baseDirectory; /** * @var PhingFile */ private $cliStubFile; /** * @var PhingFile */ private $webStubFile; /** * @var string */ private $stubPath; /** * @var int */ private $signatureAlgorithm = Phar::SHA1; /** * @var array */ private $filesets = array(); /** * @var PharMetadata */ private $metadata = null; /** * @var string */ private $alias; /** * @return PharMetadata */ public function createMetadata() { return ($this->metadata = new PharMetadata()); } /** * @return FileSet */ public function createFileSet() { $this->fileset = new IterableFileSet(); $this->filesets[] = $this->fileset; return $this->fileset; } /** * @param string $algorithm */ public function setSignature($algorithm) { /* * If we don't support passed algprithm, leave old one. */ switch ($algorithm) { case 'md5': $this->signatureAlgorithm = Phar::MD5; break; case 'sha1': $this->signatureAlgorithm = Phar::SHA1; break; case 'sha256': $this->signatureAlgorithm = Phar::SHA256; break; case 'sha512': $this->signatureAlgorithm = Phar::SHA512; break; default: break; } } /** * @param string $compression */ public function setCompression($compression) { /* * If we don't support passed compression, leave old one. */ switch ($compression) { case 'gzip': $this->compression = Phar::GZ; break; case 'bzip2': $this->compression = Phar::BZ2; break; default: break; } } /** * @param PhingFile $destinationFile */ public function setDestFile(PhingFile $destinationFile) { $this->destinationFile = $destinationFile; } /** * @param PhingFile $baseDirectory */ public function setBaseDir(PhingFile $baseDirectory) { $this->baseDirectory = $baseDirectory; } /** * @param PhingFile $stubFile */ public function setCliStub(PhingFile $stubFile) { $this->cliStubFile = $stubFile; } /** * @param PhingFile $stubFile */ public function setWebStub(PhingFile $stubFile) { $this->webStubFile = $stubFile; } /** * @param string $stubPath */ public function setStub($stubPath) { $this->stubPath = $stubPath; } /** * @param $alias */ public function setAlias($alias) { $this->alias = $alias; } /** * @throws BuildException */ public function main() { $this->checkPreconditions(); try { $this->log( 'Building package: '.$this->destinationFile->__toString(), Project::MSG_INFO ); /* * Delete old package, if exists. */ if ($this->destinationFile->exists()) { /* * TODO Check operation for errors... */ $this->destinationFile->delete(); } $phar = $this->buildPhar(); $phar->startBuffering(); $baseDirectory = realpath($this->baseDirectory->getPath()); foreach ($this->filesets as $fileset) { foreach ($fileset as $realFileName) { /* * Calculate local file name. */ $localFileName = $realFileName; if (0 === strpos($realFileName, $baseDirectory)) { $localFileName = substr( $realFileName, strlen($baseDirectory) ); } $this->log( 'Adding '.$realFileName.' as '.$localFileName.' to package', Project::MSG_VERBOSE ); $phar->addFile($realFileName, $localFileName); } } $phar->stopBuffering(); /* * File compression, if needed. */ if (Phar::NONE != $this->compression) { $phar->compressFiles($this->compression); } } catch (Exception $e) { throw new BuildException( 'Problem creating package: '.$e->getMessage(), $e, $this->getLocation() ); } } /** * @throws BuildException */ private function checkPreconditions() { if (is_null($this->destinationFile)) { throw new BuildException("destfile attribute must be set!", $this->getLocation()); } if ($this->destinationFile->exists() && $this->destinationFile->isDirectory()) { throw new BuildException("destfile is a directory!", $this->getLocation()); } if (!$this->destinationFile->canWrite()) { throw new BuildException("Can not write to the specified destfile!", $this->getLocation()); } if (!is_null($this->baseDirectory)) { if (!$this->baseDirectory->exists()) { throw new BuildException("basedir does not exist!", $this->getLocation()); } } if (is_null($this->metadata)) { throw new BuildException("metadata element must be set", $this->getLocation()); } } /** * Build and configure Phar object. * * @return Phar */ private function buildPhar() { $phar = new Phar($this->destinationFile); $phar->setSignatureAlgorithm($this->signatureAlgorithm); if (isset($this->stubPath)) { $phar->setStub(file_get_contents($this->stubPath)); } else { $phar->setDefaultStub( $this->cliStubFile, $this->webStubFile ); } if ($metadata = $this->metadata->toArray()) { $phar->setMetadata($metadata); } if(!empty($this->alias)){ $phar->setAlias($this->alias); } return $phar; } }