diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml
index d186cb106e..487eb0bfeb 100644
--- a/scm-webapp/pom.xml
+++ b/scm-webapp/pom.xml
@@ -278,13 +278,13 @@
com.github.sdorra
spotter-core
- 2.0.0
+ 2.1.1
org.apache.tika
tika-core
- 1.22
+ 1.23
diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ContentResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ContentResource.java
index 9f99efdea2..9f08c63c13 100644
--- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ContentResource.java
+++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ContentResource.java
@@ -122,7 +122,9 @@ public class ContentResource {
private void appendContentHeader(String path, byte[] head, Response.ResponseBuilder responseBuilder) {
ContentType contentType = ContentTypes.detect(path, head);
responseBuilder.header("Content-Type", contentType.getRaw());
- contentType.getLanguage().ifPresent(language -> responseBuilder.header("X-Programming-Language", language));
+ contentType.getLanguage().ifPresent(
+ language -> responseBuilder.header(ProgrammingLanguages.HEADER, ProgrammingLanguages.getValue(language))
+ );
}
private byte[] getHead(String revision, String path, RepositoryService repositoryService) throws IOException {
diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/DiffResultToDiffResultDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/DiffResultToDiffResultDtoMapper.java
index d9abde23c3..63070eab89 100644
--- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/DiffResultToDiffResultDtoMapper.java
+++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/DiffResultToDiffResultDtoMapper.java
@@ -65,7 +65,7 @@ final class DiffResultToDiffResultDtoMapper {
Optional language = ContentTypes.detect(path).getLanguage();
- language.ifPresent(value -> dto.setLanguage(value.getName()));
+ language.ifPresent(value -> dto.setLanguage(ProgrammingLanguages.getValue(value)));
List hunks = new ArrayList<>();
for (Hunk hunk : file) {
diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ProgrammingLanguages.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ProgrammingLanguages.java
new file mode 100644
index 0000000000..cecd923265
--- /dev/null
+++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ProgrammingLanguages.java
@@ -0,0 +1,24 @@
+package sonia.scm.api.v2.resources;
+
+import com.github.sdorra.spotter.Language;
+
+import java.util.Optional;
+
+final class ProgrammingLanguages {
+
+ static final String HEADER = "X-Programming-Language";
+
+ private static final String DEFAULT = "text";
+
+ private ProgrammingLanguages() {
+ }
+
+ static String getValue(Language language) {
+ Optional aceMode = language.getAceMode();
+ if (!aceMode.isPresent()) {
+ Optional codemirrorMode = language.getCodemirrorMode();
+ return codemirrorMode.orElse(DEFAULT);
+ }
+ return aceMode.get();
+ }
+}
diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DiffResultToDiffResultDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DiffResultToDiffResultDtoMapperTest.java
index 2b75e06f39..fcfd45dea3 100644
--- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DiffResultToDiffResultDtoMapperTest.java
+++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/DiffResultToDiffResultDtoMapperTest.java
@@ -23,7 +23,7 @@ class DiffResultToDiffResultDtoMapperTest {
void shouldMapDiffResult() {
DiffResult result = result(
addedFile("A.java", "abc"),
- modifiedFile("B.tsx", "def", "abc",
+ modifiedFile("B.ts", "def", "abc",
hunk("@@ -3,4 1,2 @@", 1, 2, 3, 4,
insertedLine("a", 1),
modifiedLine("b", 2),
@@ -36,9 +36,9 @@ class DiffResultToDiffResultDtoMapperTest {
DiffResultDto dto = DiffResultToDiffResultDtoMapper.INSTANCE.map(result);
List files = dto.getFiles();
- assertAddedFile(files.get(0), "A.java", "abc", "Java");
- assertModifiedFile(files.get(1), "B.tsx", "abc", "def", "TypeScript");
- assertDeletedFile(files.get(2), "C.go", "ghi", "Go");
+ assertAddedFile(files.get(0), "A.java", "abc", "java");
+ assertModifiedFile(files.get(1), "B.ts", "abc", "def", "typescript");
+ assertDeletedFile(files.get(2), "C.go", "ghi", "golang");
DiffResultDto.HunkDto hunk = files.get(1).getHunks().get(0);
assertHunk(hunk, "@@ -3,4 1,2 @@", 1, 2, 3, 4);
diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ProgrammingLanguagesTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ProgrammingLanguagesTest.java
new file mode 100644
index 0000000000..cfecb0a7fa
--- /dev/null
+++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ProgrammingLanguagesTest.java
@@ -0,0 +1,25 @@
+package sonia.scm.api.v2.resources;
+
+import com.github.sdorra.spotter.Language;
+import org.junit.jupiter.api.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+class ProgrammingLanguagesTest {
+
+ @Test
+ void shouldReturnAceModeIfPresent() {
+ assertThat(ProgrammingLanguages.getValue(Language.GO)).isEqualTo("golang");
+ assertThat(ProgrammingLanguages.getValue(Language.JAVA)).isEqualTo("java");
+ }
+
+ @Test
+ void shouldReturnCodemirrorIfAceModeIsMissing() {
+ assertThat(ProgrammingLanguages.getValue(Language.HTML_ECR)).isEqualTo("htmlmixed");
+ }
+
+ @Test
+ void shouldReturnTextIfNoModeIsPresent() {
+ assertThat(ProgrammingLanguages.getValue(Language.HXML)).isEqualTo("text");
+ }
+}