@@ -57,29 +70,8 @@ export default class Updater extends Component {
{extensions.length ? (
- {extensions.map((extension: any) => (
-
-
- {extension.icon ? icon(extension.icon.name) : ''}
-
-
-
{extension.extra['flarum-extension'].title}
-
- {extension.version}
- {extension.newPackageUpdate.latest}
-
-
-
-
-
-
-
-
- ))}
+ {core ? this.extensionItem(core, true) : null}
+ {extensions.map((extension: any) => this.extensionItem(extension))}
) : null}
@@ -87,6 +79,32 @@ export default class Updater extends Component {
);
}
+ extensionItem(extension: any, isCore: boolean = false) {
+ return (
+
+
+ {extension.icon ? icon(extension.icon.name) : ''}
+
+
+
{extension.title || extension.extra['flarum-extension'].title}
+
+ {extension.version}
+ {extension.newPackageUpdate.latest}
+
+
+
+
+
+
+
+
+ );
+ }
+
getExtensionUpdates() {
const updates = this.lastUpdateCheck?.updates?.installed?.filter((composerPackage: UpdatedPackage) => {
const extension = app.data.extensions[composerPackage.name.replace('/', '-').replace(/(flarum-ext-)|(flarum-)/, '')];
@@ -102,34 +120,47 @@ export default class Updater extends Component {
return Object.values(app.data.extensions).filter((extension: any) => extension.newPackageUpdate);
}
+ getCoreUpdate(): UpdatedPackage|undefined {
+ return this.lastUpdateCheck?.updates?.installed?.filter((composerPackage: any) => composerPackage.name === 'flarum/core').pop();
+ }
+
checkForUpdates() {
this.isLoading = true;
app.request({
method: 'POST',
url: `${app.forum.attribute('apiUrl')}/package-manager/check-for-updates`,
+ errorHandler,
}).then((response) => {
- this.isLoading = false;
this.lastUpdateCheck = response as LastUpdateCheck;
+ }).finally(() => {
+ this.isLoading = false;
m.redraw();
});
}
- update(extension: any) {
+ updateCoreMinor() {
+ app.modal.show(LoadingModal);
+
+ app.request({
+ method: 'POST',
+ url: `${app.forum.attribute('apiUrl')}/package-manager/minor-update`,
+ errorHandler,
+ }).then(() => {
+ app.alerts.show({ type: 'success' }, app.translator.trans('sycho-package-manager.admin.updater.minor_update_successful'));
+ window.location.reload();
+ }).finally(() => {
+ m.redraw();
+ });
+ }
+
+ updateExtension(extension: any) {
app.modal.show(LoadingModal);
app.request({
method: 'PATCH',
url: `${app.forum.attribute('apiUrl')}/package-manager/extensions/${extension.id}`,
- errorHandler: (e: any) => {
- const error = e.response.errors[0];
-
- if (error.code !== 'composer_command_failure') {
- throw e;
- }
-
- app.modal.show(ComposerFailureModal, { error });
- },
+ errorHandler,
}).then(() => {
app.alerts.show({ type: 'success' }, app.translator.trans('sycho-package-manager.admin.extensions.successful_update', { extension: extension.extra['flarum-extension'].title }));
window.location.reload();
diff --git a/extensions/package-manager/js/src/admin/index.js b/extensions/package-manager/js/src/admin/index.js
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/js/src/admin/utils/errorHandler.ts b/extensions/package-manager/js/src/admin/utils/errorHandler.ts
new file mode 100755
index 000000000..594581161
--- /dev/null
+++ b/extensions/package-manager/js/src/admin/utils/errorHandler.ts
@@ -0,0 +1,12 @@
+import app from "flarum/admin/app";
+import ComposerFailureModal from "../components/ComposerFailureModal";
+
+export default function (e: any) {
+ const error = e.response.errors[0];
+
+ if (error.code !== 'composer_command_failure') {
+ throw e;
+ }
+
+ app.modal.show(ComposerFailureModal, { error });
+}
diff --git a/extensions/package-manager/js/tsconfig.json b/extensions/package-manager/js/tsconfig.json
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/js/webpack.config.js b/extensions/package-manager/js/webpack.config.js
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/js/yarn.lock b/extensions/package-manager/js/yarn.lock
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/less/admin.less b/extensions/package-manager/less/admin.less
old mode 100644
new mode 100755
index a6cd8f170..065b374eb
--- a/extensions/package-manager/less/admin.less
+++ b/extensions/package-manager/less/admin.less
@@ -64,4 +64,17 @@
font-weight: bold;
}
}
+
+ &--core {
+ background-color: #e7672e;
+ color: #fff;
+ --button-color: #fff;
+ --button-bg-hover: darken(#e7672e, 5);
+ }
+
+ &--core &-icon {
+ background-size: 100%;
+ background-color: transparent;
+ filter: grayscale(1) brightness(3.5);
+ }
}
diff --git a/extensions/package-manager/locale/en.yml b/extensions/package-manager/locale/en.yml
old mode 100644
new mode 100755
index d3844f917..6042aa723
--- a/extensions/package-manager/locale/en.yml
+++ b/extensions/package-manager/locale/en.yml
@@ -20,6 +20,8 @@ sycho-package-manager:
updater:
check_for_updates: Check for updates
+ flarum: Flarum Core
last_update_checked_at: "Last Update Check: "
+ minor_update_successful: Flarum successfully updated.
updater_title: Updates
updater_help: Runs a check for new extension and Flarum updates.
diff --git a/extensions/package-manager/migrations/2017_04_09_000000_create_bazaar_tasks_table.php b/extensions/package-manager/migrations/2017_04_09_000000_create_bazaar_tasks_table.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Api/Controller/CheckForUpdatesController.php b/extensions/package-manager/src/Api/Controller/CheckForUpdatesController.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Api/Controller/ListTaskController.php b/extensions/package-manager/src/Api/Controller/ListTaskController.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Api/Controller/MinorFlarumUpdateController.php b/extensions/package-manager/src/Api/Controller/MinorFlarumUpdateController.php
new file mode 100755
index 000000000..f0cd1ee40
--- /dev/null
+++ b/extensions/package-manager/src/Api/Controller/MinorFlarumUpdateController.php
@@ -0,0 +1,42 @@
+bus = $bus;
+ }
+
+ /**
+ * @throws \Flarum\User\Exception\PermissionDeniedException
+ */
+ public function handle(ServerRequestInterface $request): ResponseInterface
+ {
+ $actor = RequestUtil::getActor($request);
+
+ $this->bus->dispatch(
+ new MinorFlarumUpdate($actor)
+ );
+
+ return new EmptyResponse();
+ }
+}
diff --git a/extensions/package-manager/src/Api/Controller/RemoveExtensionController.php b/extensions/package-manager/src/Api/Controller/RemoveExtensionController.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Api/Controller/RequireExtensionController.php b/extensions/package-manager/src/Api/Controller/RequireExtensionController.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Api/Controller/UpdateExtensionController.php b/extensions/package-manager/src/Api/Controller/UpdateExtensionController.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Api/Serializer/ExtensionSerializer.php b/extensions/package-manager/src/Api/Serializer/ExtensionSerializer.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Command/CheckForUpdates.php b/extensions/package-manager/src/Command/CheckForUpdates.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Command/CheckForUpdatesHandler.php b/extensions/package-manager/src/Command/CheckForUpdatesHandler.php
old mode 100644
new mode 100755
index b79209ec9..3e8541d10
--- a/extensions/package-manager/src/Command/CheckForUpdatesHandler.php
+++ b/extensions/package-manager/src/Command/CheckForUpdatesHandler.php
@@ -9,6 +9,8 @@ namespace SychO\PackageManager\Command;
use Carbon\Carbon;
use Composer\Console\Application;
use Flarum\Settings\SettingsRepositoryInterface;
+use SychO\PackageManager\Exception\ComposerCommandFailedException;
+use SychO\PackageManager\LastUpdateCheck;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
@@ -20,22 +22,23 @@ class CheckForUpdatesHandler
protected $composer;
/**
- * @var SettingsRepositoryInterface
+ * @var LastUpdateCheck
*/
- protected $settings;
+ protected $lastUpdateCheck;
/**
* @param Application $composer
- * @param SettingsRepositoryInterface $settings
+ * @param LastUpdateCheck $lastUpdateCheck
*/
- public function __construct(Application $composer, SettingsRepositoryInterface $settings)
+ public function __construct(Application $composer, LastUpdateCheck $lastUpdateCheck)
{
$this->composer = $composer;
- $this->settings = $settings;
+ $this->lastUpdateCheck = $lastUpdateCheck;
}
/**
* @throws \Flarum\User\Exception\PermissionDeniedException
+ * @throws ComposerCommandFailedException
*/
public function handle(CheckForUpdates $command)
{
@@ -50,15 +53,12 @@ class CheckForUpdatesHandler
'--format' => 'json',
]);
- $this->composer->run($input, $output);
+ $exitCode = $this->composer->run($input, $output);
- $lastUpdateCheck = [
- 'checkedAt' => Carbon::now(),
- 'updates' => json_decode($output->fetch(), true),
- ];
+ if ($exitCode !== 0) {
+ throw new ComposerCommandFailedException('', $output->fetch());
+ }
- $this->settings->set('sycho-package-manager.last_update_check', json_encode($lastUpdateCheck));
-
- return $lastUpdateCheck;
+ return $this->lastUpdateCheck->save(json_decode($output->fetch(), true));
}
}
diff --git a/extensions/package-manager/src/Command/MinorFlarumUpdate.php b/extensions/package-manager/src/Command/MinorFlarumUpdate.php
new file mode 100755
index 000000000..8dc3061d4
--- /dev/null
+++ b/extensions/package-manager/src/Command/MinorFlarumUpdate.php
@@ -0,0 +1,18 @@
+actor = $actor;
+ }
+}
diff --git a/extensions/package-manager/src/Command/MinorFlarumUpdateHandler.php b/extensions/package-manager/src/Command/MinorFlarumUpdateHandler.php
new file mode 100755
index 000000000..26224beb5
--- /dev/null
+++ b/extensions/package-manager/src/Command/MinorFlarumUpdateHandler.php
@@ -0,0 +1,65 @@
+composer = $composer;
+ $this->lastUpdateCheck = $lastUpdateCheck;
+ }
+
+ /**
+ * @throws \Flarum\User\Exception\PermissionDeniedException
+ * @throws ComposerUpdateFailedException
+ */
+ public function handle(MinorFlarumUpdate $command)
+ {
+ $command->actor->assertAdmin();
+
+ $output = new BufferedOutput();
+ $input = new ArrayInput([
+ 'command' => 'update',
+ 'packages' => ["flarum/*"],
+ '--prefer-dist' => true,
+ '--no-dev' => true,
+ '-a' => true,
+ '--with-all-dependencies' => true,
+ ]);
+
+ $exitCode = $this->composer->run($input, $output);
+
+ if ($exitCode !== 0) {
+ throw new ComposerUpdateFailedException('flarum/*', $output->fetch());
+ }
+
+ $this->lastUpdateCheck->forget('flarum/*', true);
+
+ return true;
+ }
+}
diff --git a/extensions/package-manager/src/Command/RemoveExtension.php b/extensions/package-manager/src/Command/RemoveExtension.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Command/RemoveExtensionHandler.php b/extensions/package-manager/src/Command/RemoveExtensionHandler.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Command/RequireExtension.php b/extensions/package-manager/src/Command/RequireExtension.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Command/RequireExtensionHandler.php b/extensions/package-manager/src/Command/RequireExtensionHandler.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Command/UpdateExtension.php b/extensions/package-manager/src/Command/UpdateExtension.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Command/UpdateExtensionHandler.php b/extensions/package-manager/src/Command/UpdateExtensionHandler.php
old mode 100644
new mode 100755
index 90e8e3368..a07413514
--- a/extensions/package-manager/src/Command/UpdateExtensionHandler.php
+++ b/extensions/package-manager/src/Command/UpdateExtensionHandler.php
@@ -11,6 +11,7 @@ use Flarum\Extension\ExtensionManager;
use Flarum\Settings\SettingsRepositoryInterface;
use SychO\PackageManager\Exception\ComposerUpdateFailedException;
use SychO\PackageManager\UpdateExtensionValidator;
+use SychO\PackageManager\LastUpdateCheck;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
@@ -32,16 +33,16 @@ class UpdateExtensionHandler
protected $validator;
/**
- * @var SettingsRepositoryInterface
+ * @var LastUpdateCheck
*/
- protected $settings;
+ protected $lastUpdateCheck;
- public function __construct(Application $composer, ExtensionManager $extensions, UpdateExtensionValidator $validator, SettingsRepositoryInterface $settings)
+ public function __construct(Application $composer, ExtensionManager $extensions, UpdateExtensionValidator $validator, LastUpdateCheck $lastUpdateCheck)
{
$this->composer = $composer;
$this->extensions = $extensions;
$this->validator = $validator;
- $this->settings = $settings;
+ $this->lastUpdateCheck = $lastUpdateCheck;
}
/**
@@ -72,24 +73,7 @@ class UpdateExtensionHandler
throw new ComposerUpdateFailedException($extension->name, $output->fetch());
}
- $lastUpdateCheck = json_decode($this->settings->get('sycho-package-manager.last_update_check', '{}'), true);
-
- if (isset($lastUpdateCheck['updates']) && ! empty($lastUpdateCheck['updates']['installed'])) {
- $updatesListChanged = false;
-
- foreach ($lastUpdateCheck['updates']['installed'] as $k => $package) {
- if ($package['name'] === $extension->name) {
- unset($lastUpdateCheck['updates']['installed'][$k]);
- $updatesListChanged = true;
- break;
- }
- }
-
- if ($updatesListChanged) {
- $lastUpdateCheck['updates']['installed'] = array_values($lastUpdateCheck['updates']['installed']);
- $this->settings->set('sycho-package-manager.last_update_check', json_encode($lastUpdateCheck));
- }
- }
+ $this->lastUpdateCheck->forget($extension->name);
return true;
}
diff --git a/extensions/package-manager/src/Exception/ComposerCommandFailedException.php b/extensions/package-manager/src/Exception/ComposerCommandFailedException.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Exception/ComposerCommandFailedExceptionHandler.php b/extensions/package-manager/src/Exception/ComposerCommandFailedExceptionHandler.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Exception/ComposerRequireFailedException.php b/extensions/package-manager/src/Exception/ComposerRequireFailedException.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Exception/ComposerUpdateFailedException.php b/extensions/package-manager/src/Exception/ComposerUpdateFailedException.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Extension/Event/Installed.php b/extensions/package-manager/src/Extension/Event/Installed.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Extension/Event/Removed.php b/extensions/package-manager/src/Extension/Event/Removed.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Extension/Event/Updated.php b/extensions/package-manager/src/Extension/Event/Updated.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/Extension/ExtensionUtils.php b/extensions/package-manager/src/Extension/ExtensionUtils.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/LastUpdateCheck.php b/extensions/package-manager/src/LastUpdateCheck.php
new file mode 100755
index 000000000..53bfa5326
--- /dev/null
+++ b/extensions/package-manager/src/LastUpdateCheck.php
@@ -0,0 +1,69 @@
+settings = $settings;
+ }
+
+ public function save(array $updates): array
+ {
+ $lastUpdateCheck = [
+ 'checkedAt' => Carbon::now(),
+ 'updates' => $updates,
+ ];
+
+ $this->settings->set(self::KEY, json_encode($lastUpdateCheck));
+
+ return $lastUpdateCheck;
+ }
+
+ public function get(): array
+ {
+ return json_decode($this->settings->get(self::KEY, '{}'), true);
+ }
+
+ public function forget(string $name, bool $wildcard = false): void
+ {
+ $lastUpdateCheck = json_decode($this->settings->get(self::KEY, '{}'), true);
+
+ if (isset($lastUpdateCheck['updates']) && ! empty($lastUpdateCheck['updates']['installed'])) {
+ $updatesListChanged = false;
+ $pattern = str_replace('*', '.*', preg_quote($name));
+
+ foreach ($lastUpdateCheck['updates']['installed'] as $k => $package) {
+ if (($wildcard && Str::of($package['name'])->test("/($pattern)/")) || $package['name'] === $name) {
+ unset($lastUpdateCheck['updates']['installed'][$k]);
+ $updatesListChanged = true;
+
+ if (! $wildcard) {
+ break;
+ }
+ }
+ }
+
+ if ($updatesListChanged) {
+ $lastUpdateCheck['updates']['installed'] = array_values($lastUpdateCheck['updates']['installed']);
+ $this->settings->set(self::KEY, json_encode($lastUpdateCheck));
+ }
+ }
+ }
+}
diff --git a/extensions/package-manager/src/PackageManagerServiceProvider.php b/extensions/package-manager/src/PackageManagerServiceProvider.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/RequirePackageValidator.php b/extensions/package-manager/src/RequirePackageValidator.php
old mode 100644
new mode 100755
diff --git a/extensions/package-manager/src/UpdateExtensionValidator.php b/extensions/package-manager/src/UpdateExtensionValidator.php
old mode 100644
new mode 100755