jenkins-bot has submitted this change and it was merged.

Change subject: registration: Support config setings that are relative paths
......................................................................


registration: Support config setings that are relative paths

Add support for configuration settings that are relative paths to the
extension directory. The most common use-case for this is where the
extension ships a generic default file, but sysadmins or packagers may
want to override it. Setting `"path": true` on the config definition
will make the value be interpreted as a relative path.

And add tests!

Bug: T100956
Change-Id: Ia87ced25b35be7a314ee2937e0ccc63f9acc5bb5
---
M docs/extension.schema.json
M includes/registration/ExtensionProcessor.php
M tests/phpunit/includes/registration/ExtensionProcessorTest.php
3 files changed, 44 insertions(+), 5 deletions(-)

Approvals:
  Reedy: Looks good to me, approved
  Daniel Kinzler: Looks good to me, but someone else must approve
  jenkins-bot: Verified



diff --git a/docs/extension.schema.json b/docs/extension.schema.json
index 14a9731..9c8160d 100644
--- a/docs/extension.schema.json
+++ b/docs/extension.schema.json
@@ -881,6 +881,11 @@
                                                        ],
                                                        "default": "array_merge"
                                                },
+                                               "path": {
+                                                       "description": "Whether 
this should be interpreted as a filesystem path, relative to extension 
directory root",
+                                                       "type": "boolean",
+                                                       "default": false
+                                               },
                                                "description": {
                                                        "type": ["string", 
"array"],
                                                        "description": "A 
description of the config setting, mostly for documentation/developers"
diff --git a/includes/registration/ExtensionProcessor.php 
b/includes/registration/ExtensionProcessor.php
index 0bf2842..9563fc0 100644
--- a/includes/registration/ExtensionProcessor.php
+++ b/includes/registration/ExtensionProcessor.php
@@ -162,14 +162,14 @@
         * @return array
         */
        public function extractInfo( $path, array $info, $version ) {
+               $dir = dirname( $path );
                if ( $version === 2 ) {
-                       $this->extractConfig2( $info );
+                       $this->extractConfig2( $info, $dir );
                } else {
                        // $version === 1
                        $this->extractConfig1( $info );
                }
                $this->extractHooks( $info );
-               $dir = dirname( $path );
                $this->extractExtensionMessagesFiles( $dir, $info );
                $this->extractMessagesDirs( $dir, $info );
                $this->extractNamespaces( $info );
@@ -381,8 +381,9 @@
         * @todo In the future, this should be done via Config interfaces
         *
         * @param array $info
+        * @param string $dir
         */
-       protected function extractConfig2( array $info ) {
+       protected function extractConfig2( array $info, $dir ) {
                if ( isset( $info['config_prefix'] ) ) {
                        $prefix = $info['config_prefix'];
                } else {
@@ -394,6 +395,9 @@
                                if ( isset( $value['merge_strategy'] ) ) {
                                        
$value[ExtensionRegistry::MERGE_STRATEGY] = $data['merge_strategy'];
                                }
+                               if ( isset( $data['path'] ) && $data['path'] ) {
+                                       $value = "$dir/$value";
+                               }
                                $this->globals["$prefix$key"] = $value;
                        }
                }
diff --git a/tests/phpunit/includes/registration/ExtensionProcessorTest.php 
b/tests/phpunit/includes/registration/ExtensionProcessorTest.php
index be7fe91..11995de 100644
--- a/tests/phpunit/includes/registration/ExtensionProcessorTest.php
+++ b/tests/phpunit/includes/registration/ExtensionProcessorTest.php
@@ -2,11 +2,12 @@
 
 class ExtensionProcessorTest extends MediaWikiTestCase {
 
-       private $dir;
+       private $dir, $dirname;
 
        public function setUp() {
                parent::setUp();
                $this->dir = __DIR__ . '/FooBar/extension.json';
+               $this->dirname = dirname( $this->dir );
        }
 
        /**
@@ -110,7 +111,7 @@
        /**
         * @covers ExtensionProcessor::extractConfig1
         */
-       public function testExtractConfig() {
+       public function testExtractConfig1() {
                $processor = new ExtensionProcessor;
                $info = [
                        'config' => [
@@ -136,6 +137,35 @@
                $this->assertEquals( 'somevalue', 
$extracted['globals']['egBar'] );
        }
 
+       /**
+        * @covers ExtensionProcessor::extractConfig2
+        */
+       public function testExtractConfig2() {
+               $processor = new ExtensionProcessor;
+               $info = [
+                       'config' => [
+                               'Bar' => [ 'value' => 'somevalue' ],
+                               'Foo' => [ 'value' => 10 ],
+                               'Path' => [ 'value' => 'foo.txt', 'path' => 
true ],
+                       ],
+               ] + self::$default;
+               $info2 = [
+                       'config' => [
+                               'Bar' => [ 'value' => 'somevalue' ],
+                       ],
+                       'config_prefix' => 'eg',
+                       'name' => 'FooBar2',
+               ];
+               $processor->extractInfo( $this->dir, $info, 2 );
+               $processor->extractInfo( $this->dir, $info2, 2 );
+               $extracted = $processor->getExtractedInfo();
+               $this->assertEquals( 'somevalue', 
$extracted['globals']['wgBar'] );
+               $this->assertEquals( 10, $extracted['globals']['wgFoo'] );
+               $this->assertEquals( "{$this->dirname}/foo.txt", 
$extracted['globals']['wgPath'] );
+               // Custom prefix:
+               $this->assertEquals( 'somevalue', 
$extracted['globals']['egBar'] );
+       }
+
        public static function provideExtractExtensionMessagesFiles() {
                $dir = __DIR__ . '/FooBar/';
                return [

-- 
To view, visit https://gerrit.wikimedia.org/r/300674
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ia87ced25b35be7a314ee2937e0ccc63f9acc5bb5
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Legoktm <legoktm.wikipe...@gmail.com>
Gerrit-Reviewer: Daniel Kinzler <daniel.kinz...@wikimedia.de>
Gerrit-Reviewer: Legoktm <legoktm.wikipe...@gmail.com>
Gerrit-Reviewer: Reedy <re...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to