diff options
Diffstat (limited to 'buildscripts/phing/classes/phing/tasks/ext/PearPackage2Task.php')
-rw-r--r-- | buildscripts/phing/classes/phing/tasks/ext/PearPackage2Task.php | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/buildscripts/phing/classes/phing/tasks/ext/PearPackage2Task.php b/buildscripts/phing/classes/phing/tasks/ext/PearPackage2Task.php new file mode 100644 index 00000000..f42231f7 --- /dev/null +++ b/buildscripts/phing/classes/phing/tasks/ext/PearPackage2Task.php @@ -0,0 +1,279 @@ +<?php +/* + * $Id: 1b20dbb6595bd4c41d1e5f1430900e3bf95de411 $ + * + * 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/tasks/ext/PearPackageTask.php'; + +/** + * A task to create a PEAR package.xml version 2.0 file. + * + * This class uses the PEAR_PackageFileManager2 class to perform the work. + * + * This class is designed to be very flexible -- i.e. account for changes to the package.xml w/o + * requiring changes to this class. We've accomplished this by having generic <option> and <mapping> + * nested elements. All options are set using PEAR_PackageFileManager2::setOptions(). + * + * The <option> tag is used to set a simple option value. + * <code> + * <option name="option_name" value="option_value"/> + * or <option name="option_name">option_value</option> + * </code> + * + * The <mapping> tag represents a complex data type. You can use nested <element> (and nested <element> with + * <element> tags) to represent the full complexity of the structure. Bear in mind that what you are creating + * will be mapped to an associative array that will be passed in via PEAR_PackageFileManager2::setOptions(). + * <code> + * <mapping name="option_name"> + * <element key="key_name" value="key_val"/> + * <element key="key_name" value="key_val"/> + * </mapping> + * </code> + * + * Here's an over-simple example of how this could be used: + * <code> + * <pearpkg2 name="phing" dir="${build.src.dir}"> + * <fileset dir="src"> + * <include name="**"/> + * </fileset> + * <option name="outputdirectory" value="./build"/> + * <option name="packagefile" value="package2.xml"/> + * <option name="packagedirectory" value="./${build.dist.dir}"/> + * <option name="baseinstalldir" value="${pkg.prefix}"/> + * <option name="channel" value="my.pear-channel.com"/> + * <option name="summary" value="${pkg.summary}"/> + * <option name="description" value="${pkg.description}"/> + * <option name="apiversion" value="${pkg.version}"/> + * <option name="apistability" value="beta"/> + * <option name="releaseversion" value="${pkg.version}"/> + * <option name="releasestability" value="beta"/> + * <option name="license" value="none"/> + * <option name="phpdep" value="5.0.0"/> + * <option name="pearinstallerdep" value="1.4.6"/> + * <option name="packagetype" value="php"/> + * <option name="notes" value="${pkg.relnotes}"/> + * <mapping name="maintainers"> + * <element> + * <element key="handle" value="hlellelid"/> + * <element key="name" value="Hans"/> + * <element key="email" value="hans@xmpl.org"/> + * <element key="role" value="lead"/> + * <element key="active" value="yes"/> + * </element> + * </mapping> + * </pearpkg2> + * </code> + * + * Look at the build.xml in the Phing base directory (assuming you have the full distro / CVS version of Phing) to + * see a more complete example of how to call this script. + * + * @author Stuart Binge <stuart.binge@complinet.com> + * @author Hans Lellelid <hans@xmpl.org> + * @package phing.tasks.ext + * @version $Id: 1b20dbb6595bd4c41d1e5f1430900e3bf95de411 $ + */ +class PearPackage2Task extends PearPackageTask { + + public function init() { + include_once 'PEAR/PackageFileManager2.php'; + if (!class_exists('PEAR_PackageFileManager2')) { + throw new BuildException("You must have installed PEAR_PackageFileManager in order to create a PEAR package.xml version 2.0 file."); + } + } + + protected function setVersion2Options() + { + $this->pkg->setPackage($this->package); + $this->pkg->setDate(strftime('%Y-%m-%d')); + $this->pkg->setTime(strftime('%H:%M:%S')); + + $newopts = array(); + foreach ($this->options as $opt) { + switch ($opt->getName()) { + case 'summary': + $this->pkg->setSummary($opt->getValue()); + break; + + case 'description': + $this->pkg->setDescription($opt->getValue()); + break; + + case 'uri': + $this->pkg->setUri($opt->getValue()); + break; + + case 'license': + $this->pkg->setLicense($opt->getValue()); + break; + + case 'channel': + $this->pkg->setChannel($opt->getValue()); + break; + + case 'apiversion': + $this->pkg->setAPIVersion($opt->getValue()); + break; + + case 'releaseversion': + $this->pkg->setReleaseVersion($opt->getValue()); + break; + + case 'releasestability': + $this->pkg->setReleaseStability($opt->getValue()); + break; + + case 'apistability': + $this->pkg->setAPIStability($opt->getValue()); + break; + + case 'notes': + $this->pkg->setNotes($opt->getValue()); + break; + + case 'packagetype': + $this->pkg->setPackageType($opt->getValue()); + break; + + case 'phpdep': + $this->pkg->setPhpDep($opt->getValue()); + break; + + case 'pearinstallerdep': + $this->pkg->setPearinstallerDep($opt->getValue()); + break; + + default: + $newopts[] = $opt; + break; + } + } + $this->options = $newopts; + + $newmaps = array(); + foreach ($this->mappings as $map) { + switch ($map->getName()) { + case 'deps': + $deps = $map->getValue(); + foreach ($deps as $dep) { + $type = isset($dep['optional']) ? 'optional' : 'required'; + $min = isset($dep['min']) ? $dep['min'] : $dep['version']; + $max = isset($dep['max']) ? $dep['max'] : null; + $rec = isset($dep['recommended']) ? $dep['recommended'] : null; + $channel = isset($dep['channel']) ? $dep['channel'] : false; + $uri = isset($dep['uri']) ? $dep['uri'] : false; + + if (!empty($channel)) { + $this->pkg->addPackageDepWithChannel( + $type, $dep['name'], $channel, $min, $max, $rec + ); + } elseif (!empty($uri)) { + $this->pkg->addPackageDepWithUri( + $type, $dep['name'], $uri + ); + } + }; + break; + + case 'extdeps': + $deps = $map->getValue(); + foreach ($deps as $dep) { + $type = isset($dep['optional']) ? 'optional' : 'required'; + $min = isset($dep['min']) ? $dep['min'] : $dep['version']; + $max = isset($dep['max']) ? $dep['max'] : $dep['version']; + $rec = isset($dep['recommended']) ? $dep['recommended'] : $dep['version']; + + $this->pkg->addExtensionDep( + $type, $dep['name'], $min, $max, $rec + ); + }; + break; + + case 'maintainers': + $maintainers = $map->getValue(); + + foreach ($maintainers as $maintainer) { + if (!isset($maintainer['active'])) { + $maintainer['active'] = 'yes'; + } else { + $maintainer['active'] = $maintainer['active'] === false ? 'no' : 'yes'; + } + $this->pkg->addMaintainer( + $maintainer['role'], + $maintainer['handle'], + $maintainer['name'], + $maintainer['email'], + $maintainer['active'] + ); + } + break; + + case 'replacements': + $replacements = $map->getValue(); + + foreach($replacements as $replacement) { + $this->pkg->addReplacement( + $replacement['path'], + $replacement['type'], + $replacement['from'], + $replacement['to'] + ); + } + break; + + case 'role': + foreach ($map->getValue() as $role) { + $this->pkg->addRole($role['extension'], $role['role']); + } + break; + + default: + $newmaps[] = $map; + } + } + $this->mappings = $newmaps; + } + + /** + * Main entry point. + * @return void + */ + public function main() + { + if ($this->dir === null) { + throw new BuildException("You must specify the \"dir\" attribute for PEAR package 2 task."); + } + + if ($this->package === null) { + throw new BuildException("You must specify the \"name\" attribute for PEAR package 2 task."); + } + + $this->pkg = new PEAR_PackageFileManager2(); + + $this->setVersion2Options(); + $this->setOptions(); + + $this->pkg->addRelease(); + $this->pkg->generateContents(); + $e = $this->pkg->writePackageFile(); + if (PEAR::isError($e)) { + throw new BuildException("Unable to write package file.", new Exception($e->getMessage())); + } + } + +} |