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 8df431632a..aa1f617945 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 @@ -21,7 +21,7 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.api.v2.resources; import com.fasterxml.jackson.annotation.JsonInclude; @@ -43,7 +43,11 @@ public class DiffResultDto extends HalRepresentation { @Data @JsonInclude(JsonInclude.Include.NON_DEFAULT) - public static class FileDto { + public static class FileDto extends HalRepresentation { + + public FileDto(Links links) { + super(links); + } private String oldPath; private String newPath; 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 5057950149..02b54b7e7d 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 @@ -27,6 +27,7 @@ package sonia.scm.api.v2.resources; import com.github.sdorra.spotter.ContentTypes; import com.github.sdorra.spotter.Language; import com.google.inject.Inject; +import de.otto.edison.hal.Links; import sonia.scm.repository.Repository; import sonia.scm.repository.api.DiffFile; import sonia.scm.repository.api.DiffLine; @@ -38,6 +39,7 @@ import java.util.List; import java.util.Optional; import java.util.OptionalInt; +import static de.otto.edison.hal.Link.linkBuilder; import static de.otto.edison.hal.Links.linkingTo; /** @@ -54,26 +56,30 @@ class DiffResultToDiffResultDtoMapper { public DiffResultDto mapForIncoming(Repository repository, DiffResult result, String source, String target) { DiffResultDto dto = new DiffResultDto(linkingTo().self(resourceLinks.incoming().diffParsed(repository.getNamespace(), repository.getName(), source, target)).build()); - setFiles(result, dto); + setFiles(result, dto, repository, target); return dto; } public DiffResultDto mapForRevision(Repository repository, DiffResult result, String revision) { DiffResultDto dto = new DiffResultDto(linkingTo().self(resourceLinks.diff().parsed(repository.getNamespace(), repository.getName(), revision)).build()); - setFiles(result, dto); + setFiles(result, dto, repository, revision); return dto; } - private void setFiles(DiffResult result, DiffResultDto dto) { + private void setFiles(DiffResult result, DiffResultDto dto, Repository repository, String revision) { List files = new ArrayList<>(); for (DiffFile file : result) { - files.add(mapFile(file)); + files.add(mapFile(file, repository, revision)); } dto.setFiles(files); } - private DiffResultDto.FileDto mapFile(DiffFile file) { - DiffResultDto.FileDto dto = new DiffResultDto.FileDto(); + private DiffResultDto.FileDto mapFile(DiffFile file, Repository repository, String revision) { + Links.Builder links = linkingTo(); + if (file.iterator().hasNext()) { + links.single(linkBuilder("lines", resourceLinks.source().content(repository.getNamespace(), repository.getName(), revision, file.getNewPath()) + "?start={start}?end={end}").build()); + } + DiffResultDto.FileDto dto = new DiffResultDto.FileDto(links.build()); // ??? dto.setOldEndingNewLine(true); dto.setNewEndingNewLine(true); 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 291b04e00c..efc1cbfff0 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 @@ -86,6 +86,19 @@ class DiffResultToDiffResultDtoMapperTest { .isEqualTo("/scm/api/v2/repositories/space/X/diff/123/parsed"); } + @Test + void shouldCreateLinkToLoadMoreLinesForFilesWithHunks() { + DiffResultDto dto = mapper.mapForRevision(REPOSITORY, createResult(), "123"); + + assertThat(dto.getFiles().get(0).getLinks().getLinkBy("lines")) + .isNotPresent(); + assertThat(dto.getFiles().get(1).getLinks().getLinkBy("lines")) + .isPresent() + .get() + .extracting("href") + .isEqualTo("/scm/api/v2/repositories/space/X/content/123/B.ts?start={start}?end={end}"); + } + @Test void shouldCreateSelfLinkForIncoming() { DiffResultDto dto = mapper.mapForIncoming(REPOSITORY, createResult(), "feature/some", "master");