diff --git a/CHANGELOG.md b/CHANGELOG.md index cc4dcd3fac..5a26bb88aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## Unreleased + ### Added - Extension point to add links to the repository cards from plug ins ([#1041](https://github.com/scm-manager/scm-manager/pull/1041)) @@ -15,6 +16,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Removed - EventSource Polyfill +### Fixed +- Build on windows ([#1048](https://github.com/scm-manager/scm-manager/issues/1048), [#1049](https://github.com/scm-manager/scm-manager/issues/1049), [#1056](https://github.com/scm-manager/scm-manager/pull/1056)) +- Show specific notification for plugin actions on plugin administration ([#1057](https://github.com/scm-manager/scm-manager/pull/1057)) + ## 2.0.0-rc5 - 2020-03-12 ### Added - Added footer extension points for links and avatar diff --git a/Jenkinsfile b/Jenkinsfile index eb12ebf17f..39173ab389 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -64,15 +64,20 @@ node('docker') { mvn 'clean install -DskipTests' } - stage('Unit Test') { - mvn 'test -Pcoverage -Dmaven.test.failure.ignore=true' - junit allowEmptyResults: true, testResults: '**/target/surefire-reports/TEST-*.xml,**/target/jest-reports/TEST-*.xml' - } - - stage('Integration Test') { - mvn 'verify -Pit -pl :scm-webapp,:scm-it -Dmaven.test.failure.ignore=true -Dscm.git.core.supportsatomicfilecreation=false' - junit allowEmptyResults: true, testResults: '**/target/failsafe-reports/TEST-*.xml' - } + parallel( + unitTest: { + stage('Unit Test') { + mvn 'test -DskipFrontendBuild -DskipTypecheck -Pcoverage -pl !scm-it -Dmaven.test.failure.ignore=true' + junit allowEmptyResults: true, testResults: '**/target/surefire-reports/TEST-*.xml,**/target/jest-reports/TEST-*.xml' + } + }, + integrationTest: { + stage('Integration Test') { + mvn 'verify -Pit -DskipUnitTests -pl :scm-webapp,:scm-it -Dmaven.test.failure.ignore=true' + junit allowEmptyResults: true, testResults: '**/target/failsafe-reports/TEST-*.xml' + } + } + ) stage('SonarQube') { @@ -203,6 +208,10 @@ String mainBranch Maven setupMavenBuild() { Maven mvn = new MavenWrapperInDocker(this, "scmmanager/java-build:11.0.6_10") + // disable logging durring the build + def logConf = "scm-webapp/src/main/resources/logback.ci.xml" + mvn.additionalArgs += " -Dlogback.configurationFile=${logConf}" + mvn.additionalArgs += " -Dscm-it.logbackConfiguration=${logConf}" if (isMainBranch() || isReleaseBranch()) { // Release starts javadoc, which takes very long, so do only for certain branches diff --git a/pom.xml b/pom.xml index ebffdedef6..2fddd0e0b3 100644 --- a/pom.xml +++ b/pom.xml @@ -200,7 +200,7 @@ de.otto.edison edison-hal - 2.0.1 + 2.1.0 @@ -399,12 +399,6 @@ ${jaxb.version} - - com.sun.xml.bind - jaxb-impl - ${jaxb.version} - - org.glassfish.jaxb jaxb-runtime @@ -480,6 +474,13 @@ org.apache.maven.plugins maven-surefire-plugin 2.22.0 + + + ${skipUnitTests} + @@ -828,7 +829,7 @@ 2.28.2 1.3 - 5.2.0 + 5.6.0 1.7.30 @@ -838,10 +839,10 @@ 2.1.1 4.5.2.Final 1.19.4 - 2.10.0 + 2.10.2 4.2.2 2.3.0 - 6.1.0.Final + 6.1.2.Final 1.6.2 @@ -852,7 +853,7 @@ 1.2.0 - 1.4.1 + 1.5.1 5.6.1.202002131546-r-scm1 @@ -871,7 +872,7 @@ UTF-8 SCM-BSD - 1.2.0.Final + 1.3.1.Final @@ -881,7 +882,9 @@ ./scm-ui/target/frontend/buildfrontend-node/node-v${nodejs.version}-linux-x64/bin/node - + + ${skipTests} diff --git a/scm-core/pom.xml b/scm-core/pom.xml index ec3b884fd6..3c7d67c2d8 100644 --- a/scm-core/pom.xml +++ b/scm-core/pom.xml @@ -152,11 +152,6 @@ jaxb-api - - com.sun.xml.bind - jaxb-impl - - org.glassfish.jaxb jaxb-runtime diff --git a/scm-it/pom.xml b/scm-it/pom.xml index efcc59d212..6f41e1f1b6 100644 --- a/scm-it/pom.xml +++ b/scm-it/pom.xml @@ -84,7 +84,7 @@ org.glassfish javax.json - 1.0.4 + 1.1.4 runtime @@ -212,6 +212,10 @@ sonia.scm.classloading.lifecycle simple + + logback.configurationFile + ${scm-it.logbackConfiguration} + /scm @@ -245,10 +249,10 @@ DEVELOPMENT target/scm-it + ${project.basedir}/../scm-webapp/src/main/resources/logback.default.xml - diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/WireProtocolRequestMockFactory.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/WireProtocolRequestMockFactory.java index d1f5124b3a..e319b07608 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/WireProtocolRequestMockFactory.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/WireProtocolRequestMockFactory.java @@ -3,12 +3,12 @@ package sonia.scm.web; import com.google.common.collect.Lists; import javax.servlet.http.HttpServletRequest; - import java.util.Collections; import java.util.List; import java.util.Locale; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; public class WireProtocolRequestMockFactory { @@ -88,7 +88,6 @@ public class WireProtocolRequestMockFactory { private HttpServletRequest base(String method, String queryStringValue) { HttpServletRequest request = mock(HttpServletRequest.class); - when(request.getRequestURI()).thenReturn(repositoryPath); when(request.getMethod()).thenReturn(method); queryString(request, queryStringValue); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/WireProtocolTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/WireProtocolTest.java index 9237127c88..40af1acfeb 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/WireProtocolTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/WireProtocolTest.java @@ -47,7 +47,10 @@ import java.util.Collections; import java.util.List; import static org.hamcrest.Matchers.contains; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; /** @@ -98,7 +101,6 @@ public class WireProtocolTest { @Test public void testGetCommandsOfWithHgArgsPost() throws IOException { - when(request.getMethod()).thenReturn("POST"); when(request.getQueryString()).thenReturn("cmd=batch"); when(request.getIntHeader("X-HgArgs-Post")).thenReturn(29); when(request.getHeaderNames()).thenReturn(Collections.enumeration(Lists.newArrayList("X-HgArgs-Post"))); diff --git a/scm-ui/pom.xml b/scm-ui/pom.xml index 851d2afd37..28b922cbc2 100644 --- a/scm-ui/pom.xml +++ b/scm-ui/pom.xml @@ -18,8 +18,9 @@ build - false false + ${skipTests} + false typescript ui-extensions/src,ui-components/src,ui-webapp/src **/*.test.js,src/tests/** @@ -88,6 +89,7 @@ run + ${skipFrontendBuild} @@ -99,7 +101,7 @@ - ${skipTests} + ${skipFrontendTests} diff --git a/scm-ui/ui-scripts/src/createPluginConfig.js b/scm-ui/ui-scripts/src/createPluginConfig.js index 3e210fa022..6057ccc997 100644 --- a/scm-ui/ui-scripts/src/createPluginConfig.js +++ b/scm-ui/ui-scripts/src/createPluginConfig.js @@ -19,6 +19,7 @@ module.exports = function(mode) { [name]: [path.resolve(__dirname, "webpack-public-path.js"), packageJSON.main || "src/main/js/index.js"] }, mode, + stats: "minimal", devtool: "source-map", target: "web", node: { diff --git a/scm-ui/ui-scripts/src/lerna.js b/scm-ui/ui-scripts/src/lerna.js index b5404fbd62..6479b112fb 100644 --- a/scm-ui/ui-scripts/src/lerna.js +++ b/scm-ui/ui-scripts/src/lerna.js @@ -1,7 +1,10 @@ const { spawnSync } = require("child_process"); +const os = require("os"); + +const yarnCmd = os.platform() === "win32" ? "yarn.cmd" : "yarn"; const yarn = args => { - const result = spawnSync("yarn", args, { stdio: "inherit" }); + const result = spawnSync(yarnCmd, args, { stdio: "inherit" }); if (result.error) { console.log("could not start yarn command:", result.error); process.exit(2); diff --git a/scm-ui/ui-scripts/src/webpack.config.js b/scm-ui/ui-scripts/src/webpack.config.js index cf63c1da3c..e6cc362a67 100644 --- a/scm-ui/ui-scripts/src/webpack.config.js +++ b/scm-ui/ui-scripts/src/webpack.config.js @@ -25,6 +25,7 @@ console.log(`build ${mode} bundles`); module.exports = [ { mode, + stats: "minimal", context: root, entry: { webapp: [path.resolve(__dirname, "webpack-public-path.js"), "./ui-webapp/src/index.tsx"] diff --git a/scm-ui/ui-styles/package.json b/scm-ui/ui-styles/package.json index 86740eccd9..e007a210ae 100644 --- a/scm-ui/ui-styles/package.json +++ b/scm-ui/ui-styles/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "@fortawesome/fontawesome-free": "^5.11.2", - "bulma": "^0.7.5", + "bulma": "^0.8.0", "bulma-popover": "^1.0.0", "bulma-tooltip": "^3.0.0", "react-diff-view": "^2.4.1" diff --git a/scm-ui/ui-webapp/public/locales/de/admin.json b/scm-ui/ui-webapp/public/locales/de/admin.json index 2bfc2d6b5b..e65a10eb85 100644 --- a/scm-ui/ui-webapp/public/locales/de/admin.json +++ b/scm-ui/ui-webapp/public/locales/de/admin.json @@ -61,7 +61,10 @@ "newVersion": "Neue Version", "dependencyNotification": "Mit diesem Plugin werden folgende Abhängigkeiten mit installiert, wenn sie noch nicht vorhanden sind!", "dependencies": "Abhängigkeiten", - "successNotification": "Das Plugin wurde erfolgreich installiert. Um Änderungen an der UI zu sehen, muss die Seite neu geladen werden:", + "installedNotification": "Das Plugin wurde erfolgreich installiert. Um Änderungen an der UI zu sehen, muss die Seite neu geladen werden:", + "updatedNotification": "Das Plugin wurde erfolgreich aktualisiert. Um Änderungen an der UI zu sehen, muss die Seite neu geladen werden:", + "uninstalledNotification": "Das Plugin wurde erfolgreich installiert. Um Änderungen an der UI zu sehen, muss die Seite neu geladen werden:", + "executedChangesNotification": "Die Plugin Änderungen wurden erfolgreich durchgeführt. Um Änderungen an der UI zu sehen, muss die Seite neu geladen werden:", "reload": "jetzt neu laden", "restartNotification": "Der SCM-Manager Kontext sollte nur neu gestartet werden, wenn aktuell niemand damit arbeitet.", "executePending": "Die folgenden Plugin-Änderungen werden ausgeführt. Anschließend wird der SCM-Manager Kontext neu gestartet.", diff --git a/scm-ui/ui-webapp/public/locales/en/admin.json b/scm-ui/ui-webapp/public/locales/en/admin.json index b061901df2..5e7e44dcd2 100644 --- a/scm-ui/ui-webapp/public/locales/en/admin.json +++ b/scm-ui/ui-webapp/public/locales/en/admin.json @@ -61,7 +61,10 @@ "newVersion": "New version", "dependencyNotification": "With this plugin, the following dependencies will be installed if they are not available yet!", "dependencies": "Dependencies", - "successNotification": "Successful installed plugin. You have to reload the page, to see ui changes:", + "installedNotification": "Successfully installed plugin. You have to reload the page, to see ui changes:", + "updatedNotification": "Successfully updated plugin. You have to reload the page, to see ui changes:", + "uninstalledNotification": "Successfully uninstalled plugin. You have to reload the page, to see ui changes:", + "executedChangesNotification": "Successfully executed plugin changes. You have to reload the page, to see ui changes:", "reload": "reload now", "restartNotification": "You should only restart the scm-manager context if no one else is currently working with it.", "executePending": "The following plugin changes will be executed and after that the scm-manager context will be restarted.", diff --git a/scm-ui/ui-webapp/src/admin/plugins/components/PluginModal.tsx b/scm-ui/ui-webapp/src/admin/plugins/components/PluginModal.tsx index 1863ce0843..d8dd1bdd9c 100644 --- a/scm-ui/ui-webapp/src/admin/plugins/components/PluginModal.tsx +++ b/scm-ui/ui-webapp/src/admin/plugins/components/PluginModal.tsx @@ -161,7 +161,7 @@ class PluginModal extends React.Component { } renderNotifications = () => { - const { t } = this.props; + const { t, pluginAction } = this.props; const { restart, error, success } = this.state; if (error) { return ( @@ -172,7 +172,7 @@ class PluginModal extends React.Component { } else if (success) { return (
- +
); } else if (restart) { diff --git a/scm-ui/ui-webapp/src/admin/plugins/components/SuccessNotification.tsx b/scm-ui/ui-webapp/src/admin/plugins/components/SuccessNotification.tsx index 8e01e84bbd..cbee8e3e15 100644 --- a/scm-ui/ui-webapp/src/admin/plugins/components/SuccessNotification.tsx +++ b/scm-ui/ui-webapp/src/admin/plugins/components/SuccessNotification.tsx @@ -1,13 +1,30 @@ import React from "react"; import { WithTranslation, withTranslation } from "react-i18next"; import { Notification } from "@scm-manager/ui-components"; +import { PluginAction } from "./PluginEntry"; + +type Props = WithTranslation & { + pluginAction?: string; +}; + +class InstallSuccessNotification extends React.Component { + createMessageForPluginAction = () => { + const { pluginAction, t } = this.props; + if (pluginAction === PluginAction.INSTALL) { + return t("plugins.modal.installedNotification"); + } else if (pluginAction === PluginAction.UPDATE) { + return t("plugins.modal.updatedNotification"); + } else if (pluginAction === PluginAction.UNINSTALL) { + return t("plugins.modal.uninstalledNotification"); + } + return t("plugins.modal.executedChangesNotification"); + }; -class InstallSuccessNotification extends React.Component { render() { const { t } = this.props; return ( - {t("plugins.modal.successNotification")}{" "} + {this.createMessageForPluginAction()}{" "} window.location.reload(true)}>{t("plugins.modal.reload")} ); diff --git a/scm-webapp/src/main/resources/logback.ci.xml b/scm-webapp/src/main/resources/logback.ci.xml new file mode 100644 index 0000000000..428d3e1350 --- /dev/null +++ b/scm-webapp/src/main/resources/logback.ci.xml @@ -0,0 +1,39 @@ + + + + + + + +