sintonia/library/phing/tasks/ext/VersionTask.php

217 lines
6.2 KiB
PHP

<?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);
}
}
}