diff options
Diffstat (limited to 'buildscripts/phing/classes/phing/tasks/ext/VersionTask.php')
-rwxr-xr-x | buildscripts/phing/classes/phing/tasks/ext/VersionTask.php | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/buildscripts/phing/classes/phing/tasks/ext/VersionTask.php b/buildscripts/phing/classes/phing/tasks/ext/VersionTask.php new file mode 100755 index 00000000..b8268870 --- /dev/null +++ b/buildscripts/phing/classes/phing/tasks/ext/VersionTask.php @@ -0,0 +1,217 @@ +<?php +/* + * $Id: 7fb6793b55e9c1c8c7b3cd8a87b694d720b32749 $ + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * This software consists of voluntary contributions made by many individuals + * and is licensed under the LGPL. For more information please see + * <http://phing.info>. + */ +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 <mw@mike.wittje.de> + * @version $Id: 7fb6793b55e9c1c8c7b3cd8a87b694d720b32749 $ $Rev $Id$ $Author$ + * @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 name of property to be set + * @param $property + * @return void + */ + 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 = trim(file_get_contents($this->file)); + + // get new version + $newVersion = $this->getVersion($filecontent); + + // write new Version to file + file_put_contents($this->file, $newVersion . "\n"); + + // 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); + } + } +}
\ No newline at end of file |