. */ require_once 'phing/Task.php'; /** * VersionTask * * Increments a three-part version number from a given file * and writes it back to the file. * Incrementing is based on given releasetype, which can be one * of Major, Minor and Bugfix. * Resulting version number is also published under supplied property. * * @author Mike Wittje * @version $Id: VersionTask.php 905 2010-10-05 16:28:03Z mrook $ $Rev $Revision: 905 $ $Date: 2010-10-05 18:28:03 +0200 (Tue, 05 Oct 2010) $ $Author: mrook $ * @package phing.tasks.ext */ class VersionTask extends Task { /** * Property for Releasetype * @var string $releasetype */ private $releasetype; /** * Property for File * @var PhingFile file */ private $file; /** * Property to be set * @var string $property */ private $property; /* Allowed Releastypes */ const RELEASETYPE_MAJOR = 'MAJOR'; const RELEASETYPE_MINOR = 'MINOR'; const RELEASETYPE_BUGFIX = 'BUGFIX'; /** * Set Property for Releasetype (Minor, Major, Bugfix) * @param string $releasetype */ public function setReleasetype($releasetype) { $this->releasetype = strtoupper($releasetype); } /** * Set Property for File containing versioninformation * @param PhingFile $file */ public function setFile($file) { $this->file = $file; } /** * Set * @param $property * @return */ public function setProperty($property) { $this->property = $property; } /** * Main-Method for the Task * * @return void * @throws BuildException */ public function main() { // check supplied attributes $this->checkReleasetype(); $this->checkFile(); $this->checkProperty(); // read file $filecontent = file_get_contents($this->file); // get new version $newVersion = $this->getVersion($filecontent); // write new Version to file file_put_contents($this->file, $newVersion); // publish new version number as property $this->project->setProperty($this->property, $newVersion); } /** * Returns new version number corresponding to Release type * * @param string $filecontent * @return string */ private function getVersion($filecontent) { // init $newVersion = ''; // Extract version list($major, $minor, $bugfix) = explode(".", $filecontent); // Return new version number switch ($this->releasetype) { case self::RELEASETYPE_MAJOR: $newVersion = sprintf("%d.%d.%d", ++$major, 0, 0); break; case self::RELEASETYPE_MINOR: $newVersion = sprintf("%d.%d.%d", $major, ++$minor, 0); break; case self::RELEASETYPE_BUGFIX: $newVersion = sprintf("%d.%d.%d", $major, $minor, ++$bugfix); break; } return $newVersion; } /** * checks releasetype attribute * @return void * @throws BuildException */ private function checkReleasetype() { // check Releasetype if (is_null($this->releasetype)) { throw new BuildException('releasetype attribute is required', $this->location); } // known releasetypes $releaseTypes = array( self::RELEASETYPE_MAJOR, self::RELEASETYPE_MINOR, self::RELEASETYPE_BUGFIX ); if (!in_array($this->releasetype, $releaseTypes)) { throw new BuildException(sprintf('Unknown Releasetype %s..Must be one of Major, Minor or Bugfix', $this->releasetype), $this->location); } } /** * checks file attribute * @return void * @throws BuildException */ private function checkFile() { // check File if ($this->file === null || strlen($this->file) == 0) { throw new BuildException('You must specify a file containing the version number', $this->location); } $content = file_get_contents($this->file); if (strlen($content) == 0) { throw new BuildException(sprintf('Supplied file %s is empty', $this->file), $this->location); } // check for three-part number $split = explode('.', $content); if (count($split) !== 3) { throw new BuildException('Unknown version number format', $this->location); } } /** * checks property attribute * @return void * @throws BuildException */ private function checkProperty() { if (is_null($this->property) || strlen($this->property) === 0) { throw new BuildException('Property for publishing version number is not set', $this->location); } } }