diff --git a/scm-ui/src/admin/plugins/components/MultiPluginActionModal.js b/scm-ui/src/admin/plugins/components/MultiPluginActionModal.js index a2a127d33f..394b7e48c9 100644 --- a/scm-ui/src/admin/plugins/components/MultiPluginActionModal.js +++ b/scm-ui/src/admin/plugins/components/MultiPluginActionModal.js @@ -97,7 +97,16 @@ class MultiPluginActionModal extends React.Component { loading: true }); - apiClient.post(pendingPlugins._links.cancel.href).then(() => this.reload()); + apiClient + .post(pendingPlugins._links.cancel.href) + .then(() => this.reload()) + .catch(error => { + this.setState({ + success: false, + loading: false, + error: error + }); + }); }; updateAll = () => { @@ -239,6 +248,7 @@ class MultiPluginActionModal extends React.Component { renderBody = () => { const { actionType } = this.props; + const { error } = this.state; return ( <>
@@ -247,6 +257,11 @@ class MultiPluginActionModal extends React.Component { {this.renderModalContent()}
+ {!!error && ( +
+ +
+ )} {actionType === MultiPluginActionType.EXECUTE_PENDING && (
{this.renderNotifications()}
)} diff --git a/scm-ui/src/admin/plugins/components/PluginModal.js b/scm-ui/src/admin/plugins/components/PluginModal.js index b15a068fa2..85e0f078d6 100644 --- a/scm-ui/src/admin/plugins/components/PluginModal.js +++ b/scm-ui/src/admin/plugins/components/PluginModal.js @@ -121,6 +121,7 @@ class PluginModal extends React.Component { .catch(error => { this.setState({ loading: false, + success: false, error: error }); }); diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java index 4b4db3a162..07accbcc76 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/DefaultPluginManager.java @@ -288,7 +288,7 @@ public class DefaultPluginManager implements PluginManager { pendingInstallQueue.forEach(PendingPluginInstallation::cancel); pendingUninstallQueue.clear(); pendingInstallQueue.clear(); - getInstalled().forEach(p -> p.setUninstallable(isUninstallable(p))); + updateMayUninstallFlag(); } @Override diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PendingPluginInstallation.java b/scm-webapp/src/main/java/sonia/scm/plugin/PendingPluginInstallation.java index 2f5d388db2..f2a8a4d633 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PendingPluginInstallation.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PendingPluginInstallation.java @@ -30,7 +30,7 @@ class PendingPluginInstallation { Files.delete(file); plugin.cancelInstallation(); } catch (IOException ex) { - throw new PluginFailedToCancelInstallationException("failed to cancel installation of plugin " + name, ex); + throw new PluginFailedToCancelInstallationException("failed to cancel plugin installation ", name, ex); } } } diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PendingPluginUninstallation.java b/scm-webapp/src/main/java/sonia/scm/plugin/PendingPluginUninstallation.java index 8d5a44d60a..7cbbecd151 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PendingPluginUninstallation.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PendingPluginUninstallation.java @@ -26,7 +26,7 @@ class PendingPluginUninstallation { Files.delete(uninstallFile); plugin.setMarkedForUninstall(false); } catch (IOException ex) { - throw new PluginFailedToCancelInstallationException("failed to cancel uninstallation of plugin " + name, ex); + throw new PluginFailedToCancelInstallationException("failed to cancel uninstallation", name, ex); } } } diff --git a/scm-webapp/src/main/java/sonia/scm/plugin/PluginFailedToCancelInstallationException.java b/scm-webapp/src/main/java/sonia/scm/plugin/PluginFailedToCancelInstallationException.java index e3d6c123d6..1be5ecdcf3 100644 --- a/scm-webapp/src/main/java/sonia/scm/plugin/PluginFailedToCancelInstallationException.java +++ b/scm-webapp/src/main/java/sonia/scm/plugin/PluginFailedToCancelInstallationException.java @@ -1,7 +1,16 @@ package sonia.scm.plugin; -public class PluginFailedToCancelInstallationException extends RuntimeException { - public PluginFailedToCancelInstallationException(String message, Throwable cause) { - super(message, cause); +import sonia.scm.ExceptionWithContext; + +import static sonia.scm.ContextEntry.ContextBuilder.entity; + +public class PluginFailedToCancelInstallationException extends ExceptionWithContext { + public PluginFailedToCancelInstallationException(String message, String name, Exception cause) { + super(entity("plugin", name).build(), message, cause); + } + + @Override + public String getCode() { + return "65RdZ5atX1"; } } diff --git a/scm-webapp/src/main/resources/locales/de/plugins.json b/scm-webapp/src/main/resources/locales/de/plugins.json index 9c5bb3f5f5..f7ba2e9adf 100644 --- a/scm-webapp/src/main/resources/locales/de/plugins.json +++ b/scm-webapp/src/main/resources/locales/de/plugins.json @@ -175,6 +175,10 @@ "40RaYIeeR1": { "displayName": "Es wurden keine Änderungen durchgeführt", "description": "Das Repository wurde nicht verändert. Daher konnte kein neuer Commit erzeugt werden." + }, + "65RdZ5atX1": { + "displayName": "Fehler beim Löschen von Plugin-Dateien", + "description": "Einige Dateien für die Plugin-Deinstallation konnten nicht gelöscht werden. Dieses kann zu Inkonsistenzen führen, so dass der SCM-Manager nicht mehr korrekt starten kann. Bitte prüfen Sie die Logs und bereinigen Sie das Plugin-Verzeichnis des SCM-Managers manuell." } }, "namespaceStrategies": { diff --git a/scm-webapp/src/main/resources/locales/en/plugins.json b/scm-webapp/src/main/resources/locales/en/plugins.json index 1ffffd73b7..a12ed3a194 100644 --- a/scm-webapp/src/main/resources/locales/en/plugins.json +++ b/scm-webapp/src/main/resources/locales/en/plugins.json @@ -175,6 +175,10 @@ "40RaYIeeR1": { "displayName": "No changes were made", "description": "No changes were made to the files of the repository. Therefor no new commit could be created." + }, + "65RdZ5atX1": { + "displayName": "Error removing plugin files", + "description": "Some files to cancel the plugin (un)installation could not be deleted. This can lead to inconsistencies so that the SCM-Manager cannot restart properly. Please check the logs and clean up the plugin folder manually." } }, "namespaceStrategies": {