jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/359079 )
Change subject: Get provider config dir from global config
......................................................................
Get provider config dir from global config
Little more boilerplate setting up provider config, but it should
make sure everyone's looking in the same directory
Bug: T147503
Change-Id: If06d9b8d64fd95336a42c1409c5d1e44f4f978ab
---
M Core/Context.php
M Core/Http/RequestHandler.php
M Core/ProviderConfiguration.php
M Maintenance/MaintenanceBase.php
M PaymentProviders/Adyen/Tests/AdyenTestConfiguration.php
A PaymentProviders/Adyen/Tests/BaseAdyenTestCase.php
M PaymentProviders/Adyen/Tests/phpunit/CaptureJobTest.php
M PaymentProviders/Adyen/Tests/phpunit/CaptureResponseActionTest.php
M PaymentProviders/Adyen/Tests/phpunit/PaymentCaptureActionTest.php
M PaymentProviders/Adyen/Tests/phpunit/RecordCaptureJobTest.php
M PaymentProviders/Adyen/Tests/phpunit/ReportAvailableTest.php
M PaymentProviders/Adyen/Tests/phpunit/RequeueMessageTest.php
M PaymentProviders/Amazon/Tests/AmazonTestCase.php
M PaymentProviders/Amazon/Tests/AmazonTestConfiguration.php
M PaymentProviders/Amazon/Tests/phpunit/AuditTest.php
M PaymentProviders/PayPal/Tests/PayPalTestConfiguration.php
M PaymentProviders/PayPal/Tests/phpunit/CaptureIncomingMessageTest.php
M Tests/BaseSmashPigUnitTestCase.php
M Tests/TestingContext.php
M config/main.yaml
20 files changed, 98 insertions(+), 74 deletions(-)
Approvals:
Mepps: Looks good to me, approved
jenkins-bot: Verified
diff --git a/Core/Context.php b/Core/Context.php
index 4f3a9c1..e1ecc1c 100644
--- a/Core/Context.php
+++ b/Core/Context.php
@@ -26,7 +26,7 @@
public static function init( GlobalConfiguration $config,
$providerConfig = null ) {
if ( !Context::$instance ) {
if ( !$providerConfig ) {
- $providerConfig =
ProviderConfiguration::createDefault();
+ $providerConfig =
ProviderConfiguration::createDefault( $config );
}
Context::$instance = new Context();
Context::$instance->setGlobalConfiguration( $config );
diff --git a/Core/Http/RequestHandler.php b/Core/Http/RequestHandler.php
index 11e0c9b..b2fdec0 100644
--- a/Core/Http/RequestHandler.php
+++ b/Core/Http/RequestHandler.php
@@ -48,7 +48,7 @@
// --- Initialize core services ---
$config = GlobalConfiguration::create();
- $providerConfig = ProviderConfiguration::createForProvider(
$view );
+ $providerConfig = ProviderConfiguration::createForProvider(
$view, $config );
Context::init( $config, $providerConfig );
// FIXME: let's always initialize this with the context
Logger::init(
diff --git a/Core/ProviderConfiguration.php b/Core/ProviderConfiguration.php
index d5c9006..3fa4c33 100644
--- a/Core/ProviderConfiguration.php
+++ b/Core/ProviderConfiguration.php
@@ -6,18 +6,27 @@
class ProviderConfiguration extends Configuration {
const NO_PROVIDER = 'no_provider';
-
protected $provider;
+ protected $machinewideBaseDirectory;
+
+ protected function __construct( GlobalConfiguration $globalConfig ) {
+ $baseDir = $globalConfig->val(
'provider-configuration-directory' );
+ $this->machinewideBaseDirectory = $baseDir;
+ }
/**
- * @param string $provider
+ * @param string $provider identifier of payment provider
+ * @param GlobalConfiguration $globalConfig
* @return static
*/
- public static function createForProvider( $provider ) {
+ public static function createForProvider(
+ $provider,
+ GlobalConfiguration $globalConfig
+ ) {
// FIXME: transitional code, remove when everything points to
new names
$provider = self::remapProvider( $provider );
- $config = new static();
+ $config = new static( $globalConfig );
$config->provider = $provider;
$config->loadDefaultConfig();
@@ -27,13 +36,18 @@
/**
* @param string $provider
* @param string|array $overridePath
+ * @param GlobalConfiguration $globalConfig
* @return static
*/
- public static function createForProviderWithOverrideFile( $provider,
$overridePath ) {
+ public static function createForProviderWithOverrideFile(
+ $provider,
+ $overridePath,
+ GlobalConfiguration $globalConfig
+ ) {
// FIXME: transitional code, remove when everything points to
new names
$provider = self::remapProvider( $provider );
- $config = new static();
+ $config = new static( $globalConfig );
$config->provider = $provider;
$searchPath = array_merge(
( array ) $overridePath,
@@ -58,10 +72,11 @@
* Create a ProviderConfiguration with just the defaults,
* to be used in processes that are not specific to one provider.
* We need this for logging in the pending queue consumer, for example.
+ * @param GlobalConfiguration $globalConfig
* @return static
*/
- public static function createDefault() {
- $config = new static();
+ public static function createDefault( GlobalConfiguration $globalConfig
) {
+ $config = new static( $globalConfig );
$config->provider = self::NO_PROVIDER;
$config->loadDefaultConfig();
@@ -73,13 +88,13 @@
if ( isset( $_SERVER['HOME'] ) ) {
$searchPath[] =
"{$_SERVER['HOME']}/.smashpig/{$this->provider}/main.yaml";
}
- $searchPath[] =
"/etc/smashpig/{$this->provider}/main.yaml";
+ $searchPath[] =
"{$this->machinewideBaseDirectory}/{$this->provider}/main.yaml";
$searchPath[] = __DIR__ .
"/../config/{$this->provider}/main.yaml";
}
if ( isset( $_SERVER['HOME'] ) ) {
$searchPath[] =
"{$_SERVER['HOME']}/.smashpig/provider-defaults.yaml";
}
- $searchPath[] = '/etc/smashpig/provider-defaults.yaml';
+ $searchPath[] =
"{$this->machinewideBaseDirectory}/provider-defaults.yaml";
$searchPath[] = __DIR__ . '/../config/provider-defaults.yaml';
return $searchPath;
}
@@ -87,4 +102,4 @@
public function getProviderName() {
return $this->provider;
}
-}
\ No newline at end of file
+}
diff --git a/Maintenance/MaintenanceBase.php b/Maintenance/MaintenanceBase.php
index 3e2398f..2fe77b4 100755
--- a/Maintenance/MaintenanceBase.php
+++ b/Maintenance/MaintenanceBase.php
@@ -143,10 +143,10 @@
}
// FIXME: 'provider' instead of 'config-node'
if ( $configNode === 'default' ) {
- $providerConfig =
ProviderConfiguration::createDefault();
+ $providerConfig = ProviderConfiguration::createDefault(
$config );
} else {
// FIXME: need different override file for provider
config
- $providerConfig =
ProviderConfiguration::createForProvider( $configNode );
+ $providerConfig =
ProviderConfiguration::createForProvider( $configNode, $config );
}
Context::init( $config, $providerConfig );
Logger::init(
diff --git a/PaymentProviders/Adyen/Tests/AdyenTestConfiguration.php
b/PaymentProviders/Adyen/Tests/AdyenTestConfiguration.php
index e65114e..1120f74 100644
--- a/PaymentProviders/Adyen/Tests/AdyenTestConfiguration.php
+++ b/PaymentProviders/Adyen/Tests/AdyenTestConfiguration.php
@@ -1,17 +1,18 @@
<?php namespace SmashPig\PaymentProviders\Adyen\Tests;
+use SmashPig\Core\GlobalConfiguration;
use SmashPig\Tests\TestingProviderConfiguration;
class AdyenTestConfiguration extends TestingProviderConfiguration {
- public static function instance( $overrides = array() ) {
- $config = static::createForProvider( 'adyen' );
+ public static function instance( $overrides = array(),
GlobalConfiguration $globalConfig ) {
+ $config = static::createForProvider( 'adyen', $globalConfig );
$config->override( $overrides );
return $config;
}
- public static function createWithSuccessfulApi() {
+ public static function createWithSuccessfulApi( GlobalConfiguration
$globalConfig ) {
$override = array( 'api' =>
array(
'class' =>
'SmashPig\PaymentProviders\Adyen\Tests\MockAdyenPaymentsAPI',
@@ -19,10 +20,10 @@
array( 'Success!' )
)
);
- return self::instance( $override );
+ return self::instance( $override, $globalConfig );
}
- public static function createWithUnsuccessfulApi() {
+ public static function createWithUnsuccessfulApi( GlobalConfiguration
$globalConfig ) {
$override = array( 'api' =>
array(
'class' =>
'SmashPig\PaymentProviders\Adyen\Tests\MockAdyenPaymentsAPI',
@@ -32,6 +33,6 @@
array( 'false' )
)
);
- return self::instance( $override );
+ return self::instance( $override, $globalConfig );
}
}
diff --git a/PaymentProviders/Adyen/Tests/BaseAdyenTestCase.php
b/PaymentProviders/Adyen/Tests/BaseAdyenTestCase.php
new file mode 100644
index 0000000..bcf62ef
--- /dev/null
+++ b/PaymentProviders/Adyen/Tests/BaseAdyenTestCase.php
@@ -0,0 +1,24 @@
+<?php
+
+namespace SmashPig\PaymentProviders\Adyen\Tests;
+
+use SmashPig\Core\Context;
+use SmashPig\Core\ProviderConfiguration;
+use SmashPig\Tests\BaseSmashPigUnitTestCase;
+
+class BaseAdyenTestCase extends BaseSmashPigUnitTestCase {
+
+ /**
+ * @var ProviderConfiguration
+ */
+ public $config;
+
+ public function setUp() {
+ parent::setUp();
+ $ctx = Context::get();
+ $this->config = AdyenTestConfiguration::createWithSuccessfulApi(
+ $ctx->getGlobalConfiguration()
+ );
+ $ctx->setProviderConfiguration( $this->config );
+ }
+}
diff --git a/PaymentProviders/Adyen/Tests/phpunit/CaptureJobTest.php
b/PaymentProviders/Adyen/Tests/phpunit/CaptureJobTest.php
index 6636b80..dd85942 100644
--- a/PaymentProviders/Adyen/Tests/phpunit/CaptureJobTest.php
+++ b/PaymentProviders/Adyen/Tests/phpunit/CaptureJobTest.php
@@ -8,6 +8,7 @@
use SmashPig\Core\ProviderConfiguration;
use SmashPig\PaymentProviders\Adyen\Jobs\ProcessCaptureRequestJob;
use SmashPig\PaymentProviders\Adyen\Tests\AdyenTestConfiguration;
+use SmashPig\PaymentProviders\Adyen\Tests\BaseAdyenTestCase;
use SmashPig\Tests\BaseSmashPigUnitTestCase;
/**
@@ -15,12 +16,7 @@
*
* @group Adyen
*/
-class CaptureJobTest extends BaseSmashPigUnitTestCase {
-
- /**
- * @var ProviderConfiguration
- */
- public $config;
+class CaptureJobTest extends BaseAdyenTestCase {
/**
* @var PendingDatabase
*/
@@ -33,8 +29,7 @@
public function setUp() {
parent::setUp();
- $this->config =
AdyenTestConfiguration::createWithSuccessfulApi();
- Context::get()->setProviderConfiguration( $this->config );
+
$this->pendingDatabase = PendingDatabase::get();
$this->pendingMessage = json_decode(
file_get_contents( __DIR__ . '/../Data/pending.json' )
, true
diff --git a/PaymentProviders/Adyen/Tests/phpunit/CaptureResponseActionTest.php
b/PaymentProviders/Adyen/Tests/phpunit/CaptureResponseActionTest.php
index 195cc7e..248a066 100644
--- a/PaymentProviders/Adyen/Tests/phpunit/CaptureResponseActionTest.php
+++ b/PaymentProviders/Adyen/Tests/phpunit/CaptureResponseActionTest.php
@@ -10,7 +10,7 @@
/**
* @group Adyen
*/
-class CaptureResponseActionTest extends BaseSmashPigUnitTestCase {
+class CaptureResponseActionTest extends BaseAdyenTestCase {
/**
* @var FifoQueueStore
@@ -19,12 +19,7 @@
public function setUp() {
parent::setUp();
- $context = Context::get();
- $context->setProviderConfiguration(
- AdyenTestConfiguration::createWithSuccessfulApi()
- );
-
- $this->jobQueue = $context->getGlobalConfiguration()
+ $this->jobQueue = Context::get()->getGlobalConfiguration()
->object( 'data-store/jobs-adyen' );
}
diff --git a/PaymentProviders/Adyen/Tests/phpunit/PaymentCaptureActionTest.php
b/PaymentProviders/Adyen/Tests/phpunit/PaymentCaptureActionTest.php
index 9667abc..bfa8a49 100644
--- a/PaymentProviders/Adyen/Tests/phpunit/PaymentCaptureActionTest.php
+++ b/PaymentProviders/Adyen/Tests/phpunit/PaymentCaptureActionTest.php
@@ -10,7 +10,7 @@
/**
* @group Adyen
*/
-class PaymentCaptureActionTest extends BaseSmashPigUnitTestCase {
+class PaymentCaptureActionTest extends BaseAdyenTestCase {
/**
* @var FifoQueueStore
@@ -19,8 +19,6 @@
public function setUp() {
parent::setUp();
- $providerConfig =
AdyenTestConfiguration::createWithSuccessfulApi();
- Context::get()->setProviderConfiguration( $providerConfig );
$globalConfig = Context::get()->getGlobalConfiguration();
$this->jobQueue = $globalConfig->object(
'data-store/jobs-adyen' );
}
diff --git a/PaymentProviders/Adyen/Tests/phpunit/RecordCaptureJobTest.php
b/PaymentProviders/Adyen/Tests/phpunit/RecordCaptureJobTest.php
index 09d4aa8..f14d4df 100644
--- a/PaymentProviders/Adyen/Tests/phpunit/RecordCaptureJobTest.php
+++ b/PaymentProviders/Adyen/Tests/phpunit/RecordCaptureJobTest.php
@@ -6,6 +6,7 @@
use SmashPig\Core\DataStores\QueueWrapper;
use SmashPig\PaymentProviders\Adyen\Jobs\RecordCaptureJob;
use SmashPig\PaymentProviders\Adyen\Tests\AdyenTestConfiguration;
+use SmashPig\PaymentProviders\Adyen\Tests\BaseAdyenTestCase;
use SmashPig\Tests\BaseSmashPigUnitTestCase;
/**
@@ -13,12 +14,8 @@
*
* @group Adyen
*/
-class RecordCaptureJobTest extends BaseSmashPigUnitTestCase {
+class RecordCaptureJobTest extends BaseAdyenTestCase {
- /**
- * @var AdyenTestConfiguration
- */
- public $config;
/**
* @var PendingDatabase
*/
@@ -27,8 +24,6 @@
public function setUp() {
parent::setUp();
- $this->config =
AdyenTestConfiguration::createWithSuccessfulApi();
- Context::get()->setProviderConfiguration( $this->config );
$this->pendingDatabase = PendingDatabase::get();
$this->pendingMessage = json_decode(
file_get_contents( __DIR__ . '/../Data/pending.json' )
, true
diff --git a/PaymentProviders/Adyen/Tests/phpunit/ReportAvailableTest.php
b/PaymentProviders/Adyen/Tests/phpunit/ReportAvailableTest.php
index f5ccb06..afdc0b3 100644
--- a/PaymentProviders/Adyen/Tests/phpunit/ReportAvailableTest.php
+++ b/PaymentProviders/Adyen/Tests/phpunit/ReportAvailableTest.php
@@ -12,12 +12,7 @@
/**
* @group Adyen
*/
-class ReportAvailableTest extends BaseSmashPigUnitTestCase {
- /**
- * @var AdyenTestConfiguration
- */
- protected $config;
-
+class ReportAvailableTest extends BaseAdyenTestCase {
/**
* @var FifoQueueStore
*/
@@ -25,8 +20,6 @@
public function setUp() {
parent::setUp();
- $this->config =
AdyenTestConfiguration::createWithSuccessfulApi();
- Context::get()->setProviderConfiguration( $this->config );
$this->jobQueue = QueueWrapper::getQueue( 'jobs-adyen' );
}
diff --git a/PaymentProviders/Adyen/Tests/phpunit/RequeueMessageTest.php
b/PaymentProviders/Adyen/Tests/phpunit/RequeueMessageTest.php
index bd4977d..236c19b 100644
--- a/PaymentProviders/Adyen/Tests/phpunit/RequeueMessageTest.php
+++ b/PaymentProviders/Adyen/Tests/phpunit/RequeueMessageTest.php
@@ -5,6 +5,7 @@
use SmashPig\Core\DataStores\PendingDatabase;
use SmashPig\PaymentProviders\Adyen\Jobs\ProcessCaptureRequestJob;
use SmashPig\PaymentProviders\Adyen\Tests\AdyenTestConfiguration;
+use SmashPig\PaymentProviders\Adyen\Tests\BaseAdyenTestCase;
use SmashPig\Tests\BaseSmashPigUnitTestCase;
/**
@@ -13,13 +14,7 @@
*
* @group Adyen
*/
-class RequeueMessageTest extends BaseSmashPigUnitTestCase {
-
- public function setUp() {
- parent::setUp();
- $config = AdyenTestConfiguration::createWithSuccessfulApi();
- Context::get()->setProviderConfiguration( $config );
- }
+class RequeueMessageTest extends BaseAdyenTestCase {
/**
* @expectedException \SmashPig\Core\RetryableException
diff --git a/PaymentProviders/Amazon/Tests/AmazonTestCase.php
b/PaymentProviders/Amazon/Tests/AmazonTestCase.php
index 640130d..ce3eb45 100644
--- a/PaymentProviders/Amazon/Tests/AmazonTestCase.php
+++ b/PaymentProviders/Amazon/Tests/AmazonTestCase.php
@@ -12,8 +12,9 @@
public function setUp() {
parent::setUp();
chdir( __DIR__ ); // So the mock client can find its response
files
- $config = AmazonTestConfiguration::instance();
- Context::get()->setProviderConfiguration( $config );
+ $ctx = Context::get();
+ $config = AmazonTestConfiguration::instance(
$ctx->getGlobalConfiguration() );
+ $ctx->setProviderConfiguration( $config );
$this->mockClient = $config->object( 'payments-client', true );
$this->mockClient->calls = array();
$this->mockClient->returns = array();
diff --git a/PaymentProviders/Amazon/Tests/AmazonTestConfiguration.php
b/PaymentProviders/Amazon/Tests/AmazonTestConfiguration.php
index 1af13fb..95dc530 100644
--- a/PaymentProviders/Amazon/Tests/AmazonTestConfiguration.php
+++ b/PaymentProviders/Amazon/Tests/AmazonTestConfiguration.php
@@ -2,14 +2,16 @@
namespace SmashPig\PaymentProviders\Amazon\Tests;
+use SmashPig\Core\GlobalConfiguration;
use SmashPig\Tests\TestingProviderConfiguration;
class AmazonTestConfiguration extends TestingProviderConfiguration {
- public static function instance() {
+ public static function instance( GlobalConfiguration $globalConfig ) {
return self::createForProviderWithOverrideFile(
'amazon',
- __DIR__ . '/config_test.yaml'
+ __DIR__ . '/config_test.yaml',
+ $globalConfig
);
}
}
diff --git a/PaymentProviders/Amazon/Tests/phpunit/AuditTest.php
b/PaymentProviders/Amazon/Tests/phpunit/AuditTest.php
index 108d74d..29f13b0 100644
--- a/PaymentProviders/Amazon/Tests/phpunit/AuditTest.php
+++ b/PaymentProviders/Amazon/Tests/phpunit/AuditTest.php
@@ -11,8 +11,9 @@
class AuditTest extends BaseSmashPigUnitTestCase {
public function setUp() {
parent::setUp();
-
- Context::get()->setProviderConfiguration(
AmazonTestConfiguration::instance() );
+ $ctx = Context::get();
+ $config = AmazonTestConfiguration::instance(
$ctx->getGlobalConfiguration() );
+ $ctx->setProviderConfiguration( $config );
}
/**
diff --git a/PaymentProviders/PayPal/Tests/PayPalTestConfiguration.php
b/PaymentProviders/PayPal/Tests/PayPalTestConfiguration.php
index 6cce474..ca0b15d 100644
--- a/PaymentProviders/PayPal/Tests/PayPalTestConfiguration.php
+++ b/PaymentProviders/PayPal/Tests/PayPalTestConfiguration.php
@@ -1,14 +1,16 @@
<?php
namespace SmashPig\PaymentProviders\PayPal\Tests;
+use SmashPig\Core\GlobalConfiguration;
use SmashPig\Tests\TestingProviderConfiguration;
class PayPalTestConfiguration extends TestingProviderConfiguration {
- public static function get () {
+ public static function get( GlobalConfiguration $globalConfig ) {
return self::createForProviderWithOverrideFile(
'paypal',
- __DIR__ . '/config_test.yaml'
+ __DIR__ . '/config_test.yaml',
+ $globalConfig
);
}
diff --git
a/PaymentProviders/PayPal/Tests/phpunit/CaptureIncomingMessageTest.php
b/PaymentProviders/PayPal/Tests/phpunit/CaptureIncomingMessageTest.php
index a25426d..2b08ef4 100644
--- a/PaymentProviders/PayPal/Tests/phpunit/CaptureIncomingMessageTest.php
+++ b/PaymentProviders/PayPal/Tests/phpunit/CaptureIncomingMessageTest.php
@@ -44,7 +44,7 @@
parent::setUp();
$this->config = Context::get()->getGlobalConfiguration();
Context::get()->setProviderConfiguration(
- PayPalTestConfiguration::get()
+ PayPalTestConfiguration::get( $this->config )
);
}
diff --git a/Tests/BaseSmashPigUnitTestCase.php
b/Tests/BaseSmashPigUnitTestCase.php
index eb918eb..676fc91 100644
--- a/Tests/BaseSmashPigUnitTestCase.php
+++ b/Tests/BaseSmashPigUnitTestCase.php
@@ -28,8 +28,10 @@
* @return TestingProviderConfiguration
*/
protected function setProviderConfiguration( $provider ) {
- $config = TestingProviderConfiguration::createForProvider(
$provider );
- Context::get()->setProviderConfiguration( $config );
+ $ctx = Context::get();
+ $globalConfig = $ctx->getGlobalConfiguration();
+ $config = TestingProviderConfiguration::createForProvider(
$provider, $globalConfig );
+ $ctx->setProviderConfiguration( $config );
return $config;
}
}
diff --git a/Tests/TestingContext.php b/Tests/TestingContext.php
index 77e0822..db93ef4 100644
--- a/Tests/TestingContext.php
+++ b/Tests/TestingContext.php
@@ -15,7 +15,7 @@
// Override the existing context
Context::$instance = new TestingContext();
if ( !$providerConfig ) {
- $providerConfig =
TestingProviderConfiguration::createDefault();
+ $providerConfig =
TestingProviderConfiguration::createDefault( $config );
}
Context::$instance->setProviderConfiguration( $providerConfig );
Context::$instance->setGlobalConfiguration( $config );
@@ -48,4 +48,4 @@
return parent::getProviderConfiguration();
}
-}
\ No newline at end of file
+}
diff --git a/config/main.yaml b/config/main.yaml
index 1751969..7c24cb2 100644
--- a/config/main.yaml
+++ b/config/main.yaml
@@ -104,3 +104,8 @@
requeue-delay: 1200
requeue-max-age: 12000
+
+# By default, provider configuration files live in the same directory as
+# global configuration files. Change this value to read provider configuration
+# files from an alternate directory.
+provider-configuration-directory: '/etc/smashpig'
--
To view, visit https://gerrit.wikimedia.org/r/359079
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: If06d9b8d64fd95336a42c1409c5d1e44f4f978ab
Gerrit-PatchSet: 5
Gerrit-Project: wikimedia/fundraising/SmashPig
Gerrit-Branch: master
Gerrit-Owner: Ejegg <[email protected]>
Gerrit-Reviewer: AndyRussG <[email protected]>
Gerrit-Reviewer: Awight <[email protected]>
Gerrit-Reviewer: Cdentinger <[email protected]>
Gerrit-Reviewer: Eileen <[email protected]>
Gerrit-Reviewer: Katie Horn <[email protected]>
Gerrit-Reviewer: Mepps <[email protected]>
Gerrit-Reviewer: XenoRyet <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits