X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=src%2Fpharext%2FPeclSourceDir.php;h=dd19171a55e307b9007aa7dc9256d50c249c2b29;hb=50e5714c543ed50557a1b644c6df27b8d298b6e1;hp=3844519d23897ca42c9eef23660cd09e223c9711;hpb=0ff7b26bce8f0dfbd1d4d45313705a94f2ac5e28;p=pharext%2Fpharext diff --git a/src/pharext/PeclSourceDir.php b/src/pharext/PeclSourceDir.php index 3844519..dd19171 100644 --- a/src/pharext/PeclSourceDir.php +++ b/src/pharext/PeclSourceDir.php @@ -30,8 +30,11 @@ class PeclSourceDir implements \IteratorAggregate, SourceDir * @see \pharext\SourceDir::__construct() */ public function __construct(Command $cmd, $path) { - $sxe = simplexml_load_file("$path/package.xml", null, 0, "http://pear.php.net/dtd/package-2.0"); - $sxe->registerXPathNamespace("pecl", "http://pear.php.net/dtd/package-2.0"); + if (!realpath("$path/package.xml")) { + throw new \Exception("Missing package.xml in $path"); + } + $sxe = simplexml_load_file("$path/package.xml"); + $sxe->registerXPathNamespace("pecl", $sxe->getDocNamespaces()[""]); $args = $cmd->getArgs(); if (!isset($args->name)) { @@ -73,12 +76,60 @@ class PeclSourceDir implements \IteratorAggregate, SourceDir } return trim($path, "/"); } + + /** + * Render installer hook + * @param array $configure + * @return string + */ + private static function loadHook($configure, $dependencies) { + return include __DIR__."/../pharext_install.tpl.php"; + } + + /** + * Create installer hook + * @return resource + */ + private function generateHooks() { + $dependencies = $this->sxe->xpath("/pecl:package/pecl:dependencies/pecl:required/pecl:package"); + foreach ($dependencies as $key => $dep) { + if (($glob = glob("{$this->path}/{$dep->name}-*.ext.phar*"))) { + usort($glob, function($a, $b) { + return version_compare( + substr($a, strpos(".ext.phar", $a)), + substr($b, strpos(".ext.phar", $b)) + ); + }); + yield realpath($this->path."/".end($glob)); + } else { + unset($dependencies[$key]); + } + } + $configure = $this->sxe->xpath("/pecl:package/pecl:extsrcrelease/pecl:configureoption"); + if ($configure) { + $fd = tmpfile(); + ob_start(function($s) use($fd){ + fwrite($fd, $s); + return null; + }); + self::loadHook($configure, $dependencies); + ob_end_flush(); + rewind($fd); + yield "pharext_install.php" => $fd; + } + } /** * Generate a list of files from the package.xml * @return Generator */ private function generateFiles() { + foreach ($this->generateHooks() as $file => $hook) { + if ($this->cmd->getArgs()->verbose) { + $this->cmd->info("Packaging %s\n", is_string($hook) ? $hook : $file); + } + yield $file => $hook; + } foreach ($this->sxe->xpath("//pecl:file") as $file) { $path = $this->path ."/". $this->dirOf($file) ."/". $file["name"]; if ($this->cmd->getArgs()->verbose) {