0b7055a99da64e0afb162490a18944bbeffd030c
3 namespace pharext\SourceDir
;
10 * A PECL extension source directory containing a v2 package.xml
12 class Pecl
implements \IteratorAggregate
, SourceDir
15 * The Packager command
16 * @var pharext\Packager
22 * @var SimpleXmlElement
34 * @see \pharext\SourceDir::__construct()
36 public function __construct(Command
$cmd, $path) {
37 if (realpath("$path/package2.xml")) {
38 $sxe = simplexml_load_file("$path/package2.xml");
39 } elseif (realpath("$path/package.xml")) {
40 $sxe = simplexml_load_file("$path/package.xml");
42 throw new Exception("Missing package.xml in $path");
44 $sxe->registerXPathNamespace("pecl", $sxe->getDocNamespaces()[""]);
46 $args = $cmd->getArgs();
47 if (!isset($args->name
)) {
48 $name = (string) $sxe->xpath("/pecl:package/pecl:name")[0];
49 foreach ($args->parse(2, ["--name", $name]) as $error) {
50 $cmd->warn("%s\n", $error);
54 if (!isset($args->release
)) {
55 $release = (string) $sxe->xpath("/pecl:package/pecl:version/pecl:release")[0];
56 foreach ($args->parse(2, ["--release", $release]) as $error) {
57 $cmd->warn("%s\n", $error);
68 * @see \pharext\SourceDir::getBaseDir()
70 public function getBaseDir() {
75 * Compute the path of a file by parent dir nodes
76 * @param \SimpleXMLElement $ele
79 private function dirOf($ele) {
81 while (($ele = current($ele->xpath(".."))) && $ele->getName() == "dir") {
82 $path = trim($ele["name"], "/") ."/". $path ;
84 return trim($path, "/");
88 * Render installer hook
89 * @param array $configure
92 private static function loadHook($configure, $dependencies) {
93 require_once "pharext/Version.php";
94 return include __DIR__
."/../../pharext_install.tpl.php";
98 * Create installer hook
101 private function generateHooks() {
102 $dependencies = $this->sxe
->xpath("/pecl:package/pecl:dependencies/pecl:required/pecl:package");
103 foreach ($dependencies as $key => $dep) {
104 if (($glob = glob("{$this->path}/{$dep->name}-*.ext.phar*"))) {
105 usort($glob, function($a, $b) {
106 return version_compare(
107 substr($a, strpos(".ext.phar", $a)),
108 substr($b, strpos(".ext.phar", $b))
113 unset($dependencies[$key]);
116 $configure = $this->sxe
->xpath("/pecl:package/pecl:extsrcrelease/pecl:configureoption");
119 ob_start(function($s) use($fd){
123 self
::loadHook($configure, $dependencies);
126 yield
"pharext_install.php" => $fd;
131 * Generate a list of files from the package.xml
134 private function generateFiles() {
135 foreach ($this->generateHooks() as $file => $hook) {
136 if ($this->cmd
->getArgs()->verbose
) {
137 $this->cmd
->info("Packaging %s\n", is_scalar($hook) ?
$hook : $file);
139 yield
$file => $hook;
141 foreach ($this->sxe
->xpath("//pecl:file") as $file) {
142 $path = $this->path
."/". $this->dirOf($file) ."/". $file["name"];
143 if ($this->cmd
->getArgs()->verbose
) {
144 $this->cmd
->info("Packaging %s\n", substr($path, strlen($this->path
)));
146 if (!($realpath = realpath($path))) {
147 $this->cmd
->warn("File %s does not exist", $path);
154 * Implements IteratorAggregate
155 * @see IteratorAggregate::getIterator()
157 public function getIterator() {
158 return $this->generateFiles();