}
/**
- * Reload (uninstall and install) all updated addons.
+ * Reload (uninstall and install) all installed and modified addons.
*/
public function reloadAddons(): void
{
- $this->proxy->reloadAddons();
+ $addons = array_filter($this->config->get('addons') ?? []);
+
+ foreach ($addons as $addonName => $data) {
+ $addonId = Strings::sanitizeFilePathItem(trim($addonName));
+
+ $addon_file_path = $this->getAddonPath() . '/' . $addonId . '/' . $addonId . '.php';
+
+ if (!file_exists($addon_file_path)) {
+ continue;
+ }
+
+ if (array_key_exists('last_update', $data) && intval($data['last_update']) === filemtime($addon_file_path)) {
+ // Addon unmodified, skipping
+ continue;
+ }
+
+ $this->logger->debug("Addon {addon}: {action}", ['action' => 'reload', 'addon' => $addonId]);
+
+ $this->uninstallAddon($addonId);
+ $this->installAddon($addonId);
+ }
}
/**
$root = vfsStream::setup(__FUNCTION__ . '_addons', 0777, [
$addonName => [
$addonName . '.php' => <<<PHP
- <?php
- function {$addonName}_install()
- {
- throw new \Exception("Addon installed");
- }
- PHP,
+ <?php
+ function {$addonName}_install()
+ {
+ throw new \Exception("Addon installed");
+ }
+ PHP,
]
]);
$root = vfsStream::setup(__FUNCTION__ . '_addons', 0777, [
$addonName => [
$addonName . '.php' => <<<PHP
- <?php
- function {$addonName}_uninstall()
- {
- throw new \Exception("Addon uninstalled");
- }
- PHP,
+ <?php
+ function {$addonName}_uninstall()
+ {
+ throw new \Exception("Addon uninstalled");
+ }
+ PHP,
]
]);
$this->assertSame([], $addonManagerHelper->getEnabledAddons());
}
+
+ public function testReloadAddonsInstallsAddon(): void
+ {
+ // We need a unique name for the addon to avoid conflicts
+ // with other tests that may define the same install function.
+ $addonName = __FUNCTION__;
+
+ $root = vfsStream::setup(__FUNCTION__ . '_addons', 0777, [
+ $addonName => [
+ $addonName . '.php' => <<<PHP
+ <?php
+ function {$addonName}_install()
+ {
+ throw new \Exception("Addon reinstalled");
+ }
+ PHP,
+ ]
+ ]);
+
+ $root->getChild($addonName . '/' . $addonName . '.php')->lastModified(1234567890);
+
+ $config = $this->createStub(IManageConfigValues::class);
+ $config->method('get')->willReturn([
+ $addonName => [
+ 'last_update' => 0,
+ 'admin' => false,
+ ],
+ ]);
+
+ $addonManagerHelper = new AddonManagerHelper(
+ $root->url(),
+ $this->createStub(Database::class),
+ $config,
+ $this->createStub(ICanCache::class),
+ $this->createStub(LoggerInterface::class),
+ $this->createStub(Profiler::class)
+ );
+
+ $addonManagerHelper->loadAddons();
+
+ $this->assertSame([$addonName], $addonManagerHelper->getEnabledAddons());
+
+ $this->expectException(Exception::class);
+ $this->expectExceptionMessage('Addon reinstalled');
+
+ $addonManagerHelper->reloadAddons();
+ }
}