From 95762c3afa8c0aefe89b8895e34eae77e13f556f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 19 Sep 2018 14:59:00 +0200 Subject: [PATCH 1/9] Fix overflow in media content --- scm-ui/styles/scm.scss | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scm-ui/styles/scm.scss b/scm-ui/styles/scm.scss index 43701de5eb..19c19b607c 100644 --- a/scm-ui/styles/scm.scss +++ b/scm-ui/styles/scm.scss @@ -11,6 +11,10 @@ $blue: #33B2E8; white-space: nowrap; } +.media-content { + overflow: auto; +} + .has-rounded-border { border-radius: 0.25rem; } From 67e140cd247789e2534d6cefb974a7afa9332471 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 19 Sep 2018 15:46:47 +0200 Subject: [PATCH 2/9] Do not extend bulmar native css classes --- scm-ui/src/repos/components/ChangesetRow.js | 5 ++++- scm-ui/styles/scm.scss | 4 ---- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/scm-ui/src/repos/components/ChangesetRow.js b/scm-ui/src/repos/components/ChangesetRow.js index cb8691206a..cd2e8a228e 100644 --- a/scm-ui/src/repos/components/ChangesetRow.js +++ b/scm-ui/src/repos/components/ChangesetRow.js @@ -13,6 +13,9 @@ const styles = { }, changesetGroup: { marginBottom: "1em" + }, + withOverflow: { + overflow: "auto" } }; @@ -49,7 +52,7 @@ class ChangesetRow extends React.Component {
-
+

{changeset.description} diff --git a/scm-ui/styles/scm.scss b/scm-ui/styles/scm.scss index 19c19b607c..43701de5eb 100644 --- a/scm-ui/styles/scm.scss +++ b/scm-ui/styles/scm.scss @@ -11,10 +11,6 @@ $blue: #33B2E8; white-space: nowrap; } -.media-content { - overflow: auto; -} - .has-rounded-border { border-radius: 0.25rem; } From 231dcbb9cbcc69689d7193750f4f4a4b3fe4f09b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 19 Sep 2018 16:05:35 +0200 Subject: [PATCH 3/9] Correct link to changeset --- scm-ui/src/repos/components/ChangesetRow.js | 15 +++++++++++++-- scm-ui/src/repos/components/ChangesetTable.js | 7 ++++--- scm-ui/src/repos/containers/Changesets.js | 4 ++-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/scm-ui/src/repos/components/ChangesetRow.js b/scm-ui/src/repos/components/ChangesetRow.js index cd2e8a228e..27830cbb44 100644 --- a/scm-ui/src/repos/components/ChangesetRow.js +++ b/scm-ui/src/repos/components/ChangesetRow.js @@ -1,11 +1,12 @@ //@flow import React from "react"; -import type { Changeset } from "@scm-manager/ui-types"; +import type { Changeset, Repository } from "@scm-manager/ui-types"; import classNames from "classnames"; import { translate, Interpolate } from "react-i18next"; import ChangesetAvatar from "./ChangesetAvatar"; import injectSheet from "react-jss"; import { DateFromNow } from "@scm-manager/ui-components"; +import { Link } from "react-router-dom"; const styles = { pointer: { @@ -20,6 +21,7 @@ const styles = { }; type Props = { + repository: Repository, changeset: Changeset, t: any, classes: any @@ -27,7 +29,16 @@ type Props = { class ChangesetRow extends React.Component { createLink = (changeset: Changeset) => { - return {changeset.id}; + const { repository } = this.props; + return ( + + {changeset.id} + + ); }; render() { diff --git a/scm-ui/src/repos/components/ChangesetTable.js b/scm-ui/src/repos/components/ChangesetTable.js index 88c2b2fc3a..e16ff384c4 100644 --- a/scm-ui/src/repos/components/ChangesetTable.js +++ b/scm-ui/src/repos/components/ChangesetTable.js @@ -1,18 +1,19 @@ // @flow import ChangesetRow from "./ChangesetRow"; import React from "react"; -import type { Changeset } from "@scm-manager/ui-types"; +import type { Changeset, Repository } from "@scm-manager/ui-types"; import classNames from "classnames"; type Props = { + repository: Repository, changesets: Changeset[] }; class ChangesetTable extends React.Component { render() { - const { changesets } = this.props; + const { repository, changesets } = this.props; const content = changesets.map((changeset, index) => { - return ; + return ; }); return

{content}
; } diff --git a/scm-ui/src/repos/containers/Changesets.js b/scm-ui/src/repos/containers/Changesets.js index 21c8211d90..e0ab5ee560 100644 --- a/scm-ui/src/repos/containers/Changesets.js +++ b/scm-ui/src/repos/containers/Changesets.js @@ -77,7 +77,7 @@ class Changesets extends React.Component { renderTable = () => { const branch = this.props.match.params.branch; - const { changesets, branchNames } = this.props; + const { repository, changesets, branchNames } = this.props; if (branchNames && branchNames.length > 0) { return ( @@ -88,7 +88,7 @@ class Changesets extends React.Component { preselectedOption={branch} optionSelected={branch => this.branchChanged(branch)} /> - +
); } From 0b6feb6503e28c6c002039a0068bd2c7890d3e92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 19 Sep 2018 16:19:59 +0200 Subject: [PATCH 4/9] Rename ChangesetTable -> ChangesetList --- .../components/{ChangesetTable.js => ChangesetList.js} | 4 ++-- scm-ui/src/repos/containers/Changesets.js | 9 ++++----- 2 files changed, 6 insertions(+), 7 deletions(-) rename scm-ui/src/repos/components/{ChangesetTable.js => ChangesetList.js} (86%) diff --git a/scm-ui/src/repos/components/ChangesetTable.js b/scm-ui/src/repos/components/ChangesetList.js similarity index 86% rename from scm-ui/src/repos/components/ChangesetTable.js rename to scm-ui/src/repos/components/ChangesetList.js index e16ff384c4..b5613b3754 100644 --- a/scm-ui/src/repos/components/ChangesetTable.js +++ b/scm-ui/src/repos/components/ChangesetList.js @@ -9,7 +9,7 @@ type Props = { changesets: Changeset[] }; -class ChangesetTable extends React.Component { +class ChangesetList extends React.Component { render() { const { repository, changesets } = this.props; const content = changesets.map((changeset, index) => { @@ -19,4 +19,4 @@ class ChangesetTable extends React.Component { } } -export default ChangesetTable; +export default ChangesetList; diff --git a/scm-ui/src/repos/containers/Changesets.js b/scm-ui/src/repos/containers/Changesets.js index e0ab5ee560..5d151e33dd 100644 --- a/scm-ui/src/repos/containers/Changesets.js +++ b/scm-ui/src/repos/containers/Changesets.js @@ -21,7 +21,7 @@ import { getBranchNames } from "../../repos/modules/branches"; import type { PagedCollection, Repository } from "@scm-manager/ui-types"; -import ChangesetTable from "../components/ChangesetTable"; +import ChangesetList from "../components/ChangesetList"; import DropDown from "../components/DropDown"; import { withRouter } from "react-router-dom"; @@ -43,8 +43,7 @@ class Changesets extends React.Component { this.state = {}; } - onPageChange = (link: string) => { - }; + onPageChange = (link: string) => {}; componentDidMount() { const { namespace, name } = this.props.repository; const branchName = this.props.match.params.branch; @@ -88,12 +87,12 @@ class Changesets extends React.Component { preselectedOption={branch} optionSelected={branch => this.branchChanged(branch)} /> - +
); } - return ; + return ; }; renderPaginator() { From dfdcd197db09fc22e60d801db957f2c1fc677e23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 19 Sep 2018 16:21:56 +0200 Subject: [PATCH 5/9] Show only first seven chars of commit id --- scm-ui/src/repos/components/ChangesetRow.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm-ui/src/repos/components/ChangesetRow.js b/scm-ui/src/repos/components/ChangesetRow.js index 27830cbb44..a80b8d2b11 100644 --- a/scm-ui/src/repos/components/ChangesetRow.js +++ b/scm-ui/src/repos/components/ChangesetRow.js @@ -36,7 +36,7 @@ class ChangesetRow extends React.Component { changeset.id }`} > - {changeset.id} + {changeset.id.substr(0, 7)} ); }; From d8c5828987bef1cdc843c53b671e36066c0c51eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 19 Sep 2018 16:39:29 +0200 Subject: [PATCH 6/9] Move changeset id renderer to component --- scm-ui/src/repos/components/ChangesetId.js | 25 +++++++++++++++++++++ scm-ui/src/repos/components/ChangesetRow.js | 14 +++--------- 2 files changed, 28 insertions(+), 11 deletions(-) create mode 100644 scm-ui/src/repos/components/ChangesetId.js diff --git a/scm-ui/src/repos/components/ChangesetId.js b/scm-ui/src/repos/components/ChangesetId.js new file mode 100644 index 0000000000..7669cd606e --- /dev/null +++ b/scm-ui/src/repos/components/ChangesetId.js @@ -0,0 +1,25 @@ +//@flow + +import { Link } from "react-router-dom"; +import React from "react"; +import type { Repository, Changeset } from "@scm-manager/ui-types"; + +type Props = { + repository: Repository, + changeset: Changeset +}; + +export default class ChangesetId extends React.Component { + render() { + const { repository, changeset } = this.props; + return ( + + {changeset.id.substr(0, 7)} + + ); + } +} diff --git a/scm-ui/src/repos/components/ChangesetRow.js b/scm-ui/src/repos/components/ChangesetRow.js index a80b8d2b11..40bcfd59ed 100644 --- a/scm-ui/src/repos/components/ChangesetRow.js +++ b/scm-ui/src/repos/components/ChangesetRow.js @@ -4,9 +4,9 @@ import type { Changeset, Repository } from "@scm-manager/ui-types"; import classNames from "classnames"; import { translate, Interpolate } from "react-i18next"; import ChangesetAvatar from "./ChangesetAvatar"; +import ChangesetId from "./ChangesetId"; import injectSheet from "react-jss"; import { DateFromNow } from "@scm-manager/ui-components"; -import { Link } from "react-router-dom"; const styles = { pointer: { @@ -30,19 +30,11 @@ type Props = { class ChangesetRow extends React.Component { createLink = (changeset: Changeset) => { const { repository } = this.props; - return ( - - {changeset.id.substr(0, 7)} - - ); + return ; }; render() { - const { changeset, t, classes } = this.props; + const { changeset, classes } = this.props; const changesetLink = this.createLink(changeset); const dateFromNow = ; const authorLine = ( From d8cf660237fb65077268209795e4e9e2e4ca7533 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 19 Sep 2018 16:47:21 +0200 Subject: [PATCH 7/9] Move changeset authro renderer to component --- .../src/repos/components/ChangesetAuthor.js | 27 +++++++++++++++++++ scm-ui/src/repos/components/ChangesetRow.js | 15 ++--------- 2 files changed, 29 insertions(+), 13 deletions(-) create mode 100644 scm-ui/src/repos/components/ChangesetAuthor.js diff --git a/scm-ui/src/repos/components/ChangesetAuthor.js b/scm-ui/src/repos/components/ChangesetAuthor.js new file mode 100644 index 0000000000..d2993daed4 --- /dev/null +++ b/scm-ui/src/repos/components/ChangesetAuthor.js @@ -0,0 +1,27 @@ +//@flow + +import React from "react"; +import type { Changeset } from "@scm-manager/ui-types"; + +type Props = { + changeset: Changeset +}; + +export default class ChangesetAuthor extends React.Component { + render() { + const { changeset } = this.props; + return ( + <> + {changeset.author.name}{" "} + + < + {changeset.author.mail} + > + + + ); + } +} diff --git a/scm-ui/src/repos/components/ChangesetRow.js b/scm-ui/src/repos/components/ChangesetRow.js index 40bcfd59ed..9ec3a7af58 100644 --- a/scm-ui/src/repos/components/ChangesetRow.js +++ b/scm-ui/src/repos/components/ChangesetRow.js @@ -7,6 +7,7 @@ import ChangesetAvatar from "./ChangesetAvatar"; import ChangesetId from "./ChangesetId"; import injectSheet from "react-jss"; import { DateFromNow } from "@scm-manager/ui-components"; +import ChangesetAuthor from "./ChangesetAuthor"; const styles = { pointer: { @@ -37,19 +38,7 @@ class ChangesetRow extends React.Component { const { changeset, classes } = this.props; const changesetLink = this.createLink(changeset); const dateFromNow = ; - const authorLine = ( - <> - {changeset.author.name}{" "} - - < - {changeset.author.mail} - > - - - ); + const authorLine = ; return (
From f1d2a41c0906154db579c31f99887fefec505d20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 19 Sep 2018 16:49:53 +0200 Subject: [PATCH 8/9] Fix translation --- scm-ui/public/locales/en/changesets.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm-ui/public/locales/en/changesets.json b/scm-ui/public/locales/en/changesets.json index 8c804d8f62..b3e996e094 100644 --- a/scm-ui/public/locales/en/changesets.json +++ b/scm-ui/public/locales/en/changesets.json @@ -4,7 +4,7 @@ "description": "Description", "contact": "Contact", "date": "Date", - "summary": "Changeset {{id}} committed at {{time}}" + "summary": "Changeset {{id}} committed {{time}}" }, "author": { "name": "Author", From ba8ce698e12f728a171d4eb149e4fa50d2cb5cb4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 19 Sep 2018 17:17:00 +0200 Subject: [PATCH 9/9] Fix paging for log command --- .../api/v2/resources/BranchRootResource.java | 7 ++-- .../v2/resources/ChangesetRootResource.java | 8 +++-- .../v2/resources/FileHistoryRootResource.java | 7 ++-- .../v2/resources/PagedLogCommandBuilder.java | 30 ++++++++++++++++ .../resources/ChangesetRootResourceTest.java | 34 ++++++++++++++++--- 5 files changed, 73 insertions(+), 13 deletions(-) create mode 100644 scm-webapp/src/main/java/sonia/scm/api/v2/resources/PagedLogCommandBuilder.java diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchRootResource.java index 9763f11def..80b8f7ddc7 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/BranchRootResource.java @@ -100,9 +100,10 @@ public class BranchRootResource { try (RepositoryService repositoryService = serviceFactory.create(new NamespaceAndName(namespace, name))) { Repository repository = repositoryService.getRepository(); RepositoryPermissions.read(repository).check(); - ChangesetPagingResult changesets = repositoryService.getLogCommand() - .setPagingStart(page) - .setPagingLimit(pageSize) + ChangesetPagingResult changesets = new PagedLogCommandBuilder(repositoryService) + .page(page) + .pageSize(pageSize) + .create() .setBranch(branchName) .getChangesets(); if (changesets != null && changesets.getChangesets() != null) { diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetRootResource.java index 717b8d7198..97a23684a5 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ChangesetRootResource.java @@ -12,6 +12,7 @@ import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryNotFoundException; import sonia.scm.repository.RepositoryPermissions; import sonia.scm.repository.RevisionNotFoundException; +import sonia.scm.repository.api.LogCommandBuilder; import sonia.scm.repository.api.RepositoryService; import sonia.scm.repository.api.RepositoryServiceFactory; import sonia.scm.web.VndMediaType; @@ -59,9 +60,10 @@ public class ChangesetRootResource { try (RepositoryService repositoryService = serviceFactory.create(new NamespaceAndName(namespace, name))) { Repository repository = repositoryService.getRepository(); RepositoryPermissions.read(repository).check(); - ChangesetPagingResult changesets = repositoryService.getLogCommand() - .setPagingStart(page) - .setPagingLimit(pageSize) + ChangesetPagingResult changesets = new PagedLogCommandBuilder(repositoryService) + .page(page) + .pageSize(pageSize) + .create() .getChangesets(); if (changesets != null && changesets.getChangesets() != null) { PageResult pageResult = new PageResult<>(changesets.getChangesets(), changesets.getTotal()); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileHistoryRootResource.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileHistoryRootResource.java index 118cc4167a..e38a6f699a 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileHistoryRootResource.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/FileHistoryRootResource.java @@ -73,9 +73,10 @@ public class FileHistoryRootResource { try (RepositoryService repositoryService = serviceFactory.create(new NamespaceAndName(namespace, name))) { log.info("Get changesets of the file {} and revision {}", path, revision); Repository repository = repositoryService.getRepository(); - ChangesetPagingResult changesets = repositoryService.getLogCommand() - .setPagingStart(page) - .setPagingLimit(pageSize) + ChangesetPagingResult changesets = new PagedLogCommandBuilder(repositoryService) + .page(page) + .pageSize(pageSize) + .create() .setPath(path) .setStartChangeset(revision) .getChangesets(); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PagedLogCommandBuilder.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PagedLogCommandBuilder.java new file mode 100644 index 0000000000..c2af89e152 --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/PagedLogCommandBuilder.java @@ -0,0 +1,30 @@ +package sonia.scm.api.v2.resources; + +import sonia.scm.repository.api.LogCommandBuilder; +import sonia.scm.repository.api.RepositoryService; + +class PagedLogCommandBuilder { + private final RepositoryService repositoryService; + private int page; + private int pageSize ; + + PagedLogCommandBuilder(RepositoryService repositoryService) { + this.repositoryService = repositoryService; + } + + PagedLogCommandBuilder page(int page) { + this.page = page; + return this; + } + + PagedLogCommandBuilder pageSize(int pageSize) { + this.pageSize = pageSize; + return this; + } + + LogCommandBuilder create() { + return repositoryService.getLogCommand() + .setPagingStart(page * pageSize) + .setPagingLimit(pageSize); + } +} diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java index b80b62167b..4e1a0f90f1 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ChangesetRootResourceTest.java @@ -109,8 +109,8 @@ public class ChangesetRootResourceTest extends RepositoryTestBase { List changesetList = Lists.newArrayList(new Changeset(id, Date.from(creationDate).getTime(), new Person(authorName, authorEmail), commit)); when(changesetPagingResult.getChangesets()).thenReturn(changesetList); when(changesetPagingResult.getTotal()).thenReturn(1); - when(logCommandBuilder.setPagingStart(anyInt())).thenReturn(logCommandBuilder); - when(logCommandBuilder.setPagingLimit(anyInt())).thenReturn(logCommandBuilder); + when(logCommandBuilder.setPagingStart(0)).thenReturn(logCommandBuilder); + when(logCommandBuilder.setPagingLimit(10)).thenReturn(logCommandBuilder); when(logCommandBuilder.setBranch(anyString())).thenReturn(logCommandBuilder); when(logCommandBuilder.getChangesets()).thenReturn(changesetPagingResult); MockHttpRequest request = MockHttpRequest @@ -126,6 +126,34 @@ public class ChangesetRootResourceTest extends RepositoryTestBase { assertTrue(response.getContentAsString().contains(String.format("\"description\":\"%s\"", commit))); } + @Test + public void shouldGetSinglePageOfChangeSets() throws Exception { + String id = "revision_123"; + Instant creationDate = Instant.now(); + String authorName = "name"; + String authorEmail = "em@i.l"; + String commit = "my branch commit"; + ChangesetPagingResult changesetPagingResult = mock(ChangesetPagingResult.class); + List changesetList = Lists.newArrayList(new Changeset(id, Date.from(creationDate).getTime(), new Person(authorName, authorEmail), commit)); + when(changesetPagingResult.getChangesets()).thenReturn(changesetList); + when(changesetPagingResult.getTotal()).thenReturn(1); + when(logCommandBuilder.setPagingStart(20)).thenReturn(logCommandBuilder); + when(logCommandBuilder.setPagingLimit(10)).thenReturn(logCommandBuilder); + when(logCommandBuilder.setBranch(anyString())).thenReturn(logCommandBuilder); + when(logCommandBuilder.getChangesets()).thenReturn(changesetPagingResult); + MockHttpRequest request = MockHttpRequest + .get(CHANGESET_URL + "?page=2") + .accept(VndMediaType.CHANGESET_COLLECTION); + MockHttpResponse response = new MockHttpResponse(); + dispatcher.invoke(request, response); + assertEquals(200, response.getStatus()); + log.info("Response :{}", response.getContentAsString()); + assertTrue(response.getContentAsString().contains(String.format("\"id\":\"%s\"", id))); + assertTrue(response.getContentAsString().contains(String.format("\"name\":\"%s\"", authorName))); + assertTrue(response.getContentAsString().contains(String.format("\"mail\":\"%s\"", authorEmail))); + assertTrue(response.getContentAsString().contains(String.format("\"description\":\"%s\"", commit))); + } + @Test public void shouldGetChangeSet() throws Exception { String id = "revision_123"; @@ -137,8 +165,6 @@ public class ChangesetRootResourceTest extends RepositoryTestBase { List changesetList = Lists.newArrayList(new Changeset(id, Date.from(creationDate).getTime(), new Person(authorName, authorEmail), commit)); when(changesetPagingResult.getChangesets()).thenReturn(changesetList); when(changesetPagingResult.getTotal()).thenReturn(1); - when(logCommandBuilder.setPagingStart(anyInt())).thenReturn(logCommandBuilder); - when(logCommandBuilder.setPagingLimit(anyInt())).thenReturn(logCommandBuilder); when(logCommandBuilder.setEndChangeset(anyString())).thenReturn(logCommandBuilder); when(logCommandBuilder.setStartChangeset(anyString())).thenReturn(logCommandBuilder); when(logCommandBuilder.getChangesets()).thenReturn(changesetPagingResult);