From 2d117648babb08a266bb6b1b77dbcf864f1f8285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Mon, 9 Mar 2020 15:33:58 +0100 Subject: [PATCH] Add possibility to set jgit nfs related config It may be necessary for users to configure jgit behaviour related to file handling. This commit makes the following two configurations available (among others): - core.trustfolderstat - core.supportsatomicfilecreation --- CHANGELOG.md | 1 + Jenkinsfile | 2 +- .../spi/GitConfigContextListener.java | 41 +++++++++++++++++++ .../spi/GitConfigContextListenerTest.java | 21 ++++++++++ 4 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitConfigContextListener.java create mode 100644 scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitConfigContextListenerTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 5fa1f5ff79..15720de4e4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added footer extension points for links and avatar - Create OpenAPI specification during build - Extension point entries with supplied extensionName are sorted ascending +- Possibility to configure git core config entries for jgit like core.trustfolderstat and core.supportsatomicfilecreation ### Changed - New footer design diff --git a/Jenkinsfile b/Jenkinsfile index 8dee82b57a..8d6ef93d76 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,7 +39,7 @@ node('docker') { } stage('Integration Test') { - mvn 'verify -Pit -pl :scm-webapp,:scm-it -Dmaven.test.failure.ignore=true' + mvn 'verify -Pit -pl :scm-webapp,:scm-it -Dmaven.test.failure.ignore=true -Dscm.git.core.supportsatomicfilecreation=false' } stage('SonarQube') { diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitConfigContextListener.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitConfigContextListener.java new file mode 100644 index 0000000000..453a18a690 --- /dev/null +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitConfigContextListener.java @@ -0,0 +1,41 @@ +package sonia.scm.repository.spi; + +import org.eclipse.jgit.util.SystemReader; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sonia.scm.plugin.Extension; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import java.util.Map; + +@Extension +public class GitConfigContextListener implements ServletContextListener { + + private static final Logger LOG = LoggerFactory.getLogger(GitConfigContextListener.class); + private static final String SCM_JGIT_CORE = "scm.git.core."; + + @Override + public void contextInitialized(ServletContextEvent sce) { + System.getProperties() + .entrySet().stream() + .filter(e -> e.getKey().toString().startsWith(SCM_JGIT_CORE)) + .forEach(this::setConfig); + } + + private void setConfig(Map.Entry property) { + String key = property.getKey().toString().substring(SCM_JGIT_CORE.length()); + String value = property.getValue().toString(); + try { + SystemReader.getInstance().getSystemConfig().setString("core", null, key, value); + LOG.info("set git config core.{} = {}", key,value); + } catch (Exception e) { + LOG.error("could not set git config core.{} = {}", key,value, e); + } + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + // nothing to do + } +} diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitConfigContextListenerTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitConfigContextListenerTest.java new file mode 100644 index 0000000000..468f1b88c3 --- /dev/null +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitConfigContextListenerTest.java @@ -0,0 +1,21 @@ +package sonia.scm.repository.spi; + +import org.eclipse.jgit.errors.ConfigInvalidException; +import org.eclipse.jgit.util.SystemReader; +import org.junit.jupiter.api.Test; + +import java.io.IOException; + +import static org.assertj.core.api.Assertions.assertThat; + +class GitConfigContextListenerTest { + + @Test + void shouldSetGitConfig() throws IOException, ConfigInvalidException { + System.setProperty("scm.git.core.someTestKey", "testValue"); + new GitConfigContextListener().contextInitialized(null); + assertThat( + SystemReader.getInstance().getSystemConfig().getString("core", null, "someTestKey") + ).isEqualTo("testValue"); + } +}