mirror of
https://github.com/flarum/core.git
synced 2025-07-16 14:26:25 +02:00
Add Extension Updating
This commit is contained in:
70
extensions/package-manager/js/dist/admin.js
vendored
70
extensions/package-manager/js/dist/admin.js
vendored
@ -355,6 +355,14 @@ __webpack_require__.r(__webpack_exports__);
|
|||||||
/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4__);
|
/* harmony import */ var flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4__);
|
||||||
/* harmony import */ var flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! flarum/common/helpers/humanTime */ "flarum/common/helpers/humanTime");
|
/* harmony import */ var flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! flarum/common/helpers/humanTime */ "flarum/common/helpers/humanTime");
|
||||||
/* harmony import */ var flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_5__);
|
/* harmony import */ var flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_5__);
|
||||||
|
/* harmony import */ var flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! flarum/admin/components/LoadingModal */ "flarum/admin/components/LoadingModal");
|
||||||
|
/* harmony import */ var flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_6___default = /*#__PURE__*/__webpack_require__.n(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_6__);
|
||||||
|
/* harmony import */ var _ComposerFailureModal__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./ComposerFailureModal */ "./src/admin/components/ComposerFailureModal.tsx");
|
||||||
|
/* harmony import */ var flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! flarum/common/components/Tooltip */ "flarum/common/components/Tooltip");
|
||||||
|
/* harmony import */ var flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_8___default = /*#__PURE__*/__webpack_require__.n(flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_8__);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -385,7 +393,8 @@ var Updater = /*#__PURE__*/function (_Component) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
_proto.view = function view() {
|
_proto.view = function view() {
|
||||||
var _this$lastUpdateCheck;
|
var _this$lastUpdateCheck,
|
||||||
|
_this2 = this;
|
||||||
|
|
||||||
var extensions = this.getExtensionUpdates(); // @TODO catch `flarum/core` updates and display them differently, since it is the CORE and not an extension.
|
var extensions = this.getExtensionUpdates(); // @TODO catch `flarum/core` updates and display them differently, since it is the CORE and not an extension.
|
||||||
|
|
||||||
@ -393,13 +402,13 @@ var Updater = /*#__PURE__*/function (_Component) {
|
|||||||
className: "Form-group"
|
className: "Form-group"
|
||||||
}, m("label", null, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.updater.updater_title')), m("p", {
|
}, m("label", null, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.updater.updater_title')), m("p", {
|
||||||
className: "helpText"
|
className: "helpText"
|
||||||
}, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.updater.updater_help')), m("p", {
|
}, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.updater.updater_help')), Object.keys(this.lastUpdateCheck).length ? m("p", {
|
||||||
className: "PackageManager-lastUpdatedAt"
|
className: "PackageManager-lastUpdatedAt"
|
||||||
}, m("span", {
|
}, m("span", {
|
||||||
className: "PackageManager-lastUpdatedAt-label"
|
className: "PackageManager-lastUpdatedAt-label"
|
||||||
}, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.updater.last_update_checked_at')), m("span", {
|
}, flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.updater.last_update_checked_at')), m("span", {
|
||||||
className: "PackageManager-lastUpdatedAt-value"
|
className: "PackageManager-lastUpdatedAt-value"
|
||||||
}, flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_5___default()((_this$lastUpdateCheck = this.lastUpdateCheck) == null ? void 0 : _this$lastUpdateCheck.checkedAt))), m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4___default.a, {
|
}, flarum_common_helpers_humanTime__WEBPACK_IMPORTED_MODULE_5___default()((_this$lastUpdateCheck = this.lastUpdateCheck) == null ? void 0 : _this$lastUpdateCheck.checkedAt))) : null, m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4___default.a, {
|
||||||
className: "Button",
|
className: "Button",
|
||||||
icon: "fas fa-sync-alt",
|
icon: "fas fa-sync-alt",
|
||||||
onclick: this.checkForUpdates.bind(this),
|
onclick: this.checkForUpdates.bind(this),
|
||||||
@ -426,10 +435,14 @@ var Updater = /*#__PURE__*/function (_Component) {
|
|||||||
className: "PackageManager-extension-version-latest Label"
|
className: "PackageManager-extension-version-latest Label"
|
||||||
}, extension.newPackageUpdate.latest))), m("div", {
|
}, extension.newPackageUpdate.latest))), m("div", {
|
||||||
className: "PackageManager-extension-controls"
|
className: "PackageManager-extension-controls"
|
||||||
|
}, m(flarum_common_components_Tooltip__WEBPACK_IMPORTED_MODULE_8___default.a, {
|
||||||
|
text: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.extensions.update')
|
||||||
}, m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4___default.a, {
|
}, m(flarum_common_components_Button__WEBPACK_IMPORTED_MODULE_4___default.a, {
|
||||||
icon: "fas fa-arrow-alt-circle-up",
|
icon: "fas fa-arrow-alt-circle-up",
|
||||||
className: "Button Button--icon Button--flat"
|
className: "Button Button--icon Button--flat",
|
||||||
})));
|
onclick: _this2.update.bind(_this2, extension),
|
||||||
|
"aria-label": flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.translator.trans('sycho-package-manager.admin.extensions.update')
|
||||||
|
}))));
|
||||||
}))) : null);
|
}))) : null);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -438,7 +451,7 @@ var Updater = /*#__PURE__*/function (_Component) {
|
|||||||
|
|
||||||
var updates = (_this$lastUpdateCheck2 = this.lastUpdateCheck) == null ? void 0 : (_this$lastUpdateCheck3 = _this$lastUpdateCheck2.updates) == null ? void 0 : (_this$lastUpdateCheck4 = _this$lastUpdateCheck3.installed) == null ? void 0 : _this$lastUpdateCheck4.filter(function (composerPackage) {
|
var updates = (_this$lastUpdateCheck2 = this.lastUpdateCheck) == null ? void 0 : (_this$lastUpdateCheck3 = _this$lastUpdateCheck2.updates) == null ? void 0 : (_this$lastUpdateCheck4 = _this$lastUpdateCheck3.installed) == null ? void 0 : _this$lastUpdateCheck4.filter(function (composerPackage) {
|
||||||
var extension = flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.data.extensions[composerPackage.name.replace('/', '-').replace(/(flarum-ext-)|(flarum-)/, '')];
|
var extension = flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.data.extensions[composerPackage.name.replace('/', '-').replace(/(flarum-ext-)|(flarum-)/, '')];
|
||||||
var safeToUpdate = composerPackage['latest-status'] === 'semver-safe-update';
|
var safeToUpdate = ['semver-safe-update', 'update-possible'].includes(composerPackage['latest-status']);
|
||||||
|
|
||||||
if (extension && safeToUpdate) {
|
if (extension && safeToUpdate) {
|
||||||
extension.newPackageUpdate = composerPackage;
|
extension.newPackageUpdate = composerPackage;
|
||||||
@ -452,15 +465,43 @@ var Updater = /*#__PURE__*/function (_Component) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
_proto.checkForUpdates = function checkForUpdates() {
|
_proto.checkForUpdates = function checkForUpdates() {
|
||||||
var _this2 = this;
|
var _this3 = this;
|
||||||
|
|
||||||
this.isLoading = true;
|
this.isLoading = true;
|
||||||
flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.request({
|
flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.request({
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
url: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.forum.attribute('apiUrl') + "/package-manager/check-for-updates"
|
url: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.forum.attribute('apiUrl') + "/package-manager/check-for-updates"
|
||||||
}).then(function (response) {
|
}).then(function (response) {
|
||||||
_this2.isLoading = false;
|
_this3.isLoading = false;
|
||||||
_this2.lastUpdateCheck = response;
|
_this3.lastUpdateCheck = response;
|
||||||
|
m.redraw();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
_proto.update = function update(extension) {
|
||||||
|
flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.modal.show(flarum_admin_components_LoadingModal__WEBPACK_IMPORTED_MODULE_6___default.a);
|
||||||
|
flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.request({
|
||||||
|
method: 'PATCH',
|
||||||
|
url: flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.forum.attribute('apiUrl') + "/package-manager/extensions/" + extension.id,
|
||||||
|
errorHandler: function errorHandler(e) {
|
||||||
|
var error = e.response.errors[0];
|
||||||
|
|
||||||
|
if (error.code !== 'composer_command_failure') {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
flarum_admin_app__WEBPACK_IMPORTED_MODULE_1___default.a.modal.show(_ComposerFailureModal__WEBPACK_IMPORTED_MODULE_7__["default"], {
|
||||||
|
error: error
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}).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.extensions.successful_update', {
|
||||||
|
extension: extension.extra['flarum-extension'].title
|
||||||
|
}));
|
||||||
|
window.location.reload();
|
||||||
|
})["finally"](function () {
|
||||||
m.redraw();
|
m.redraw();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
@ -625,6 +666,17 @@ module.exports = flarum.core.compat['common/components/Modal'];
|
|||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "flarum/common/components/Tooltip":
|
||||||
|
/*!******************************************************************!*\
|
||||||
|
!*** external "flarum.core.compat['common/components/Tooltip']" ***!
|
||||||
|
\******************************************************************/
|
||||||
|
/*! no static exports found */
|
||||||
|
/***/ (function(module, exports) {
|
||||||
|
|
||||||
|
module.exports = flarum.core.compat['common/components/Tooltip'];
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
/***/ "flarum/common/extend":
|
/***/ "flarum/common/extend":
|
||||||
/*!******************************************************!*\
|
/*!******************************************************!*\
|
||||||
!*** external "flarum.core.compat['common/extend']" ***!
|
!*** external "flarum.core.compat['common/extend']" ***!
|
||||||
|
File diff suppressed because one or more lines are too long
@ -3,6 +3,9 @@ import Component from 'flarum/common/Component';
|
|||||||
import icon from "flarum/common/helpers/icon";
|
import icon from "flarum/common/helpers/icon";
|
||||||
import Button from "flarum/common/components/Button";
|
import Button from "flarum/common/components/Button";
|
||||||
import humanTime from "flarum/common/helpers/humanTime";
|
import humanTime from "flarum/common/helpers/humanTime";
|
||||||
|
import LoadingModal from "flarum/admin/components/LoadingModal";
|
||||||
|
import ComposerFailureModal from "./ComposerFailureModal";
|
||||||
|
import Tooltip from "flarum/common/components/Tooltip";
|
||||||
|
|
||||||
type UpdatedPackage = {
|
type UpdatedPackage = {
|
||||||
name: string;
|
name: string;
|
||||||
@ -38,11 +41,17 @@ export default class Updater extends Component {
|
|||||||
<div className="Form-group">
|
<div className="Form-group">
|
||||||
<label>{app.translator.trans('sycho-package-manager.admin.updater.updater_title')}</label>
|
<label>{app.translator.trans('sycho-package-manager.admin.updater.updater_title')}</label>
|
||||||
<p className="helpText">{app.translator.trans('sycho-package-manager.admin.updater.updater_help')}</p>
|
<p className="helpText">{app.translator.trans('sycho-package-manager.admin.updater.updater_help')}</p>
|
||||||
<p className="PackageManager-lastUpdatedAt">
|
{Object.keys(this.lastUpdateCheck).length ? (
|
||||||
<span className="PackageManager-lastUpdatedAt-label">{app.translator.trans('sycho-package-manager.admin.updater.last_update_checked_at')}</span>
|
<p className="PackageManager-lastUpdatedAt">
|
||||||
<span className="PackageManager-lastUpdatedAt-value">{humanTime(this.lastUpdateCheck?.checkedAt)}</span>
|
<span className="PackageManager-lastUpdatedAt-label">{app.translator.trans('sycho-package-manager.admin.updater.last_update_checked_at')}</span>
|
||||||
</p>
|
<span className="PackageManager-lastUpdatedAt-value">{humanTime(this.lastUpdateCheck?.checkedAt)}</span>
|
||||||
<Button className="Button" icon="fas fa-sync-alt" onclick={this.checkForUpdates.bind(this)} loading={this.isLoading}>
|
</p>
|
||||||
|
) : null}
|
||||||
|
<Button
|
||||||
|
className="Button"
|
||||||
|
icon="fas fa-sync-alt"
|
||||||
|
onclick={this.checkForUpdates.bind(this)}
|
||||||
|
loading={this.isLoading}>
|
||||||
{app.translator.trans('sycho-package-manager.admin.updater.check_for_updates')}
|
{app.translator.trans('sycho-package-manager.admin.updater.check_for_updates')}
|
||||||
</Button>
|
</Button>
|
||||||
{extensions.length ? (
|
{extensions.length ? (
|
||||||
@ -61,7 +70,13 @@ export default class Updater extends Component {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="PackageManager-extension-controls">
|
<div className="PackageManager-extension-controls">
|
||||||
<Button icon="fas fa-arrow-alt-circle-up" className="Button Button--icon Button--flat" />
|
<Tooltip text={app.translator.trans('sycho-package-manager.admin.extensions.update')}>
|
||||||
|
<Button
|
||||||
|
icon="fas fa-arrow-alt-circle-up"
|
||||||
|
className="Button Button--icon Button--flat"
|
||||||
|
onclick={this.update.bind(this, extension)}
|
||||||
|
aria-label={app.translator.trans('sycho-package-manager.admin.extensions.update')} />
|
||||||
|
</Tooltip>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
@ -75,7 +90,7 @@ export default class Updater extends Component {
|
|||||||
getExtensionUpdates() {
|
getExtensionUpdates() {
|
||||||
const updates = this.lastUpdateCheck?.updates?.installed?.filter((composerPackage: UpdatedPackage) => {
|
const updates = this.lastUpdateCheck?.updates?.installed?.filter((composerPackage: UpdatedPackage) => {
|
||||||
const extension = app.data.extensions[composerPackage.name.replace('/', '-').replace(/(flarum-ext-)|(flarum-)/, '')];
|
const extension = app.data.extensions[composerPackage.name.replace('/', '-').replace(/(flarum-ext-)|(flarum-)/, '')];
|
||||||
const safeToUpdate = composerPackage['latest-status'] === 'semver-safe-update';
|
const safeToUpdate = ['semver-safe-update', 'update-possible'].includes(composerPackage['latest-status']);
|
||||||
|
|
||||||
if (extension && safeToUpdate) {
|
if (extension && safeToUpdate) {
|
||||||
extension.newPackageUpdate = composerPackage;
|
extension.newPackageUpdate = composerPackage;
|
||||||
@ -99,4 +114,27 @@ export default class Updater extends Component {
|
|||||||
m.redraw();
|
m.redraw();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update(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 });
|
||||||
|
},
|
||||||
|
}).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();
|
||||||
|
}).finally(() => {
|
||||||
|
m.redraw();
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,8 @@ sycho-package-manager:
|
|||||||
proceed: Proceed
|
proceed: Proceed
|
||||||
successful_install: "{extension} was installed successfully, redirecting.."
|
successful_install: "{extension} was installed successfully, redirecting.."
|
||||||
successful_remove: Extension removed successfully.
|
successful_remove: Extension removed successfully.
|
||||||
|
successful_update: "{extension} was updated successfully, redirecting.."
|
||||||
|
update: Update
|
||||||
|
|
||||||
failure_modal:
|
failure_modal:
|
||||||
title: Operation Failed
|
title: Operation Failed
|
||||||
|
@ -1,20 +1,22 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
namespace SychO\PackageManager\Api\Controller;
|
namespace SychO\PackageManager\Api\Controller;
|
||||||
|
|
||||||
use Flarum\Bus\Dispatcher;
|
use Flarum\Bus\Dispatcher;
|
||||||
use Flarum\Http\RequestUtil;
|
use Flarum\Http\RequestUtil;
|
||||||
use SychO\PackageManager\Api\Serializer\ExtensionSerializer;
|
use Laminas\Diactoros\Response\EmptyResponse;
|
||||||
use Flarum\Api\Controller\AbstractShowController;
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
use Psr\Http\Server\RequestHandlerInterface;
|
||||||
use Illuminate\Support\Arr;
|
use Illuminate\Support\Arr;
|
||||||
use Psr\Http\Message\ServerRequestInterface;
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
use SychO\PackageManager\Command\UpdateExtension;
|
use SychO\PackageManager\Command\UpdateExtension;
|
||||||
use Tobscure\JsonApi\Document;
|
|
||||||
|
|
||||||
class UpdateExtensionController extends AbstractShowController
|
class UpdateExtensionController implements RequestHandlerInterface
|
||||||
{
|
{
|
||||||
public $serializer = ExtensionSerializer::class;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Dispatcher
|
* @var Dispatcher
|
||||||
*/
|
*/
|
||||||
@ -28,13 +30,15 @@ class UpdateExtensionController extends AbstractShowController
|
|||||||
/**
|
/**
|
||||||
* @throws \Flarum\User\Exception\PermissionDeniedException
|
* @throws \Flarum\User\Exception\PermissionDeniedException
|
||||||
*/
|
*/
|
||||||
protected function data(ServerRequestInterface $request, Document $document)
|
public function handle(ServerRequestInterface $request): ResponseInterface
|
||||||
{
|
{
|
||||||
$actor = RequestUtil::getActor($request);
|
$actor = RequestUtil::getActor($request);
|
||||||
$extensionId = Arr::get($request->getQueryParams(), 'id');
|
$extensionId = Arr::get($request->getQueryParams(), 'id');
|
||||||
|
|
||||||
return $this->bus->dispatch(
|
$this->bus->dispatch(
|
||||||
new UpdateExtension($actor, $extensionId)
|
new UpdateExtension($actor, $extensionId)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return new EmptyResponse();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,26 +1,47 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
namespace SychO\PackageManager\Command;
|
namespace SychO\PackageManager\Command;
|
||||||
|
|
||||||
|
use Composer\Console\Application;
|
||||||
use Flarum\Extension\ExtensionManager;
|
use Flarum\Extension\ExtensionManager;
|
||||||
use SychO\PackageManager\Extension\PackageManager;
|
use Flarum\Settings\SettingsRepositoryInterface;
|
||||||
|
use SychO\PackageManager\Exception\ComposerUpdateFailedException;
|
||||||
|
use SychO\PackageManager\UpdateExtensionValidator;
|
||||||
|
use Symfony\Component\Console\Input\ArrayInput;
|
||||||
|
use Symfony\Component\Console\Output\BufferedOutput;
|
||||||
|
|
||||||
class UpdateExtensionHandler
|
class UpdateExtensionHandler
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @var Application
|
||||||
|
*/
|
||||||
|
protected $composer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var ExtensionManager
|
* @var ExtensionManager
|
||||||
*/
|
*/
|
||||||
protected $extensions;
|
protected $extensions;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var PackageManager
|
* @var UpdateExtensionValidator
|
||||||
*/
|
*/
|
||||||
protected $packages;
|
protected $validator;
|
||||||
|
|
||||||
public function __construct(ExtensionManager $extensions, PackageManager $packages)
|
/**
|
||||||
|
* @var SettingsRepositoryInterface
|
||||||
|
*/
|
||||||
|
protected $settings;
|
||||||
|
|
||||||
|
public function __construct(Application $composer, ExtensionManager $extensions, UpdateExtensionValidator $validator, SettingsRepositoryInterface $settings)
|
||||||
{
|
{
|
||||||
|
$this->composer = $composer;
|
||||||
$this->extensions = $extensions;
|
$this->extensions = $extensions;
|
||||||
$this->packages = $packages;
|
$this->validator = $validator;
|
||||||
|
$this->settings = $settings;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -31,12 +52,45 @@ class UpdateExtensionHandler
|
|||||||
{
|
{
|
||||||
$command->actor->assertAdmin();
|
$command->actor->assertAdmin();
|
||||||
|
|
||||||
|
$this->validator->assertValid(['extensionId' => $command->extensionId]);
|
||||||
|
|
||||||
$extension = $this->extensions->getExtension($command->extensionId);
|
$extension = $this->extensions->getExtension($command->extensionId);
|
||||||
|
|
||||||
if (empty($extension)) {
|
if (empty($extension)) {
|
||||||
// ... exception
|
// ... exception
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->packages->updatePackage($extension->name);
|
$output = new BufferedOutput();
|
||||||
|
$input = new ArrayInput([
|
||||||
|
'command' => 'require',
|
||||||
|
'packages' => ["$extension->name:*"],
|
||||||
|
]);
|
||||||
|
|
||||||
|
$exitCode = $this->composer->run($input, $output);
|
||||||
|
|
||||||
|
if ($exitCode !== 0) {
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace SychO\PackageManager\Exception;
|
||||||
|
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
class ComposerCommandFailedException extends Exception
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $packageName;
|
||||||
|
|
||||||
|
public function __construct(string $packageName, string $output)
|
||||||
|
{
|
||||||
|
$this->packageName = $packageName;
|
||||||
|
|
||||||
|
parent::__construct($output);
|
||||||
|
}
|
||||||
|
}
|
@ -12,7 +12,7 @@ class ComposerCommandFailedExceptionHandler
|
|||||||
{
|
{
|
||||||
protected const INCOMPATIBLE_REGEX = '/ +- {PACKAGE_NAME} v[0-9.]+ requires flarum\/core/m';
|
protected const INCOMPATIBLE_REGEX = '/ +- {PACKAGE_NAME} v[0-9.]+ requires flarum\/core/m';
|
||||||
|
|
||||||
public function handle(ComposerRequireFailedException $e): HandledError
|
public function handle(ComposerCommandFailedException $e): HandledError
|
||||||
{
|
{
|
||||||
return (new HandledError(
|
return (new HandledError(
|
||||||
$e,
|
$e,
|
||||||
@ -21,7 +21,7 @@ class ComposerCommandFailedExceptionHandler
|
|||||||
))->withDetails($this->errorDetails($e));
|
))->withDetails($this->errorDetails($e));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function errorDetails(ComposerRequireFailedException $e): array
|
protected function errorDetails(ComposerCommandFailedException $e): array
|
||||||
{
|
{
|
||||||
$details = [
|
$details = [
|
||||||
'output' => $e->getMessage(),
|
'output' => $e->getMessage(),
|
||||||
@ -34,13 +34,14 @@ class ComposerCommandFailedExceptionHandler
|
|||||||
return [$details];
|
return [$details];
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function guessCause(ComposerRequireFailedException $e): ?string
|
protected function guessCause(ComposerCommandFailedException $e): ?string
|
||||||
{
|
{
|
||||||
error_log(str_replace('{PACKAGE_NAME}', preg_quote($e->packageName, '/'), self::INCOMPATIBLE_REGEX));
|
if ($e instanceof ComposerRequireFailedException) {
|
||||||
$hasMatches = preg_match(str_replace('{PACKAGE_NAME}', preg_quote($e->packageName, '/'), self::INCOMPATIBLE_REGEX), $e->getMessage(), $matches);
|
$hasMatches = preg_match(str_replace('{PACKAGE_NAME}', preg_quote($e->packageName, '/'), self::INCOMPATIBLE_REGEX), $e->getMessage(), $matches);
|
||||||
|
|
||||||
if ($hasMatches) {
|
if ($hasMatches) {
|
||||||
return 'extension_incompatible_with_instance';
|
return 'extension_incompatible_with_instance';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
|
@ -6,19 +6,7 @@
|
|||||||
|
|
||||||
namespace SychO\PackageManager\Exception;
|
namespace SychO\PackageManager\Exception;
|
||||||
|
|
||||||
use Exception;
|
class ComposerRequireFailedException extends ComposerCommandFailedException
|
||||||
|
|
||||||
class ComposerRequireFailedException extends Exception
|
|
||||||
{
|
{
|
||||||
/**
|
// ...
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $packageName;
|
|
||||||
|
|
||||||
public function __construct(string $packageName, string $output)
|
|
||||||
{
|
|
||||||
$this->packageName = $packageName;
|
|
||||||
|
|
||||||
parent::__construct($output);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,12 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace SychO\PackageManager\Exception;
|
||||||
|
|
||||||
|
class ComposerUpdateFailedException extends ComposerCommandFailedException
|
||||||
|
{
|
||||||
|
// ...
|
||||||
|
}
|
15
extensions/package-manager/src/UpdateExtensionValidator.php
Normal file
15
extensions/package-manager/src/UpdateExtensionValidator.php
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace SychO\PackageManager;
|
||||||
|
|
||||||
|
use Flarum\Foundation\AbstractValidator;
|
||||||
|
|
||||||
|
class UpdateExtensionValidator extends AbstractValidator
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected $rules = [
|
||||||
|
'extensionId' => 'required|string'
|
||||||
|
];
|
||||||
|
}
|
Reference in New Issue
Block a user