1
0
mirror of https://github.com/flarum/core.git synced 2025-07-16 14:26:25 +02:00

Change minor updating to update everything as is currently

This commit is contained in:
SychO9
2021-11-18 15:14:22 +01:00
parent 71e812c386
commit 38cd56c351
11 changed files with 1120 additions and 54 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,3 +1,4 @@
import Mithril from "mithril";
import app from 'flarum/admin/app'; import app from 'flarum/admin/app';
import Component from 'flarum/common/Component'; import Component from 'flarum/common/Component';
import icon from 'flarum/common/helpers/icon'; import icon from 'flarum/common/helpers/icon';
@ -9,6 +10,7 @@ import errorHandler from '../utils/errorHandler';
import classList from 'flarum/common/utils/classList'; import classList from 'flarum/common/utils/classList';
import LoadingIndicator from 'flarum/common/components/LoadingIndicator'; import LoadingIndicator from 'flarum/common/components/LoadingIndicator';
import MajorUpdater from './MajorUpdater'; import MajorUpdater from './MajorUpdater';
import {Extension} from "flarum/admin/AdminApplication";
export type UpdatedPackage = { export type UpdatedPackage = {
name: string; name: string;
@ -20,37 +22,44 @@ export type UpdatedPackage = {
description: string; description: string;
}; };
type ComposerUpdates = { export type ComposerUpdates = {
installed: UpdatedPackage[]; installed: UpdatedPackage[];
}; };
type LastUpdateCheck = { export type LastUpdateCheck = {
checkedAt: Date; checkedAt: Date;
updates: ComposerUpdates; updates: ComposerUpdates;
}; };
export default class Updater extends Component { export default class Updater<Attrs> extends Component<Attrs> {
isLoading: string | null = null; isLoading: string | null = null;
lastUpdateCheck: LastUpdateCheck = app.data.lastUpdateCheck || {}; lastUpdateCheck: LastUpdateCheck = (app.data.lastUpdateCheck as LastUpdateCheck) || {};
packageUpdates: Record<string, UpdatedPackage> = {};
oninit(vnode) { oninit(vnode: Mithril.Vnode<Attrs, this>) {
super.oninit(vnode); super.oninit(vnode);
} }
view() { view() {
const extensions: any = this.getExtensionUpdates(); const extensions: any = this.getExtensionUpdates();
const coreUpdate: UpdatedPackage | undefined = this.getCoreUpdate(); const coreUpdate: UpdatedPackage | undefined = this.getCoreUpdate();
let core = null; let core: any = null;
if (coreUpdate) { if (coreUpdate) {
core = { core = {
title: app.translator.trans('flarum-package-manager.admin.updater.flarum'), id: "flarum-core",
version: app.data.settings.version, version: app.data.settings.version,
icon: { icon: {
backgroundImage: `url(${app.forum.attribute('baseUrl')}/assets/extensions/flarum-package-manager/flarum.svg`, backgroundImage: `url(${app.forum.attribute('baseUrl')}/assets/extensions/flarum-package-manager/flarum.svg`,
}, },
newPackageUpdate: coreUpdate, extra: {
'flarum-extension': {
title: app.translator.trans('flarum-package-manager.admin.updater.flarum'),
}
}
}; };
this.packageUpdates['flarum-core'] = coreUpdate;
} }
return [ return [
@ -102,7 +111,7 @@ export default class Updater extends Component {
]; ];
} }
extensionItem(extension: any, isCore: boolean = false) { extensionItem(extension: Extension, isCore: boolean = false) {
return ( return (
<div <div
className={classList({ className={classList({
@ -114,17 +123,17 @@ export default class Updater extends Component {
{extension.icon ? icon(extension.icon.name) : ''} {extension.icon ? icon(extension.icon.name) : ''}
</div> </div>
<div className="PackageManager-extension-info"> <div className="PackageManager-extension-info">
<div className="PackageManager-extension-name">{extension.title || extension.extra['flarum-extension'].title}</div> <div className="PackageManager-extension-name">{extension.extra['flarum-extension'].title}</div>
<div className="PackageManager-extension-version"> <div className="PackageManager-extension-version">
<span className="PackageManager-extension-version-current">{this.version(extension.version)}</span> <span className="PackageManager-extension-version-current">{this.version(extension.version)}</span>
{extension.newPackageUpdate['latest-minor'] ? ( {this.packageUpdates[extension.id]['latest-minor'] ? (
<span className="PackageManager-extension-version-latest PackageManager-extension-version-latest--minor"> <span className="PackageManager-extension-version-latest PackageManager-extension-version-latest--minor">
{this.version(extension.newPackageUpdate['latest-minor'])} {this.version(this.packageUpdates[extension.id]['latest-minor']!)}
</span> </span>
) : null} ) : null}
{extension.newPackageUpdate['latest-major'] && !isCore ? ( {this.packageUpdates[extension.id]['latest-major'] && !isCore ? (
<span className="PackageManager-extension-version-latest PackageManager-extension-version-latest--major"> <span className="PackageManager-extension-version-latest PackageManager-extension-version-latest--major">
{this.version(extension.newPackageUpdate['latest-major'])} {this.version(this.packageUpdates[extension.id]['latest-major']!)}
</span> </span>
) : null} ) : null}
</div> </div>
@ -153,13 +162,13 @@ export default class Updater extends Component {
const safeToUpdate = ['semver-safe-update', 'update-possible'].includes(composerPackage['latest-status']); const safeToUpdate = ['semver-safe-update', 'update-possible'].includes(composerPackage['latest-status']);
if (extension && safeToUpdate) { if (extension && safeToUpdate) {
extension.newPackageUpdate = composerPackage; this.packageUpdates[extension.id] = composerPackage;
} }
return extension && safeToUpdate; return extension && safeToUpdate;
}); });
return Object.values(app.data.extensions).filter((extension: any) => extension.newPackageUpdate); return Object.values(app.data.extensions).filter((extension: any) => this.packageUpdates[extension.id]);
} }
getCoreUpdate(): UpdatedPackage | undefined { getCoreUpdate(): UpdatedPackage | undefined {
@ -185,23 +194,25 @@ export default class Updater extends Component {
} }
updateCoreMinor() { updateCoreMinor() {
app.modal.show(LoadingModal); if (confirm(app.translator.trans('flarum-package-manager.admin.minor_update_confirmation.content'))) {
this.isLoading = 'minor-update'; app.modal.show(LoadingModal);
this.isLoading = 'minor-update';
app /*app
.request({ .request({
method: 'POST', method: 'POST',
url: `${app.forum.attribute('apiUrl')}/package-manager/minor-update`, url: `${app.forum.attribute('apiUrl')}/package-manager/minor-update`,
errorHandler, errorHandler,
}) })
.then(() => { .then(() => {
app.alerts.show({ type: 'success' }, app.translator.trans('flarum-package-manager.admin.update_successful')); app.alerts.show({ type: 'success' }, app.translator.trans('flarum-package-manager.admin.update_successful'));
window.location.reload(); window.location.reload();
}) })
.finally(() => { .finally(() => {
this.isLoading = null; this.isLoading = null;
m.redraw(); m.redraw();
}); });*/
}
} }
updateExtension(extension: any) { updateExtension(extension: any) {

View File

@ -7,7 +7,6 @@ import LoadingModal from 'flarum/admin/components/LoadingModal';
import Installer from './components/Installer'; import Installer from './components/Installer';
import Updater from './components/Updater'; import Updater from './components/Updater';
import isExtensionEnabled from 'flarum/admin/utils/isExtensionEnabled'; import isExtensionEnabled from 'flarum/admin/utils/isExtensionEnabled';
import MajorUpdater from './components/MajorUpdater';
app.initializers.add('flarum-package-manager', (app) => { app.initializers.add('flarum-package-manager', (app) => {
app.extensionData app.extensionData
@ -22,16 +21,22 @@ app.initializers.add('flarum-package-manager', (app) => {
</div> </div>
); );
} }
return null;
}) })
.registerSetting(() => { .registerSetting(() => {
if (app.data.isRequiredDirectoriesWritable) { if (app.data.isRequiredDirectoriesWritable) {
return <Installer />; return <Installer />;
} }
return null;
}) })
.registerSetting(() => { .registerSetting(() => {
if (app.data.isRequiredDirectoriesWritable) { if (app.data.isRequiredDirectoriesWritable) {
return <Updater />; return <Updater />;
} }
return null;
}); });
extend(ExtensionPage.prototype, 'topItems', function (items) { extend(ExtensionPage.prototype, 'topItems', function (items) {

View File

@ -1,11 +1,16 @@
{ {
"extends": "flarum-tsconfig", // Use Flarum's tsconfig as a starting point
"include": ["src/**/*"], "extends": "flarum-tsconfig",
"compilerOptions": { // This will match all .ts, .tsx, .d.ts, .js, .jsx files in your `src` folder
"declarationDir": "./dist-typings", // and also tells your Typescript server to read core's global typings for
"baseUrl": ".", // access to `dayjs` and `$` in the global namespace.
"paths": { "include": ["src/**/*", "../vendor/flarum/core/js/dist-typings/@types/**/*"],
"flarum/*": ["../vendor/flarum/core/js/dist-typings/*"] "compilerOptions": {
// This will output typings to `dist-typings`
"declarationDir": "./dist-typings",
"baseUrl": ".",
"paths": {
"flarum/*": ["../vendor/flarum/core/js/dist-typings/*"]
}
} }
}
} }

View File

@ -119,3 +119,12 @@
grid-area: helpText; grid-area: helpText;
} }
} }
.MinorUpdateWarningModal {
.Modal-footer {
display: flex;
align-items: center;
justify-content: center;
gap: 4px;
}
}

View File

@ -29,6 +29,9 @@ flarum-package-manager:
title: Flarum {version} Major Update Available title: Flarum {version} Major Update Available
update: Update update: Update
minor_update_confirmation:
content: This will also update any other extensions/packages with availabe updates.
updater: updater:
check_for_updates: Check for updates check_for_updates: Check for updates
flarum: Flarum Core flarum: Flarum Core

View File

@ -83,7 +83,7 @@ class MajorUpdateHandler
return true; return true;
} }
$this->lastUpdateCheck->forget('flarum/*', true); $this->lastUpdateCheck->forgetAll();
$this->events->dispatch( $this->events->dispatch(
new FlarumUpdated(FlarumUpdated::MAJOR) new FlarumUpdated(FlarumUpdated::MAJOR)

View File

@ -10,6 +10,7 @@
namespace Flarum\PackageManager\Command; namespace Flarum\PackageManager\Command;
use Flarum\PackageManager\Composer\ComposerAdapter; use Flarum\PackageManager\Composer\ComposerAdapter;
use Flarum\PackageManager\Composer\ComposerJson;
use Illuminate\Contracts\Events\Dispatcher; use Illuminate\Contracts\Events\Dispatcher;
use Flarum\PackageManager\Event\FlarumUpdated; use Flarum\PackageManager\Event\FlarumUpdated;
use Flarum\PackageManager\Exception\ComposerUpdateFailedException; use Flarum\PackageManager\Exception\ComposerUpdateFailedException;
@ -33,11 +34,17 @@ class MinorFlarumUpdateHandler
*/ */
protected $events; protected $events;
public function __construct(ComposerAdapter $composer, LastUpdateCheck $lastUpdateCheck, Dispatcher $events) /**
* @var ComposerJson
*/
protected $composerJson;
public function __construct(ComposerAdapter $composer, LastUpdateCheck $lastUpdateCheck, Dispatcher $events, ComposerJson $composerJson)
{ {
$this->composer = $composer; $this->composer = $composer;
$this->lastUpdateCheck = $lastUpdateCheck; $this->lastUpdateCheck = $lastUpdateCheck;
$this->events = $events; $this->events = $events;
$this->composerJson = $composerJson;
} }
/** /**
@ -48,15 +55,20 @@ class MinorFlarumUpdateHandler
{ {
$command->actor->assertAdmin(); $command->actor->assertAdmin();
$coreRequirement = $this->composerJson->get()['require']['flarum/core'];
$this->composerJson->require('*', '*');
$this->composerJson->require('flarum/core', $coreRequirement);
$output = $this->composer->run( $output = $this->composer->run(
new StringInput("update flarum/* --prefer-dist --no-dev -a --with-all-dependencies") new StringInput("update --prefer-dist --no-dev -a --with-all-dependencies")
); );
if ($output->getExitCode() !== 0) { if ($output->getExitCode() !== 0) {
throw new ComposerUpdateFailedException('flarum/*', $output->getContents()); throw new ComposerUpdateFailedException('flarum/*', $output->getContents());
} }
$this->lastUpdateCheck->forget('flarum/*', true); $this->lastUpdateCheck->forgetAll();
$this->events->dispatch( $this->events->dispatch(
new FlarumUpdated(FlarumUpdated::MINOR) new FlarumUpdated(FlarumUpdated::MINOR)

View File

@ -11,6 +11,7 @@ namespace Flarum\PackageManager\Composer;
use Flarum\Foundation\Paths; use Flarum\Foundation\Paths;
use Illuminate\Filesystem\Filesystem; use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Str;
class ComposerJson class ComposerJson
{ {
@ -37,24 +38,26 @@ class ComposerJson
public function require(string $packageName, string $version): void public function require(string $packageName, string $version): void
{ {
$composerJson = $this->getComposerJson(); $composerJson = $this->get();
if (strpos($packageName, '*') === false) { if (strpos($packageName, '*') === false) {
$composerJson['require'][$packageName] = $version; $composerJson['require'][$packageName] = $version;
} else { } else {
foreach ($composerJson['require'] as $p => $v) { foreach ($composerJson['require'] as $p => $v) {
if (preg_match(preg_quote(str_replace('*', '.*', $packageName), '/'), $p, $matches)) { $wildcardPackageName = str_replace('\*', '.*', preg_quote($packageName, '/'));
if (Str::of($p)->test("/($wildcardPackageName)/")) {
$composerJson['require'][$p] = $version; $composerJson['require'][$p] = $version;
} }
} }
} }
$this->setComposerJson($composerJson); $this->set($composerJson);
} }
public function revert(): void public function revert(): void
{ {
$this->setComposerJson($this->initialJson); $this->set($this->initialJson);
} }
protected function getComposerJsonPath(): string protected function getComposerJsonPath(): string
@ -65,7 +68,7 @@ class ComposerJson
/** /**
* @throws \Illuminate\Contracts\Filesystem\FileNotFoundException * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
*/ */
protected function getComposerJson(): array public function get(): array
{ {
$json = json_decode($this->filesystem->get($this->getComposerJsonPath()), true); $json = json_decode($this->filesystem->get($this->getComposerJsonPath()), true);
@ -76,7 +79,7 @@ class ComposerJson
return $json; return $json;
} }
protected function setComposerJson(array $json): void protected function set(array $json): void
{ {
$this->filesystem->put($this->getComposerJsonPath(), json_encode($json, JSON_PRETTY_PRINT)); $this->filesystem->put($this->getComposerJsonPath(), json_encode($json, JSON_PRETTY_PRINT));
} }

View File

@ -60,7 +60,7 @@ class LastUpdateCheck
if (isset($lastUpdateCheck['updates']) && ! empty($lastUpdateCheck['updates']['installed'])) { if (isset($lastUpdateCheck['updates']) && ! empty($lastUpdateCheck['updates']['installed'])) {
$updatesListChanged = false; $updatesListChanged = false;
$pattern = preg_quote(str_replace('*', '.*', $name)); $pattern = str_replace('\*', '.*', preg_quote($name, '/'));
foreach ($lastUpdateCheck['updates']['installed'] as $k => $package) { foreach ($lastUpdateCheck['updates']['installed'] as $k => $package) {
if (($wildcard && Str::of($package['name'])->test("/($pattern)/")) || $package['name'] === $name) { if (($wildcard && Str::of($package['name'])->test("/($pattern)/")) || $package['name'] === $name) {
@ -79,4 +79,9 @@ class LastUpdateCheck
} }
} }
} }
public function forgetAll(): void
{
$this->save([]);
}
} }