diff --git a/gradle/changelog/add_missing_change_type_to_statistics.yml b/gradle/changelog/add_missing_change_type_to_statistics.yml new file mode 100644 index 0000000000..eb473bfb06 --- /dev/null +++ b/gradle/changelog/add_missing_change_type_to_statistics.yml @@ -0,0 +1,2 @@ +- type: added + description: In diffs, Copied and renamed files are now on display if they are available diff --git a/scm-core/src/main/java/sonia/scm/repository/api/DiffResult.java b/scm-core/src/main/java/sonia/scm/repository/api/DiffResult.java index e48b5e7928..c7632c78b5 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/DiffResult.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/DiffResult.java @@ -87,6 +87,14 @@ public interface DiffResult extends Iterable { * number of deleted files in a diff */ int deleted; + /** + * number of renamed files in a diff + */ + int renamed; + /** + * number of copy files in a diff + */ + int copied; } @Value diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffResult.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffResult.java index 9458b0c755..ee649f13e6 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffResult.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffResult.java @@ -196,20 +196,18 @@ public class GitDiffResult implements DiffResult { int addCounter = 0; int modifiedCounter = 0; int deletedCounter = 0; + int renameCounter = 0; + int copyCounter = 0; for (DiffEntry diffEntry : diffEntries) { switch (diffEntry.getChangeType()) { - case ADD: - ++addCounter; - break; - case MODIFY: - ++modifiedCounter; - break; - case DELETE: - ++deletedCounter; - break; + case ADD -> ++addCounter; + case MODIFY -> ++modifiedCounter; + case DELETE -> ++deletedCounter; + case RENAME -> ++renameCounter; + case COPY -> ++copyCounter; } } - DiffStatistics stats = new DiffStatistics(addCounter, modifiedCounter, deletedCounter); + DiffStatistics stats = new DiffStatistics(addCounter, modifiedCounter, deletedCounter,renameCounter,copyCounter); return Optional.of(stats); } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitDiffResultCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitDiffResultCommandTest.java index e7b250c908..83fa8787c9 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitDiffResultCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitDiffResultCommandTest.java @@ -189,6 +189,8 @@ public class GitDiffResultCommandTest extends AbstractGitCommandTestBase { assertThat(diffResult.getStatistics()).get().extracting("deleted").isEqualTo(1); assertThat(diffResult.getStatistics()).get().extracting("modified").isEqualTo(1); assertThat(diffResult.getStatistics()).get().extracting("added").isEqualTo(0); + assertThat(diffResult.getStatistics()).get().extracting("renamed").isEqualTo(0); + assertThat(diffResult.getStatistics()).get().extracting("copied").isEqualTo(0); } @Test diff --git a/scm-ui/ui-components/src/repos/DiffStatistics.tsx b/scm-ui/ui-components/src/repos/DiffStatistics.tsx index 4c8976398d..290c19bdfd 100644 --- a/scm-ui/ui-components/src/repos/DiffStatistics.tsx +++ b/scm-ui/ui-components/src/repos/DiffStatistics.tsx @@ -49,6 +49,23 @@ const DiffStatistics: FC = ({ data }) => { values={{ newFiles: data.added, modified: data.modified, deleted: data.deleted }} components={{ tag: }} > + {data.renamed > 0 && ( + }} + > + )} + {data.copied > 0 && ( + }} + > + )} + {t("changesets.showFiles")} ); }; diff --git a/scm-ui/ui-types/src/Diff.ts b/scm-ui/ui-types/src/Diff.ts index 23f933c38e..0eeee720fa 100644 --- a/scm-ui/ui-types/src/Diff.ts +++ b/scm-ui/ui-types/src/Diff.ts @@ -55,6 +55,8 @@ export type Statistics = { added: number; deleted: number; modified: number; + renamed: number; + copied: number; }; export type FileTree = { diff --git a/scm-ui/ui-webapp/public/locales/de/repos.json b/scm-ui/ui-webapp/public/locales/de/repos.json index c9526c0d1b..bea59e9bdd 100644 --- a/scm-ui/ui-webapp/public/locales/de/repos.json +++ b/scm-ui/ui-webapp/public/locales/de/repos.json @@ -271,7 +271,10 @@ "activateWhitespace": "Whitespace-Änderungen einblenden", "moreDiffsAvailable": "Es sind weitere Diffs verfügbar", "loadMore": "Weitere laden", - "showModifiedFiles": "{{newFiles}} hinzugefügte, {{modified}} geänderte, {{deleted}} gelöschte Dateien", + "showModifiedFiles": "{{newFiles}} hinzugefügte, {{modified}} geänderte, {{deleted}} gelöschte", + "showRenamedFiles": ", {{renamed}} umbenannte", + "showCopiedFiles": ", {{copied}} kopierte", + "showFiles": "Dateien", "diffTreeTitle": "Diff-Liste" }, "changeset": { diff --git a/scm-ui/ui-webapp/public/locales/en/repos.json b/scm-ui/ui-webapp/public/locales/en/repos.json index 4c1b6873e4..08a5801146 100644 --- a/scm-ui/ui-webapp/public/locales/en/repos.json +++ b/scm-ui/ui-webapp/public/locales/en/repos.json @@ -272,6 +272,9 @@ "moreDiffsAvailable": "There are more diffs available", "loadMore": "Load more", "showModifiedFiles": "{{newFiles}} added, {{modified}} modified, {{deleted}} deleted", + "showRenamedFiles": ", {{renamed}} renamed", + "showCopiedFiles": ", {{copied}} copied", + "showFiles": "files", "diffTreeTitle": "Diff-List" }, "changeset": { diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/DiffResultDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/DiffResultDto.java index a0638c8cc0..446e6d77cc 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/DiffResultDto.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/DiffResultDto.java @@ -81,6 +81,8 @@ public class DiffResultDto extends HalRepresentation { private int added; private int deleted; private int modified; + private int renamed; + private int copied; } @Data 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 99124a0449..23ad533e96 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 @@ -128,7 +128,9 @@ class DiffResultToDiffResultDtoMapper { DiffResultDto.DiffStatisticsDto diffStatisticsDto = new DiffResultDto.DiffStatisticsDto( diffStatistics.getAdded(), diffStatistics.getDeleted(), - diffStatistics.getModified() + diffStatistics.getModified(), + diffStatistics.getRenamed(), + diffStatistics.getCopied() ); dto.setStatistics(diffStatisticsDto); } 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 00fbd7770a..583b935d9c 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 @@ -181,7 +181,7 @@ class DiffResultToDiffResultDtoMapperTest { @Test void shouldMapStatistics() { DiffResult result = createResult(); - when(result.getStatistics()).thenReturn(of(new DiffResult.DiffStatistics(1, 2, 3))); + when(result.getStatistics()).thenReturn(of(new DiffResult.DiffStatistics(1, 2, 3, 4, 5))); when(result.getDiffTree()).thenReturn(of(DiffResult.DiffTreeNode.createRootNode())); DiffResultDto.DiffStatisticsDto dto = mapper.mapForIncoming(REPOSITORY, result, "feature/some", "master").getStatistics(); @@ -189,6 +189,8 @@ class DiffResultToDiffResultDtoMapperTest { assertThat(dto.getAdded()).isEqualTo(1); assertThat(dto.getModified()).isEqualTo(2); assertThat(dto.getDeleted()).isEqualTo(3); + assertThat(dto.getRenamed()).isEqualTo(4); + assertThat(dto.getCopied()).isEqualTo(5); } @Test @@ -206,13 +208,13 @@ class DiffResultToDiffResultDtoMapperTest { DiffResultDto.DiffTreeNodeDto expectedTree = new DiffResultDto.DiffTreeNodeDto("", Map.of( "a.txt", new DiffResultDto.DiffTreeNodeDto("a.txt", Map.of(), Optional.of(DiffFile.ChangeType.MODIFY)), - "b.txt", new DiffResultDto.DiffTreeNodeDto("b.txt", Map.of(),Optional.of(DiffFile.ChangeType.DELETE)), + "b.txt", new DiffResultDto.DiffTreeNodeDto("b.txt", Map.of(), Optional.of(DiffFile.ChangeType.DELETE)), "victory", new DiffResultDto.DiffTreeNodeDto("victory", Map.of( "road", new DiffResultDto.DiffTreeNodeDto("road", Map.of( "c.txt", new DiffResultDto.DiffTreeNodeDto("c.txt", Map.of(), Optional.of(DiffFile.ChangeType.ADD)), "d.txt", new DiffResultDto.DiffTreeNodeDto("d.txt", Map.of(), Optional.of(DiffFile.ChangeType.RENAME)) - ),Optional.empty()) - ),Optional.empty()), + ), Optional.empty()) + ), Optional.empty()), "indigo", new DiffResultDto.DiffTreeNodeDto("indigo", Map.of( "plateau", new DiffResultDto.DiffTreeNodeDto("plateau", Map.of( "e.txt", new DiffResultDto.DiffTreeNodeDto("e.txt", Map.of(), Optional.of(DiffFile.ChangeType.COPY))