123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217 |
- <?php
- /*
- * $Id: VersionTask.php 905 2010-10-05 16:28:03Z mrook $
- *
- * 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: 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);
- }
- }
- }
|