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"); + } +}