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:
48
extensions/package-manager/js/dist/admin.js
vendored
48
extensions/package-manager/js/dist/admin.js
vendored
@@ -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
@@ -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();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
@@ -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(() => {
|
||||
|
@@ -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.
|
||||
|
41
extensions/package-manager/src/Api/Controller/MajorUpdateController.php
Executable file
41
extensions/package-manager/src/Api/Controller/MajorUpdateController.php
Executable 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();
|
||||
}
|
||||
}
|
@@ -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);
|
||||
|
24
extensions/package-manager/src/Command/MajorUpdate.php
Normal file
24
extensions/package-manager/src/Command/MajorUpdate.php
Normal 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;
|
||||
}
|
||||
}
|
152
extensions/package-manager/src/Command/MajorUpdateHandler.php
Normal file
152
extensions/package-manager/src/Command/MajorUpdateHandler.php
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
@@ -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());
|
||||
|
Reference in New Issue
Block a user