Commit:    560a116e6846c13a693a9ea221dda0c627da6fd7
Author:    Christoph M. Becker <[email protected]>         Wed, 18 Dec 2019 
13:12:58 +0100
Parents:   a630bada1e8612cc42306f97c80396c96acb22e1
Branches:  master

Link:       
http://git.php.net/?p=web/rmtools.git;a=commitdiff;h=560a116e6846c13a693a9ea221dda0c627da6fd7

Log:
Support extensions with config.w32 in subfolder

Some extensions have the actual extension code in a subfolder of the
toplevel package folder, and as such can't currently be built.  For
instance, xhprof has `xhprof-x.y.z/extension/config.w32`, but we only
check for `xhprof-x.y.z/config.w32` and `config.w32`.

Changing `PeclExt::tmp_extract_path` to point to the subfolder which
contains ' config.w32` wouldn't work, though, because then the folders
in package.xml won't match anymore.  Therefore, we attempt to copy the
whole subfolder one level up, and resume the build process.

Changed paths:
  M  include/PeclExt.php


Diff:
diff --git a/include/PeclExt.php b/include/PeclExt.php
index f1e050e..4478479 100644
--- a/include/PeclExt.php
+++ b/include/PeclExt.php
@@ -298,8 +298,6 @@ class PeclExt
                                throw new \Exception("Unsupported package 
format");
                }
 
-               /* XXX what if we would look for subdirs containing config.w32? 
The subdir
-               where the file is has to be the root of the source tree. */
                if (file_exists(realpath($tmp_path . '/' . 
$this->pkg_basename))) {
                        /* This covers the case when the source is in a subdir 
within a package,
                        thats native pecl, git.php.net export too. Github 
should work too, whereby
@@ -311,6 +309,16 @@ class PeclExt
                        $this->tmp_extract_path = realpath($tmp_path);
                }
 
+               /* if there is no config.w32 in the tmp_extract_path, but there 
is exactly 
+                  one in a subfolder, we copy the whole subfolder one level 
up, unless
+                  there are conflicting files/dirs */
+               if (!file_exists($this->tmp_extract_path . '/config.w32')
+                       && ($configdirs = glob($this->tmp_extract_path . 
'/*/config.w32'))
+                       && count($configdirs) === 1)
+               {
+                       
$this->copyConfigW32DirToToplevel(dirname($configdirs[0]), 
$this->tmp_extract_path);
+               }
+
                if (file_exists($tmp_path . DIRECTORY_SEPARATOR . 
'package2.xml')) {
                        $this->package_xml_path = $tmp_path . 
DIRECTORY_SEPARATOR . 'package2.xml';
                } else if (file_exists($tmp_path . DIRECTORY_SEPARATOR . 
'package.xml')) {
@@ -361,6 +369,29 @@ class PeclExt
                return $this->tmp_extract_path;
        }
 
+       private function copyConfigW32DirToToplevel($src, $dst)
+       {
+               $iterator = new \RecursiveIteratorIterator(
+                       new \RecursiveDirectoryIterator($src, 
\RecursiveDirectoryIterator::SKIP_DOTS),
+                       \RecursiveIteratorIterator::SELF_FIRST
+               );
+               foreach ($iterator as $item) {
+                       $subdir = $dst . DIRECTORY_SEPARATOR . 
$iterator->getSubPathName();
+                       if (file_exists($subdir)) {
+                               throw new \Exception('Failed to copy config.w32 
dir to toplevel');
+                       }
+                       if ($item->isDir()) {
+                               if (!mkdir($subdir)) {
+                                       throw new \Exception('Failed to copy 
config.w32 dir to toplevel');
+                               }
+                       } else {
+                               if (!copy($item, $subdir)) {
+                                       throw new \Exception('Failed to copy 
config.w32 dir to toplevel');
+                               }
+                       }
+               }
+       }
+
        public function putSourcesIntoBranch()
        {
                $ext_dir = $this->build->getSourceDir() . DIRECTORY_SEPARATOR . 
'ext';


--
PHP Webmaster List Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to