1
0
mirror of https://github.com/flarum/core.git synced 2025-07-25 18:51:40 +02:00

[untested] Major Update handler (#1)

This commit is contained in:
SychO9
2021-10-03 10:58:17 +01:00
parent 2ce28f8e5c
commit 7e174dd08a
10 changed files with 296 additions and 13 deletions

View File

@@ -343,6 +343,11 @@ __webpack_require__.r(__webpack_exports__);
/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3__);
/* harmony import */ var flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! flarum/common/components/Tooltip */ "flarum/common/components/Tooltip");
/* harmony import */ var flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_4__);
/* harmony import */ var flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! flarum/admin/components/LoadingModal */ "flarum/admin/components/LoadingModal");
/* harmony import */ var flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5__);
/* harmony import */ var _utils_errorHandler__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/errorHandler */ "./src/admin/utils/errorHandler.ts");
@@ -353,7 +358,15 @@ var MajorUpdater = /*#__PURE__*/function (_Component) {
Object(_babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_0__["default"])(MajorUpdater, _Component);
function MajorUpdater() {
return _Component.apply(this, arguments) || this;
var _this;
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
_this = _Component.call.apply(_Component, [this].concat(args)) || this;
_this.isLoading = null;
return _this;
}
var _proto = MajorUpdater.prototype;
@@ -374,13 +387,40 @@ var MajorUpdater = /*#__PURE__*/function (_Component) {
text: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.major_updater.dry_run_help')
}, m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3___default.a, {
className: "Button",
icon: "fas fa-vial"
icon: "fas fa-vial",
onclick: this.update.bind(this, true)
}, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.major_updater.dry_run'))), m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_3___default.a, {
className: "Button",
icon: "fas fa-play"
icon: "fas fa-play",
onclick: this.update.bind(this, false)
}, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.major_updater.update'))));
};
_proto.update = function update(dryRun) {
var _this2 = this;
this.isLoading = "update-" + (dryRun ? 'dry-run' : 'run');
flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.modal.show(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_5___default.a);
flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.request({
method: 'POST',
url: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.forum.attribute('apiUrl') + "/package-manager/major-update",
body: {
data: {
dryRun: dryRun
}
},
errorHandler: _utils_errorHandler__WEBPACK_IMPORTED_MODULE_6__["default"]
}).then(function () {
flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.alerts.show({
type: 'success'
}, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.update_successful'));
window.location.reload();
})["finally"](function () {
_this2.isLoading = null;
m.redraw();
});
};
return MajorUpdater;
}(flarum_common_Component__WEBPACK_IMPORTED_MODULE_2___default.a);
@@ -605,7 +645,7 @@ var Updater = /*#__PURE__*/function (_Component) {
}).then(function () {
flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.alerts.show({
type: 'success'
}, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.updater.minor_update_successful'));
}, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.update_successful'));
window.location.reload();
})["finally"](function () {
_this4.isLoading = null;

File diff suppressed because one or more lines are too long

View File

@@ -4,12 +4,16 @@ import Mithril from 'mithril';
import Button from 'flarum/common/components/Button';
import Tooltip from 'flarum/common/components/Tooltip';
import { UpdatedPackage } from './Updater';
import LoadingModal from 'flarum/admin/components/LoadingModal';
import errorHandler from '../utils/errorHandler';
interface MajorUpdaterAttrs extends ComponentAttrs {
coreUpdate: UpdatedPackage;
}
export default class MajorUpdater<T extends MajorUpdaterAttrs = MajorUpdaterAttrs> extends Component<T> {
isLoading: string | null = null;
view(vnode: Mithril.Vnode<ComponentAttrs, this>): Mithril.Children {
return (
<div className="Form-group PackageManager-majorUpdate">
@@ -18,15 +22,38 @@ export default class MajorUpdater<T extends MajorUpdaterAttrs = MajorUpdaterAttr
<p className="helpText">{app.translator.trans('sycho-package-manager.admin.major_updater.description')}</p>
<div className="PackageManager-updaterControls">
<Tooltip text={app.translator.trans('sycho-package-manager.admin.major_updater.dry_run_help')}>
<Button className="Button" icon="fas fa-vial">
<Button className="Button" icon="fas fa-vial" onclick={this.update.bind(this, true)}>
{app.translator.trans('sycho-package-manager.admin.major_updater.dry_run')}
</Button>
</Tooltip>
<Button className="Button" icon="fas fa-play">
<Button className="Button" icon="fas fa-play" onclick={this.update.bind(this, false)}>
{app.translator.trans('sycho-package-manager.admin.major_updater.update')}
</Button>
</div>
</div>
);
}
update(dryRun: boolean) {
this.isLoading = `update-${dryRun ? 'dry-run' : 'run'}`;
app.modal.show(LoadingModal);
app
.request({
method: 'POST',
url: `${app.forum.attribute('apiUrl')}/package-manager/major-update`,
body: {
data: { dryRun },
},
errorHandler,
})
.then(() => {
app.alerts.show({ type: 'success' }, app.translator.trans('sycho-package-manager.admin.update_successful'));
window.location.reload();
})
.finally(() => {
this.isLoading = null;
m.redraw();
});
}
}

View File

@@ -195,7 +195,7 @@ export default class Updater extends Component {
errorHandler,
})
.then(() => {
app.alerts.show({ type: 'success' }, app.translator.trans('sycho-package-manager.admin.updater.minor_update_successful'));
app.alerts.show({ type: 'success' }, app.translator.trans('sycho-package-manager.admin.update_successful'));
window.location.reload();
})
.finally(() => {

View File

@@ -34,7 +34,8 @@ sycho-package-manager:
flarum: Flarum Core
global_update_successful: Successfully updated all packages.
last_update_checked_at: "Last Update Check: "
minor_update_successful: Flarum successfully updated.
run_global_update: Run Global Update
updater_title: Updates
updater_help: Runs a check for new extension and Flarum updates.
update_successful: Flarum successfully updated.

View File

@@ -0,0 +1,41 @@
<?php
/**
*
*/
namespace SychO\PackageManager\Api\Controller;
use Flarum\Bus\Dispatcher;
use Flarum\Http\RequestUtil;
use Laminas\Diactoros\Response\EmptyResponse;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Server\RequestHandlerInterface;
use Illuminate\Support\Arr;
use Psr\Http\Message\ServerRequestInterface;
use SychO\PackageManager\Command\MajorUpdate;
class MajorUpdateController implements RequestHandlerInterface
{
/**
* @var Dispatcher
*/
protected $bus;
public function __construct(Dispatcher $bus)
{
$this->bus = $bus;
}
public function handle(ServerRequestInterface $request): ResponseInterface
{
$actor = RequestUtil::getActor($request);
$dryRun = (bool) (int) Arr::get($request->getParsedBody(), 'data.dryRun');
$this->bus->dispatch(
new MajorUpdate($actor, $dryRun)
);
return new EmptyResponse();
}
}

View File

@@ -27,9 +27,6 @@ class UpdateExtensionController implements RequestHandlerInterface
$this->bus = $bus;
}
/**
* @throws \Flarum\User\Exception\PermissionDeniedException
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{
$actor = RequestUtil::getActor($request);

View File

@@ -0,0 +1,24 @@
<?php
namespace SychO\PackageManager\Command;
use Flarum\User\User;
class MajorUpdate
{
/**
* @var \Flarum\User\User
*/
public $actor;
/**
* @var bool
*/
public $dryRun;
public function __construct(User $actor, bool $dryRun)
{
$this->actor = $actor;
$this->dryRun = $dryRun;
}
}

View File

@@ -0,0 +1,152 @@
<?php
namespace SychO\PackageManager\Command;
use Composer\Console\Application;
use Flarum\Foundation\Paths;
use Illuminate\Contracts\Events\Dispatcher;
use Illuminate\Support\Arr;
use SychO\PackageManager\Event\FlarumUpdated;
use SychO\PackageManager\Exception\ComposerUpdateFailedException;
use SychO\PackageManager\LastUpdateCheck;
use SychO\PackageManager\OutputLogger;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
class MajorUpdateHandler
{
/**
* @var Application
*/
protected $composer;
/**
* @var LastUpdateCheck
*/
protected $lastUpdateCheck;
/**
* @var Dispatcher
*/
protected $events;
/**
* @var OutputLogger
*/
protected $logger;
/**
* @var Paths
*/
protected $paths;
/**
* @var array
*/
protected $composerJson;
public function __construct(Application $composer, LastUpdateCheck $lastUpdateCheck, Dispatcher $events, OutputLogger $logger, Paths $paths)
{
$this->composer = $composer;
$this->lastUpdateCheck = $lastUpdateCheck;
$this->events = $events;
$this->logger = $logger;
$this->paths = $paths;
}
/**
* Set the version constraint for all directly required packages in the root composer.json to *.
* Set flarum/core version constraint to new major version.
* Run composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies.
* Clear cache.
* Run migrations.
*
* @throws \Flarum\User\Exception\PermissionDeniedException
* @throws ComposerUpdateFailedException
*/
public function handle(MajorUpdate $command)
{
$command->actor->assertAdmin();
$majorVersion = $this->getNewMajorVersion();
if (! $majorVersion) {
return false;
}
$this->updateComposerJson($majorVersion);
$this->runCommand($command->dryRun);
if ($command->dryRun) {
$this->revertComposerJson();
return true;
}
$this->lastUpdateCheck->forget('flarum/*', true);
$this->events->dispatch(
new FlarumUpdated(FlarumUpdated::MAJOR)
);
return true;
}
protected function getNewMajorVersion(): ?string
{
$core = Arr::first($this->lastUpdateCheck->get()['updates']['installed'], function ($package) {
return $package['name'] === 'flarum/core';
});
return $core ? $core['latest-major'] : null;
}
protected function updateComposerJson(string $majorVersion): void
{
$composerJsonPath = $this->paths->base . '/composer.json';
$this->composerJson = $newComposerJson = json_decode(file_get_contents($composerJsonPath), true);
foreach ($newComposerJson['require'] as $name => &$version) {
if ($name === 'flarum/core') {
$version = '^'.str_replace('v', '', $majorVersion);
} else {
$version = '*';
}
}
file_put_contents($composerJsonPath, json_encode($newComposerJson));
}
protected function revertComposerJson(): void
{
$composerJsonPath = $this->paths->base . '/composer.json';
file_put_contents($composerJsonPath, $this->composerJson);
}
/**
* @throws ComposerUpdateFailedException
*/
protected function runCommand(bool $dryRun): void
{
$output = new BufferedOutput();
$input = new ArrayInput([
'command' => 'update',
'--prefer-dist' => true,
'--no-plugins' => true,
'--no-dev' => true,
'-a' => true,
'--with-all-dependencies' => true,
'--dry-run' => $dryRun,
]);
$exitCode = $this->composer->run($input, $output);
$output = $output->fetch();
$this->logger->log($input->__toString(), $output, $exitCode);
if ($exitCode !== 0) {
throw new ComposerUpdateFailedException('*', $output);
}
}
}

View File

@@ -9,6 +9,7 @@ namespace SychO\PackageManager\Listener;
use Composer\Command\ClearCacheCommand;
use Flarum\Database\Console\MigrateCommand;
use Flarum\Foundation\Console\AssetsPublishCommand;
use SychO\PackageManager\Event\FlarumUpdated;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\NullOutput;
@@ -39,7 +40,7 @@ class PostUpdateListener
/**
* @throws \Exception
*/
public function handle($event)
public function handle(FlarumUpdated $event)
{
$this->clearCache->run(new ArrayInput([]), new NullOutput());
$this->migrate->run(new ArrayInput([]), new NullOutput());