From 62a87e62344540ad1f2a15017733416118769577 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Thu, 14 May 2020 12:23:27 +0200 Subject: [PATCH 01/54] Resolve markdown links correctly --- .../src/MarkdownLinkRenderer.test.tsx | 71 +++++++++++++++ .../src/MarkdownLinkRenderer.tsx | 87 +++++++++++++++++++ scm-ui/ui-components/src/MarkdownView.tsx | 3 + 3 files changed, 161 insertions(+) create mode 100644 scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx create mode 100644 scm-ui/ui-components/src/MarkdownLinkRenderer.tsx diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx new file mode 100644 index 0000000000..a9cc02ddfe --- /dev/null +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx @@ -0,0 +1,71 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +import React from "react"; +import { correctLocalLink } from "./MarkdownLinkRenderer"; + +const basePath = "/repo/space/name/sources/master/"; +const pathname = basePath + "README.md/"; + +describe("correctLocalLink tests", () => { + it("should return same url", () => { + expect(correctLocalLink(pathname, "")).toBe(pathname); + }); + + it("should return main directory", () => { + expect(correctLocalLink(pathname, "/")).toBe("/"); + expect(correctLocalLink(pathname, "/users/")).toBe("/users/"); + expect(correctLocalLink(pathname, "/users/#42")).toBe("/users/#42"); + }); + + it("should return ascend directory", () => { + expect(correctLocalLink(pathname, "../")).toBe(basePath + "../"); // one layer up + expect(correctLocalLink(pathname, "../../")).toBe(basePath + "../../"); // one layer up + }); + + it("should return same directory", () => { + expect(correctLocalLink(pathname, "./another.md")).toBe(basePath + "./another.md/"); // same layer + expect(correctLocalLink(pathname, "./another.md#42")).toBe(basePath + "./another.md/#42"); // same layer + }); + + it("should return deeper links", () => { + expect(correctLocalLink(pathname, "docs/Home.md")).toBe(basePath + "docs/Home.md/"); + expect(correctLocalLink(pathname, "docs/Home.md#42")).toBe(basePath + "docs/Home.md/#42"); + }); + + it("should return external link", () => { + expect(correctLocalLink(pathname, "https://foo.bar/baz#42")).toBe("https://foo.bar/baz#42"); + expect(correctLocalLink(pathname, "ldap://[2001:db8::7]/c=GB?objectClass?one")).toBe( + "ldap://[2001:db8::7]/c=GB?objectClass?one" + ); + expect(correctLocalLink(pathname, "mailto:John.Doe@example.com")).toBe("mailto:John.Doe@example.com"); + expect(correctLocalLink(pathname, "http://userid:password@example.com:8080")).toBe( + "http://userid:password@example.com:8080" + ); + expect(correctLocalLink(pathname, "tel:+1-816-555-1212")).toBe("tel:+1-816-555-1212"); + expect(correctLocalLink(pathname, "urn:oasis:names:specification:docbook:dtd:xml:4.1.2")).toBe( + "urn:oasis:names:specification:docbook:dtd:xml:4.1.2" + ); + expect(correctLocalLink(pathname, "about:config")).toBe("about:config"); + }); +}); diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx new file mode 100644 index 0000000000..4c9b9ae6ab --- /dev/null +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx @@ -0,0 +1,87 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +import React, { ReactNode } from "react"; +import { withRouter, RouteComponentProps } from "react-router-dom"; +import { withContextPath } from "./urls"; + +type Props = RouteComponentProps & { + children: ReactNode; + href: string; +}; + +function flatten(text: string, child: any): any { + return typeof child === "string" ? text + child : React.Children.toArray(child.props.children).reduce(flatten, text); +} + +/** + * Handle local SCM-Manager and external links + * + * @VisibleForTesting + */ +export function correctLocalLink(pathname: string, link: string) { + if (link === "") { + return pathname; + } + + // Leave uris unchanged which start with schemes + const regex = new RegExp(".:"); + if (link.match(regex)) { + return link; + } + + // Reference to the main directory possible if link starts with slash + let base = ""; + let path = link; + if (!link.startsWith("/")) { + base = pathname; + // Remove last slash temporary + if (base.endsWith("/")) base = base.substring(0, base.length - 1); + // Remove current called file from path + base = base.substr(0, base.lastIndexOf("/") + 1); + + // Remove first slash for absolute consistence + if (path.startsWith("/")) path = path.substring(1); + } + + // Link must end with fragment if it contains one + const pathParts = path.split("#"); + if (pathParts.length > 1) { + // Add ending slash in front of fragment + if (!pathParts[0].endsWith("/")) pathParts[0] += "/"; + path = pathParts[0] + "#" + pathParts[1]; + } else { + // Add ending slash + if (!path.endsWith("/")) path += "/"; + } + + return base + path; +} +function MarkdownLinkRenderer(props: Props) { + const compositeUrl = withContextPath(correctLocalLink(props.location.pathname, props.href)); + const linkText = React.Children.toArray(props.children).reduce(flatten, ""); + + return {linkText}; +} + +export default withRouter(MarkdownLinkRenderer); diff --git a/scm-ui/ui-components/src/MarkdownView.tsx b/scm-ui/ui-components/src/MarkdownView.tsx index d1ef3008c2..362e553d3b 100644 --- a/scm-ui/ui-components/src/MarkdownView.tsx +++ b/scm-ui/ui-components/src/MarkdownView.tsx @@ -29,6 +29,7 @@ import { binder } from "@scm-manager/ui-extensions"; import ErrorBoundary from "./ErrorBoundary"; import SyntaxHighlighter from "./SyntaxHighlighter"; import MarkdownHeadingRenderer from "./MarkdownHeadingRenderer"; +import MarkdownLinkRenderer from "./MarkdownLinkRenderer"; import { useTranslation } from "react-i18next"; import Notification from "./Notification"; @@ -114,6 +115,8 @@ class MarkdownView extends React.Component { rendererList.heading = MarkdownHeadingRenderer; } + rendererList.link = MarkdownLinkRenderer; + if (!rendererList.code) { rendererList.code = SyntaxHighlighter; } From 20b1ec77ec1c83df054126f5902f8841d2d57625 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Thu, 14 May 2020 12:31:21 +0200 Subject: [PATCH 02/54] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index afafc0d4e6..f085786cde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Handle obscure line breaks in diff viewer ([#1129](https://github.com/scm-manager/scm-manager/pull/1129)) - Validate subversion client checksum ([#1113](https://github.com/scm-manager/scm-manager/issues/1113)) - Fix plugin manage permission ([#1135](https://github.com/scm-manager/scm-manager/pull/1135)) +- Correctly resolve Links in markdown files ([#1152](https://github.com/scm-manager/scm-manager/pull/1152)) ## [2.0.0-rc7] - 2020-04-09 ### Added From 1d27c9df159d459727a54092919c2654253f90cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 14 May 2020 17:34:08 +0200 Subject: [PATCH 03/54] Add exception mapper for InvalidFormatException. This exception is thrown for example when an enum in the input could not be found. This is an invalid input and therefore should not result in an internal server error. --- .../scm/api/InvalidFormatExceptionMapper.java | 59 +++++++++++++++ .../main/resources/locales/de/plugins.json | 4 + .../main/resources/locales/en/plugins.json | 4 + .../api/InvalidFormatExceptionMapperTest.java | 74 +++++++++++++++++++ 4 files changed, 141 insertions(+) create mode 100644 scm-webapp/src/main/java/sonia/scm/api/InvalidFormatExceptionMapper.java create mode 100644 scm-webapp/src/test/java/sonia/scm/api/InvalidFormatExceptionMapperTest.java diff --git a/scm-webapp/src/main/java/sonia/scm/api/InvalidFormatExceptionMapper.java b/scm-webapp/src/main/java/sonia/scm/api/InvalidFormatExceptionMapper.java new file mode 100644 index 0000000000..97dd96a23a --- /dev/null +++ b/scm-webapp/src/main/java/sonia/scm/api/InvalidFormatExceptionMapper.java @@ -0,0 +1,59 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.api; + +import com.fasterxml.jackson.databind.exc.InvalidFormatException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import sonia.scm.api.v2.resources.ErrorDto; +import sonia.scm.web.VndMediaType; + +import javax.ws.rs.core.Response; +import javax.ws.rs.ext.ExceptionMapper; +import javax.ws.rs.ext.Provider; +import java.util.Collections; + +@Provider +public class InvalidFormatExceptionMapper implements ExceptionMapper { + + private static final Logger LOG = LoggerFactory.getLogger(InvalidFormatExceptionMapper.class); + + private static final String ERROR_CODE = "2qRyyaVcJ1"; + + @Override + public Response toResponse(InvalidFormatException exception) { + LOG.trace("got invalid format in json: {}", exception.getMessage()); + ErrorDto errorDto = new ErrorDto(); + errorDto.setMessage("invalid format in json content: " + exception.getMessage()); + errorDto.setContext(Collections.emptyList()); + errorDto.setErrorCode(ERROR_CODE); + errorDto.setTransactionId(MDC.get("transaction_id")); + return Response.status(Response.Status.BAD_REQUEST) + .entity(errorDto) + .type(VndMediaType.ERROR_TYPE) + .build(); + } +} diff --git a/scm-webapp/src/main/resources/locales/de/plugins.json b/scm-webapp/src/main/resources/locales/de/plugins.json index 8c5c88e0f8..314dac3de4 100644 --- a/scm-webapp/src/main/resources/locales/de/plugins.json +++ b/scm-webapp/src/main/resources/locales/de/plugins.json @@ -215,6 +215,10 @@ "8nRuFzjss1": { "displayName": "Fehler beim Löschen falscher Downloads", "description": "Ein fehlerhaft heruntergeladenes Plugin konnte nicht gelöscht werden. Bitte prüfen Sie die Server Logs und löschen die Datei manuell." + }, + "2qRyyaVcJ1": { + "displayName": "Ungültig formatiertes Element", + "description": "Die Eingabe beinhaltete unfültige Formate. Bitte prüfen Sie die Server Logs für genauere Informationen." } }, "namespaceStrategies": { diff --git a/scm-webapp/src/main/resources/locales/en/plugins.json b/scm-webapp/src/main/resources/locales/en/plugins.json index 998e796bac..fba82da650 100644 --- a/scm-webapp/src/main/resources/locales/en/plugins.json +++ b/scm-webapp/src/main/resources/locales/en/plugins.json @@ -215,6 +215,10 @@ "8nRuFzjss1": { "displayName": "Error while cleaning up failed plugin", "description": "A failed plugin download could not be removed correctly. Please check the server log and remove the plugin manually." + }, + "2qRyyaVcJ1": { + "displayName": "Invalid format in element", + "description": "The input had some invalid formats. Please check the server log for further information." } }, "namespaceStrategies": { diff --git a/scm-webapp/src/test/java/sonia/scm/api/InvalidFormatExceptionMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/InvalidFormatExceptionMapperTest.java new file mode 100644 index 0000000000..c06da77c92 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/api/InvalidFormatExceptionMapperTest.java @@ -0,0 +1,74 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.api; + +import org.jboss.resteasy.mock.MockDispatcherFactory; +import org.jboss.resteasy.mock.MockHttpRequest; +import org.jboss.resteasy.mock.MockHttpResponse; +import org.jboss.resteasy.spi.Dispatcher; +import org.junit.jupiter.api.Test; + +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import java.io.UnsupportedEncodingException; +import java.net.URISyntaxException; + +import static org.assertj.core.api.Assertions.assertThat; + +class InvalidFormatExceptionMapperTest { + + @Test + void shouldMapInvalidFormatExceptionDueToInvalidEnum() throws URISyntaxException, UnsupportedEncodingException { + Dispatcher dispatcher = MockDispatcherFactory.createDispatcher(); + dispatcher.getRegistry().addSingletonResource(new SimpleResource()); + dispatcher.getProviderFactory().registerProvider(InvalidFormatExceptionMapper.class); + + MockHttpRequest request = MockHttpRequest + .post("/") + .contentType("application/json") + .content("{\"e\": \"NONE\"}".getBytes()); + MockHttpResponse response = new MockHttpResponse(); + + dispatcher.invoke(request, response); + + assertThat(response.getStatus()).isEqualTo(400); + assertThat(response.getContentAsString()).contains("2qRyyaVcJ1"); + } + + @Path("/") + static class SimpleResource { + @POST + public void post(ObjectWithEnum o) { + } + } + + static class ObjectWithEnum { + public Enum e; + } + + enum Enum { + ONE, TWO + } +} From 9131b5eb2fb878cfc5234bf0a040bb5eba6cad2b Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Thu, 14 May 2020 23:35:14 +0200 Subject: [PATCH 04/54] Add another fragment test case which caused jenkins error --- scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx | 1 + scm-ui/ui-components/src/MarkdownLinkRenderer.tsx | 10 ++-------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx index a9cc02ddfe..7390ee0709 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx @@ -30,6 +30,7 @@ const pathname = basePath + "README.md/"; describe("correctLocalLink tests", () => { it("should return same url", () => { expect(correctLocalLink(pathname, "")).toBe(pathname); + expect(correctLocalLink(pathname, "#42")).toBe("#42"); }); it("should return main directory", () => { diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx index 4c9b9ae6ab..1c4c26020d 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx @@ -30,10 +30,6 @@ type Props = RouteComponentProps & { href: string; }; -function flatten(text: string, child: any): any { - return typeof child === "string" ? text + child : React.Children.toArray(child.props.children).reduce(flatten, text); -} - /** * Handle local SCM-Manager and external links * @@ -46,7 +42,7 @@ export function correctLocalLink(pathname: string, link: string) { // Leave uris unchanged which start with schemes const regex = new RegExp(".:"); - if (link.match(regex)) { + if (link.match(regex) || link.startsWith("#")) { return link; } @@ -79,9 +75,7 @@ export function correctLocalLink(pathname: string, link: string) { } function MarkdownLinkRenderer(props: Props) { const compositeUrl = withContextPath(correctLocalLink(props.location.pathname, props.href)); - const linkText = React.Children.toArray(props.children).reduce(flatten, ""); - - return {linkText}; + return {props.children}; } export default withRouter(MarkdownLinkRenderer); From 327bde9515e27eac7ef27bbebc28847e0d603b93 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Fri, 15 May 2020 00:40:56 +0200 Subject: [PATCH 05/54] Correct misplacing of path context --- scm-ui/ui-components/src/MarkdownLinkRenderer.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx index 1c4c26020d..2e512fde51 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx @@ -74,7 +74,7 @@ export function correctLocalLink(pathname: string, link: string) { return base + path; } function MarkdownLinkRenderer(props: Props) { - const compositeUrl = withContextPath(correctLocalLink(props.location.pathname, props.href)); + const compositeUrl = correctLocalLink(withContextPath(props.location.pathname), props.href); return {props.children}; } From a148d2977026911daab97c54639695c3d1ce4fe5 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Fri, 15 May 2020 09:54:20 +0200 Subject: [PATCH 06/54] Correct mixing concepts, Link instead of a for internal links, adjust regex --- .../src/MarkdownLinkRenderer.tsx | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx index 2e512fde51..3b97bcedef 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx @@ -21,15 +21,17 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -import React, { ReactNode } from "react"; -import { withRouter, RouteComponentProps } from "react-router-dom"; +import React, { FC, ReactNode } from "react"; +import { Link, useLocation } from "react-router-dom"; import { withContextPath } from "./urls"; -type Props = RouteComponentProps & { +type Props = { children: ReactNode; href: string; }; +const regex = new RegExp("[a-z]:"); + /** * Handle local SCM-Manager and external links * @@ -40,8 +42,7 @@ export function correctLocalLink(pathname: string, link: string) { return pathname; } - // Leave uris unchanged which start with schemes - const regex = new RegExp(".:"); + // Leave uris unchanged which start with schemes or fragment if (link.match(regex) || link.startsWith("#")) { return link; } @@ -73,9 +74,15 @@ export function correctLocalLink(pathname: string, link: string) { return base + path; } -function MarkdownLinkRenderer(props: Props) { - const compositeUrl = correctLocalLink(withContextPath(props.location.pathname), props.href); - return {props.children}; -} -export default withRouter(MarkdownLinkRenderer); +const MarkdownLinkRenderer: FC = ({ children, href }) => { + const location = useLocation(); + const compositeUrl = correctLocalLink(withContextPath(location.pathname), href); + + if (compositeUrl.match(regex)) { + return {children}; + } + return {children}; +}; + +export default MarkdownLinkRenderer; From 13a8cb4c8f01d6ce762a9d680c5bfde3df7ddb0f Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Fri, 15 May 2020 09:55:51 +0200 Subject: [PATCH 07/54] Reorder unit tests --- .../src/MarkdownLinkRenderer.test.tsx | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx index 7390ee0709..d2a52f70e3 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx @@ -28,6 +28,11 @@ const basePath = "/repo/space/name/sources/master/"; const pathname = basePath + "README.md/"; describe("correctLocalLink tests", () => { + it("should return same directory", () => { + expect(correctLocalLink(pathname, "./another.md")).toBe(basePath + "./another.md/"); + expect(correctLocalLink(pathname, "./another.md#42")).toBe(basePath + "./another.md/#42"); + }); + it("should return same url", () => { expect(correctLocalLink(pathname, "")).toBe(pathname); expect(correctLocalLink(pathname, "#42")).toBe("#42"); @@ -40,13 +45,8 @@ describe("correctLocalLink tests", () => { }); it("should return ascend directory", () => { - expect(correctLocalLink(pathname, "../")).toBe(basePath + "../"); // one layer up - expect(correctLocalLink(pathname, "../../")).toBe(basePath + "../../"); // one layer up - }); - - it("should return same directory", () => { - expect(correctLocalLink(pathname, "./another.md")).toBe(basePath + "./another.md/"); // same layer - expect(correctLocalLink(pathname, "./another.md#42")).toBe(basePath + "./another.md/#42"); // same layer + expect(correctLocalLink(pathname, "../")).toBe(basePath + "../"); + expect(correctLocalLink(pathname, "../../")).toBe(basePath + "../../"); }); it("should return deeper links", () => { From 5a11ca7185bd012ef360ecfc1f7b68a28c7b9471 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Fri, 15 May 2020 10:46:42 +0200 Subject: [PATCH 08/54] Update storyshots --- .../src/__snapshots__/storyshots.test.ts.snap | 54 ++++++++++++------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap b/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap index e9e4792aef..6bcb322fee 100644 --- a/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap +++ b/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap @@ -33581,56 +33581,64 @@ exports[`Storyshots MarkdownView Default 1`] = `

[Top] @@ -33842,7 +33854,8 @@ Deserunt officia esse aliquip consectetur duis ut labore laborum commodo aliquip

[Top] @@ -34149,7 +34162,8 @@ Deserunt officia esse aliquip consectetur duis ut labore laborum commodo aliquip

[Top] @@ -34214,7 +34228,8 @@ func main() {

[Top] @@ -34236,7 +34251,8 @@ func main() { reprehenderit duis irure @@ -34262,7 +34278,8 @@ func main() { anim aute reprehenderit id eu ea. Aute excepteur proident @@ -34305,7 +34322,8 @@ func main() {

Reprehenderit non eu quis in ad elit esse qui aute id incididunt From d95dcfb03877d93fe63a95c18f6d5d0355e4fdb0 Mon Sep 17 00:00:00 2001 From: Konstantin Schaper Date: Mon, 18 May 2020 12:04:16 +0200 Subject: [PATCH 09/54] Exclude frontend unit tests from sonar qube code coverage --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index f36487867c..d31b19a89c 100644 --- a/pom.xml +++ b/pom.xml @@ -954,6 +954,7 @@ **/*StoreFactory.java,**/*UserPassword.js ./scm-ui/target/frontend/buildfrontend-node/node-v${nodejs.version}-linux-x64/bin/node + **/*.test.ts From 448dfb45119833eb87fd9586c85f96cf65960d66 Mon Sep 17 00:00:00 2001 From: Konstantin Schaper Date: Tue, 19 May 2020 08:03:33 +0200 Subject: [PATCH 10/54] Exclude frontend unit tests from sonar qube code coverage --- Jenkinsfile | 1 + pom.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index c6415c158c..666ca23869 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -199,6 +199,7 @@ Maven setupMavenBuild() { def logConf = "scm-webapp/src/main/resources/logback.ci.xml" mvn.additionalArgs += " -Dlogback.configurationFile=${logConf}" mvn.additionalArgs += " -Dscm-it.logbackConfiguration=${logConf}" + mvn.additionalArgs += " -Dsonar.coverage.exclusions=**/*.test.ts,**/*.test.tsx" if (isMainBranch() || isReleaseBranch()) { // Release starts javadoc, which takes very long, so do only for certain branches diff --git a/pom.xml b/pom.xml index d31b19a89c..84db3eba31 100644 --- a/pom.xml +++ b/pom.xml @@ -954,7 +954,7 @@ **/*StoreFactory.java,**/*UserPassword.js ./scm-ui/target/frontend/buildfrontend-node/node-v${nodejs.version}-linux-x64/bin/node - **/*.test.ts + **/*.test.ts,**/*.test.tsx From ead2efdd416f115956f01dd882bc706f7336c585 Mon Sep 17 00:00:00 2001 From: Konstantin Schaper Date: Tue, 19 May 2020 08:32:14 +0200 Subject: [PATCH 11/54] Remove non-functional code coverage configuration from pom --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index 84db3eba31..f36487867c 100644 --- a/pom.xml +++ b/pom.xml @@ -954,7 +954,6 @@ **/*StoreFactory.java,**/*UserPassword.js ./scm-ui/target/frontend/buildfrontend-node/node-v${nodejs.version}-linux-x64/bin/node - **/*.test.ts,**/*.test.tsx From ae51a583fd62c1b990bbc9219455ca4654af3641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 25 Mar 2020 11:39:14 +0100 Subject: [PATCH 12/54] POC for rename detection in diffs --- .../java/sonia/scm/repository/spi/Differ.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java index 6bba6a331e..aa67268ac2 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java @@ -21,17 +21,19 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.repository.spi; import com.google.common.base.Strings; import org.eclipse.jgit.diff.DiffEntry; +import org.eclipse.jgit.diff.DiffFormatter; import org.eclipse.jgit.errors.MissingObjectException; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.revwalk.RevTree; import org.eclipse.jgit.revwalk.RevWalk; +import org.eclipse.jgit.treewalk.AbstractTreeIterator; import org.eclipse.jgit.treewalk.EmptyTreeIterator; import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.treewalk.filter.PathFilter; @@ -57,7 +59,7 @@ final class Differ implements AutoCloseable { static Diff diff(Repository repository, DiffCommandRequest request) throws IOException { try (Differ differ = create(repository, request)) { - return differ.diff(); + return differ.diff(repository); } } @@ -108,8 +110,13 @@ final class Differ implements AutoCloseable { return new Differ(commit, walk, treeWalk); } - private Diff diff() throws IOException { - List entries = DiffEntry.scan(treeWalk); + private Diff diff(Repository repository) throws IOException { + DiffFormatter diffFormatter = new DiffFormatter(null); + diffFormatter.setRepository(repository); + diffFormatter.setDetectRenames(true); + List entries = diffFormatter.scan( + treeWalk.getTree(0, AbstractTreeIterator.class), + treeWalk.getTree(1, AbstractTreeIterator.class)); return new Diff(commit, entries); } From dbc58784e4b1f0faf57a39272eb2925bd0c89692 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Mon, 11 May 2020 14:21:25 +0200 Subject: [PATCH 13/54] Fix path handling --- .../java/sonia/scm/repository/spi/Differ.java | 13 +++++++++---- .../scm/repository/spi/GitDiffCommand.java | 2 +- .../repository/spi/GitDiffCommandTest.java | 17 +++++++++++++++++ .../scm/repository/spi/scm-git-spi-test.zip | Bin 37734 -> 40559 bytes 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java index aa67268ac2..c8ed2e6e51 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java @@ -50,11 +50,13 @@ final class Differ implements AutoCloseable { private final RevWalk walk; private final TreeWalk treeWalk; private final RevCommit commit; + private final PathFilter pathFilter; - private Differ(RevCommit commit, RevWalk walk, TreeWalk treeWalk) { + private Differ(RevCommit commit, RevWalk walk, TreeWalk treeWalk, PathFilter pathFilter) { this.commit = commit; this.walk = walk; this.treeWalk = treeWalk; + this.pathFilter = pathFilter; } static Diff diff(Repository repository, DiffCommandRequest request) throws IOException { @@ -83,11 +85,11 @@ final class Differ implements AutoCloseable { treeWalk.reset(); treeWalk.setRecursive(true); + PathFilter pathFilter = null; if (Util.isNotEmpty(request.getPath())) { - treeWalk.setFilter(PathFilter.create(request.getPath())); + pathFilter = PathFilter.create(request.getPath()); } - if (!Strings.isNullOrEmpty(request.getAncestorChangeset())) { ObjectId otherRevision = repository.resolve(request.getAncestorChangeset()); ObjectId ancestorId = GitUtil.computeCommonAncestor(repository, revision, otherRevision); @@ -107,13 +109,16 @@ final class Differ implements AutoCloseable { treeWalk.addTree(commit.getTree()); - return new Differ(commit, walk, treeWalk); + return new Differ(commit, walk, treeWalk, pathFilter); } private Diff diff(Repository repository) throws IOException { DiffFormatter diffFormatter = new DiffFormatter(null); diffFormatter.setRepository(repository); diffFormatter.setDetectRenames(true); + if (pathFilter != null) { + diffFormatter.setPathFilter(pathFilter); + } List entries = diffFormatter.scan( treeWalk.getTree(0, AbstractTreeIterator.class), treeWalk.getTree(1, AbstractTreeIterator.class)); diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java index 29c9f81b14..0e851456a7 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java @@ -57,7 +57,7 @@ public class GitDiffCommand extends AbstractGitCommand implements DiffCommand { formatter.setRepository(repository); for (DiffEntry e : diff.getEntries()) { - if (!e.getOldId().equals(e.getNewId())) { + if (!e.getOldId().equals(e.getNewId()) || !e.getNewPath().equals(e.getOldPath())) { formatter.format(e); } } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitDiffCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitDiffCommandTest.java index 042c1f3186..7a9e9f660e 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitDiffCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitDiffCommandTest.java @@ -24,11 +24,13 @@ package sonia.scm.repository.spi; +import org.assertj.core.api.Assertions; import org.junit.Test; import java.io.ByteArrayOutputStream; import java.io.IOException; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; public class GitDiffCommandTest extends AbstractGitCommandTestBase { @@ -140,4 +142,19 @@ public class GitDiffCommandTest extends AbstractGitCommandTestBase { gitDiffCommand.getDiffResult(diffCommandRequest).accept(output); assertEquals(DIFF_FILE_PARTIAL_MERGE, output.toString()); } + + @Test + public void diffBetweenTwoBranchesWithMovedFiles() throws IOException { + GitDiffCommand gitDiffCommand = new GitDiffCommand(createContext()); + DiffCommandRequest diffCommandRequest = new DiffCommandRequest(); + diffCommandRequest.setRevision("rename"); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + gitDiffCommand.getDiffResult(diffCommandRequest).accept(output); + assertThat(output.toString()) + .contains("similarity index 100%") + .contains("rename from a.txt") + .contains("rename to a-copy.txt") + .contains("rename from b.txt") + .contains("rename to b-copy.txt"); + } } diff --git a/scm-plugins/scm-git-plugin/src/test/resources/sonia/scm/repository/spi/scm-git-spi-test.zip b/scm-plugins/scm-git-plugin/src/test/resources/sonia/scm/repository/spi/scm-git-spi-test.zip index da166155a780700c719e046b5070e591b4434371..80483d04d1d77a446b75a353ad72e2f0a644f2f3 100644 GIT binary patch delta 5155 zcma)830PBC7Jl3pWf79d76=#w6#-ci^0Ki=07V4hAy#oIV#q?+1cV@nfLIl!BFL#$ z>(uFDs}8M}(q*ug(K^*BwYFpJIH>JN7to6PIM!O*x$ixafSvh1^L;Px-uuoy_niMM z_aA&6-8_og!+H1S^(^m_>KsTsfUZ~xbXL1UuY-u4ANLiLF*TiV&mq|HFIbR~nJ*MW z98$6yp&EVSrdrdP_0q|+ziuK3!W+8Ai5gcKSL#ZQ3!ic($l9!)Uom)s4-o1@{Nji)S`}di2bm^Y_nPd+^2n8>fmVcQqZK72=t> zV#WO>y@wwSHk-R#J6sBy%Oi?5h4uXXOV4{fMYY1r+Pbt2eT{uUk;$wd-F4&y2X55D z%iuIX%E2h5><>T>~8%-`8g0 zwdoQVa*bfWi`BJ|&sf{~&Qf<6=M~4!2U0v? zvDceydLEDQ6{r+Z>^asn#d_xB)Xh4AT(0cE_ArkOTT_-_WYkwxMqzoAPNvA$Df5+5 zN^PJNCaF}ZmMN)xxk9N>8PynAnNg=6qqRKJvoYNT$%Nx_hde(N?SmV?X#d*z&Rj>w z(_2sf^`YOvb*PMeB3MWhd>}x13Dj&-}RAjb9)6v}U1;`+^14gApGb zB9|UK@LBNNeVa2~pk@ChAGt@xmL=1QWp{i(FKvFc>R|nnftahmo=ETi+3gLwe_;4l z`QB$tz1{95R}!}E&N%CJ;m+9;YaK2IB#wg!QLw zKKQ~Hem}A6xpH5)IK>&R`xo2Lu}rcf_st|uj!DhCl9AL5@qnCwyEgfP$#yiqm~2nk zkU+a0CIT4=Vi*pR!Ej(G+b5XRm8&`9M|ve&0!xFe`$Q0*5Qg_?8=1c0`ry!?ci{*y z&*&&%9Z%LJ*eLv;u3Y1=5%*;zbDf=g-}CDU9hqkfU4oWRdp(rDc#i4E#zzs~e)Co1 z+L~KcrKMLJ)~~&?XLmuiDSDQ7Sf$ev`MMWvg!{Mzx-V4`DII>~c^SE@yDOyUBmQ@F%nZY#?aYho}ltg^+UWNIdvj}xFG z#1rzAjHG*Zd}DJ7N4W%EACE!d;J$DeRm z^v!n)uRn!3zZ}-JzJ62o;h)yzLIQo}<|BXcKizF zb880H&kksmC1<3P%eL=$upn{Z+M_%7YA1d4+s3VNt$W_DB#0~*HE2_&!?7@XtzHka zBEqDu5H9$Lp>9T@4dxST-N7R~&RWmiMd7a2`V{jNILG1nh!jT)z6h)F-N3Y`Um_~l z-Q|&7AvVb*uqDb`$R2Pt>YPpc1*tuV$uh1Gn`CC|X~2uVW|MW5TZ^pCw&qOP3waeK zvK6VC`dyLEXA1I?d*r*#IF`&aI-XcwuU1n=xm>NI3`&_yqt{5KdZ|H;uXD8yUoa{a zr8lXm(FF-Op2ElD34&;U-i{4fJ0L1r78Ja%>CM0O{c`Z7TlX3s{Ct!@@LN*K-jknQ z)DU-bG{=}ifj8Fsz-5X9I6%>BbM0q^wRd@T=P4aI&>1Y7Rb0dvtcO)v+lIMnI~H%N zb8YM48au{2G&&aBffO&`$NY0dMgoqpR-Ga!j!kCQyJF2FMd<-iabMZ=1;$&?5y6)D zk%GgWeK_8lN!<0tX41?9Be7(%tHY*aI3bg5?D5)PZ8kieXt&{5B4-2B#3v_N&okTh z{|B#e4Z{PLCUZKN`mUX2&$IqnoXuUcxqM>qqEZrU=RKEVmHmOWk>N?-&7nAo=$AS~ za-;F{PVuo5xLe^1Wn*UzdjEIjDr}%QipQ5 zZSa5+^Hf&hS%bv6)R7=c$_gr@;B!6>vr&ttIYE}uKn^((5a}d=mO_74_`XqsUU3GI zDFgYqg2|NWJj0D3RvArrYg>l|+D+qmjCIgdA{G@{Kbeg>LnSURn`QoRc?%D7X1>q| zmlZ)^ABcCF4r6&}(nm8|>?HbDf%l|f{>UMmrr&w$4_gZ)yce((T-H;}{*G223>S!b z9s<0UXz+%~=6KXBfIRa;@}Yo$GkkCCr#~YK>neC~*DOXALJ$<@p_@V|FI6M{EHUx0^G44i75oyxAQVbxuPm}=q;krPwpTn&fpn5u*mJ&DJ)QoSZlEu zz3Kr6i?h&9Pk2~N&GYSB^DIw4aQO$t@MWXN^^J&XJ(_bPGsNBl52b}L#gn&%YIL+ zt>-!rQ=2{>yYoqDwp~BCt(2gTeIQ~bja+=8VWkD#_l0{aX);bsK%0nyy0RduQn0*2i@GK7QUy*23EZx*kgk&nX!WPy#Z_AL(Pa47DjGQkg0#|tv_Y`Hl13YY z;3qtLX9|>6(dfYxI96prmZ_k!(BzS+1jGhX@S!EhUQhd{*}Y*oCAJeYJtkrxt(KtS zX^>T&vy4fau{3ftB)!37lsqY^9CcJ-z7X=N_~`g_I8{xf@gd-|+JcUTK-+2>IfTMx zJX3~2P7RIf!r(xS1(|0+KrPP48Bkt}^D!KTYUiW!aEMt$qj$sM*)2d>=DJbw*F=pnnW0_w_^|OGOSwin+c0+LlM*nyem4FUQs}Fr(R)(xTWdjEWYDpe zMrUO39iI8gVQIaLqcv^yVzfdIo%L!Gvl})n!b%>DZx9QH<#rdMO;H_!U|86YgxnOc zyMad83iz?Xg7TH1Yoy8jN&>D+DHv+hqA4l}T}P8<6#<826dYcsMbD|>HeTvi6A&P$ zV0DugZP!3g6HWd@Lx4X;LBje`NwX-%elp8(?2%+MWh}oL4c?xyJD-&8*!2VB{d?=h zWNRz|1K2RfXSAp)4(2{XlRa?+xG5?494|eJhlv|#GHE6OJ5>}szd?&m%!Gct(KKr>CY zBoXjUECrF9wP;T=ly9cd`Wox zw*(3vwP?}VIgs!yjYO%?{;UPPkP41lY4opDSiIGO%ICu8c=qmGnA~bXH`CzxRvJ<1 za0Sn1&x5>eG-{a#Z*8+6mkgNRMk6`{YTEGmnQ*f$4ZV^HvF*#y_H5YIo`assf!pnQ zg6_oxVJ<5xu8b-#tE`HEm)aHZ+;%Z)TLN!wUxs>g;MSoh4;lz~lq-Qn?ZNPVhnRe5 pB!JEngR~y{{jswFN6R9 delta 3037 zcmZWqc~Dem5`TPe!L=2BWh5P5%6gQJP=e4 z74(M(C@E8$tW~Zi%aUx?=*F{>wRB6_l&-htS|#d6D;2Y=wQ=9UywS@1^Sb-%?(f&X z?yu*E6XajNCq0u??fO&YgNb%G`Wu@bzQIOlEh=1!^2TRwfr{-^q6!-ly+KHj$5NaA zP1#qE4}IN{L8hqMjHk-6nw*EfDpgX3W~s)x$($}Vu zzh^WJlAfwl-ZAku1sgeJiDJiEf?@?67XVEO44!)cS>wG9p)g z)Gt~>jT?SXWv@&6NHisC4W3j81 z!UCo$_O}CM`}u&=um*(Sp}|`@(+An;UZD`X#ejduXt6!$fO1w~l+VO`9~x5xFd-U- z`85WSP`8jGsS7XjJ@7cj7cu!p^n`34CB+DtbOUUm-meWpQ>YX-bS>1!H8rBMrAZC_ z_zW@WP~~_xHwl&95{{0rY6W3svkns{WGEFhPWX><)*UWYJ#;VJT@DuKk&dv@UkP-H zCDlZ@C^|Q4chXQBS&VjbG(NY4;O}NnkJ8&$IFaV3789PEi|EH9cRJIT;+vne443Rejubfkmyg zz~ejhRjGWDwlA%95`|#~J>FoxRWdC|mZ?3Od|$Cebn0++N`|D1vBne^<@G5p#5YqO zDls2*>F`skv!_8QNn5R)-Ai*$WCG0A5HzQIdPE-WD0i~3cdC5;VCrW|%-IYXm)rvP zq4>jxSrM-dYZVir1>)t=-g^kSd#?2M6!u=+7uQx^2FIn1*q^1cR-R?a7(S`^mVh+T_)b-yK7w0KfiNQ5n%UeA#ae9={3 z;%U@T)Uw*84t%v@yio2~cr_TwJRQsprDUcb)-*68Z$X}vfs%h(>T%Ayew6dCM=F6` zWg_4BVc{x{So9cN#gq5+u<#r`qNmUmz~BQu91GW&$P0h`Wi?0G0C=t8Nn9W{uHi_1 zAcohJiS!Vi0ot`3DKo&nmM8f^xVCl{*%pM@Mve>zp}CPKfx-Au&=v$EuZbr@KaMx? zn#fQEP=Ylv0ZBC`k+#Za6R8eGYqJ1ISkTQJ88M-F9Zw8lIJ1tU%fl!HL@+2^&ywq5 z=v>bc(*)dHUxu_6lV)7_D@jumaJwY}&&)c!==G*c!zp-0GPt%O9P5^8aiUF4!Y5+q zMvlBS5npfQNoWM-wQ%&J2nwcX26tOnve%3Wn>hNGnZmvp28TAWz zKDDBF8%JJRabQ~+E^akxHZU$CQyHZ@$G4lvIR-bk^Xfk&yF9E*(cKk|tvihLlVl24 zGX$1*u!Kp0v74jUrckKJVsNmV)jUseMNM|)_3JUw*{KxF*$k?BSaLfRhkG~@o`x4a zJpE1@g*H}TemO2^1fj{a{tg}XTn9J^T3JQahxIQsNd3WstTq<|&=$iP}~bYLch z|4n1?QZV&pBBz(5?+B)Ic?`bjW$6o96bADdWbJ0jKsGk+=E&FC7~ahjuN)Na;fO5< zeS3H^oCED%p}D!R@8!v%TwD{hN4bdJ$CJoB9Nfo|>O4FZwB~$N^>O5MK92SAB&Pt0 z{T$g+fR=vVvu`>@RXH5hxVIuqdbXDRM*8}63MXwwRP1NT--_|>{xZ6<NvZ3H<|+ z$Ub1Czn?|n^4wra9}x7G>Ww0A7( QR;rcCN}?#;B5@P^AEBfjDF6Tf From fba34b3babee501fb9a5ab243c847f5a972d97a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Mon, 11 May 2020 16:48:02 +0200 Subject: [PATCH 14/54] Add unit tests --- .../spi/GitDiffResultCommandTest.java | 16 +++++++++++ .../scm/repository/spi/GitHunkParserTest.java | 28 +++++++++++++++++++ 2 files changed, 44 insertions(+) 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 cf42b00719..e2722b78ab 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 @@ -103,6 +103,22 @@ public class GitDiffResultCommandTest extends AbstractGitCommandTestBase { assertThat(hunk.getNewLineCount()).isEqualTo(2); } + @Test + public void shouldReturnRenames() throws IOException { + DiffResult diffResult = createDiffResult("rename"); + + Iterator fileIterator = diffResult.iterator(); + DiffFile renameA = fileIterator.next(); + assertThat(renameA.getOldPath()).isEqualTo("a.txt"); + assertThat(renameA.getNewPath()).isEqualTo("a-copy.txt"); + assertThat(renameA.iterator().hasNext()).isFalse(); + + DiffFile renameB = fileIterator.next(); + assertThat(renameB.getOldPath()).isEqualTo("b.txt"); + assertThat(renameB.getNewPath()).isEqualTo("b-copy.txt"); + assertThat(renameB.iterator().hasNext()).isFalse(); + } + private DiffResult createDiffResult(String s) throws IOException { GitDiffResultCommand gitDiffResultCommand = new GitDiffResultCommand(createContext()); DiffCommandRequest diffCommandRequest = new DiffCommandRequest(); diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitHunkParserTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitHunkParserTest.java index fda99ed7bf..54c92a4346 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitHunkParserTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitHunkParserTest.java @@ -112,6 +112,15 @@ class GitHunkParserTest { " indent_size = 2\r\r\n" + " charset = utf-8\n"; + private static final String RENAMES = "diff --git a/a.txt b/a-copy.txt\n" + + "similarity index 100%\n" + + "rename from a.txt\n" + + "rename to a-copy.txt\n" + + "diff --git a/b.txt b/b-copy.txt\n" + + "similarity index 100%\n" + + "rename from b.txt\n" + + "rename to b-copy.txt"; + @Test void shouldParseHunks() { List hunks = new GitHunkParser().parse(DIFF_001); @@ -210,6 +219,25 @@ class GitHunkParserTest { assertThat(lines.hasNext()).isFalse(); } + @Test + void shouldHandleRenames() { + List hunks = new GitHunkParser().parse(RENAMES); + + Hunk hunk = hunks.get(0); + hunk.getRawHeader(); + + Iterator lines = hunk.iterator(); + + DiffLine line1 = lines.next(); + assertThat(line1.getOldLineNumber()).hasValue(10); + assertThat(line1.getNewLineNumber()).hasValue(10); + assertThat(line1.getContent()).isEqualTo("indent_style = space"); + + lines.next(); + lines.next(); + assertThat(lines.hasNext()).isFalse(); + } + private void assertHunk(Hunk hunk, int oldStart, int oldLineCount, int newStart, int newLineCount) { assertThat(hunk.getOldStart()).isEqualTo(oldStart); assertThat(hunk.getOldLineCount()).isEqualTo(oldLineCount); From 5421d4116162d4d50e7369f1808fe072ac11c4c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Mon, 11 May 2020 17:19:38 +0200 Subject: [PATCH 15/54] Support rename in rest layer --- .../DiffResultToDiffResultDtoMapper.java | 7 +++-- .../DiffResultToDiffResultDtoMapperTest.java | 27 +++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) 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 045638c0b7..2c17abd30f 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 @@ -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.github.sdorra.spotter.ContentTypes; @@ -89,11 +89,14 @@ class DiffResultToDiffResultDtoMapper { } else if (isFileNull(newPath) && isFilePath(oldPath)) { path = oldPath; dto.setType("delete"); + } else if (!newPath.equals(oldPath)) { + path = newPath; + dto.setType("rename"); } else if (isFilePath(newPath) && isFilePath(oldPath)) { path = newPath; dto.setType("modify"); } else { - // TODO copy and rename? + // TODO copy? throw new IllegalStateException("no file without path"); } 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 3c88c76675..5b0ff6eff9 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 @@ -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 de.otto.edison.hal.Link; @@ -35,11 +35,13 @@ import sonia.scm.repository.api.DiffResult; import sonia.scm.repository.api.Hunk; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.OptionalInt; import static java.net.URI.create; +import static java.util.Collections.emptyIterator; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -60,6 +62,7 @@ class DiffResultToDiffResultDtoMapperTest { 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"); + assertRenamedFile(files.get(3), "typo.ts", "okay.ts", "def", "fixed", "typescript"); DiffResultDto.HunkDto hunk = files.get(1).getHunks().get(0); assertHunk(hunk, "@@ -3,4 1,2 @@", 1, 2, 3, 4); @@ -104,7 +107,8 @@ class DiffResultToDiffResultDtoMapperTest { deletedLine("c", 3) ) ), - deletedFile("C.go", "ghi") + deletedFile("C.go", "ghi"), + renamedFile("okay.ts", "typo.ts", "fixed", "def") ); } @@ -161,6 +165,15 @@ class DiffResultToDiffResultDtoMapperTest { assertThat(file.getLanguage()).isEqualTo(language); } + private void assertRenamedFile(DiffResultDto.FileDto file, String oldPath, String newPath, String oldRevision, String newRevision, String language) { + assertThat(file.getOldPath()).isEqualTo(oldPath); + assertThat(file.getNewPath()).isEqualTo(newPath); + assertThat(file.getOldRevision()).isEqualTo(oldRevision); + assertThat(file.getNewRevision()).isEqualTo(newRevision); + assertThat(file.getType()).isEqualTo("rename"); + assertThat(file.getLanguage()).isEqualTo(language); + } + private DiffResult result(DiffFile... files) { DiffResult result = mock(DiffResult.class); when(result.iterator()).thenReturn(Arrays.asList(files).iterator()); @@ -193,6 +206,16 @@ class DiffResultToDiffResultDtoMapperTest { return file; } + private DiffFile renamedFile(String newPath, String oldPath, String newRevision, String oldRevision) { + DiffFile file = mock(DiffFile.class); + when(file.getNewPath()).thenReturn(newPath); + when(file.getNewRevision()).thenReturn(newRevision); + when(file.getOldPath()).thenReturn(oldPath); + when(file.getOldRevision()).thenReturn(oldRevision); + when(file.iterator()).thenReturn(emptyIterator()); + return file; + } + private Hunk hunk(String rawHeader, int newStart, int newLineCount, int oldStart, int oldLineCount, DiffLine... lines) { Hunk hunk = mock(Hunk.class); when(hunk.getRawHeader()).thenReturn(rawHeader); From 4d352efef01f2af80598636909fc14df97306988 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 12 May 2020 07:50:39 +0200 Subject: [PATCH 16/54] Remove wrong test The GitHunkParser has nothing to do with renames, so this test does not make any sense. --- .../scm/repository/spi/GitHunkParserTest.java | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitHunkParserTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitHunkParserTest.java index 54c92a4346..fda99ed7bf 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitHunkParserTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitHunkParserTest.java @@ -112,15 +112,6 @@ class GitHunkParserTest { " indent_size = 2\r\r\n" + " charset = utf-8\n"; - private static final String RENAMES = "diff --git a/a.txt b/a-copy.txt\n" + - "similarity index 100%\n" + - "rename from a.txt\n" + - "rename to a-copy.txt\n" + - "diff --git a/b.txt b/b-copy.txt\n" + - "similarity index 100%\n" + - "rename from b.txt\n" + - "rename to b-copy.txt"; - @Test void shouldParseHunks() { List hunks = new GitHunkParser().parse(DIFF_001); @@ -219,25 +210,6 @@ class GitHunkParserTest { assertThat(lines.hasNext()).isFalse(); } - @Test - void shouldHandleRenames() { - List hunks = new GitHunkParser().parse(RENAMES); - - Hunk hunk = hunks.get(0); - hunk.getRawHeader(); - - Iterator lines = hunk.iterator(); - - DiffLine line1 = lines.next(); - assertThat(line1.getOldLineNumber()).hasValue(10); - assertThat(line1.getNewLineNumber()).hasValue(10); - assertThat(line1.getContent()).isEqualTo("indent_style = space"); - - lines.next(); - lines.next(); - assertThat(lines.hasNext()).isFalse(); - } - private void assertHunk(Hunk hunk, int oldStart, int oldLineCount, int newStart, int newLineCount) { assertThat(hunk.getOldStart()).isEqualTo(oldStart); assertThat(hunk.getOldLineCount()).isEqualTo(oldLineCount); From 76354aa83911f4cee53aeecb4062872ceef3b0cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 12 May 2020 14:40:26 +0200 Subject: [PATCH 17/54] Close diff formatter --- .../java/sonia/scm/repository/spi/Differ.java | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java index c8ed2e6e51..c613e945f1 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java @@ -113,16 +113,17 @@ final class Differ implements AutoCloseable { } private Diff diff(Repository repository) throws IOException { - DiffFormatter diffFormatter = new DiffFormatter(null); - diffFormatter.setRepository(repository); - diffFormatter.setDetectRenames(true); - if (pathFilter != null) { - diffFormatter.setPathFilter(pathFilter); + try (DiffFormatter diffFormatter = new DiffFormatter(null)) { + diffFormatter.setRepository(repository); + diffFormatter.setDetectRenames(true); + if (pathFilter != null) { + diffFormatter.setPathFilter(pathFilter); + } + List entries = diffFormatter.scan( + treeWalk.getTree(0, AbstractTreeIterator.class), + treeWalk.getTree(1, AbstractTreeIterator.class)); + return new Diff(commit, entries); } - List entries = diffFormatter.scan( - treeWalk.getTree(0, AbstractTreeIterator.class), - treeWalk.getTree(1, AbstractTreeIterator.class)); - return new Diff(commit, entries); } @Override From 35ffc5c4e20579bd4f899afd50361a4b4b0d5442 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Thu, 14 May 2020 13:20:56 +0200 Subject: [PATCH 18/54] Introduce new API for modifications New modifications includes list of 'renames'. Therefore we introduce a new base class Modification. --- .../sonia/scm/repository/Modification.java | 94 +++++++++++++++++++ .../sonia/scm/repository/Modifications.java | 81 ++++++++-------- .../java/sonia/scm/repository/spi/Differ.java | 10 +- .../spi/GitModificationsCommand.java | 35 ++++--- .../scm/repository/spi/GitLogCommandTest.java | 10 +- .../repository/spi/GitMergeCommandTest.java | 3 +- .../spi/GitModificationsCommandTest.java | 66 +++++++++++-- .../spi/HgModificationsCommand.java | 8 +- .../spi/javahg/AbstractChangesetCommand.java | 17 ++-- .../spi/javahg/HgLogChangesetCommand.java | 7 +- .../scm/repository/spi/HgLogCommandTest.java | 9 +- .../spi/HgModificationsCommandTest.java | 5 +- .../java/sonia/scm/repository/SvnUtil.java | 48 ++++------ .../spi/SvnModificationsCommand.java | 8 +- .../scm/repository/spi/SvnLogCommandTest.java | 4 +- .../api/v2/resources/ModificationsDto.java | 13 ++- .../resources/ModificationsToDtoMapper.java | 17 +++- .../resources/ModificationsResourceTest.java | 18 ++-- 18 files changed, 326 insertions(+), 127 deletions(-) create mode 100644 scm-core/src/main/java/sonia/scm/repository/Modification.java diff --git a/scm-core/src/main/java/sonia/scm/repository/Modification.java b/scm-core/src/main/java/sonia/scm/repository/Modification.java new file mode 100644 index 0000000000..94d74ae722 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/Modification.java @@ -0,0 +1,94 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.io.Serializable; + +public interface Modification extends EffectedPath, Serializable { + + @Getter + @AllArgsConstructor + class Added implements Modification { + private final String path; + + @Override + public String getEffectedPath() { + return path; + } + } + + @Getter + @AllArgsConstructor + class Removed implements Modification { + private final String path; + + @Override + public String getEffectedPath() { + return path; + } + } + + @Getter + @AllArgsConstructor + class Modified implements Modification { + private final String path; + + @Override + public String getEffectedPath() { + return path; + } + } + + @Getter + @AllArgsConstructor + class Renamed implements Modification { + private final String oldPath; + private final String newPath; + + @Override + public String getEffectedPath() { + return newPath; + } + } + + @Getter + @AllArgsConstructor + class Copied implements Modification { + private final String sourcePath; + private final String targetPath; + + @Override + public String getEffectedPath() { + return targetPath; + } + } +} + +interface EffectedPath { + String getEffectedPath(); +} diff --git a/scm-core/src/main/java/sonia/scm/repository/Modifications.java b/scm-core/src/main/java/sonia/scm/repository/Modifications.java index 999f103d2a..ce43fe58f8 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Modifications.java +++ b/scm-core/src/main/java/sonia/scm/repository/Modifications.java @@ -24,71 +24,74 @@ package sonia.scm.repository; -import com.google.common.collect.Lists; +import com.google.common.collect.ImmutableList; +import lombok.Builder; import lombok.EqualsAndHashCode; -import lombok.Setter; +import lombok.Getter; import lombok.ToString; import java.io.Serializable; +import java.util.Collection; import java.util.List; +import static java.util.Arrays.asList; +import static java.util.stream.Collectors.toList; + @EqualsAndHashCode @ToString -@Setter +@Getter public class Modifications implements Serializable { private static final long serialVersionUID = -8902033326668658140L; - private String revision; - /** - * lists of changed files - */ - private List added; - private List modified; - private List removed; + private final String revision; + private final Collection modifications; - public Modifications() { + public Modifications(String revision, Modification... modifications) { + this(revision, asList(modifications)); } - public Modifications(List added) { - this(added, null, null); + public Modifications(String revision, Collection modifications) { + this.revision = revision; + this.modifications = ImmutableList.copyOf(modifications); } - public Modifications(List added, List modified) { - this(added, modified, null); + public List getEffectedPaths() { + return modifications.stream().map(Modification::getEffectedPath).collect(toList()); } - public Modifications(List added, List modified, List removed) { - this.added = added; - this.modified = modified; - this.removed = removed; + public List getAdded() { + return modifications.stream() + .filter(m -> m instanceof Modification.Added) + .map(m -> (Modification.Added) m) + .collect(toList()); } - public List getAdded() { - if (added == null) { - added = Lists.newArrayList(); - } - - return added; + public List getRemoved() { + return modifications.stream() + .filter(m -> m instanceof Modification.Removed) + .map(m -> (Modification.Removed) m) + .collect(toList()); } - public List getModified() { - if (modified == null) { - modified = Lists.newArrayList(); - } - - return modified; + public List getModified() { + return modifications.stream() + .filter(m -> m instanceof Modification.Modified) + .map(m -> (Modification.Modified) m) + .collect(toList()); } - public List getRemoved() { - if (removed == null) { - removed = Lists.newArrayList(); - } - - return removed; + public List getRenamed() { + return modifications.stream() + .filter(m -> m instanceof Modification.Renamed) + .map(m -> (Modification.Renamed) m) + .collect(toList()); } - public String getRevision() { - return revision; + public List getCopied() { + return modifications.stream() + .filter(m -> m instanceof Modification.Copied) + .map(m -> (Modification.Copied) m) + .collect(toList()); } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java index c613e945f1..aa539b978c 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/Differ.java @@ -113,17 +113,23 @@ final class Differ implements AutoCloseable { } private Diff diff(Repository repository) throws IOException { + List entries = scanWithRename(repository, pathFilter, treeWalk); + return new Diff(commit, entries); + } + + static List scanWithRename(Repository repository, PathFilter pathFilter, TreeWalk treeWalk) throws IOException { + List entries; try (DiffFormatter diffFormatter = new DiffFormatter(null)) { diffFormatter.setRepository(repository); diffFormatter.setDetectRenames(true); if (pathFilter != null) { diffFormatter.setPathFilter(pathFilter); } - List entries = diffFormatter.scan( + entries = diffFormatter.scan( treeWalk.getTree(0, AbstractTreeIterator.class), treeWalk.getTree(1, AbstractTreeIterator.class)); - return new Diff(commit, entries); } + return entries; } @Override diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitModificationsCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitModificationsCommand.java index 3839c98959..d04e8293ca 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitModificationsCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitModificationsCommand.java @@ -34,10 +34,13 @@ import org.eclipse.jgit.treewalk.EmptyTreeIterator; import org.eclipse.jgit.treewalk.TreeWalk; import sonia.scm.repository.GitUtil; import sonia.scm.repository.InternalRepositoryException; +import sonia.scm.repository.Modification; import sonia.scm.repository.Modifications; import java.io.IOException; import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; import static sonia.scm.ContextEntry.ContextBuilder.entity; @@ -72,15 +75,14 @@ public class GitModificationsCommand extends AbstractGitCommand implements Modif treeWalk.addTree(new EmptyTreeIterator()); } treeWalk.addTree(commit.getTree()); - List entries = DiffEntry.scan(treeWalk); - Modifications modifications = new Modifications(); + List entries = Differ.scanWithRename(context.open(), null, treeWalk); + Collection modifications = new ArrayList<>(); for (DiffEntry e : entries) { - if (!e.getOldId().equals(e.getNewId())) { - appendModification(modifications, e); + if (!e.getOldId().equals(e.getNewId()) || !e.getOldPath().equals(e.getNewPath())) { + modifications.add(asModification(e)); } } - modifications.setRevision(revision); - return modifications; + return new Modifications(revision, modifications); } @Override @@ -111,16 +113,19 @@ public class GitModificationsCommand extends AbstractGitCommand implements Modif return getModifications(request.getRevision()); } - private void appendModification(Modifications modifications, DiffEntry entry) throws UnsupportedModificationTypeException { + private Modification asModification(DiffEntry entry) throws UnsupportedModificationTypeException { DiffEntry.ChangeType type = entry.getChangeType(); - if (type == DiffEntry.ChangeType.ADD) { - modifications.getAdded().add(entry.getNewPath()); - } else if (type == DiffEntry.ChangeType.MODIFY) { - modifications.getModified().add(entry.getNewPath()); - } else if (type == DiffEntry.ChangeType.DELETE) { - modifications.getRemoved().add(entry.getOldPath()); - } else { - throw new UnsupportedModificationTypeException(entity(repository), MessageFormat.format("The modification type: {0} is not supported.", type)); + switch (type) { + case ADD: + return new Modification.Added(entry.getNewPath()); + case MODIFY: + return new Modification.Modified(entry.getNewPath()); + case DELETE: + return new Modification.Removed(entry.getOldPath()); + case RENAME: + return new Modification.Renamed(entry.getOldPath(), entry.getNewPath()); + default: + throw new UnsupportedModificationTypeException(entity(repository), MessageFormat.format("The modification type: {0} is not supported.", type)); } } } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java index 38ab4e0ebb..61c2009405 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitLogCommandTest.java @@ -39,11 +39,11 @@ import java.io.File; import java.io.IOException; import static java.nio.charset.Charset.defaultCharset; +import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.contains; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; @@ -188,7 +188,9 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase assertTrue("removed list should be empty", modifications.getRemoved().isEmpty()); assertFalse("added list should not be empty", modifications.getAdded().isEmpty()); assertEquals(2, modifications.getAdded().size()); - assertThat(modifications.getAdded(), contains("a.txt", "b.txt")); + assertThat(modifications.getAdded()) + .extracting("path") + .containsExactly("a.txt", "b.txt"); } @Test @@ -198,14 +200,14 @@ public class GitLogCommandTest extends AbstractGitCommandTestBase GitLogCommand command = createCommand(); Changeset c = command.getChangeset("435df2f061add3589cb3", request); - Assertions.assertThat(c.getBranches()).containsOnly("master"); + assertThat(c.getBranches()).containsOnly("master"); } @Test public void shouldNotReturnCommitFromDifferentBranch() { when(request.getBranch()).thenReturn("master"); Changeset changeset = createCommand().getChangeset("3f76a12f08a6ba0dc988c68b7f0b2cd190efc3c4", request); - Assertions.assertThat(changeset).isNull(); + assertThat(changeset).isNull(); } @Test diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java index 8586b26cfb..f8e7be6fd4 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java @@ -40,6 +40,7 @@ import org.junit.jupiter.api.Assertions; import sonia.scm.NoChangesMadeException; import sonia.scm.NotFoundException; import sonia.scm.repository.GitWorkdirFactory; +import sonia.scm.repository.Modification; import sonia.scm.repository.Person; import sonia.scm.repository.api.MergeCommandResult; import sonia.scm.repository.api.MergeStrategy; @@ -318,7 +319,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase { assertThat(message).isEqualTo("squash three commits"); GitModificationsCommand modificationsCommand = new GitModificationsCommand(createContext()); - List changes = modificationsCommand.getModifications("master").getAdded(); + List changes = modificationsCommand.getModifications("master").getAdded(); assertThat(changes.size()).isEqualTo(3); } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModificationsCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModificationsCommandTest.java index e6ac22d32c..1657191d21 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModificationsCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitModificationsCommandTest.java @@ -86,6 +86,25 @@ public class GitModificationsCommandTest extends AbstractRemoteCommandTestBase { assertModifications.accept(outgoingModificationsCommand.getModifications(revision)); } + @Test + public void shouldReadRenamedFiles() throws Exception { + String originalFile = "a.txt"; + write(outgoing, outgoingDirectory, originalFile, "bal bla"); + commit(outgoing, "add file"); + write(outgoing, outgoingDirectory, "b.txt", "bal bla"); + File file = new File(outgoingDirectory, originalFile); + file.delete(); + outgoing.rm().addFilepattern(originalFile).call(); + + RevCommit modifiedFileCommit = commit(outgoing, "rename file"); + String revision = modifiedFileCommit.getName(); + + Consumer assertModifications = assertRenamedFiles("b.txt"); + assertModifications.accept(outgoingModificationsCommand.getModifications(revision)); + pushOutgoingAndPullIncoming(); + assertModifications.accept(incomingModificationsCommand.getModifications(revision)); + } + void pushOutgoingAndPullIncoming() throws IOException { GitPushCommand cmd = new GitPushCommand(handler, new GitContext(outgoingDirectory, outgoingRepository, null)); PushCommandRequest request = new PushCommandRequest(); @@ -102,31 +121,62 @@ public class GitModificationsCommandTest extends AbstractRemoteCommandTestBase { assertThat(modifications).isNotNull(); assertThat(modifications.getAdded()) .as("added files modifications") - .hasSize(0); + .asList() + .isEmpty(); assertThat(modifications.getModified()) .as("modified files modifications") - .hasSize(0); + .asList() + .isEmpty(); assertThat(modifications.getRemoved()) .as("removed files modifications") + .asList() .hasSize(1) + .extracting("path") .containsOnly(fileName); }; } + Consumer assertRenamedFiles(String fileName) { + return (modifications) -> { + assertThat(modifications).isNotNull(); + assertThat(modifications.getAdded()) + .as("added files modifications") + .asList() + .isEmpty(); + assertThat(modifications.getModified()) + .as("modified files modifications") + .asList() + .isEmpty(); + assertThat(modifications.getRemoved()) + .as("removed files modifications") + .asList() + .isEmpty(); + assertThat(modifications.getRenamed()) + .as("renamed files modifications") + .asList() + .hasSize(1) + .extracting("newPath") + .containsOnly(fileName); + }; + } Consumer assertModifiedFiles(String file) { return (modifications) -> { assertThat(modifications).isNotNull(); assertThat(modifications.getAdded()) .as("added files modifications") - .hasSize(0); + .asList() + .isEmpty(); assertThat(modifications.getModified()) .as("modified files modifications") + .asList() + .extracting("path") .hasSize(1) .containsOnly(file); assertThat(modifications.getRemoved()) .as("removed files modifications") - .hasSize(0); + .asList() + .isEmpty(); }; } @@ -135,14 +185,18 @@ public class GitModificationsCommandTest extends AbstractRemoteCommandTestBase { assertThat(modifications).isNotNull(); assertThat(modifications.getAdded()) .as("added files modifications") + .asList() .hasSize(1) + .extracting("path") .containsOnly(file); assertThat(modifications.getModified()) .as("modified files modifications") - .hasSize(0); + .asList() + .isEmpty(); assertThat(modifications.getRemoved()) .as("removed files modifications") - .hasSize(0); + .asList() + .isEmpty(); }; } } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgModificationsCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgModificationsCommand.java index f9c7a3e1d1..157529baf5 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgModificationsCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/HgModificationsCommand.java @@ -24,9 +24,12 @@ package sonia.scm.repository.spi; +import sonia.scm.repository.Modification; import sonia.scm.repository.Modifications; import sonia.scm.repository.spi.javahg.HgLogChangesetCommand; +import java.util.Collection; + public class HgModificationsCommand extends AbstractCommand implements ModificationsCommand { HgModificationsCommand(HgCommandContext context) { @@ -38,9 +41,8 @@ public class HgModificationsCommand extends AbstractCommand implements Modificat public Modifications getModifications(String revision) { com.aragost.javahg.Repository repository = open(); HgLogChangesetCommand hgLogChangesetCommand = HgLogChangesetCommand.on(repository, getContext().getConfig()); - Modifications modifications = hgLogChangesetCommand.rev(revision).extractModifications(); - modifications.setRevision(revision); - return modifications; + Collection modifications = hgLogChangesetCommand.rev(revision).extractModifications(); + return new Modifications(revision, modifications); } @Override diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/AbstractChangesetCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/AbstractChangesetCommand.java index 4de460d20a..be2172f2fd 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/AbstractChangesetCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/AbstractChangesetCommand.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.repository.spi.javahg; //~--- non-JDK imports -------------------------------------------------------- @@ -36,10 +36,13 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import sonia.scm.repository.Changeset; import sonia.scm.repository.HgConfig; +import sonia.scm.repository.Modification; import sonia.scm.repository.Modifications; import sonia.scm.repository.Person; import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; import java.util.List; //~--- JDK imports ------------------------------------------------------------ @@ -251,7 +254,7 @@ public abstract class AbstractChangesetCommand extends AbstractCommand return changeset; } - protected Modifications readModificationsFromStream(HgInputStream in) { + protected Collection readModificationsFromStream(HgInputStream in) { try { boolean found = in.find(CHANGESET_PATTERN); if (found) { @@ -265,16 +268,16 @@ public abstract class AbstractChangesetCommand extends AbstractCommand return null; } - private Modifications extractModifications(HgInputStream in) throws IOException { - Modifications modifications = new Modifications(); + private Collection extractModifications(HgInputStream in) throws IOException { + Collection modifications = new ArrayList<>(); String line = in.textUpTo('\n'); while (line.length() > 0) { if (line.startsWith("a ")) { - modifications.getAdded().add(line.substring(2)); + modifications.add(new Modification.Added(line.substring(2))); } else if (line.startsWith("m ")) { - modifications.getModified().add(line.substring(2)); + modifications.add(new Modification.Modified(line.substring(2))); } else if (line.startsWith("d ")) { - modifications.getRemoved().add(line.substring(2)); + modifications.add(new Modification.Removed(line.substring(2))); } line = in.textUpTo('\n'); } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/HgLogChangesetCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/HgLogChangesetCommand.java index 418772b39f..923132fe07 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/HgLogChangesetCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/HgLogChangesetCommand.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.repository.spi.javahg; import com.aragost.javahg.Repository; @@ -31,9 +31,10 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import sonia.scm.repository.Changeset; import sonia.scm.repository.HgConfig; -import sonia.scm.repository.Modifications; +import sonia.scm.repository.Modification; import java.io.IOException; +import java.util.Collection; import java.util.List; /** @@ -64,7 +65,7 @@ public class HgLogChangesetCommand extends AbstractChangesetCommand { return readListFromStream(getHgInputStream(files, CHANGESET_EAGER_STYLE_PATH)); } - public Modifications extractModifications(String... files) { + public Collection extractModifications(String... files) { HgInputStream hgInputStream = getHgInputStream(files, CHANGESET_EAGER_STYLE_PATH); try { return readModificationsFromStream(hgInputStream); diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgLogCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgLogCommandTest.java index efb3919455..d548ebf75e 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgLogCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgLogCommandTest.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.repository.spi; //~--- non-JDK imports -------------------------------------------------------- @@ -33,11 +33,10 @@ import sonia.scm.repository.Modifications; import java.io.IOException; -import static org.hamcrest.Matchers.contains; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; //~--- JDK imports ------------------------------------------------------------ @@ -162,7 +161,9 @@ public class HgLogCommandTest extends AbstractHgCommandTestBase assertTrue("removed list should be empty", modifications.getRemoved().isEmpty()); assertFalse("added list should not be empty", modifications.getAdded().isEmpty()); assertEquals(2, modifications.getAdded().size()); - assertThat(modifications.getAdded(), contains("a.txt", "b.txt")); + assertThat(modifications.getAdded()) + .extracting("path") + .containsExactly("a.txt", "b.txt"); } @Test diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgModificationsCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgModificationsCommandTest.java index c257dc611a..993b8a6fb9 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgModificationsCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgModificationsCommandTest.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.repository.spi; import com.aragost.javahg.Changeset; @@ -96,6 +96,7 @@ public class HgModificationsCommandTest extends IncomingOutgoingTestBase { assertThat(modifications.getRemoved()) .as("removed files modifications") .hasSize(1) + .extracting("path") .containsOnly(fileName); }; } @@ -110,6 +111,7 @@ public class HgModificationsCommandTest extends IncomingOutgoingTestBase { assertThat(modifications.getModified()) .as("modified files modifications") .hasSize(1) + .extracting("path") .containsOnly(file); assertThat(modifications.getRemoved()) .as("removed files modifications") @@ -123,6 +125,7 @@ public class HgModificationsCommandTest extends IncomingOutgoingTestBase { assertThat(modifications.getAdded()) .as("added files modifications") .hasSize(1) + .extracting("path") .containsOnly(addedFile); assertThat(modifications.getModified()) .as("modified files modifications") diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java index 58cc319e2a..40a5ee5a69 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.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.repository; //~--- non-JDK imports -------------------------------------------------------- @@ -49,7 +49,11 @@ import java.io.IOException; import java.io.PrintWriter; import java.util.List; import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; +import static java.util.Collections.emptyList; +import static java.util.Optional.empty; import static sonia.scm.ContextEntry.ContextBuilder.entity; import static sonia.scm.NotFoundException.notFound; @@ -116,30 +120,23 @@ public final class SvnUtil public static Modifications createModifications(SVNLogEntry entry, String revision) { - Modifications modifications = new Modifications(); - modifications.setRevision(revision); Map changeMap = entry.getChangedPaths(); + List modificationList; if (Util.isNotEmpty(changeMap)) { - - for (SVNLogEntryPath e : changeMap.values()) { - appendModification(modifications, e.getType(), e.getPath()); - } + modificationList = changeMap.values().stream() + .map(e -> asModification(e.getType(), e.getPath())) + .filter(Optional::isPresent) + .map(Optional::get) + .collect(Collectors.toList()); + } else { + modificationList = emptyList(); } - return modifications; + + return new Modifications(revision, modificationList); } - /** - * Method description - * - * - * @param modifications - * @param type - * @param path - */ - public static void appendModification(Modifications modifications, char type, - String path) - { + public static Optional asModification(char type, String path) { if (path.startsWith("/")) { path = path.substring(1); @@ -148,23 +145,18 @@ public final class SvnUtil switch (type) { case SVNLogEntryPath.TYPE_ADDED : - modifications.getAdded().add(path); - - break; + return Optional.of(new Modification.Added(path)); case SVNLogEntryPath.TYPE_DELETED : - modifications.getRemoved().add(path); - - break; + return Optional.of(new Modification.Removed(path)); case TYPE_UPDATED : case SVNLogEntryPath.TYPE_MODIFIED : - modifications.getModified().add(path); - - break; + return Optional.of(new Modification.Modified(path)); default : logger.debug("unknown modification type {}", type); + return empty(); } } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnModificationsCommand.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnModificationsCommand.java index 97c44ce747..8daebf9245 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnModificationsCommand.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/spi/SvnModificationsCommand.java @@ -31,10 +31,12 @@ import org.tmatesoft.svn.core.io.SVNRepository; import org.tmatesoft.svn.core.wc.SVNClientManager; import org.tmatesoft.svn.core.wc.admin.SVNLookClient; import sonia.scm.repository.InternalRepositoryException; +import sonia.scm.repository.Modification; import sonia.scm.repository.Modifications; import sonia.scm.repository.SvnUtil; import sonia.scm.util.Util; +import java.util.ArrayList; import java.util.Collection; @Slf4j @@ -78,12 +80,12 @@ public class SvnModificationsCommand extends AbstractSvnCommand implements Modif private Modifications getModificationsFromTransaction(String transaction) throws SVNException { log.debug("get svn modifications from transaction: {}", transaction); - final Modifications modifications = new Modifications(); SVNLookClient client = SVNClientManager.newInstance().getLookClient(); + Collection modificationList = new ArrayList<>(); client.doGetChanged(context.getDirectory(), transaction, - e -> SvnUtil.appendModification(modifications, e.getType(), e.getPath()), true); + e -> SvnUtil.asModification(e.getType(), e.getPath()).ifPresent(modificationList::add), true); - return modifications; + return new Modifications(null, modificationList); } @Override diff --git a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLogCommandTest.java b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLogCommandTest.java index 52162419fa..cab001573b 100644 --- a/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLogCommandTest.java +++ b/scm-plugins/scm-svn-plugin/src/test/java/sonia/scm/repository/spi/SvnLogCommandTest.java @@ -143,8 +143,8 @@ public class SvnLogCommandTest extends AbstractSvnCommandTestBase assertEquals(1, modifications.getModified().size()); assertEquals(1, modifications.getRemoved().size()); assertTrue("added list should be empty", modifications.getAdded().isEmpty()); - assertEquals("a.txt", modifications.getModified().get(0)); - assertEquals("b.txt", modifications.getRemoved().get(0)); + assertEquals("a.txt", modifications.getModified().get(0).getPath()); + assertEquals("b.txt", modifications.getRemoved().get(0).getPath()); } @Test diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ModificationsDto.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ModificationsDto.java index 9dbfb5707d..d826ece42c 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ModificationsDto.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ModificationsDto.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 de.otto.edison.hal.HalRepresentation; @@ -54,10 +54,21 @@ public class ModificationsDto extends HalRepresentation { */ private List removed; + /** + * Mapping of renamed files + */ + private List renamed; + @Override @SuppressWarnings("squid:S1185") // We want to have this method available in this package protected HalRepresentation add(Links links) { return super.add(links); } + @Getter + @Setter + public static class RenamedDto { + private String oldPath; + private String newPath; + } } diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ModificationsToDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ModificationsToDtoMapper.java index e393265c26..0e9f169f53 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ModificationsToDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ModificationsToDtoMapper.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 de.otto.edison.hal.Links; @@ -30,6 +30,7 @@ import org.mapstruct.Context; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; +import sonia.scm.repository.Modification; import sonia.scm.repository.Modifications; import sonia.scm.repository.Repository; @@ -52,4 +53,18 @@ public abstract class ModificationsToDtoMapper { .self(resourceLinks.modifications().self(repository.getNamespace(), repository.getName(), target.getRevision())); target.add(linksBuilder.build()); } + + String map(Modification.Added added) { + return added.getPath(); + } + + String map(Modification.Removed removed) { + return removed.getPath(); + } + + String map(Modification.Modified modified) { + return modified.getPath(); + } + + abstract ModificationsDto.RenamedDto map(Modification.Renamed renamed); } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java index 23893f9f95..3697330587 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.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.google.inject.util.Providers; @@ -30,7 +30,6 @@ import org.apache.shiro.subject.Subject; import org.apache.shiro.subject.support.SubjectThreadState; import org.apache.shiro.util.ThreadContext; import org.apache.shiro.util.ThreadState; -import org.assertj.core.util.Lists; import org.jboss.resteasy.mock.MockHttpRequest; import org.jboss.resteasy.mock.MockHttpResponse; import org.junit.After; @@ -41,6 +40,9 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import sonia.scm.repository.InternalRepositoryException; +import sonia.scm.repository.Modification.Added; +import sonia.scm.repository.Modification.Modified; +import sonia.scm.repository.Modification.Removed; import sonia.scm.repository.Modifications; import sonia.scm.repository.NamespaceAndName; import sonia.scm.repository.Repository; @@ -141,7 +143,6 @@ public class ModificationsResourceTest extends RepositoryTestBase { @Test public void shouldGetModifications() throws Exception { - Modifications modifications = new Modifications(); String revision = "revision"; String addedFile_1 = "a.txt"; String addedFile_2 = "b.txt"; @@ -149,10 +150,13 @@ public class ModificationsResourceTest extends RepositoryTestBase { String modifiedFile_2 = "c.txt"; String removedFile_1 = "e.txt"; String removedFile_2 = "f.txt"; - modifications.setRevision(revision); - modifications.setAdded(Lists.newArrayList(addedFile_1, addedFile_2)); - modifications.setModified(Lists.newArrayList(modifiedFile_1, modifiedFile_2)); - modifications.setRemoved(Lists.newArrayList(removedFile_1, removedFile_2)); + Modifications modifications = new Modifications(revision, + new Added(addedFile_1), + new Added(addedFile_2), + new Modified(modifiedFile_1), + new Modified(modifiedFile_2), + new Removed(removedFile_1), + new Removed(removedFile_2)); when(modificationsCommandBuilder.getModifications()).thenReturn(modifications); when(modificationsCommandBuilder.revision(eq(revision))).thenReturn(modificationsCommandBuilder); From 74b959e4514e1d1a8341f59963857bfc9958dab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 15 May 2020 13:03:52 +0200 Subject: [PATCH 19/54] handle both paths as effected for rename --- .../sonia/scm/repository/Modification.java | 25 ++++--- .../sonia/scm/repository/Modifications.java | 8 +- .../scm/repository/ModificationsTest.java | 73 +++++++++++++++++++ 3 files changed, 93 insertions(+), 13 deletions(-) create mode 100644 scm-core/src/test/java/sonia/scm/repository/ModificationsTest.java diff --git a/scm-core/src/main/java/sonia/scm/repository/Modification.java b/scm-core/src/main/java/sonia/scm/repository/Modification.java index 94d74ae722..2b675230fa 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Modification.java +++ b/scm-core/src/main/java/sonia/scm/repository/Modification.java @@ -28,6 +28,9 @@ import lombok.AllArgsConstructor; import lombok.Getter; import java.io.Serializable; +import java.util.stream.Stream; + +import static java.util.stream.Stream.of; public interface Modification extends EffectedPath, Serializable { @@ -37,8 +40,8 @@ public interface Modification extends EffectedPath, Serializable { private final String path; @Override - public String getEffectedPath() { - return path; + public Stream getEffectedPaths() { + return of(path); } } @@ -48,8 +51,8 @@ public interface Modification extends EffectedPath, Serializable { private final String path; @Override - public String getEffectedPath() { - return path; + public Stream getEffectedPaths() { + return of(path); } } @@ -59,8 +62,8 @@ public interface Modification extends EffectedPath, Serializable { private final String path; @Override - public String getEffectedPath() { - return path; + public Stream getEffectedPaths() { + return of(path); } } @@ -71,8 +74,8 @@ public interface Modification extends EffectedPath, Serializable { private final String newPath; @Override - public String getEffectedPath() { - return newPath; + public Stream getEffectedPaths() { + return of(oldPath, newPath); } } @@ -83,12 +86,12 @@ public interface Modification extends EffectedPath, Serializable { private final String targetPath; @Override - public String getEffectedPath() { - return targetPath; + public Stream getEffectedPaths() { + return of(targetPath); } } } interface EffectedPath { - String getEffectedPath(); + Stream getEffectedPaths(); } diff --git a/scm-core/src/main/java/sonia/scm/repository/Modifications.java b/scm-core/src/main/java/sonia/scm/repository/Modifications.java index ce43fe58f8..891bf50216 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Modifications.java +++ b/scm-core/src/main/java/sonia/scm/repository/Modifications.java @@ -25,7 +25,6 @@ package sonia.scm.repository; import com.google.common.collect.ImmutableList; -import lombok.Builder; import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.ToString; @@ -33,6 +32,7 @@ import lombok.ToString; import java.io.Serializable; import java.util.Collection; import java.util.List; +import java.util.stream.Stream; import static java.util.Arrays.asList; import static java.util.stream.Collectors.toList; @@ -57,7 +57,11 @@ public class Modifications implements Serializable { } public List getEffectedPaths() { - return modifications.stream().map(Modification::getEffectedPath).collect(toList()); + return effectedPathsStream().collect(toList()); + } + + public Stream effectedPathsStream() { + return modifications.stream().flatMap(Modification::getEffectedPaths); } public List getAdded() { diff --git a/scm-core/src/test/java/sonia/scm/repository/ModificationsTest.java b/scm-core/src/test/java/sonia/scm/repository/ModificationsTest.java new file mode 100644 index 0000000000..2832d8f5ef --- /dev/null +++ b/scm-core/src/test/java/sonia/scm/repository/ModificationsTest.java @@ -0,0 +1,73 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +class ModificationsTest { + + public static final Modifications MODIFICATIONS = new Modifications("123", + new Modification.Added("added"), + new Modification.Removed("removed"), + new Modification.Modified("modified"), + new Modification.Renamed("rename from", "rename to"), + new Modification.Copied("copy from", "copy to") + ); + + @Test + void shouldFindAddedFilesAsEffected() { + assertThat(MODIFICATIONS.getEffectedPaths()) + .contains("added"); + } + + @Test + void shouldFindRemovedFilesAsEffected() { + assertThat(MODIFICATIONS.getEffectedPaths()) + .contains("removed"); + } + + @Test + void shouldFindModifiedFilesAsEffected() { + assertThat(MODIFICATIONS.getEffectedPaths()) + .contains("modified"); + } + + @Test + void shouldFindRenamedFilesAsEffected() { + assertThat(MODIFICATIONS.getEffectedPaths()) + .contains("rename from", "rename to"); + } + + @Test + void shouldFindTargetOfCopiedFilesAsEffected() { + assertThat(MODIFICATIONS.getEffectedPaths()) + .contains("copy to") + .doesNotContain("copy from"); + } +} From c722565109615b46b4c25044becc69ad7de186f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 15 May 2020 14:33:04 +0200 Subject: [PATCH 20/54] Hide `getEffectedPaths` for other packages --- .../main/java/sonia/scm/repository/Added.java | 43 ++++++++++++ .../java/sonia/scm/repository/Copied.java | 44 ++++++++++++ .../sonia/scm/repository/EffectedPath.java | 31 +++++++++ .../sonia/scm/repository/Modification.java | 69 +------------------ .../sonia/scm/repository/Modifications.java | 30 ++++---- .../java/sonia/scm/repository/Modified.java | 43 ++++++++++++ .../java/sonia/scm/repository/Removed.java | 43 ++++++++++++ .../java/sonia/scm/repository/Renamed.java | 44 ++++++++++++ .../scm/repository/ModificationsTest.java | 12 ++-- .../spi/GitModificationsCommand.java | 12 ++-- .../repository/spi/GitMergeCommandTest.java | 4 +- .../spi/javahg/AbstractChangesetCommand.java | 9 ++- .../java/sonia/scm/repository/SvnUtil.java | 6 +- .../resources/ModificationsToDtoMapper.java | 13 ++-- .../resources/ModificationsResourceTest.java | 6 +- 15 files changed, 299 insertions(+), 110 deletions(-) create mode 100644 scm-core/src/main/java/sonia/scm/repository/Added.java create mode 100644 scm-core/src/main/java/sonia/scm/repository/Copied.java create mode 100644 scm-core/src/main/java/sonia/scm/repository/EffectedPath.java create mode 100644 scm-core/src/main/java/sonia/scm/repository/Modified.java create mode 100644 scm-core/src/main/java/sonia/scm/repository/Removed.java create mode 100644 scm-core/src/main/java/sonia/scm/repository/Renamed.java diff --git a/scm-core/src/main/java/sonia/scm/repository/Added.java b/scm-core/src/main/java/sonia/scm/repository/Added.java new file mode 100644 index 0000000000..a5ccf848b4 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/Added.java @@ -0,0 +1,43 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.stream.Stream; + +import static java.util.stream.Stream.of; + +@Getter +@AllArgsConstructor +public class Added extends Modification { + private final String path; + + @Override + Stream getEffectedPaths() { + return of(path); + } +} diff --git a/scm-core/src/main/java/sonia/scm/repository/Copied.java b/scm-core/src/main/java/sonia/scm/repository/Copied.java new file mode 100644 index 0000000000..841136a035 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/Copied.java @@ -0,0 +1,44 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.stream.Stream; + +import static java.util.stream.Stream.of; + +@Getter +@AllArgsConstructor +public class Copied extends Modification { + private final String sourcePath; + private final String targetPath; + + @Override + Stream getEffectedPaths() { + return of(targetPath); + } +} diff --git a/scm-core/src/main/java/sonia/scm/repository/EffectedPath.java b/scm-core/src/main/java/sonia/scm/repository/EffectedPath.java new file mode 100644 index 0000000000..e591a47ac5 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/EffectedPath.java @@ -0,0 +1,31 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository; + +import java.util.stream.Stream; + +abstract class EffectedPath { + abstract Stream getEffectedPaths(); +} diff --git a/scm-core/src/main/java/sonia/scm/repository/Modification.java b/scm-core/src/main/java/sonia/scm/repository/Modification.java index 2b675230fa..7bb41e0573 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Modification.java +++ b/scm-core/src/main/java/sonia/scm/repository/Modification.java @@ -24,74 +24,7 @@ package sonia.scm.repository; -import lombok.AllArgsConstructor; -import lombok.Getter; - import java.io.Serializable; -import java.util.stream.Stream; -import static java.util.stream.Stream.of; - -public interface Modification extends EffectedPath, Serializable { - - @Getter - @AllArgsConstructor - class Added implements Modification { - private final String path; - - @Override - public Stream getEffectedPaths() { - return of(path); - } - } - - @Getter - @AllArgsConstructor - class Removed implements Modification { - private final String path; - - @Override - public Stream getEffectedPaths() { - return of(path); - } - } - - @Getter - @AllArgsConstructor - class Modified implements Modification { - private final String path; - - @Override - public Stream getEffectedPaths() { - return of(path); - } - } - - @Getter - @AllArgsConstructor - class Renamed implements Modification { - private final String oldPath; - private final String newPath; - - @Override - public Stream getEffectedPaths() { - return of(oldPath, newPath); - } - } - - @Getter - @AllArgsConstructor - class Copied implements Modification { - private final String sourcePath; - private final String targetPath; - - @Override - public Stream getEffectedPaths() { - return of(targetPath); - } - } -} - -interface EffectedPath { - Stream getEffectedPaths(); +public abstract class Modification extends EffectedPath implements Serializable { } diff --git a/scm-core/src/main/java/sonia/scm/repository/Modifications.java b/scm-core/src/main/java/sonia/scm/repository/Modifications.java index 891bf50216..42f1d85aef 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Modifications.java +++ b/scm-core/src/main/java/sonia/scm/repository/Modifications.java @@ -64,38 +64,38 @@ public class Modifications implements Serializable { return modifications.stream().flatMap(Modification::getEffectedPaths); } - public List getAdded() { + public List getAdded() { return modifications.stream() - .filter(m -> m instanceof Modification.Added) - .map(m -> (Modification.Added) m) + .filter(m -> m instanceof Added) + .map(m -> (Added) m) .collect(toList()); } - public List getRemoved() { + public List getRemoved() { return modifications.stream() - .filter(m -> m instanceof Modification.Removed) - .map(m -> (Modification.Removed) m) + .filter(m -> m instanceof Removed) + .map(m -> (Removed) m) .collect(toList()); } - public List getModified() { + public List getModified() { return modifications.stream() - .filter(m -> m instanceof Modification.Modified) - .map(m -> (Modification.Modified) m) + .filter(m -> m instanceof Modified) + .map(m -> (Modified) m) .collect(toList()); } - public List getRenamed() { + public List getRenamed() { return modifications.stream() - .filter(m -> m instanceof Modification.Renamed) - .map(m -> (Modification.Renamed) m) + .filter(m -> m instanceof Renamed) + .map(m -> (Renamed) m) .collect(toList()); } - public List getCopied() { + public List getCopied() { return modifications.stream() - .filter(m -> m instanceof Modification.Copied) - .map(m -> (Modification.Copied) m) + .filter(m -> m instanceof Copied) + .map(m -> (Copied) m) .collect(toList()); } } diff --git a/scm-core/src/main/java/sonia/scm/repository/Modified.java b/scm-core/src/main/java/sonia/scm/repository/Modified.java new file mode 100644 index 0000000000..6c0d7150a7 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/Modified.java @@ -0,0 +1,43 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.stream.Stream; + +import static java.util.stream.Stream.of; + +@Getter +@AllArgsConstructor +public class Modified extends Modification { + private final String path; + + @Override + Stream getEffectedPaths() { + return of(path); + } +} diff --git a/scm-core/src/main/java/sonia/scm/repository/Removed.java b/scm-core/src/main/java/sonia/scm/repository/Removed.java new file mode 100644 index 0000000000..7b8e23021f --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/Removed.java @@ -0,0 +1,43 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.stream.Stream; + +import static java.util.stream.Stream.of; + +@Getter +@AllArgsConstructor +public class Removed extends Modification { + private final String path; + + @Override + Stream getEffectedPaths() { + return of(path); + } +} diff --git a/scm-core/src/main/java/sonia/scm/repository/Renamed.java b/scm-core/src/main/java/sonia/scm/repository/Renamed.java new file mode 100644 index 0000000000..d00c01c6b6 --- /dev/null +++ b/scm-core/src/main/java/sonia/scm/repository/Renamed.java @@ -0,0 +1,44 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.stream.Stream; + +import static java.util.stream.Stream.of; + +@Getter +@AllArgsConstructor +public class Renamed extends Modification { + private final String oldPath; + private final String newPath; + + @Override + Stream getEffectedPaths() { + return of(oldPath, newPath); + } +} diff --git a/scm-core/src/test/java/sonia/scm/repository/ModificationsTest.java b/scm-core/src/test/java/sonia/scm/repository/ModificationsTest.java index 2832d8f5ef..f6023248e4 100644 --- a/scm-core/src/test/java/sonia/scm/repository/ModificationsTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/ModificationsTest.java @@ -24,20 +24,18 @@ package sonia.scm.repository; -import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.*; class ModificationsTest { public static final Modifications MODIFICATIONS = new Modifications("123", - new Modification.Added("added"), - new Modification.Removed("removed"), - new Modification.Modified("modified"), - new Modification.Renamed("rename from", "rename to"), - new Modification.Copied("copy from", "copy to") + new Added("added"), + new Removed("removed"), + new Modified("modified"), + new Renamed("rename from", "rename to"), + new Copied("copy from", "copy to") ); @Test diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitModificationsCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitModificationsCommand.java index d04e8293ca..918d276148 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitModificationsCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitModificationsCommand.java @@ -32,10 +32,14 @@ import org.eclipse.jgit.revwalk.RevTree; import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.treewalk.EmptyTreeIterator; import org.eclipse.jgit.treewalk.TreeWalk; +import sonia.scm.repository.Added; import sonia.scm.repository.GitUtil; import sonia.scm.repository.InternalRepositoryException; import sonia.scm.repository.Modification; import sonia.scm.repository.Modifications; +import sonia.scm.repository.Modified; +import sonia.scm.repository.Removed; +import sonia.scm.repository.Renamed; import java.io.IOException; import java.text.MessageFormat; @@ -117,13 +121,13 @@ public class GitModificationsCommand extends AbstractGitCommand implements Modif DiffEntry.ChangeType type = entry.getChangeType(); switch (type) { case ADD: - return new Modification.Added(entry.getNewPath()); + return new Added(entry.getNewPath()); case MODIFY: - return new Modification.Modified(entry.getNewPath()); + return new Modified(entry.getNewPath()); case DELETE: - return new Modification.Removed(entry.getOldPath()); + return new Removed(entry.getOldPath()); case RENAME: - return new Modification.Renamed(entry.getOldPath(), entry.getNewPath()); + return new Renamed(entry.getOldPath(), entry.getNewPath()); default: throw new UnsupportedModificationTypeException(entity(repository), MessageFormat.format("The modification type: {0} is not supported.", type)); } diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java index f8e7be6fd4..ed21f683fb 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/repository/spi/GitMergeCommandTest.java @@ -39,8 +39,8 @@ import org.junit.Test; import org.junit.jupiter.api.Assertions; import sonia.scm.NoChangesMadeException; import sonia.scm.NotFoundException; +import sonia.scm.repository.Added; import sonia.scm.repository.GitWorkdirFactory; -import sonia.scm.repository.Modification; import sonia.scm.repository.Person; import sonia.scm.repository.api.MergeCommandResult; import sonia.scm.repository.api.MergeStrategy; @@ -319,7 +319,7 @@ public class GitMergeCommandTest extends AbstractGitCommandTestBase { assertThat(message).isEqualTo("squash three commits"); GitModificationsCommand modificationsCommand = new GitModificationsCommand(createContext()); - List changes = modificationsCommand.getModifications("master").getAdded(); + List changes = modificationsCommand.getModifications("master").getAdded(); assertThat(changes.size()).isEqualTo(3); } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/AbstractChangesetCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/AbstractChangesetCommand.java index be2172f2fd..18ba2c8390 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/AbstractChangesetCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/AbstractChangesetCommand.java @@ -34,11 +34,14 @@ import com.aragost.javahg.internals.RuntimeIOException; import com.aragost.javahg.internals.Utils; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; +import sonia.scm.repository.Added; import sonia.scm.repository.Changeset; import sonia.scm.repository.HgConfig; import sonia.scm.repository.Modification; import sonia.scm.repository.Modifications; +import sonia.scm.repository.Modified; import sonia.scm.repository.Person; +import sonia.scm.repository.Removed; import java.io.IOException; import java.util.ArrayList; @@ -273,11 +276,11 @@ public abstract class AbstractChangesetCommand extends AbstractCommand String line = in.textUpTo('\n'); while (line.length() > 0) { if (line.startsWith("a ")) { - modifications.add(new Modification.Added(line.substring(2))); + modifications.add(new Added(line.substring(2))); } else if (line.startsWith("m ")) { - modifications.add(new Modification.Modified(line.substring(2))); + modifications.add(new Modified(line.substring(2))); } else if (line.startsWith("d ")) { - modifications.add(new Modification.Removed(line.substring(2))); + modifications.add(new Removed(line.substring(2))); } line = in.textUpTo('\n'); } diff --git a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java index 40a5ee5a69..26a851d1e2 100644 --- a/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java +++ b/scm-plugins/scm-svn-plugin/src/main/java/sonia/scm/repository/SvnUtil.java @@ -145,14 +145,14 @@ public final class SvnUtil switch (type) { case SVNLogEntryPath.TYPE_ADDED : - return Optional.of(new Modification.Added(path)); + return Optional.of(new Added(path)); case SVNLogEntryPath.TYPE_DELETED : - return Optional.of(new Modification.Removed(path)); + return Optional.of(new Removed(path)); case TYPE_UPDATED : case SVNLogEntryPath.TYPE_MODIFIED : - return Optional.of(new Modification.Modified(path)); + return Optional.of(new Modified(path)); default : logger.debug("unknown modification type {}", type); diff --git a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ModificationsToDtoMapper.java b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ModificationsToDtoMapper.java index 0e9f169f53..ec545402b7 100644 --- a/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ModificationsToDtoMapper.java +++ b/scm-webapp/src/main/java/sonia/scm/api/v2/resources/ModificationsToDtoMapper.java @@ -30,8 +30,11 @@ import org.mapstruct.Context; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.MappingTarget; -import sonia.scm.repository.Modification; +import sonia.scm.repository.Added; import sonia.scm.repository.Modifications; +import sonia.scm.repository.Modified; +import sonia.scm.repository.Removed; +import sonia.scm.repository.Renamed; import sonia.scm.repository.Repository; import javax.inject.Inject; @@ -54,17 +57,17 @@ public abstract class ModificationsToDtoMapper { target.add(linksBuilder.build()); } - String map(Modification.Added added) { + String map(Added added) { return added.getPath(); } - String map(Modification.Removed removed) { + String map(Removed removed) { return removed.getPath(); } - String map(Modification.Modified modified) { + String map(Modified modified) { return modified.getPath(); } - abstract ModificationsDto.RenamedDto map(Modification.Renamed renamed); + abstract ModificationsDto.RenamedDto map(Renamed renamed); } diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java index 3697330587..9c6a3b984c 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/ModificationsResourceTest.java @@ -39,12 +39,12 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import sonia.scm.repository.Added; import sonia.scm.repository.InternalRepositoryException; -import sonia.scm.repository.Modification.Added; -import sonia.scm.repository.Modification.Modified; -import sonia.scm.repository.Modification.Removed; import sonia.scm.repository.Modifications; import sonia.scm.repository.NamespaceAndName; +import sonia.scm.repository.Removed; +import sonia.scm.repository.Modified; import sonia.scm.repository.Repository; import sonia.scm.repository.api.ModificationsCommandBuilder; import sonia.scm.repository.api.RepositoryService; From 541d6ee0c607174e9383662107605d9f04b86f57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Fri, 15 May 2020 21:39:04 +0200 Subject: [PATCH 21/54] Support copy and renamed modifications for hg --- .../main/java/sonia/scm/repository/Added.java | 6 +- .../java/sonia/scm/repository/Copied.java | 6 +- .../java/sonia/scm/repository/Modified.java | 6 +- .../java/sonia/scm/repository/Removed.java | 6 +- .../java/sonia/scm/repository/Renamed.java | 6 +- .../spi/javahg/AbstractChangesetCommand.java | 17 +--- .../spi/javahg/HgModificationParser.java | 64 +++++++++++++++ .../sonia/scm/styles/changesets-eager.style | 5 +- .../spi/javahg/HgModificationParserTest.java | 82 +++++++++++++++++++ 9 files changed, 162 insertions(+), 36 deletions(-) create mode 100644 scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/HgModificationParser.java create mode 100644 scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/javahg/HgModificationParserTest.java diff --git a/scm-core/src/main/java/sonia/scm/repository/Added.java b/scm-core/src/main/java/sonia/scm/repository/Added.java index a5ccf848b4..c61c82fd03 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Added.java +++ b/scm-core/src/main/java/sonia/scm/repository/Added.java @@ -24,15 +24,13 @@ package sonia.scm.repository; -import lombok.AllArgsConstructor; -import lombok.Getter; +import lombok.Value; import java.util.stream.Stream; import static java.util.stream.Stream.of; -@Getter -@AllArgsConstructor +@Value public class Added extends Modification { private final String path; diff --git a/scm-core/src/main/java/sonia/scm/repository/Copied.java b/scm-core/src/main/java/sonia/scm/repository/Copied.java index 841136a035..45153cb91e 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Copied.java +++ b/scm-core/src/main/java/sonia/scm/repository/Copied.java @@ -24,15 +24,13 @@ package sonia.scm.repository; -import lombok.AllArgsConstructor; -import lombok.Getter; +import lombok.Value; import java.util.stream.Stream; import static java.util.stream.Stream.of; -@Getter -@AllArgsConstructor +@Value public class Copied extends Modification { private final String sourcePath; private final String targetPath; diff --git a/scm-core/src/main/java/sonia/scm/repository/Modified.java b/scm-core/src/main/java/sonia/scm/repository/Modified.java index 6c0d7150a7..38f50ef2c0 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Modified.java +++ b/scm-core/src/main/java/sonia/scm/repository/Modified.java @@ -24,15 +24,13 @@ package sonia.scm.repository; -import lombok.AllArgsConstructor; -import lombok.Getter; +import lombok.Value; import java.util.stream.Stream; import static java.util.stream.Stream.of; -@Getter -@AllArgsConstructor +@Value public class Modified extends Modification { private final String path; diff --git a/scm-core/src/main/java/sonia/scm/repository/Removed.java b/scm-core/src/main/java/sonia/scm/repository/Removed.java index 7b8e23021f..4cc7ba8800 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Removed.java +++ b/scm-core/src/main/java/sonia/scm/repository/Removed.java @@ -24,15 +24,13 @@ package sonia.scm.repository; -import lombok.AllArgsConstructor; -import lombok.Getter; +import lombok.Value; import java.util.stream.Stream; import static java.util.stream.Stream.of; -@Getter -@AllArgsConstructor +@Value public class Removed extends Modification { private final String path; diff --git a/scm-core/src/main/java/sonia/scm/repository/Renamed.java b/scm-core/src/main/java/sonia/scm/repository/Renamed.java index d00c01c6b6..3535b8bf9b 100644 --- a/scm-core/src/main/java/sonia/scm/repository/Renamed.java +++ b/scm-core/src/main/java/sonia/scm/repository/Renamed.java @@ -24,15 +24,13 @@ package sonia.scm.repository; -import lombok.AllArgsConstructor; -import lombok.Getter; +import lombok.Value; import java.util.stream.Stream; import static java.util.stream.Stream.of; -@Getter -@AllArgsConstructor +@Value public class Renamed extends Modification { private final String oldPath; private final String newPath; diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/AbstractChangesetCommand.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/AbstractChangesetCommand.java index 18ba2c8390..5aea125875 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/AbstractChangesetCommand.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/AbstractChangesetCommand.java @@ -34,17 +34,12 @@ import com.aragost.javahg.internals.RuntimeIOException; import com.aragost.javahg.internals.Utils; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; -import sonia.scm.repository.Added; import sonia.scm.repository.Changeset; import sonia.scm.repository.HgConfig; import sonia.scm.repository.Modification; -import sonia.scm.repository.Modifications; -import sonia.scm.repository.Modified; import sonia.scm.repository.Person; -import sonia.scm.repository.Removed; import java.io.IOException; -import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -272,19 +267,13 @@ public abstract class AbstractChangesetCommand extends AbstractCommand } private Collection extractModifications(HgInputStream in) throws IOException { - Collection modifications = new ArrayList<>(); + HgModificationParser hgModificationParser = new HgModificationParser(); String line = in.textUpTo('\n'); while (line.length() > 0) { - if (line.startsWith("a ")) { - modifications.add(new Added(line.substring(2))); - } else if (line.startsWith("m ")) { - modifications.add(new Modified(line.substring(2))); - } else if (line.startsWith("d ")) { - modifications.add(new Removed(line.substring(2))); - } + hgModificationParser.addLine(line); line = in.textUpTo('\n'); } - return modifications; + return hgModificationParser.getModifications(); } /** diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/HgModificationParser.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/HgModificationParser.java new file mode 100644 index 0000000000..e57cab9279 --- /dev/null +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/repository/spi/javahg/HgModificationParser.java @@ -0,0 +1,64 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository.spi.javahg; + +import sonia.scm.repository.Added; +import sonia.scm.repository.Copied; +import sonia.scm.repository.Modification; +import sonia.scm.repository.Modified; +import sonia.scm.repository.Removed; +import sonia.scm.repository.Renamed; + +import java.util.Collection; +import java.util.LinkedHashSet; + +class HgModificationParser { + private final Collection modifications = new LinkedHashSet<>(); + + void addLine(String line) { + if (line.startsWith("a ")) { + modifications.add(new Added(line.substring(2))); + } else if (line.startsWith("m ")) { + modifications.add(new Modified(line.substring(2))); + } else if (line.startsWith("d ")) { + modifications.add(new Removed(line.substring(2))); + } else if (line.startsWith("c ")) { + String sourceTarget = line.substring(2); + int divider = sourceTarget.indexOf('\0'); + String source = sourceTarget.substring(0, divider); + String target = sourceTarget.substring(divider + 1); + modifications.remove(new Added(target)); + if (modifications.remove(new Removed(source))) { + modifications.add(new Renamed(source, target)); + } else { + modifications.add(new Copied(source, target)); + } + } + } + + Collection getModifications() { + return modifications; + } +} diff --git a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/styles/changesets-eager.style b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/styles/changesets-eager.style index 2185c47a05..07c31fd7ea 100644 --- a/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/styles/changesets-eager.style +++ b/scm-plugins/scm-hg-plugin/src/main/resources/sonia/scm/styles/changesets-eager.style @@ -1,8 +1,9 @@ header = "%{pattern}" -changeset = "{rev}:{node}{author}\n{date|hgdate}\n{branch}\n{parents}{extras}\n{tags}{file_adds}{file_mods}{file_dels}\n{desc}\0" +changeset = "{rev}:{node}{author}\n{date|hgdate}\n{branch}\n{parents}{extras}\n{tags}{file_adds}{file_mods}{file_dels}{file_copies}\n{desc}\0" tag = "t {tag}\n" file_add = "a {file_add}\n" file_mod = "m {file_mod}\n" file_del = "d {file_del}\n" +file_copy = "c {source}\0{name}\n" extra = "{key}={value|stringescape}," -footer = "%{pattern}" \ No newline at end of file +footer = "%{pattern}" diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/javahg/HgModificationParserTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/javahg/HgModificationParserTest.java new file mode 100644 index 0000000000..5c36134a0d --- /dev/null +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/javahg/HgModificationParserTest.java @@ -0,0 +1,82 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.repository.spi.javahg; + +import org.junit.jupiter.api.Test; +import sonia.scm.repository.Added; +import sonia.scm.repository.Copied; +import sonia.scm.repository.Modified; +import sonia.scm.repository.Removed; +import sonia.scm.repository.Renamed; + +import static org.assertj.core.api.Assertions.assertThat; + +class HgModificationParserTest { + + HgModificationParser parser = new HgModificationParser(); + + @Test + void shouldDetectAddedPath() { + parser.addLine("a added/file"); + + assertThat(parser.getModifications()) + .containsExactly(new Added("added/file")); + } + + @Test + void shouldDetectModifiedPath() { + parser.addLine("m modified/file"); + + assertThat(parser.getModifications()) + .containsExactly(new Modified("modified/file")); + } + + @Test + void shouldDetectRemovedPath() { + parser.addLine("d removed/file"); + + assertThat(parser.getModifications()) + .containsExactly(new Removed("removed/file")); + } + + @Test + void shouldDetectRenamedPath() { + parser.addLine("a new/path"); + parser.addLine("d old/path"); + parser.addLine("c old/path\0new/path"); + + assertThat(parser.getModifications()) + .containsExactly(new Renamed("old/path", "new/path")); + } + + @Test + void shouldCopiedRenamedPath() { + parser.addLine("a new/path"); + parser.addLine("c old/path\0new/path"); + + assertThat(parser.getModifications()) + .containsExactly(new Copied("old/path", "new/path")); + } +} From 9c86107674e9024be53f64edd71dabdff7d6142e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 19 May 2020 09:53:16 +0200 Subject: [PATCH 22/54] Use fixed version of gitparser --- package.json | 2 +- yarn.lock | 1745 ++++++++++++++++++++++++++------------------------ 2 files changed, 902 insertions(+), 845 deletions(-) diff --git a/package.json b/package.json index 6c3b45c9ca..4045306d30 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "resolutions": { "babel-core": "7.0.0-bridge.0", - "gitdiff-parser": "https://github.com/scm-manager/gitdiff-parser#ed3fe7de73dbb0a06c3e6adbbdf22dbae6e66351", + "gitdiff-parser": "https://github.com/scm-manager/gitdiff-parser#1da10408e52ad1d58b1f817dd1d658d9f2eb4087", "lowlight": "1.13.1" }, "babel": { diff --git a/yarn.lock b/yarn.lock index f33b9dd3fd..bf850ef2f3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16,28 +16,28 @@ dependencies: "@babel/highlight" "^7.8.3" -"@babel/compat-data@^7.8.6", "@babel/compat-data@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.0.tgz#04815556fc90b0c174abd2c0c1bb966faa036a6c" - integrity sha512-zeFQrr+284Ekvd9e7KAX954LkapWiOmQtsfHirhxqfdlX6MEC32iRE+pqUGlYIBchdevaCwvzxWGSy/YBNI85g== +"@babel/compat-data@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.9.6.tgz#3f604c40e420131affe6f2c8052e9a275ae2049b" + integrity sha512-5QPTrNen2bm7RBc7dsOmcA5hbrS4O2Vhmk5XOL4zWW/zD/hV0iinpefDlkm+tBBy8kDtFaaeEvmAqt+nURAV2g== dependencies: - browserslist "^4.9.1" + browserslist "^4.11.1" invariant "^2.2.4" semver "^5.5.0" "@babel/core@^7.1.0", "@babel/core@^7.4.5", "@babel/core@^7.6.3", "@babel/core@^7.7.5": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.0.tgz#ac977b538b77e132ff706f3b8a4dbad09c03c56e" - integrity sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w== + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.9.6.tgz#d9aa1f580abf3b2286ef40b6904d390904c63376" + integrity sha512-nD3deLvbsApbHAHttzIssYqgb883yU/d9roe4RZymBCDaZryMJDbptVpEpeQuRh4BJ+SYI8le9YGxKvFEvl1Wg== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" + "@babel/generator" "^7.9.6" "@babel/helper-module-transforms" "^7.9.0" - "@babel/helpers" "^7.9.0" - "@babel/parser" "^7.9.0" + "@babel/helpers" "^7.9.6" + "@babel/parser" "^7.9.6" "@babel/template" "^7.8.6" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -47,12 +47,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.0", "@babel/generator@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.4.tgz#12441e90c3b3c4159cdecf312075bf1a8ce2dbce" - integrity sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA== +"@babel/generator@^7.4.0", "@babel/generator@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.9.6.tgz#5408c82ac5de98cda0d77d8124e99fa1f2170a43" + integrity sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ== dependencies: - "@babel/types" "^7.9.0" + "@babel/types" "^7.9.6" jsesc "^2.5.1" lodash "^4.17.13" source-map "^0.5.0" @@ -73,13 +73,13 @@ "@babel/types" "^7.8.3" "@babel/helper-builder-react-jsx-experimental@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.0.tgz#066d80262ade488f9c1b1823ce5db88a4cedaa43" - integrity sha512-3xJEiyuYU4Q/Ar9BsHisgdxZsRlsShMe90URZ0e6przL26CCs8NJbDoxH94kKT17PcxlMhsCAwZd90evCo26VQ== + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-react-jsx-experimental/-/helper-builder-react-jsx-experimental-7.9.5.tgz#0b4b3e04e6123f03b404ca4dfd6528fe6bb92fe3" + integrity sha512-HAagjAC93tk748jcXpZ7oYRZH485RCq/+yEv9SIWezHRPv9moZArTnkUNciUNzvwHUABmiWKlcxJvMcu59UwTg== dependencies: "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-module-imports" "^7.8.3" - "@babel/types" "^7.9.0" + "@babel/types" "^7.9.5" "@babel/helper-builder-react-jsx@^7.9.0": version "7.9.0" @@ -89,27 +89,27 @@ "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/types" "^7.9.0" -"@babel/helper-compilation-targets@^7.8.7": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz#dac1eea159c0e4bd46e309b5a1b04a66b53c1dde" - integrity sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw== +"@babel/helper-compilation-targets@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.9.6.tgz#1e05b7ccc9d38d2f8b40b458b380a04dcfadd38a" + integrity sha512-x2Nvu0igO0ejXzx09B/1fGBxY9NXQlBW2kZsSxCJft+KHN8t9XWzIvFxtPHnBOAXpVsdxZKZFbRUC8TsNKajMw== dependencies: - "@babel/compat-data" "^7.8.6" - browserslist "^4.9.1" + "@babel/compat-data" "^7.9.6" + browserslist "^4.11.1" invariant "^2.2.4" levenary "^1.1.1" semver "^5.5.0" -"@babel/helper-create-class-features-plugin@^7.8.3": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz#243a5b46e2f8f0f674dc1387631eb6b28b851de0" - integrity sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg== +"@babel/helper-create-class-features-plugin@^7.8.3", "@babel/helper-create-class-features-plugin@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.9.6.tgz#965c8b0a9f051801fd9d3b372ca0ccf200a90897" + integrity sha512-6N9IeuyHvMBRyjNYOMJHrhwtu4WJMrYf8hVbEHD3pbbbmNOk1kmXSQs7bA4dYDUaIx4ZEzdnvo6NwC3WHd/Qow== dependencies: - "@babel/helper-function-name" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" "@babel/helper-member-expression-to-functions" "^7.8.3" "@babel/helper-optimise-call-expression" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" - "@babel/helper-replace-supers" "^7.8.6" + "@babel/helper-replace-supers" "^7.9.6" "@babel/helper-split-export-declaration" "^7.8.3" "@babel/helper-create-regexp-features-plugin@^7.8.3", "@babel/helper-create-regexp-features-plugin@^7.8.8": @@ -138,14 +138,14 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-function-name@^7.8.3": - version "7.8.3" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.8.3.tgz#eeeb665a01b1f11068e9fb86ad56a1cb1a824cca" - integrity sha512-BCxgX1BC2hD/oBlIFUgOCQDOPV8nSINxCwM3o93xP4P9Fq6aV5sgv2cOOITDMtCfQ+3PvHp3l689XZvAM9QyOA== +"@babel/helper-function-name@^7.8.3", "@babel/helper-function-name@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz#2b53820d35275120e1874a82e5aabe1376920a5c" + integrity sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw== dependencies: "@babel/helper-get-function-arity" "^7.8.3" "@babel/template" "^7.8.3" - "@babel/types" "^7.8.3" + "@babel/types" "^7.9.5" "@babel/helper-get-function-arity@^7.8.3": version "7.8.3" @@ -218,15 +218,15 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6": - version "7.8.6" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz#5ada744fd5ad73203bf1d67459a27dcba67effc8" - integrity sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA== +"@babel/helper-replace-supers@^7.8.3", "@babel/helper-replace-supers@^7.8.6", "@babel/helper-replace-supers@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.9.6.tgz#03149d7e6a5586ab6764996cd31d6981a17e1444" + integrity sha512-qX+chbxkbArLyCImk3bWV+jB5gTNU/rsze+JlcF6Nf8tVTigPJSI1o1oBow/9Resa1yehUO9lIipsmu9oG4RzA== dependencies: "@babel/helper-member-expression-to-functions" "^7.8.3" "@babel/helper-optimise-call-expression" "^7.8.3" - "@babel/traverse" "^7.8.6" - "@babel/types" "^7.8.6" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" "@babel/helper-simple-access@^7.8.3": version "7.8.3" @@ -243,10 +243,10 @@ dependencies: "@babel/types" "^7.8.3" -"@babel/helper-validator-identifier@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz#ad53562a7fc29b3b9a91bbf7d10397fd146346ed" - integrity sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw== +"@babel/helper-validator-identifier@^7.9.0", "@babel/helper-validator-identifier@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz#90977a8e6fbf6b431a7dc31752eee233bf052d80" + integrity sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g== "@babel/helper-wrap-function@^7.8.3": version "7.8.3" @@ -258,14 +258,14 @@ "@babel/traverse" "^7.8.3" "@babel/types" "^7.8.3" -"@babel/helpers@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.2.tgz#b42a81a811f1e7313b88cba8adc66b3d9ae6c09f" - integrity sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA== +"@babel/helpers@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.9.6.tgz#092c774743471d0bb6c7de3ad465ab3d3486d580" + integrity sha512-tI4bUbldloLcHWoRUMAj4g1bF313M/o6fBKhIsb3QnGVPwRm9JsNf/gqMkQ7zjqReABiffPV6RWj7hEglID5Iw== dependencies: "@babel/template" "^7.8.3" - "@babel/traverse" "^7.9.0" - "@babel/types" "^7.9.0" + "@babel/traverse" "^7.9.6" + "@babel/types" "^7.9.6" "@babel/highlight@^7.0.0", "@babel/highlight@^7.8.3": version "7.9.0" @@ -276,10 +276,10 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.4.tgz#68a35e6b0319bbc014465be43828300113f2f2e8" - integrity sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA== +"@babel/parser@^7.1.0", "@babel/parser@^7.4.3", "@babel/parser@^7.7.0", "@babel/parser@^7.8.6", "@babel/parser@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.9.6.tgz#3b1bbb30dabe600cd72db58720998376ff653bc7" + integrity sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q== "@babel/plugin-proposal-async-generator-functions@^7.8.3": version "7.8.3" @@ -330,13 +330,14 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-numeric-separator" "^7.8.3" -"@babel/plugin-proposal-object-rest-spread@^7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.0.tgz#a28993699fc13df165995362693962ba6b061d6f" - integrity sha512-UgqBv6bjq4fDb8uku9f+wcm1J7YxJ5nT7WO/jBr0cl0PLKb7t1O6RNR1kZbjgx2LQtsDI9hwoQVmn0yhXeQyow== +"@babel/plugin-proposal-object-rest-spread@^7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.6.tgz#7a093586fcb18b08266eb1a7177da671ac575b63" + integrity sha512-Ga6/fhGqA9Hj+y6whNpPv8psyaK5xzrQwSPsGPloVkvmH+PqW1ixdnfJ9uIO06OjQNYol3PMnfmJ8vfZtkzF+A== dependencies: "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" + "@babel/plugin-transform-parameters" "^7.9.5" "@babel/plugin-proposal-optional-catch-binding@^7.8.3": version "7.8.3" @@ -491,14 +492,14 @@ "@babel/helper-plugin-utils" "^7.8.3" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.9.0": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.2.tgz#8603fc3cc449e31fdbdbc257f67717536a11af8d" - integrity sha512-TC2p3bPzsfvSsqBZo0kJnuelnoK9O3welkUpqSqBQuBF6R5MN2rysopri8kNvtlGIb2jmUO7i15IooAZJjZuMQ== +"@babel/plugin-transform-classes@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz#800597ddb8aefc2c293ed27459c1fcc935a26c2c" + integrity sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg== dependencies: "@babel/helper-annotate-as-pure" "^7.8.3" "@babel/helper-define-map" "^7.8.3" - "@babel/helper-function-name" "^7.8.3" + "@babel/helper-function-name" "^7.9.5" "@babel/helper-optimise-call-expression" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-replace-supers" "^7.8.6" @@ -512,10 +513,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-destructuring@^7.8.3": - version "7.8.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.8.8.tgz#fadb2bc8e90ccaf5658de6f8d4d22ff6272a2f4b" - integrity sha512-eRJu4Vs2rmttFCdhPUM3bV0Yo/xPSdPw6ML9KHs/bjB4bLA5HXlbvYXPOD5yASodGod+krjYx21xm1QmL8dCJQ== +"@babel/plugin-transform-destructuring@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz#72c97cf5f38604aea3abf3b935b0e17b1db76a50" + integrity sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q== dependencies: "@babel/helper-plugin-utils" "^7.8.3" @@ -579,34 +580,34 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-transform-modules-amd@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz#19755ee721912cf5bb04c07d50280af3484efef4" - integrity sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q== +"@babel/plugin-transform-modules-amd@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.6.tgz#8539ec42c153d12ea3836e0e3ac30d5aae7b258e" + integrity sha512-zoT0kgC3EixAyIAU+9vfaUVKTv9IxBDSabgHoUCBP6FqEJ+iNiN7ip7NBKcYqbfUDfuC2mFCbM7vbu4qJgOnDw== dependencies: "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.0.tgz#e3e72f4cbc9b4a260e30be0ea59bdf5a39748940" - integrity sha512-qzlCrLnKqio4SlgJ6FMMLBe4bySNis8DFn1VkGmOcxG9gqEyPIOzeQrA//u0HAKrWpJlpZbZMPB1n/OPa4+n8g== +"@babel/plugin-transform-modules-commonjs@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.9.6.tgz#64b7474a4279ee588cacd1906695ca721687c277" + integrity sha512-7H25fSlLcn+iYimmsNe3uK1at79IE6SKW9q0/QeEHTMC9MdOZ+4bA+T1VFB5fgOqBWoqlifXRzYD0JPdmIrgSQ== dependencies: "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-simple-access" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz#e9fd46a296fc91e009b64e07ddaa86d6f0edeb90" - integrity sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ== +"@babel/plugin-transform-modules-systemjs@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.6.tgz#207f1461c78a231d5337a92140e52422510d81a4" + integrity sha512-NW5XQuW3N2tTHim8e1b7qGy7s0kZ2OH3m5octc49K1SdAKGxYxeIx7hiIz05kS1R2R+hOWcsr1eYwcGhrdHsrg== dependencies: "@babel/helper-hoist-variables" "^7.8.3" "@babel/helper-module-transforms" "^7.9.0" "@babel/helper-plugin-utils" "^7.8.3" - babel-plugin-dynamic-import-node "^2.3.0" + babel-plugin-dynamic-import-node "^2.3.3" "@babel/plugin-transform-modules-umd@^7.9.0": version "7.9.0" @@ -638,10 +639,10 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/helper-replace-supers" "^7.8.3" -"@babel/plugin-transform-parameters@^7.8.7": - version "7.9.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.3.tgz#3028d0cc20ddc733166c6e9c8534559cee09f54a" - integrity sha512-fzrQFQhp7mIhOzmOtPiKffvCYQSK10NR8t6BBz2yPbeUHb9OLW8RZGtgDRBn8z2hGcwvKDL3vC7ojPTLNxmqEg== +"@babel/plugin-transform-parameters@^7.9.5": + version "7.9.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz#173b265746f5e15b2afe527eeda65b73623a0795" + integrity sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA== dependencies: "@babel/helper-get-function-arity" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" @@ -754,11 +755,11 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-transform-typescript@^7.9.0": - version "7.9.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.4.tgz#4bb4dde4f10bbf2d787fce9707fb09b483e33359" - integrity sha512-yeWeUkKx2auDbSxRe8MusAG+n4m9BFY/v+lPjmQDgOFX5qnySkUY5oXzkp6FwPdsYqnKay6lorXYdC0n3bZO7w== + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.9.6.tgz#2248971416a506fc78278fc0c0ea3179224af1e9" + integrity sha512-8OvsRdvpt3Iesf2qsAn+YdlwAJD7zJ+vhFZmDCa4b8dTp7MmHtKk5FF2mCsGxjZwuwsy/yIIay/nLmxST1ctVQ== dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-create-class-features-plugin" "^7.9.6" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-typescript" "^7.8.3" @@ -779,12 +780,12 @@ regenerator-runtime "^0.13.4" "@babel/preset-env@^7.4.5", "@babel/preset-env@^7.6.3": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.0.tgz#a5fc42480e950ae8f5d9f8f2bbc03f52722df3a8" - integrity sha512-712DeRXT6dyKAM/FMbQTV/FvRCms2hPCx+3weRjZ8iQVQWZejWWk1wwG6ViWMyqb/ouBbGOl5b6aCk0+j1NmsQ== + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.9.6.tgz#df063b276c6455ec6fcfc6e53aacc38da9b0aea6" + integrity sha512-0gQJ9RTzO0heXOhzftog+a/WyOuqMrAIugVYxMYf83gh1CQaQDjMtsOpqOwXyDL/5JcWsrCm8l4ju8QC97O7EQ== dependencies: - "@babel/compat-data" "^7.9.0" - "@babel/helper-compilation-targets" "^7.8.7" + "@babel/compat-data" "^7.9.6" + "@babel/helper-compilation-targets" "^7.9.6" "@babel/helper-module-imports" "^7.8.3" "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-proposal-async-generator-functions" "^7.8.3" @@ -792,7 +793,7 @@ "@babel/plugin-proposal-json-strings" "^7.8.3" "@babel/plugin-proposal-nullish-coalescing-operator" "^7.8.3" "@babel/plugin-proposal-numeric-separator" "^7.8.3" - "@babel/plugin-proposal-object-rest-spread" "^7.9.0" + "@babel/plugin-proposal-object-rest-spread" "^7.9.6" "@babel/plugin-proposal-optional-catch-binding" "^7.8.3" "@babel/plugin-proposal-optional-chaining" "^7.9.0" "@babel/plugin-proposal-unicode-property-regex" "^7.8.3" @@ -809,9 +810,9 @@ "@babel/plugin-transform-async-to-generator" "^7.8.3" "@babel/plugin-transform-block-scoped-functions" "^7.8.3" "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-classes" "^7.9.0" + "@babel/plugin-transform-classes" "^7.9.5" "@babel/plugin-transform-computed-properties" "^7.8.3" - "@babel/plugin-transform-destructuring" "^7.8.3" + "@babel/plugin-transform-destructuring" "^7.9.5" "@babel/plugin-transform-dotall-regex" "^7.8.3" "@babel/plugin-transform-duplicate-keys" "^7.8.3" "@babel/plugin-transform-exponentiation-operator" "^7.8.3" @@ -819,14 +820,14 @@ "@babel/plugin-transform-function-name" "^7.8.3" "@babel/plugin-transform-literals" "^7.8.3" "@babel/plugin-transform-member-expression-literals" "^7.8.3" - "@babel/plugin-transform-modules-amd" "^7.9.0" - "@babel/plugin-transform-modules-commonjs" "^7.9.0" - "@babel/plugin-transform-modules-systemjs" "^7.9.0" + "@babel/plugin-transform-modules-amd" "^7.9.6" + "@babel/plugin-transform-modules-commonjs" "^7.9.6" + "@babel/plugin-transform-modules-systemjs" "^7.9.6" "@babel/plugin-transform-modules-umd" "^7.9.0" "@babel/plugin-transform-named-capturing-groups-regex" "^7.8.3" "@babel/plugin-transform-new-target" "^7.8.3" "@babel/plugin-transform-object-super" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.8.7" + "@babel/plugin-transform-parameters" "^7.9.5" "@babel/plugin-transform-property-literals" "^7.8.3" "@babel/plugin-transform-regenerator" "^7.8.7" "@babel/plugin-transform-reserved-words" "^7.8.3" @@ -837,8 +838,8 @@ "@babel/plugin-transform-typeof-symbol" "^7.8.4" "@babel/plugin-transform-unicode-regex" "^7.8.3" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.9.0" - browserslist "^4.9.1" + "@babel/types" "^7.9.6" + browserslist "^4.11.1" core-js-compat "^3.6.2" invariant "^2.2.2" levenary "^1.1.1" @@ -884,17 +885,17 @@ "@babel/plugin-transform-typescript" "^7.9.0" "@babel/runtime-corejs3@^7.8.3": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.2.tgz#26fe4aa77e9f1ecef9b776559bbb8e84d34284b7" - integrity sha512-HHxmgxbIzOfFlZ+tdeRKtaxWOMUoCG5Mu3wKeUmOxjYrwb3AAHgnmtCUbPPK11/raIWLIBK250t8E2BPO0p7jA== + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs3/-/runtime-corejs3-7.9.6.tgz#67aded13fffbbc2cb93247388cf84d77a4be9a71" + integrity sha512-6toWAfaALQjt3KMZQc6fABqZwUDDuWzz+cAfPhqyEnzxvdWOAkjwPNxgF8xlmo7OWLsSjaKjsskpKHRLaMArOA== dependencies: core-js-pure "^3.0.0" regenerator-runtime "^0.13.4" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.3.4", "@babel/runtime@^7.4.0", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": - version "7.9.2" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.2.tgz#d90df0583a3a252f09aaa619665367bae518db06" - integrity sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q== +"@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.7.2", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f" + integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ== dependencies: regenerator-runtime "^0.13.4" @@ -907,27 +908,27 @@ "@babel/parser" "^7.8.6" "@babel/types" "^7.8.6" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.8.6", "@babel/traverse@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.0.tgz#d3882c2830e513f4fe4cec9fe76ea1cc78747892" - integrity sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w== +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.3", "@babel/traverse@^7.7.0", "@babel/traverse@^7.8.3", "@babel/traverse@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.9.6.tgz#5540d7577697bf619cc57b92aa0f1c231a94f442" + integrity sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg== dependencies: "@babel/code-frame" "^7.8.3" - "@babel/generator" "^7.9.0" - "@babel/helper-function-name" "^7.8.3" + "@babel/generator" "^7.9.6" + "@babel/helper-function-name" "^7.9.5" "@babel/helper-split-export-declaration" "^7.8.3" - "@babel/parser" "^7.9.0" - "@babel/types" "^7.9.0" + "@babel/parser" "^7.9.6" + "@babel/types" "^7.9.6" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.13" -"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0": - version "7.9.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.0.tgz#00b064c3df83ad32b2dbf5ff07312b15c7f1efb5" - integrity sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng== +"@babel/types@^7.0.0", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.7.0", "@babel/types@^7.8.3", "@babel/types@^7.8.6", "@babel/types@^7.9.0", "@babel/types@^7.9.5", "@babel/types@^7.9.6": + version "7.9.6" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" + integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== dependencies: - "@babel/helper-validator-identifier" "^7.9.0" + "@babel/helper-validator-identifier" "^7.9.5" lodash "^4.17.13" to-fast-properties "^2.0.0" @@ -1315,24 +1316,24 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" -"@jest/types@^25.2.6": - version "25.2.6" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.2.6.tgz#c12f44af9bed444438091e4b59e7ed05f8659cb6" - integrity sha512-myJTTV37bxK7+3NgKc4Y/DlQ5q92/NOwZsZ+Uch7OXdElxOg61QYc72fPYNAjlvbnJ2YvbXLamIsa9tj48BmyQ== +"@jest/types@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-25.5.0.tgz#4d6a4793f7b9599fc3680877b856a97dbccf2a9d" + integrity sha512-OXD0RgQ86Tu3MazKo8bnrkDRaDXXMGUqd+kTtLtK1Zb7CRzQcaSRPPPV37SvYTdevXEBVxe0HXylEjs8ibkmCw== dependencies: "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^15.0.0" chalk "^3.0.0" -"@lerna/add@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.20.0.tgz#bea7edf36fc93fb72ec34cb9ba854c48d4abf309" - integrity sha512-AnH1oRIEEg/VDa3SjYq4x1/UglEAvrZuV0WssHUMN81RTZgQk3we+Mv3qZNddrZ/fBcZu2IAdN/EQ3+ie2JxKQ== +"@lerna/add@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/add/-/add-3.21.0.tgz#27007bde71cc7b0a2969ab3c2f0ae41578b4577b" + integrity sha512-vhUXXF6SpufBE1EkNEXwz1VLW03f177G9uMOFMQkp6OJ30/PWg4Ekifuz9/3YfgB2/GH8Tu4Lk3O51P2Hskg/A== dependencies: "@evocateur/pacote" "^9.6.3" - "@lerna/bootstrap" "3.20.0" - "@lerna/command" "3.18.5" + "@lerna/bootstrap" "3.21.0" + "@lerna/command" "3.21.0" "@lerna/filter-options" "3.20.0" "@lerna/npm-conf" "3.16.0" "@lerna/validation-error" "3.13.0" @@ -1341,12 +1342,12 @@ p-map "^2.1.0" semver "^6.2.0" -"@lerna/bootstrap@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.20.0.tgz#635d71046830f208e851ab429a63da1747589e37" - integrity sha512-Wylullx3uthKE7r4izo09qeRGL20Y5yONlQEjPCfnbxCC2Elu+QcPu4RC6kqKQ7b+g7pdC3OOgcHZjngrwr5XQ== +"@lerna/bootstrap@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/bootstrap/-/bootstrap-3.21.0.tgz#bcd1b651be5b0970b20d8fae04c864548123aed6" + integrity sha512-mtNHlXpmvJn6JTu0KcuTTPl2jLsDNud0QacV/h++qsaKbhAaJr/FElNZ5s7MwZFUM3XaDmvWzHKaszeBMHIbBw== dependencies: - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/filter-options" "3.20.0" "@lerna/has-npm-version" "3.16.5" "@lerna/npm-install" "3.16.5" @@ -1370,13 +1371,13 @@ read-package-tree "^5.1.6" semver "^6.2.0" -"@lerna/changed@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.20.0.tgz#66b97ebd6c8f8d207152ee524a0791846a9097ae" - integrity sha512-+hzMFSldbRPulZ0vbKk6RD9f36gaH3Osjx34wrrZ62VB4pKmjyuS/rxVYkCA3viPLHoiIw2F8zHM5BdYoDSbjw== +"@lerna/changed@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/changed/-/changed-3.21.0.tgz#108e15f679bfe077af500f58248c634f1044ea0b" + integrity sha512-hzqoyf8MSHVjZp0gfJ7G8jaz+++mgXYiNs9iViQGA8JlN/dnWLI5sWDptEH3/B30Izo+fdVz0S0s7ydVE3pWIw== dependencies: "@lerna/collect-updates" "3.20.0" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/listable" "3.18.5" "@lerna/output" "3.13.0" @@ -1398,12 +1399,12 @@ execa "^1.0.0" strong-log-transformer "^2.0.0" -"@lerna/clean@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-3.20.0.tgz#ba777e373ddeae63e57860df75d47a9e5264c5b2" - integrity sha512-9ZdYrrjQvR5wNXmHfDsfjWjp0foOkCwKe3hrckTzkAeQA1ibyz5llGwz5e1AeFrV12e2/OLajVqYfe+qdkZUgg== +"@lerna/clean@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/clean/-/clean-3.21.0.tgz#c0b46b5300cc3dae2cda3bec14b803082da3856d" + integrity sha512-b/L9l+MDgE/7oGbrav6rG8RTQvRiZLO1zTcG17zgJAAuhlsPxJExMlh2DFwJEVi2les70vMhHfST3Ue1IMMjpg== dependencies: - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/filter-options" "3.20.0" "@lerna/prompt" "3.18.5" "@lerna/pulse-till-done" "3.13.0" @@ -1443,14 +1444,14 @@ npmlog "^4.1.2" slash "^2.0.0" -"@lerna/command@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/command/-/command-3.18.5.tgz#14c6d2454adbfd365f8027201523e6c289cd3cd9" - integrity sha512-36EnqR59yaTU4HrR1C9XDFti2jRx0BgpIUBeWn129LZZB8kAB3ov1/dJNa1KcNRKp91DncoKHLY99FZ6zTNpMQ== +"@lerna/command@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/command/-/command-3.21.0.tgz#9a2383759dc7b700dacfa8a22b2f3a6e190121f7" + integrity sha512-T2bu6R8R3KkH5YoCKdutKv123iUgUbW8efVjdGCDnCMthAQzoentOJfDeodBwn0P2OqCl3ohsiNVtSn9h78fyQ== dependencies: "@lerna/child-process" "3.16.5" "@lerna/package-graph" "3.18.5" - "@lerna/project" "3.18.0" + "@lerna/project" "3.21.0" "@lerna/validation-error" "3.13.0" "@lerna/write-log-file" "3.13.0" clone-deep "^4.0.1" @@ -1485,14 +1486,14 @@ fs-extra "^8.1.0" npmlog "^4.1.2" -"@lerna/create@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.18.5.tgz#11ac539f069248eaf7bc4c42e237784330f4fc47" - integrity sha512-cHpjocbpKmLopCuZFI7cKEM3E/QY8y+yC7VtZ4FQRSaLU8D8i2xXtXmYaP1GOlVNavji0iwoXjuNpnRMInIr2g== +"@lerna/create@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/create/-/create-3.21.0.tgz#e813832adf3488728b139e5a75c8b01b1372e62f" + integrity sha512-cRIopzKzE2vXJPmsiwCDMWo4Ct+KTmX3nvvkQLDoQNrrRK7w+3KQT3iiorbj1koD95RsVQA7mS2haWok9SIv0g== dependencies: "@evocateur/pacote" "^9.6.3" "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/npm-conf" "3.16.0" "@lerna/validation-error" "3.13.0" camelcase "^5.0.0" @@ -1517,23 +1518,23 @@ "@lerna/child-process" "3.16.5" npmlog "^4.1.2" -"@lerna/diff@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-3.18.5.tgz#e9e2cb882f84d5b84f0487c612137305f07accbc" - integrity sha512-u90lGs+B8DRA9Z/2xX4YaS3h9X6GbypmGV6ITzx9+1Ga12UWGTVlKaCXBgONMBjzJDzAQOK8qPTwLA57SeBLgA== +"@lerna/diff@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/diff/-/diff-3.21.0.tgz#e6df0d8b9916167ff5a49fcb02ac06424280a68d" + integrity sha512-5viTR33QV3S7O+bjruo1SaR40m7F2aUHJaDAC7fL9Ca6xji+aw1KFkpCtVlISS0G8vikUREGMJh+c/VMSc8Usw== dependencies: "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/validation-error" "3.13.0" npmlog "^4.1.2" -"@lerna/exec@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-3.20.0.tgz#29f0c01aee2340eb46f90706731fef2062a49639" - integrity sha512-pS1mmC7kzV668rHLWuv31ClngqeXjeHC8kJuM+W2D6IpUVMGQHLcCTYLudFgQsuKGVpl0DGNYG+sjLhAPiiu6A== +"@lerna/exec@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/exec/-/exec-3.21.0.tgz#17f07533893cb918a17b41bcc566dc437016db26" + integrity sha512-iLvDBrIE6rpdd4GIKTY9mkXyhwsJ2RvQdB9ZU+/NhR3okXfqKc6py/24tV111jqpXTtZUW6HNydT4dMao2hi1Q== dependencies: "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/filter-options" "3.20.0" "@lerna/profiler" "3.20.0" "@lerna/run-topologically" "3.18.5" @@ -1609,13 +1610,13 @@ "@lerna/child-process" "3.16.5" semver "^6.2.0" -"@lerna/import@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/import/-/import-3.18.5.tgz#a9c7d8601870729851293c10abd18b3707f7ba5e" - integrity sha512-PH0WVLEgp+ORyNKbGGwUcrueW89K3Iuk/DDCz8mFyG2IG09l/jOF0vzckEyGyz6PO5CMcz4TI1al/qnp3FrahQ== +"@lerna/import@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/import/-/import-3.21.0.tgz#87b08f2a2bfeeff7357c6fd8490e638d3cd5b32d" + integrity sha512-aISkL4XD0Dqf5asDaOZWu65jgj8fWUhuQseZWuQe3UfHxav69fTS2YLIngUfencaOSZVOcVCom28YCzp61YDxw== dependencies: "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/prompt" "3.18.5" "@lerna/pulse-till-done" "3.13.0" "@lerna/validation-error" "3.13.0" @@ -1623,43 +1624,43 @@ fs-extra "^8.1.0" p-map-series "^1.0.0" -"@lerna/info@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/info/-/info-3.20.0.tgz#3a5212f3029f2bc6255f9533bdf4bcb120ef329a" - integrity sha512-Rsz+KQF9mczbGUbPTrtOed1N0C+cA08Qz0eX/oI+NNjvsryZIju/o7uedG4I3P55MBiAioNrJI88fHH3eTgYug== +"@lerna/info@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/info/-/info-3.21.0.tgz#76696b676fdb0f35d48c83c63c1e32bb5e37814f" + integrity sha512-0XDqGYVBgWxUquFaIptW2bYSIu6jOs1BtkvRTWDDhw4zyEdp6q4eaMvqdSap1CG+7wM5jeLCi6z94wS0AuiuwA== dependencies: - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/output" "3.13.0" envinfo "^7.3.1" -"@lerna/init@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/init/-/init-3.18.5.tgz#86dd0b2b3290755a96975069b5cb007f775df9f5" - integrity sha512-oCwipWrha98EcJAHm8AGd2YFFLNI7AW9AWi0/LbClj1+XY9ah+uifXIgYGfTk63LbgophDd8936ZEpHMxBsbAg== +"@lerna/init@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/init/-/init-3.21.0.tgz#1e810934dc8bf4e5386c031041881d3b4096aa5c" + integrity sha512-6CM0z+EFUkFfurwdJCR+LQQF6MqHbYDCBPyhu/d086LRf58GtYZYj49J8mKG9ktayp/TOIxL/pKKjgLD8QBPOg== dependencies: "@lerna/child-process" "3.16.5" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" fs-extra "^8.1.0" p-map "^2.1.0" write-json-file "^3.2.0" -"@lerna/link@3.18.5": - version "3.18.5" - resolved "https://registry.yarnpkg.com/@lerna/link/-/link-3.18.5.tgz#f24347e4f0b71d54575bd37cfa1794bc8ee91b18" - integrity sha512-xTN3vktJpkT7Nqc3QkZRtHO4bT5NvuLMtKNIBDkks0HpGxC9PRyyqwOoCoh1yOGbrWIuDezhfMg3Qow+6I69IQ== +"@lerna/link@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/link/-/link-3.21.0.tgz#8be68ff0ccee104b174b5bbd606302c2f06e9d9b" + integrity sha512-tGu9GxrX7Ivs+Wl3w1+jrLi1nQ36kNI32dcOssij6bg0oZ2M2MDEFI9UF2gmoypTaN9uO5TSsjCFS7aR79HbdQ== dependencies: - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/package-graph" "3.18.5" "@lerna/symlink-dependencies" "3.17.0" p-map "^2.1.0" slash "^2.0.0" -"@lerna/list@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/list/-/list-3.20.0.tgz#7e67cc29c5cf661cfd097e8a7c2d3dcce7a81029" - integrity sha512-fXTicPrfioVnRzknyPawmYIVkzDRBaQqk9spejS1S3O1DOidkihK0xxNkr8HCVC0L22w6f92g83qWDp2BYRUbg== +"@lerna/list@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/list/-/list-3.21.0.tgz#42f76fafa56dea13b691ec8cab13832691d61da2" + integrity sha512-KehRjE83B1VaAbRRkRy6jLX1Cin8ltsrQ7FHf2bhwhRHK0S54YuA6LOoBnY/NtA8bHDX/Z+G5sMY78X30NS9tg== dependencies: - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/filter-options" "3.20.0" "@lerna/listable" "3.18.5" "@lerna/output" "3.13.0" @@ -1805,10 +1806,10 @@ npmlog "^4.1.2" upath "^1.2.0" -"@lerna/project@3.18.0": - version "3.18.0" - resolved "https://registry.yarnpkg.com/@lerna/project/-/project-3.18.0.tgz#56feee01daeb42c03cbdf0ed8a2a10cbce32f670" - integrity sha512-+LDwvdAp0BurOAWmeHE3uuticsq9hNxBI0+FMHiIai8jrygpJGahaQrBYWpwbshbQyVLeQgx3+YJdW2TbEdFWA== +"@lerna/project@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/project/-/project-3.21.0.tgz#5d784d2d10c561a00f20320bcdb040997c10502d" + integrity sha512-xT1mrpET2BF11CY32uypV2GPtPVm6Hgtha7D81GQP9iAitk9EccrdNjYGt5UBYASl4CIDXBRxwmTTVGfrCx82A== dependencies: "@lerna/package" "3.16.0" "@lerna/validation-error" "3.13.0" @@ -1831,10 +1832,10 @@ inquirer "^6.2.0" npmlog "^4.1.2" -"@lerna/publish@3.20.2": - version "3.20.2" - resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.20.2.tgz#a45d29813099b3249657ea913d0dc3f8ebc5cc2e" - integrity sha512-N7Y6PdhJ+tYQPdI1tZum8W25cDlTp4D6brvRacKZusweWexxaopbV8RprBaKexkEX/KIbncuADq7qjDBdQHzaA== +"@lerna/publish@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/publish/-/publish-3.21.0.tgz#0112393125f000484c3f50caba71a547f91bd7f4" + integrity sha512-JZ+ehZB9UCQ9nqH8Ld/Yqc/If++aK/7XIubkrB9sQ5hf2GeIbmI/BrJpMgLW/e9T5bKrUBZPUvoUN3daVipA5A== dependencies: "@evocateur/libnpmaccess" "^3.1.2" "@evocateur/npm-registry-fetch" "^4.0.0" @@ -1842,7 +1843,7 @@ "@lerna/check-working-tree" "3.16.5" "@lerna/child-process" "3.16.5" "@lerna/collect-updates" "3.20.0" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/describe-ref" "3.16.5" "@lerna/log-packed" "3.16.0" "@lerna/npm-conf" "3.16.0" @@ -1857,7 +1858,7 @@ "@lerna/run-lifecycle" "3.16.2" "@lerna/run-topologically" "3.18.5" "@lerna/validation-error" "3.13.0" - "@lerna/version" "3.20.2" + "@lerna/version" "3.21.0" figgy-pudding "^3.5.1" fs-extra "^8.1.0" npm-package-arg "^6.1.0" @@ -1920,12 +1921,12 @@ figgy-pudding "^3.5.1" p-queue "^4.0.0" -"@lerna/run@3.20.0": - version "3.20.0" - resolved "https://registry.yarnpkg.com/@lerna/run/-/run-3.20.0.tgz#a479f7c42bdf9ebabb3a1e5a2bdebb7a8d201151" - integrity sha512-9U3AqeaCeB7KsGS9oyKNp62s9vYoULg/B4cqXTKZkc+OKL6QOEjYHYVSBcMK9lUXrMjCjDIuDSX3PnTCPxQ2Dw== +"@lerna/run@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/run/-/run-3.21.0.tgz#2a35ec84979e4d6e42474fe148d32e5de1cac891" + integrity sha512-fJF68rT3veh+hkToFsBmUJ9MHc9yGXA7LSDvhziAojzOb0AI/jBDp6cEcDQyJ7dbnplba2Lj02IH61QUf9oW0Q== dependencies: - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/filter-options" "3.20.0" "@lerna/npm-run-script" "3.16.5" "@lerna/output" "3.13.0" @@ -1970,15 +1971,15 @@ dependencies: npmlog "^4.1.2" -"@lerna/version@3.20.2": - version "3.20.2" - resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.20.2.tgz#3709141c0f537741d9bc10cb24f56897bcb30428" - integrity sha512-ckBJMaBWc+xJen0cMyCE7W67QXLLrc0ELvigPIn8p609qkfNM0L0CF803MKxjVOldJAjw84b8ucNWZLvJagP/Q== +"@lerna/version@3.21.0": + version "3.21.0" + resolved "https://registry.yarnpkg.com/@lerna/version/-/version-3.21.0.tgz#5bcc3d2de9eb8f4db18efb0d88973f9a509eccc3" + integrity sha512-nIT3u43fCNj6uSMN1dRxFnF4GhmIiOEqSTkGSjrMU+8kHKwzOqS/6X6TOzklBmCyEZOpF/fLlGqH3BZHnwLDzQ== dependencies: "@lerna/check-working-tree" "3.16.5" "@lerna/child-process" "3.16.5" "@lerna/collect-updates" "3.20.0" - "@lerna/command" "3.18.5" + "@lerna/command" "3.21.0" "@lerna/conventional-commits" "3.18.5" "@lerna/github-client" "3.16.5" "@lerna/gitlab-client" "3.15.0" @@ -2030,12 +2031,12 @@ dependencies: "@octokit/types" "^2.0.0" -"@octokit/endpoint@^6.0.0": - version "6.0.0" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.0.tgz#4c7acd79ab72df78732a7d63b09be53ec5a2230b" - integrity sha512-3nx+MEYoZeD0uJ+7F/gvELLvQJzLXhep2Az0bBSXagbApDvDW0LWwpnAIY/hb0Jwe17A0fJdz0O12dPh05cj7A== +"@octokit/endpoint@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.1.tgz#16d5c0e7a83e3a644d1ddbe8cded6c3d038d31d7" + integrity sha512-pOPHaSz57SFT/m3R5P8MUu4wLPszokn5pXcB/pzavLTQf2jbU+6iayTvzaY6/BiotuRS0qyEUkx3QglT4U958A== dependencies: - "@octokit/types" "^2.0.0" + "@octokit/types" "^2.11.1" is-plain-object "^3.0.0" universal-user-agent "^5.0.0" @@ -2083,13 +2084,13 @@ once "^1.4.0" "@octokit/request@^5.2.0": - version "5.3.4" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.3.4.tgz#fbc950bf785d59da3b0399fc6d042c8cf52e2905" - integrity sha512-qyj8G8BxQyXjt9Xu6NvfvOr1E0l35lsXtwm3SopsYg/JWXjlsnwqLc8rsD2OLguEL/JjLfBvrXr4az7z8Lch2A== + version "5.4.2" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.2.tgz#74f8e5bbd39dc738a1b127629791f8ad1b3193ee" + integrity sha512-zKdnGuQ2TQ2vFk9VU8awFT4+EYf92Z/v3OlzRaSh4RIP0H6cvW1BFPXq4XYvNez+TPQjqN+0uSkCYnMFFhcFrw== dependencies: - "@octokit/endpoint" "^6.0.0" + "@octokit/endpoint" "^6.0.1" "@octokit/request-error" "^2.0.0" - "@octokit/types" "^2.0.0" + "@octokit/types" "^2.11.1" deprecation "^2.0.0" is-plain-object "^3.0.0" node-fetch "^2.3.0" @@ -2118,10 +2119,10 @@ once "^1.4.0" universal-user-agent "^4.0.0" -"@octokit/types@^2.0.0", "@octokit/types@^2.0.1": - version "2.5.1" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.5.1.tgz#22563b3bb50034bea3176eac1860340c5e812e2a" - integrity sha512-q4Wr7RexkPRrkQpXzUYF5Fj/14Mr65RyOHj6B9d/sQACpqGcStkHZj4qMEtlMY5SnD/69jlL9ItGPbDM0dR/dA== +"@octokit/types@^2.0.0", "@octokit/types@^2.0.1", "@octokit/types@^2.11.1": + version "2.16.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-2.16.2.tgz#4c5f8da3c6fecf3da1811aef678fda03edac35d2" + integrity sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q== dependencies: "@types/node" ">= 8" @@ -2646,16 +2647,16 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": - version "7.0.9" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.9.tgz#be82fab304b141c3eee81a4ce3b034d0eba1590a" - integrity sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw== + version "7.0.11" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.0.11.tgz#1ae3010e8bf8851d324878b42acec71986486d18" + integrity sha512-ddHK5icION5U6q11+tV2f9Mo6CZVuT8GJKld2q9LqHSZbvLbH34Kcu2yFGckZut453+eQU6btIA3RihmnRgI+Q== dependencies: "@babel/types" "^7.3.0" "@types/cheerio@*": - version "0.22.17" - resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.17.tgz#e54f71c3135f71ebc16c8dc62edad533872c9e72" - integrity sha512-izlm+hbqWN9csuB9GSMfCnAyd3/57XZi3rfz1B0C4QBGVMp+9xQ7+9KYnep+ySfUrCWql4lGzkLf0XmprXcz9g== + version "0.22.18" + resolved "https://registry.yarnpkg.com/@types/cheerio/-/cheerio-0.22.18.tgz#19018dceae691509901e339d63edf1e935978fe6" + integrity sha512-Fq7R3fINAPSdUEhOyjG4iVxgHrOnqDJbY0/BUuiN0pvD/rfmZWekVZnv+vcs8TtpA2XF50uv50LaE4EnpEL/Hw== dependencies: "@types/node" "*" @@ -2714,9 +2715,9 @@ "@types/node" "*" "@types/history@*", "@types/history@^4.7.3": - version "4.7.5" - resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.5.tgz#527d20ef68571a4af02ed74350164e7a67544860" - integrity sha512-wLD/Aq2VggCJXSjxEwrMafIP51Z+13H78nXIX0ABEuIGhmB5sNGbR113MOKo+yfw+RDo1ZU3DM6yfnnRF/+ouw== + version "4.7.6" + resolved "https://registry.yarnpkg.com/@types/history/-/history-4.7.6.tgz#ed8fc802c45b8e8f54419c2d054e55c9ea344356" + integrity sha512-GRTZLeLJ8ia00ZH8mxMO8t0aC9M1N9bN461Z2eaRurJo6Fpa+utgCwLzI4jQHcrdzuzp5WPN9jRwpsCQ1VhJ5w== "@types/hoist-non-react-statics@*": version "3.3.1" @@ -2727,9 +2728,9 @@ hoist-non-react-statics "^3.3.0" "@types/html-minifier-terser@^5.0.0": - version "5.0.0" - resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.0.0.tgz#7532440c138605ced1b555935c3115ddd20e8bef" - integrity sha512-q95SP4FdkmF0CwO0F2q0H6ZgudsApaY/yCtAQNRn1gduef5fGpyEphzy0YCq/N0UFvDSnLg5V8jFK/YGXlDiCw== + version "5.1.0" + resolved "https://registry.yarnpkg.com/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz#551a4589b6ee2cc9c1dff08056128aec29b94880" + integrity sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA== "@types/i18next@^13.0.0": version "13.0.0" @@ -2744,9 +2745,9 @@ integrity sha512-iTs9HReBu7evG77Q4EC8hZnqRt57irBDkK9nvmHroiOIVwYMQc4IvYvdRgwKfYepunIY7Oh/dBuuld+Gj9uo6w== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" - integrity sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg== + version "2.0.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.2.tgz#79d7a78bad4219f4c03d6557a1c72d9ca6ba62d5" + integrity sha512-rsZg7eL+Xcxsxk2XlBt9KcG8nOp9iYdKCOikY9x2RFJCyOdNj4MKPQty0e8oZr29vVAzKXr1BmR+kZauti3o1w== "@types/istanbul-lib-report@*": version "3.0.0" @@ -2756,9 +2757,9 @@ "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^1.1.1": - version "1.1.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz#7a8cbf6a406f36c8add871625b278eaf0b0d255a" - integrity sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-1.1.2.tgz#e875cc689e47bce549ec81f3df5e6f6f11cfaeb2" + integrity sha512-P/W9yOX/3oPZSpaYOCQzGqgCQRXn0FFO/V8bWrCQs+wLmvVVxk6CRBXALEvNs9OHIatlnlFokfhuDo2ug01ciw== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-lib-report" "*" @@ -2771,9 +2772,9 @@ "@types/jest" "*" "@types/jest@*": - version "25.2.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.1.tgz#9544cd438607955381c1bdbdb97767a249297db5" - integrity sha512-msra1bCaAeEdkSyA0CZ6gW1ukMIvZ5YoJkdXw/qhQdsuuDlFTcEUrUw8CLCPt2rVRUfXlClVvK2gvPs9IokZaA== + version "25.2.3" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-25.2.3.tgz#33d27e4c4716caae4eced355097a47ad363fdcaf" + integrity sha512-JXc1nK/tXHiDhV55dvfzqtmP4S3sy3T3ouV2tkViZgxY/zeUkcpQcQPGRlgF4KmWzWW5oiWYSZwtCB+2RsE4Fw== dependencies: jest-diff "^25.2.1" pretty-format "^25.2.1" @@ -2798,9 +2799,9 @@ "@types/lodash" "*" "@types/lodash@*", "@types/lodash@^4.14.136": - version "4.14.149" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.149.tgz#1342d63d948c6062838fbf961012f74d4e638440" - integrity sha512-ijGqzZt/b7BfzcK9vTrS6MFljQRPn5BFWOx8oE0GYxribu6uV+aA9zZuXI1zc/etK9E8nrgdoF2+LgUw7+9tJQ== + version "4.14.151" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.151.tgz#7d58cac32bedb0ec37cb7f99094a167d6176c9d5" + integrity sha512-Zst90IcBX5wnwSu7CAS0vvJkTjTELY4ssKbHiTnGcJgi170uiS8yQDdc3v6S77bRqYQIN1App5a1Pc2lceE5/g== "@types/lowlight@^0.0.0": version "0.0.0" @@ -2812,10 +2813,15 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== +"@types/minimist@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" + integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= + "@types/node@*", "@types/node@>= 8": - version "13.11.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-13.11.0.tgz#390ea202539c61c8fa6ba4428b57e05bc36dc47b" - integrity sha512-uM4mnmsIIPK/yeO+42F2RQhGUIs39K2RFmugcJANppXe6J1nvH87PvzPZYpza7Xhhs8Yn9yIAVdLZ84z61+0xQ== + version "14.0.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.1.tgz#5d93e0a099cd0acd5ef3d5bde3c086e1f49ff68c" + integrity sha512-FAYBGwC+W6F9+huFIDtn43cpy7+SzG+atzRiTfdp3inUKL2hXnd4rG8hylJLIh4+hqrQy1P17kvJByE/z825hA== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -2843,9 +2849,9 @@ integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw== "@types/q@^1.5.1": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.2.tgz#690a1475b84f2a884fd07cd797c00f5f31356ea8" - integrity sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw== + version "1.5.4" + resolved "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz#15925414e0ad2cd765bfef58842f7e26a7accb24" + integrity sha512-1HcDas8SEj4z1Wc696tH56G8OlRaH/sqZOynNNB+HF0WOeXPaxTtbYzJY2oEfiUxjSKjhCKr+MvR7dCHcEelug== "@types/query-string@5": version "5.1.0" @@ -2853,24 +2859,24 @@ integrity sha512-9/sJK+T04pNq7uwReR0CLxqXj1dhxiTapZ1tIxA0trEsT6FRS0bz09YMcMb7tsVBTm4RJ0NEBYGsAjoEmqoFXg== "@types/reach__router@^1.2.3": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@types/reach__router/-/reach__router-1.3.4.tgz#98ef393d06f59d296b5c021ba94b94e5fc463245" - integrity sha512-DZgYfxUIlVSjvf0AvBbYNbpXLrTFNNpU1HrvCRbnMtx3nvGUUWC1/zlAe4dD4FCPFtc+LQuIPEsDiTb0zQkthg== + version "1.3.5" + resolved "https://registry.yarnpkg.com/@types/reach__router/-/reach__router-1.3.5.tgz#14e1e981cccd3a5e50dc9e969a72de0b9d472f6d" + integrity sha512-h0NbqXN/tJuBY/xggZSej1SKQEstbHO7J/omt1tYoFGmj3YXOodZKbbqD4mNDh7zvEGYd7YFrac1LTtAr3xsYQ== dependencies: "@types/history" "*" "@types/react" "*" "@types/react-dom@*", "@types/react-dom@^16.9.2": - version "16.9.6" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.6.tgz#9e7f83d90566521cc2083be2277c6712dcaf754c" - integrity sha512-S6ihtlPMDotrlCJE9ST1fRmYrQNNwfgL61UB4I1W7M6kPulUKx9fXAleW5zpdIjUQ4fTaaog8uERezjsGUj9HQ== + version "16.9.8" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.8.tgz#fe4c1e11dfc67155733dfa6aa65108b4971cb423" + integrity sha512-ykkPQ+5nFknnlU6lDd947WbQ6TE3NNzbQAkInC2EKY1qeYdTKp7onFusmYZb+ityzx2YviqT6BXSu+LyWWJwcA== dependencies: "@types/react" "*" "@types/react-native@*": - version "0.62.1" - resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.62.1.tgz#a51d50ade85420a68d594778316ed74e5040078c" - integrity sha512-4uKqYGek9/OstJWW0hEfF/6fx8BzNkzdAFxeY+VOxec+SPKK/hvGEjnX6+0jV1MnJDBHYKdWfWA4sYCQ8G3sqA== + version "0.62.10" + resolved "https://registry.yarnpkg.com/@types/react-native/-/react-native-0.62.10.tgz#82c481df21db4e7460755dc3fc7091e333a1d2bd" + integrity sha512-QR4PGrzZ3IvRIHlScyIPuv2GV8tD/BMICZz514KGvn3KHbh0mLphHHemtHZC1o8u4xM5LxwVpMpMYHQ+ncSfag== dependencies: "@types/react" "*" @@ -2883,18 +2889,18 @@ redux "^3.6.0" "@types/react-router-dom@^5.1.0": - version "5.1.3" - resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.3.tgz#b5d28e7850bd274d944c0fbbe5d57e6b30d71196" - integrity sha512-pCq7AkOvjE65jkGS5fQwQhvUp4+4PVD9g39gXLZViP2UqFiFzsEpB3PKf0O6mdbKsewSK8N14/eegisa/0CwnA== + version "5.1.5" + resolved "https://registry.yarnpkg.com/@types/react-router-dom/-/react-router-dom-5.1.5.tgz#7c334a2ea785dbad2b2dcdd83d2cf3d9973da090" + integrity sha512-ArBM4B1g3BWLGbaGvwBGO75GNFbLDUthrDojV2vHLih/Tq8M+tgvY1DSwkuNrPSwdp/GUL93WSEpTZs8nVyJLw== dependencies: "@types/history" "*" "@types/react" "*" "@types/react-router" "*" "@types/react-router@*": - version "5.1.5" - resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.5.tgz#7b2f9b7cc3d350e92664c4e38c0ef529286fe628" - integrity sha512-RZPdCtZympi6X7EkGyaU7ISiAujDYTWgqMF9owE3P6efITw27IWQykcti0BvA5h4Mu1LLl5rxrpO3r8kHyUZ/Q== + version "5.1.7" + resolved "https://registry.yarnpkg.com/@types/react-router/-/react-router-5.1.7.tgz#e9d12ed7dcfc79187e4d36667745b69a5aa11556" + integrity sha512-2ouP76VQafKjtuc0ShpwUebhHwJo0G6rhahW9Pb8au3tQTjYXd2jta4wv6U2tGLR/I42yuG00+UXjNYY0dTzbg== dependencies: "@types/history" "*" "@types/react" "*" @@ -2930,9 +2936,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^16.9.9": - version "16.9.32" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.32.tgz#f6368625b224604148d1ddf5920e4fefbd98d383" - integrity sha512-fmejdp0CTH00mOJmxUPPbWCEBWPvRIL4m8r0qD+BSDUqmutPyGQCHifzMpMzdvZwROdEdL78IuZItntFWgPXHQ== + version "16.9.35" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.9.35.tgz#a0830d172e8aadd9bd41709ba2281a3124bbd368" + integrity sha512-q0n0SsWcGc8nDqH2GJfWQWUOmZSJhXV64CjVN5SvcNti3TdEaA3AH0D8DwNmMdzjMAC/78tB8nAZIlV8yTz+zQ== dependencies: "@types/prop-types" "*" csstype "^2.2.0" @@ -2975,16 +2981,16 @@ integrity sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ== "@types/uglify-js@*": - version "3.0.5" - resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.0.5.tgz#2c70d5c68f6e002e3b2e4f849adc5f162546f633" - integrity sha512-L7EbSkhSaWBpkl+PZAEAqZTqtTeIsq7s/oX/q0LNnxxJoRVKQE0T81XDVyaxjiiKQwiV2vhVeYRqxdRNqGOGJw== + version "3.9.1" + resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.9.1.tgz#0ad39d6a72979593f669acdfc7e980d590d3fb94" + integrity sha512-rdBIeMQyRBOXogop/EYBvSkYFn9D9yGxUa5hagBVG55KIdSUbp22EACJSHCs6kmmfunojAhf7zJH+Ds06/qLaQ== dependencies: source-map "^0.6.1" "@types/webpack-env@^1.15.0": - version "1.15.1" - resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.1.tgz#c8e84705e08eed430b5e15b39c65b0944e4d1422" - integrity sha512-eWN5ElDTeBc5lRDh95SqA8x18D0ll2pWudU3uWiyfsRmIZcmUXpEsxPU+7+BsdCrO2vfLRC629u/MmjbmF+2tA== + version "1.15.2" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.2.tgz#927997342bb9f4a5185a86e6579a0a18afc33b0a" + integrity sha512-67ZgZpAlhIICIdfQrB5fnDvaKFcDxpKibxznfYRVAT4mQE41Dido/3Ty+E3xGBmTogc5+0Qb8tWhna+5B8z1iQ== "@types/webpack-sources@*": version "0.1.7" @@ -2996,9 +3002,9 @@ source-map "^0.6.1" "@types/webpack@^4.41.8": - version "4.41.10" - resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.10.tgz#2e1f6b3508a249854efe3dcc7690905ac5ee10be" - integrity sha512-vIy0qaq8AjOjZLuFPqpo7nAJzcoVXMdw3mvpNN07Uvdy0p1IpJeLNBe3obdRP7FX2jIusDE7z1pZa0A6qYUgnA== + version "4.41.13" + resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.13.tgz#988d114c8913d039b8a0e0502a7fe4f1f84f3d5e" + integrity sha512-RYmIHOWSxnTTa765N6jJBVE45pd2SYNblEYshVDduLw6RhocazNmRzE5/ytvBD8IkDMH6DI+bcrqxh8NILimBA== dependencies: "@types/anymatch" "*" "@types/node" "*" @@ -3013,60 +3019,60 @@ integrity sha512-FA/BWv8t8ZWJ+gEOnLLd8ygxH/2UFbAvgEonyfN6yWGLKc7zVjbpl2Y4CTjid9h2RfgPP6SEt6uHwEOply00yw== "@types/yargs@^13.0.0": - version "13.0.8" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.8.tgz#a38c22def2f1c2068f8971acb3ea734eb3c64a99" - integrity sha512-XAvHLwG7UQ+8M4caKIH0ZozIOYay5fQkAgyIXegXT9jPtdIGdhga+sUEdAr1CiG46aB+c64xQEYyEzlwWVTNzA== + version "13.0.9" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-13.0.9.tgz#44028e974343c7afcf3960f1a2b1099c39a7b5e1" + integrity sha512-xrvhZ4DZewMDhoH1utLtOAwYQy60eYFoXeje30TzM3VOvQlBwQaEpKFq5m34k1wOw2AKIi2pwtiAjdmhvlBUzg== dependencies: "@types/yargs-parser" "*" "@types/yargs@^15.0.0": - version "15.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.4.tgz#7e5d0f8ca25e9d5849f2ea443cf7c402decd8299" - integrity sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg== + version "15.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.5.tgz#947e9a6561483bdee9adffc983e91a6902af8b79" + integrity sha512-Dk/IDOPtOgubt/IaevIUbTgV7doaKkoorvOyYM2CMwuDyP89bekI7H4xLIwunNYiK9jhCkmc6pUrJk3cj2AB9w== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^2.12.0": - version "2.26.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.26.0.tgz#04c96560c8981421e5a9caad8394192363cc423f" - integrity sha512-4yUnLv40bzfzsXcTAtZyTjbiGUXMrcIJcIMioI22tSOyAxpdXiZ4r7YQUU8Jj6XXrLz9d5aMHPQf5JFR7h27Nw== + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz#6f8ce8a46c7dea4a6f1d171d2bb8fbae6dac2be9" + integrity sha512-4zY3Z88rEE99+CNvTbXSyovv2z9PNOVffTWD2W8QF5s2prBQtwN2zadqERcrHpcR7O/+KMI3fcTAmUUhK/iQcQ== dependencies: - "@typescript-eslint/experimental-utils" "2.26.0" + "@typescript-eslint/experimental-utils" "2.34.0" functional-red-black-tree "^1.0.1" regexpp "^3.0.0" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.26.0": - version "2.26.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.26.0.tgz#063390c404d9980767d76274df386c0aa675d91d" - integrity sha512-RELVoH5EYd+JlGprEyojUv9HeKcZqF7nZUGSblyAw1FwOGNnmQIU8kxJ69fttQvEwCsX5D6ECJT8GTozxrDKVQ== +"@typescript-eslint/experimental-utils@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.34.0.tgz#d3524b644cdb40eebceca67f8cf3e4cc9c8f980f" + integrity sha512-eS6FTkq+wuMJ+sgtuNTtcqavWXqsflWcfBnlYhg/nS4aZ1leewkXGbvBhaapn1q6qf4M71bsR1tez5JTRMuqwA== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.26.0" + "@typescript-eslint/typescript-estree" "2.34.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" "@typescript-eslint/parser@^2.12.0": - version "2.26.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.26.0.tgz#385463615818b33acb72a25b39c03579df93d76f" - integrity sha512-+Xj5fucDtdKEVGSh9353wcnseMRkPpEAOY96EEenN7kJVrLqy/EVwtIh3mxcUz8lsFXW1mT5nN5vvEam/a5HiQ== + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.34.0.tgz#50252630ca319685420e9a39ca05fe185a256bc8" + integrity sha512-03ilO0ucSD0EPTw2X4PntSIRFtDPWjrVq7C3/Z3VQHRC7+13YB55rcJI3Jt+YgeHbjUdJPcPa7b23rXCBokuyA== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.26.0" - "@typescript-eslint/typescript-estree" "2.26.0" + "@typescript-eslint/experimental-utils" "2.34.0" + "@typescript-eslint/typescript-estree" "2.34.0" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.26.0": - version "2.26.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.26.0.tgz#d8132cf1ee8a72234f996519a47d8a9118b57d56" - integrity sha512-3x4SyZCLB4zsKsjuhxDLeVJN6W29VwBnYpCsZ7vIdPel9ZqLfIZJgJXO47MNUkurGpQuIBALdPQKtsSnWpE1Yg== +"@typescript-eslint/typescript-estree@2.34.0": + version "2.34.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.34.0.tgz#14aeb6353b39ef0732cc7f1b8285294937cf37d5" + integrity sha512-OMAr+nJWKdlVM9LOqCqh3pQQPwxHAN7Du8DR6dmwCrAmxtiXQnhHJ6tBNtf+cggqfo51SG/FCwnKhXCIM7hnVg== dependencies: debug "^4.1.1" eslint-visitor-keys "^1.1.0" glob "^7.1.6" is-glob "^4.0.1" lodash "^4.17.15" - semver "^6.3.0" + semver "^7.3.2" tsutils "^3.17.1" "@webassemblyjs/ast@1.9.0": @@ -3282,15 +3288,15 @@ acorn@^5.5.3: resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg== -acorn@^6.0.1, acorn@^6.2.1: +acorn@^6.0.1, acorn@^6.4.1: version "6.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474" integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA== acorn@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" - integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg== + version "7.2.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz#17ea7e40d7c8640ff54a694c889c26f31704effe" + integrity sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ== address@1.1.2, address@^1.0.1: version "1.1.2" @@ -3376,9 +3382,9 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1: integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ== ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.5.5: - version "6.12.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.0.tgz#06d60b96d87b8454a5adaba86e7854da629db4b7" - integrity sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw== + version "6.12.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd" + integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ== dependencies: fast-deep-equal "^3.1.1" fast-json-stable-stringify "^2.0.0" @@ -3641,6 +3647,11 @@ arrify@^1.0.1: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= +arrify@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa" + integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== + asap@^2.0.0, asap@~2.0.3: version "2.0.6" resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" @@ -3733,17 +3744,17 @@ atob@^2.1.2: integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== autoprefixer@^9.7.2: - version "9.7.5" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.7.5.tgz#8df10b9ff9b5814a8d411a5cfbab9c793c392376" - integrity sha512-URo6Zvt7VYifomeAfJlMFnYDhow1rk2bufwkbamPEAtQFcL11moLk4PnR7n9vlu7M+BkXAZkHFA0mIcY7tjQFg== + version "9.8.0" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.0.tgz#68e2d2bef7ba4c3a65436f662d0a56a741e56511" + integrity sha512-D96ZiIHXbDmU02dBaemyAg53ez+6F5yZmapmgKcjm35yEe1uVDYI8hGW3VYoGRaG290ZFf91YxHrR518vC0u/A== dependencies: - browserslist "^4.11.0" - caniuse-lite "^1.0.30001036" + browserslist "^4.12.0" + caniuse-lite "^1.0.30001061" chalk "^2.4.2" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.27" - postcss-value-parser "^4.0.3" + postcss "^7.0.30" + postcss-value-parser "^4.1.0" aws-sign2@~0.7.0: version "0.7.0" @@ -3850,10 +3861,10 @@ babel-plugin-add-react-displayname@^0.0.5: resolved "https://registry.yarnpkg.com/babel-plugin-add-react-displayname/-/babel-plugin-add-react-displayname-0.0.5.tgz#339d4cddb7b65fd62d1df9db9fe04de134122bd5" integrity sha1-M51M3be2X9YtHfnbn+BN4TQSK9U= -babel-plugin-dynamic-import-node@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.0.tgz#f00f507bdaa3c3e3ff6e7e5e98d90a7acab96f7f" - integrity sha512-o6qFkpeQEBxcqt0XYlWzAVxNCSCZdUgcR8IRlhD/8DylxjjO4foPcvTW0GGKa/cVt3rvxZ7o5ippJ+/0nvLhlQ== +babel-plugin-dynamic-import-node@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3" + integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== dependencies: object.assign "^4.1.0" @@ -4241,11 +4252,16 @@ bluebird@^3.3.5, bluebird@^3.5.1, bluebird@^3.5.3, bluebird@^3.5.5: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: +bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== +bn.js@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.1.tgz#48efc4031a9c4041b9c99c6941d903463ab62eb5" + integrity sha512-IUTD/REb78Z2eodka1QZyyEk66pciRcP6Sroka0aI3tG/iwIdYLrBD62RsubR7vqdt3WyX8p4jxeatzmRSphtA== + body-parser@1.19.0: version "1.19.0" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" @@ -4372,7 +4388,7 @@ browserify-des@^1.0.0: inherits "^2.0.1" safe-buffer "^5.1.2" -browserify-rsa@^4.0.0: +browserify-rsa@^4.0.0, browserify-rsa@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz#21e0abfaf6f2029cf2fafb133567a701d4135524" integrity sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ= @@ -4381,17 +4397,19 @@ browserify-rsa@^4.0.0: randombytes "^2.0.1" browserify-sign@^4.0.0: - version "4.0.4" - resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.0.4.tgz#aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298" - integrity sha1-qk62jl17ZYuqa/alfmMMvXqT0pg= + version "4.2.0" + resolved "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz#545d0b1b07e6b2c99211082bf1b12cce7a0b0e11" + integrity sha512-hEZC1KEeYuoHRqhGhTy6gWrpJA3ZDjFWv0DE61643ZnOXAKJb3u7yWcrU0mMc9SwAqK1n7myPGndkp0dFG7NFA== dependencies: - bn.js "^4.1.1" - browserify-rsa "^4.0.0" - create-hash "^1.1.0" - create-hmac "^1.1.2" - elliptic "^6.0.0" - inherits "^2.0.1" - parse-asn1 "^5.0.0" + bn.js "^5.1.1" + browserify-rsa "^4.0.1" + create-hash "^1.2.0" + create-hmac "^1.1.7" + elliptic "^6.5.2" + inherits "^2.0.4" + parse-asn1 "^5.1.5" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" browserify-zlib@^0.2.0: version "0.2.0" @@ -4409,13 +4427,13 @@ browserslist@4.7.0: electron-to-chromium "^1.3.247" node-releases "^1.1.29" -browserslist@^4.0.0, browserslist@^4.11.0, browserslist@^4.8.3, browserslist@^4.9.1: - version "4.11.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.11.1.tgz#92f855ee88d6e050e7e7311d987992014f1a1f1b" - integrity sha512-DCTr3kDrKEYNw6Jb9HFxVLQNaue8z+0ZfRBRjmCunKDEXEBajKDj2Y+Uelg+Pi29OnvaSGwjOsnRyNEkXzHg5g== +browserslist@^4.0.0, browserslist@^4.11.1, browserslist@^4.12.0, browserslist@^4.8.5: + version "4.12.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz#06c6d5715a1ede6c51fc39ff67fd647f740b656d" + integrity sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg== dependencies: - caniuse-lite "^1.0.30001038" - electron-to-chromium "^1.3.390" + caniuse-lite "^1.0.30001043" + electron-to-chromium "^1.3.413" node-releases "^1.1.53" pkg-up "^2.0.0" @@ -4476,9 +4494,9 @@ bulma-tooltip@^3.0.0: integrity sha512-CsT3APjhlZScskFg38n8HYL8oYNUHQtcu4sz6ERarxkUpBRbk9v0h/5KAvXeKapVSn2dp9l7bOGit5SECP8EWQ== bulma@^0.8.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.8.1.tgz#a5feacb703b73a87fdeae4f0d12317d62fc1d301" - integrity sha512-Afi2zv4DKmNSYfmx55V+Mtnt8+WfR8Rs65kWArmzEuWP7vNr7dSAEDI+ORZlgOR1gueNZwpKaPdUi4ZiTNwgPA== + version "0.8.2" + resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.8.2.tgz#5d928f16ed4a84549c2873f95c92c38c69c631a7" + integrity sha512-vMM/ijYSxX+Sm+nD7Lmc1UgWDy2JcL2nTKqwgEqXuOMU+IGALbXd5MLt/BcjBAPLIx36TtzhzBcSnOP974gcqA== byline@^5.0.0: version "5.0.0" @@ -4614,6 +4632,15 @@ camelcase-keys@^4.0.0: map-obj "^2.0.0" quick-lru "^1.0.0" +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" @@ -4629,6 +4656,11 @@ camelcase@^5.0.0, camelcase@^5.3.1: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== +camelcase@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.0.0.tgz#5259f7c30e35e278f1bdc2a4d91230b37cad981e" + integrity sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w== + camelize@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -4649,10 +4681,10 @@ caniuse-api@^3.0.0: lodash.memoize "^4.1.2" lodash.uniq "^4.5.0" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001036, caniuse-lite@^1.0.30001038: - version "1.0.30001039" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001039.tgz#b3814a1c38ffeb23567f8323500c09526a577bbe" - integrity sha512-SezbWCTT34eyFoWHgx8UWso7YtvtM7oosmFoXbCkdC6qJzRfBTeTgE9REtKtiuKXuMwWTZEvdnFNGAyVMorv8Q== +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000989, caniuse-lite@^1.0.30001043, caniuse-lite@^1.0.30001061: + version "1.0.30001062" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001062.tgz#d814b648338504b315222ace6f1a533d9a55e390" + integrity sha512-ei9ZqeOnN7edDrb24QfJ0OZicpEbsWxv7WusOiQGz/f2SfvBgHHbOEwBJ8HKGVSyx8Z6ndPjxzR6m0NQq+0bfw== capture-exit@^2.0.0: version "2.0.0" @@ -4736,10 +4768,10 @@ cheerio@^1.0.0-rc.3: lodash "^4.15.0" parse5 "^3.0.1" -"chokidar@>=2.0.0 <4.0.0": - version "3.3.1" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450" - integrity sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg== +"chokidar@>=2.0.0 <4.0.0", chokidar@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz#b30611423ce376357c765b9b8f904b9fba3c0be8" + integrity sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ== dependencies: anymatch "~3.1.1" braces "~3.0.2" @@ -4747,7 +4779,7 @@ cheerio@^1.0.0-rc.3: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.3.0" + readdirp "~3.4.0" optionalDependencies: fsevents "~2.1.2" @@ -4852,9 +4884,9 @@ cli-table3@0.5.1: colors "^1.1.2" cli-width@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" - integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw== clipboard@^2.0.0: version "2.0.6" @@ -4865,15 +4897,6 @@ clipboard@^2.0.0: select "^1.1.2" tiny-emitter "^2.0.0" -cliui@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ== - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - cliui@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" @@ -5026,9 +5049,9 @@ commondir@^1.0.1: integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= compare-func@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.2.tgz#99dd0ba457e1f9bc722b12c08ec33eeab31fa648" - integrity sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg= + version "1.3.4" + resolved "https://registry.yarnpkg.com/compare-func/-/compare-func-1.3.4.tgz#6b07c4c5e8341119baf44578085bda0f4a823516" + integrity sha512-sq2sWtrqKPkEXAC8tEJA1+BqAH9GbFkGBtUOqrUX57VSfwp8xyktctk+uLoRy5eccTdxzDcVIztlYDpKs3Jv1Q== dependencies: array-ify "^1.0.0" dot-prop "^3.0.0" @@ -5134,9 +5157,9 @@ content-type@~1.0.4: integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== conventional-changelog-angular@^5.0.3: - version "5.0.6" - resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.6.tgz#269540c624553aded809c29a3508fdc2b544c059" - integrity sha512-QDEmLa+7qdhVIv8sFZfVxU1VSyVvnXPsxq8Vam49mKUcO1Z8VTLEJk9uI21uiJUsnmm0I4Hrsdc9TgkOQo9WSA== + version "5.0.10" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.10.tgz#5cf7b00dd315b6a6a558223c80d5ef24ddb34205" + integrity sha512-k7RPPRs0vp8+BtPsM9uDxRl6KcgqtCJmzRD1wRtgqmhQ96g8ifBGo9O/TZBG23jqlXS/rg8BKRDELxfnQQGiaA== dependencies: compare-func "^1.3.1" q "^1.5.1" @@ -5161,43 +5184,43 @@ conventional-changelog-core@^3.1.6: through2 "^3.0.0" conventional-changelog-preset-loader@^2.1.1: - version "2.3.0" - resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.0.tgz#580fa8ab02cef22c24294d25e52d7ccd247a9a6a" - integrity sha512-/rHb32J2EJnEXeK4NpDgMaAVTFZS3o1ExmjKMtYVgIC4MQn0vkNSbYpdGRotkfGGRWiqk3Ri3FBkiZGbAfIfOQ== + version "2.3.4" + resolved "https://registry.yarnpkg.com/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.3.4.tgz#14a855abbffd59027fd602581f1f34d9862ea44c" + integrity sha512-GEKRWkrSAZeTq5+YjUZOYxdHq+ci4dNwHvpaBC3+ENalzFWuCWa9EZXSuZBpkr72sMdKB+1fyDV4takK1Lf58g== conventional-changelog-writer@^4.0.6: - version "4.0.11" - resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.11.tgz#9f56d2122d20c96eb48baae0bf1deffaed1edba4" - integrity sha512-g81GQOR392I+57Cw3IyP1f+f42ME6aEkbR+L7v1FBBWolB0xkjKTeCWVguzRrp6UiT1O6gBpJbEy2eq7AnV1rw== + version "4.0.16" + resolved "https://registry.yarnpkg.com/conventional-changelog-writer/-/conventional-changelog-writer-4.0.16.tgz#ca10f2691a8ea6d3c2eb74bd35bcf40aa052dda5" + integrity sha512-jmU1sDJDZpm/dkuFxBeRXvyNcJQeKhGtVcFFkwTphUAzyYWcwz2j36Wcv+Mv2hU3tpvLMkysOPXJTLO55AUrYQ== dependencies: compare-func "^1.3.1" - conventional-commits-filter "^2.0.2" + conventional-commits-filter "^2.0.6" dateformat "^3.0.0" - handlebars "^4.4.0" + handlebars "^4.7.6" json-stringify-safe "^5.0.1" lodash "^4.17.15" - meow "^5.0.0" + meow "^7.0.0" semver "^6.0.0" split "^1.0.0" through2 "^3.0.0" -conventional-commits-filter@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz#f122f89fbcd5bb81e2af2fcac0254d062d1039c1" - integrity sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ== +conventional-commits-filter@^2.0.2, conventional-commits-filter@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/conventional-commits-filter/-/conventional-commits-filter-2.0.6.tgz#0935e1240c5ca7698329affee1b6a46d33324c4c" + integrity sha512-4g+sw8+KA50/Qwzfr0hL5k5NWxqtrOVw4DDk3/h6L85a9Gz0/Eqp3oP+CWCNfesBvZZZEFHF7OTEbRe+yYSyKw== dependencies: lodash.ismatch "^4.4.0" modify-values "^1.0.0" conventional-commits-parser@^3.0.3: - version "3.0.8" - resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.0.8.tgz#23310a9bda6c93c874224375e72b09fb275fe710" - integrity sha512-YcBSGkZbYp7d+Cr3NWUeXbPDFUN6g3SaSIzOybi8bjHL5IJ5225OSCxJJ4LgziyEJ7AaJtE9L2/EU6H7Nt/DDQ== + version "3.1.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.1.0.tgz#10140673d5e7ef5572633791456c5d03b69e8be4" + integrity sha512-RSo5S0WIwXZiRxUGTPuYFbqvrR4vpJ1BDdTlthFgvHt5kEdnd1+pdvwWphWn57/oIl4V72NMmOocFqqJ8mFFhA== dependencies: JSONStream "^1.0.4" is-text-path "^1.0.1" lodash "^4.17.15" - meow "^5.0.0" + meow "^7.0.0" split2 "^2.0.0" through2 "^3.0.0" trim-off-newlines "^1.0.0" @@ -5258,17 +5281,17 @@ copy-to-clipboard@^3.0.8: toggle-selection "^1.0.6" core-js-compat@^3.6.2: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.4.tgz#938476569ebb6cda80d339bcf199fae4f16fff17" - integrity sha512-zAa3IZPvsJ0slViBQ2z+vgyyTuhd3MFn1rBQjZSKVEgB0UMYhUkCj9jJUVPgGTGqWvsBVmfnruXgTcNyTlEiSA== + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz#2a51d9a4e25dfd6e690251aa81f99e3c05481f1c" + integrity sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng== dependencies: - browserslist "^4.8.3" + browserslist "^4.8.5" semver "7.0.0" core-js-pure@^3.0.0, core-js-pure@^3.0.1: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.4.tgz#4bf1ba866e25814f149d4e9aaa08c36173506e3a" - integrity sha512-epIhRLkXdgv32xIUFaaAry2wdxZYBi6bgM7cB136dzzXXa+dFyRLTZeLUJxnd8ShrmyVXBub63n2NHo2JAt8Cw== + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js-pure/-/core-js-pure-3.6.5.tgz#c79e75f5e38dbc85a662d91eea52b8256d53b813" + integrity sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA== core-js@^1.0.0: version "1.2.7" @@ -5281,9 +5304,9 @@ core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5, core-js@^2.6.9: integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg== core-js@^3.0.1, core-js@^3.0.4: - version "3.6.4" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" - integrity sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw== + version "3.6.5" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz#7395dc273af37fb2e50e9bd3d9fe841285231d1a" + integrity sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -5340,7 +5363,7 @@ create-emotion@^9.2.12: stylis "^3.5.0" stylis-rule-sheet "^0.0.10" -create-hash@^1.1.0, create-hash@^1.1.2: +create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" integrity sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg== @@ -5351,7 +5374,7 @@ create-hash@^1.1.0, create-hash@^1.1.2: ripemd160 "^2.0.1" sha.js "^2.4.0" -create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: +create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: version "1.1.7" resolved "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz#69170c78b3ab957147b2b8b04572e47ead2243ff" integrity sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg== @@ -5418,22 +5441,23 @@ css-declaration-sorter@^4.0.1: timsort "^0.3.0" css-loader@^3.0.0, css-loader@^3.2.0: - version "3.4.2" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.4.2.tgz#d3fdb3358b43f233b78501c5ed7b1c6da6133202" - integrity sha512-jYq4zdZT0oS0Iykt+fqnzVLRIeiPWhka+7BqPn+oSIpWJAHak5tmB/WZrJ2a21JhCeFyNnnlroSl8c+MtVndzA== + version "3.5.3" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.5.3.tgz#95ac16468e1adcd95c844729e0bb167639eb0bcf" + integrity sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw== dependencies: camelcase "^5.3.1" cssesc "^3.0.0" icss-utils "^4.1.1" loader-utils "^1.2.3" normalize-path "^3.0.0" - postcss "^7.0.23" + postcss "^7.0.27" postcss-modules-extract-imports "^2.0.0" postcss-modules-local-by-default "^3.0.2" - postcss-modules-scope "^2.1.1" + postcss-modules-scope "^2.2.0" postcss-modules-values "^3.0.0" - postcss-value-parser "^4.0.2" - schema-utils "^2.6.0" + postcss-value-parser "^4.0.3" + schema-utils "^2.6.6" + semver "^6.3.0" css-select-base-adapter@^0.1.1: version "0.1.1" @@ -5633,9 +5657,9 @@ data-urls@^1.0.0: whatwg-url "^7.0.0" date-fns@^2.4.1: - version "2.11.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.11.1.tgz#197b8be1bbf5c5e6fe8bea817f0fe111820e7a12" - integrity sha512-3RdUoinZ43URd2MJcquzBbDQo+J87cSzB8NkXdZiN5ia1UNyep0oCyitfiL88+R7clGTeq/RniXAc16gWyAu1w== + version "2.14.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.14.0.tgz#359a87a265bb34ef2e38f93ecf63ac453f9bc7ba" + integrity sha512-1zD+68jhFgDIM0rF05rcwYO8cExdNqxjq4xP1QKM60Q45mnO6zaMWB4tOzrIr4M4GSLntsKeE4c9Bdl2jhL/yw== dateformat@^3.0.0: version "3.0.3" @@ -5675,7 +5699,7 @@ debuglog@^1.0.1: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= -decamelize-keys@^1.0.0: +decamelize-keys@^1.0.0, decamelize-keys@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.0.tgz#d171a87933252807eb3cb61dc1c1445d078df2d9" integrity sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk= @@ -6043,9 +6067,9 @@ domutils@^1.5.1, domutils@^1.7.0: domelementtype "1" domutils@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.0.0.tgz#15b8278e37bfa8468d157478c58c367718133c08" - integrity sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg== + version "2.1.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.1.0.tgz#7ade3201af43703fde154952e3a868eb4b635f16" + integrity sha512-CD9M0Dm1iaHfQ1R/TI+z3/JWp/pgub0j4jIQKH89ARR4ATAV2nbaOQS5XxU9maJP5jHaPdDDQSEHuE2UmpUTKg== dependencies: dom-serializer "^0.2.1" domelementtype "^2.0.1" @@ -6093,9 +6117,9 @@ dotenv-expand@^5.1.0: integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== dotenv-webpack@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-1.7.0.tgz#4384d8c57ee6f405c296278c14a9f9167856d3a1" - integrity sha512-wwNtOBW/6gLQSkb8p43y0Wts970A3xtNiG/mpwj9MLUhtPCQG6i+/DSXXoNN7fbPCU/vQ7JjwGmgOeGZSSZnsw== + version "1.8.0" + resolved "https://registry.yarnpkg.com/dotenv-webpack/-/dotenv-webpack-1.8.0.tgz#7ca79cef2497dd4079d43e81e0796bc9d0f68a5e" + integrity sha512-o8pq6NLBehtrqA8Jv8jFQNtG9nhRtVqmoD4yWbgUyoU3+9WBlPe+c2EAiaJok9RB28QvrWvdWLZGeTT5aATDMg== dependencies: dotenv-defaults "^1.0.2" @@ -6142,10 +6166,10 @@ ejs@^2.7.4: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz#48661287573dcc53e366c7a1ae52c3a120eec9ba" integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== -electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.390: - version "1.3.397" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.397.tgz#db640c2e67b08d590a504c20b56904537aa2bafa" - integrity sha512-zcUd1p/7yzTSdWkCTrqGvbnEOASy96d0RJL/lc5BDJoO23Z3G/VHd0yIPbguDU9n8QNUTCigLO7oEdtOb7fp2A== +electron-to-chromium@^1.3.247, electron-to-chromium@^1.3.413: + version "1.3.442" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.442.tgz#62f96e0529f40a214a97411b57f27c4f080f0aa2" + integrity sha512-3OjmbnD9+LyWzh9o3rjC7LNIkcDHjKyHM6Xt0G/+7gHGCaEIwvWYi8TrNA8feNnuGmvI9WKu289PFMQGMLHAig== element-resize-detector@^1.2.1: version "1.2.1" @@ -6154,7 +6178,7 @@ element-resize-detector@^1.2.1: dependencies: batch-processor "1.0.0" -elliptic@^6.0.0: +elliptic@^6.0.0, elliptic@^6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz#05c5678d7173c049d8ca433552224a495d0e3762" integrity sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw== @@ -6247,9 +6271,9 @@ entities@^1.1.1, entities@^1.1.2, entities@~1.1.1: integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4" - integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw== + version "2.0.2" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.2.tgz#ac74db0bba8d33808bbf36809c3a5c3683531436" + integrity sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw== env-paths@^2.2.0: version "2.2.0" @@ -6257,9 +6281,9 @@ env-paths@^2.2.0: integrity sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA== envinfo@^7.3.1: - version "7.5.0" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.5.0.tgz#91410bb6db262fb4f1409bd506e9ff57e91023f4" - integrity sha512-jDgnJaF/Btomk+m3PZDTTCb5XIIIX3zYItnCRfF73zVgvinLoRomuhi75Y4su0PtQxWz4v66XnLLckyvyJTOIQ== + version "7.5.1" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.5.1.tgz#93c26897225a00457c75e734d354ea9106a72236" + integrity sha512-hQBkDf2iO4Nv0CNHpCuSBeaSrveU6nThVxFGTrq/eDlV716UQk09zChaJae4mZRsos1x4YLY2TaH3LHUae3ZmQ== enzyme-adapter-react-16@^1.15.0: version "1.15.2" @@ -6289,9 +6313,9 @@ enzyme-adapter-utils@^1.13.0: semver "^5.7.1" enzyme-context-react-router-4@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/enzyme-context-react-router-4/-/enzyme-context-react-router-4-2.0.0.tgz#d23ab6a4e3a6c6d34519def1bdacea4fd19daecd" - integrity sha512-q/0Fugcvipzo6qxghQ9NQjMrj0PW1wZh02dQ67AVg/j35naD4MeXihI2la3s4fUKGhrK6IUCQ4QGEw15slTNqQ== + version "2.1.0" + resolved "https://registry.yarnpkg.com/enzyme-context-react-router-4/-/enzyme-context-react-router-4-2.1.0.tgz#3154fc5294047e55fa65c4f15b3df912500f5b20" + integrity sha512-PCH0DuZ70r5PTDn6ZkETsF8MS2g9sgbrJGM2lvHsBHNI41p6HUo8nPf2zWJJ1vyWCDGQNlvuNUt5p9ZdgL0vCA== dependencies: "@types/history" "^4.7.3" enzyme-context-utils "^1.1.0" @@ -6463,9 +6487,9 @@ escodegen@^1.9.1: source-map "~0.6.1" eslint-config-prettier@^6.4.0: - version "6.10.1" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.10.1.tgz#129ef9ec575d5ddc0e269667bf09defcd898642a" - integrity sha512-svTy6zh1ecQojvpbJSgH3aei/Rt7C6i090l5f2WQ4aB05lYHeZIR1qL4wZyyILTbtmnbHP5Yn8MrsOJMGa8RkQ== + version "6.11.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz#f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1" + integrity sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA== dependencies: get-stdin "^6.0.0" @@ -6533,9 +6557,9 @@ eslint-plugin-jsx-a11y@^6.2.3: jsx-ast-utils "^2.2.1" eslint-plugin-prettier@^3.1.1: - version "3.1.2" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.2.tgz#432e5a667666ab84ce72f945c72f77d996a5c9ba" - integrity sha512-GlolCC9y3XZfv3RQfwGew7NnuFDKsfI4lbvRK+PIIo23SFH+LemGs4cKwzAaRa+Mdb+lQO/STaIayno8T5sJJA== + version "3.1.3" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz#ae116a0fc0e598fdae48743a4430903de5b4e6ca" + integrity sha512-+HG5jmu/dN3ZV3T6eCD7a4BlAySdN7mLIbJYo0z1cFQuI+r2DiTJEFeF68ots93PsnrMxbzIZ2S/ieX+mkrBeQ== dependencies: prettier-linter-helpers "^1.0.0" @@ -6545,9 +6569,9 @@ eslint-plugin-react-hooks@^2.1.2: integrity sha512-Y2c4b55R+6ZzwtTppKwSmK/Kar8AdLiC2f9NADCuxbcTgPPg41Gyqa6b9GppgXSvCtkRw43ZE86CT5sejKC6/g== eslint-plugin-react@^7.16.0: - version "7.19.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.19.0.tgz#6d08f9673628aa69c5559d33489e855d83551666" - integrity sha512-SPT8j72CGuAP+JFbT0sJHOB80TX/pu44gQ4vXH/cq+hQTiY2PuZ6IHkqXJV6x1b28GDdo1lbInjKUrrdUf0LOQ== + version "7.20.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.20.0.tgz#f98712f0a5e57dfd3e5542ef0604b8739cd47be3" + integrity sha512-rqe1abd0vxMjmbPngo4NaYxTcR3Y4Hrmc/jg4T+sYz63yqlmJRknpEQfmWY+eDWPuMmix6iUIK+mv0zExjeLgA== dependencies: array-includes "^3.1.1" doctrine "^2.1.0" @@ -6558,7 +6582,6 @@ eslint-plugin-react@^7.16.0: object.values "^1.1.1" prop-types "^15.7.2" resolve "^1.15.1" - semver "^6.3.0" string.prototype.matchall "^4.0.2" xregexp "^4.3.0" @@ -6655,11 +6678,11 @@ esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.2.0.tgz#a010a519c0288f2530b3404124bfb5f02e9797fe" - integrity sha512-weltsSqdeWIX9G2qQZz7KlTRJdkkOCTPgLYJUz1Hacf48R4YOwGPHO3+ORfWedqJKbq5WQmsgK90n+pFLIKt/Q== + version "1.3.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" + integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== dependencies: - estraverse "^5.0.0" + estraverse "^5.1.0" esrecurse@^4.1.0: version "4.2.1" @@ -6673,10 +6696,10 @@ estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== -estraverse@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.0.0.tgz#ac81750b482c11cca26e4b07e83ed8f75fbcdc22" - integrity sha512-j3acdrMzqrxmJTNj5dbr1YbjacrYgAxVMeF0gK16E3j494mOe7xygM/ZLIguEQ0ETwAg2hlJCtHRGav+y0Ny5A== +estraverse@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" + integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== esutils@^2.0.2: version "2.0.3" @@ -6694,9 +6717,9 @@ eventemitter3@^3.1.0: integrity sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q== eventemitter3@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.0.tgz#d65176163887ee59f386d64c82610b696a4a74eb" - integrity sha512-qerSRB0p+UDEssxTtm6EDKcE7W4OaoisfIMl4CngyEhjpYglocpNg6UEqCvemdGhosAsg4sO2dXJOdyBifPGCg== + version "4.0.4" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz#b5463ace635a083d018bdc7c917b4c5f10a85384" + integrity sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ== events@^3.0.0: version "3.1.0" @@ -7044,7 +7067,7 @@ find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" -find-cache-dir@^3.0.0, find-cache-dir@^3.2.0: +find-cache-dir@^3.0.0, find-cache-dir@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz#89b33fad4a4670daa94f855f7fbe31d6d84fe880" integrity sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ== @@ -7120,10 +7143,10 @@ flush-write-stream@^1.0.0: inherits "^2.0.3" readable-stream "^2.3.6" -focus-lock@^0.6.6: - version "0.6.6" - resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.6.6.tgz#98119a755a38cfdbeda0280eaa77e307eee850c7" - integrity sha512-Dx69IXGCq1qsUExWuG+5wkiMqVM/zGx/reXSJSLogECwp3x6KeNQZ+NAetgxEFpnC41rD8U3+jRCW68+LNzdtw== +focus-lock@^0.6.7: + version "0.6.8" + resolved "https://registry.yarnpkg.com/focus-lock/-/focus-lock-0.6.8.tgz#61985fadfa92f02f2ee1d90bc738efaf7f3c9f46" + integrity sha512-vkHTluRCoq9FcsrldC0ulQHiyBYgVJB2CX53I8r0nTC6KnEij7Of0jpBspjt3/CuNb6fyoj3aOh9J2HgQUM0og== follow-redirects@^1.0.0: version "1.11.0" @@ -7257,17 +7280,17 @@ fs.realpath@^1.0.0: integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= fsevents@^1.2.7: - version "1.2.12" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.12.tgz#db7e0d8ec3b0b45724fd4d83d43554a8f1f0de5c" - integrity sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q== + version "1.2.13" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw== dependencies: bindings "^1.5.0" nan "^2.12.1" fsevents@~2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.2.tgz#4c0a1fb34bc68e543b4b82a9ec392bfbda840805" - integrity sha512-R4wDiBwZ0KzpgOWetKDug1FZcYhqYnUYKtfZYt4mD5SBz76q0KR4Q9o7GIPamsVPGmW3EYPPJ0dOOjvx32ldZA== + version "2.1.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" + integrity sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ== function-bind@^1.1.1: version "1.1.1" @@ -7322,11 +7345,6 @@ gensync@^1.0.0-beta.1: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269" integrity sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg== -get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w== - get-caller-file@^2.0.1: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" @@ -7426,9 +7444,9 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" -gitdiff-parser@^0.1.2, "gitdiff-parser@https://github.com/scm-manager/gitdiff-parser#ed3fe7de73dbb0a06c3e6adbbdf22dbae6e66351": +gitdiff-parser@^0.1.2, "gitdiff-parser@https://github.com/scm-manager/gitdiff-parser#1da10408e52ad1d58b1f817dd1d658d9f2eb4087": version "0.1.2" - resolved "https://github.com/scm-manager/gitdiff-parser#ed3fe7de73dbb0a06c3e6adbbdf22dbae6e66351" + resolved "https://github.com/scm-manager/gitdiff-parser#1da10408e52ad1d58b1f817dd1d658d9f2eb4087" glob-base@^0.3.0: version "0.3.0" @@ -7591,9 +7609,9 @@ good-listener@^1.2.2: delegate "^3.1.2" graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2: - version "4.2.3" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.3.tgz#4a12ff1b60376ef09862c2093edd908328be8423" - integrity sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ== + version "4.2.4" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb" + integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== growly@^1.3.0: version "1.3.0" @@ -7618,7 +7636,7 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -handlebars@^4.4.0: +handlebars@^4.7.6: version "4.7.6" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e" integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA== @@ -7643,6 +7661,11 @@ har-validator@~5.1.3: ajv "^6.5.5" har-schema "^2.0.0" +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -7709,12 +7732,13 @@ has@^1.0.0, has@^1.0.3: function-bind "^1.1.1" hash-base@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.0.4.tgz#5fc8686847ecd73499403319a6b0a3f3f6ae4918" - integrity sha1-X8hoaEfs1zSZQDMZprCj8/auSRg= + version "3.1.0" + resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz#55c381d9e06e1d2997a883b4a3fddfe7f0d3af33" + integrity sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA== dependencies: - inherits "^2.0.1" - safe-buffer "^5.0.1" + inherits "^2.0.4" + readable-stream "^3.6.0" + safe-buffer "^5.2.0" hash.js@^1.0.0, hash.js@^1.0.3: version "1.1.7" @@ -7843,10 +7867,10 @@ html-encoding-sniffer@^1.0.2: dependencies: whatwg-encoding "^1.0.1" -html-entities@^1.2.0, html-entities@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" - integrity sha1-DfKTUfByEWNRXfueVUPl9u7VFi8= +html-entities@^1.2.0, html-entities@^1.2.1, html-entities@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz#fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44" + integrity sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA== html-escaper@^2.0.0: version "2.0.2" @@ -7854,9 +7878,9 @@ html-escaper@^2.0.0: integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== html-minifier-terser@^5.0.1: - version "5.0.5" - resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.0.5.tgz#8f12f639789f04faa9f5cf2ff9b9f65607f21f8b" - integrity sha512-cBSFFghQh/uHcfSiL42KxxIRMF7A144+3E44xdlctIjxEmkEfCvouxNyFH2wysXk1fCGBPwtcr3hDWlGTfkDew== + version "5.1.1" + resolved "https://registry.yarnpkg.com/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz#922e96f1f3bb60832c2634b79884096389b1f054" + integrity sha512-ZPr5MNObqnV/T9akshPKbVgyOqLmy+Bxo7juKCfTfnjNniTAMdy4hz21YQqoofMBJD2kdREaqPPdThoR78Tgxg== dependencies: camel-case "^4.1.1" clean-css "^4.2.3" @@ -7884,9 +7908,9 @@ html-to-react@^1.3.4: ramda "^0.26" html-webpack-plugin@^4.0.0-beta.2: - version "4.0.4" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.0.4.tgz#90cdfb168094e93e047174d9baca098ec5540636" - integrity sha512-BREQzUbFfIQS39KqxkT2L1Ot0tuu1isako1CaCQLrgEQ43zi2ScHAe3SMTnVBWsStnIsGtl8jprDdxwZkNhrwQ== + version "4.3.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz#53bf8f6d696c4637d5b656d3d9863d89ce8174fd" + integrity sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w== dependencies: "@types/html-minifier-terser" "^5.0.0" "@types/tapable" "^1.0.5" @@ -7986,9 +8010,9 @@ http-proxy-middleware@0.19.1: micromatch "^3.1.10" http-proxy@^1.17.0: - version "1.18.0" - resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.0.tgz#dbe55f63e75a347db7f3d99974f2692a314a6a3a" - integrity sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ== + version "1.18.1" + resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== dependencies: eventemitter3 "^4.0.0" follow-redirects "^1.0.0" @@ -8024,21 +8048,21 @@ humanize-ms@^1.2.1: ms "^2.0.0" i18next-browser-languagedetector@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-4.0.2.tgz#eb02535cc5e57dd534fc60abeede05a3823a8551" - integrity sha512-AK4IZ3XST4HIKShgpB2gOFeDPrMOnZx56GLA6dGo/8rvkiczIlq05lV8w77c3ShEZxtTZeUVRI4Q/cBFFVXS/w== + version "4.2.0" + resolved "https://registry.yarnpkg.com/i18next-browser-languagedetector/-/i18next-browser-languagedetector-4.2.0.tgz#82e35d31f88a1d7c2b6d5913bf8c8481cd40aafb" + integrity sha512-qRSCBWgDUSqVQb3sTxkDC+ImYLhF+wB387Y1RpOcJvyex+V3abi+W83n4Awy+dx719AOBbKTy97FjrUGrAhbyw== dependencies: "@babel/runtime" "^7.5.5" i18next-fetch-backend@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/i18next-fetch-backend/-/i18next-fetch-backend-2.2.0.tgz#39ff6578596e0122e80692e04d7897ee373607d6" - integrity sha512-HodOCr4fezjMgJwWnOR/JUotdbM1onXdnB6Y+XDgDpXX58SkZXcyz6VmmUGc/8XMxFzq3162Qs2vO+SlO4TCFw== + version "2.3.1" + resolved "https://registry.yarnpkg.com/i18next-fetch-backend/-/i18next-fetch-backend-2.3.1.tgz#5bad723cfdec4b29698e580957fa547f4ff6e37a" + integrity sha512-cn0GFBbkkaXwaiXqfb3bpmhoBYvFR9bFBR5BeSNMP9KSmYE8M+q0QKwd68rcVDwasFxrurI97hYOY+5svGM51Q== i18next@*: - version "19.3.4" - resolved "https://registry.yarnpkg.com/i18next/-/i18next-19.3.4.tgz#512de50ee6075df825c646e1ce646a104f0938c9" - integrity sha512-ef7AxxutzdhBsBNugE9jgqsbwesG1muJOtZ9ZrPARPs/jXegViTp4+8JCeMp8BAyTIo1Zn0giqc8+2UpqFjU0w== + version "19.4.4" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-19.4.4.tgz#c0a18bc2f2be554da636e67bfbf5200c7948b60d" + integrity sha512-ofaHtdsDdX3A5nYur1HWblB7J4hIcjr2ACdnwTAJgc8hTfPbyzZfGX0hVkKpI3vzDIgO6Uzc4v1ffW2W6gG6zw== dependencies: "@babel/runtime" "^7.3.1" @@ -8173,7 +8197,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -8523,9 +8547,9 @@ is-fullwidth-code-point@^3.0.0: integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== is-function@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" - integrity sha1-Es+5i2W1fdPRk6MSH19uL0N2ArU= + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08" + integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ== is-generator-fn@^2.0.0: version "2.1.0" @@ -8633,11 +8657,6 @@ is-plain-object@^3.0.0: dependencies: isobject "^4.0.0" -is-promise@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" - integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= - is-regex@^1.0.4, is-regex@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" @@ -8714,9 +8733,9 @@ is-utf8@^0.2.0: integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= is-what@^3.3.1: - version "3.7.1" - resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.7.1.tgz#a3f810a99f88e9122cf17bf2be7709688970db1a" - integrity sha512-IAoapxlqyLSqt0Zr/7ZMT/fjEw9nwxxmz/TlBH+TJjvcXxmmAdRvo41W74uw3XJMGFpbeft97cpkPmLK89lJWw== + version "3.8.0" + resolved "https://registry.yarnpkg.com/is-what/-/is-what-3.8.0.tgz#610bc46a524355f2424eb85eedc6ebbbf7e1ff8c" + integrity sha512-UKeBoQfV8bjlM4pmx1FLDHdxslW/1mTksEs8ReVsilPmUv5cORd4+2/wFcviI3cUjrLybxCjzc8DnodAzJ/Wrg== is-whitespace-character@^1.0.0: version "1.0.4" @@ -8744,9 +8763,11 @@ is-wsl@^1.1.0: integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= is-wsl@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" - integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" isarray@0.0.1: version "0.0.1" @@ -8918,14 +8939,14 @@ jest-diff@^24.3.0, jest-diff@^24.9.0: pretty-format "^24.9.0" jest-diff@^25.2.1: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.2.6.tgz#a6d70a9ab74507715ea1092ac513d1ab81c1b5e7" - integrity sha512-KuadXImtRghTFga+/adnNrv9s61HudRMR7gVSbP35UKZdn4IK2/0N0PpGZIqtmllK9aUyye54I3nu28OYSnqOg== + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-25.5.0.tgz#1dd26ed64f96667c068cef026b677dfa01afcfa9" + integrity sha512-z1kygetuPiREYdNIumRpAHY6RXiGmp70YHptjdaxTWGmA085W3iCnXNx0DhflK3vwrKmrRWyY1wUpkPMVxMK7A== dependencies: chalk "^3.0.0" diff-sequences "^25.2.6" jest-get-type "^25.2.6" - pretty-format "^25.2.6" + pretty-format "^25.5.0" jest-docblock@^24.3.0: version "24.9.0" @@ -9234,10 +9255,10 @@ jest-worker@^24.6.0, jest-worker@^24.9.0: merge-stream "^2.0.0" supports-color "^6.1.0" -jest-worker@^25.1.0: - version "25.2.6" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.2.6.tgz#d1292625326794ce187c38f51109faced3846c58" - integrity sha512-FJn9XDUSxcOR4cwDzRfL1z56rUofNTFs539FGASpd50RHdb6EVkhxQqktodW2mI49l+W3H+tFJDotCHUQF6dmA== +jest-worker@^25.4.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz#2611d071b79cea0f43ee57a3d118593ac1547db1" + integrity sha512-/dsSmUkIy5EBGfv/IjjqmFxrNAUpBERfGs1oHROyD7yxjG/w+t0GOJDX8O1k32ySmd7+a5IhnJU2qQFcJ4n1vw== dependencies: merge-stream "^2.0.0" supports-color "^7.0.0" @@ -9427,7 +9448,7 @@ kind-of@^5.0.0: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -9486,26 +9507,26 @@ left-pad@^1.3.0: integrity sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA== lerna@^3.17.0: - version "3.20.2" - resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.20.2.tgz#abf84e73055fe84ee21b46e64baf37b496c24864" - integrity sha512-bjdL7hPLpU3Y8CBnw/1ys3ynQMUjiK6l9iDWnEGwFtDy48Xh5JboR9ZJwmKGCz9A/sarVVIGwf1tlRNKUG9etA== + version "3.21.0" + resolved "https://registry.yarnpkg.com/lerna/-/lerna-3.21.0.tgz#c81a0f8df45c6b7c9d3fc9fdcd0f846aca2375c6" + integrity sha512-ux8yOwQEgIXOZVUfq+T8nVzPymL19vlIoPbysOP3YA4hcjKlqQIlsjI/1ugBe6b4MF7W4iV5vS3gH9cGqBBc1A== dependencies: - "@lerna/add" "3.20.0" - "@lerna/bootstrap" "3.20.0" - "@lerna/changed" "3.20.0" - "@lerna/clean" "3.20.0" + "@lerna/add" "3.21.0" + "@lerna/bootstrap" "3.21.0" + "@lerna/changed" "3.21.0" + "@lerna/clean" "3.21.0" "@lerna/cli" "3.18.5" - "@lerna/create" "3.18.5" - "@lerna/diff" "3.18.5" - "@lerna/exec" "3.20.0" - "@lerna/import" "3.18.5" - "@lerna/info" "3.20.0" - "@lerna/init" "3.18.5" - "@lerna/link" "3.18.5" - "@lerna/list" "3.20.0" - "@lerna/publish" "3.20.2" - "@lerna/run" "3.20.0" - "@lerna/version" "3.20.2" + "@lerna/create" "3.21.0" + "@lerna/diff" "3.21.0" + "@lerna/exec" "3.21.0" + "@lerna/import" "3.21.0" + "@lerna/info" "3.21.0" + "@lerna/init" "3.21.0" + "@lerna/link" "3.21.0" + "@lerna/list" "3.21.0" + "@lerna/publish" "3.21.0" + "@lerna/run" "3.21.0" + "@lerna/version" "3.21.0" import-local "^2.0.0" npmlog "^4.1.2" @@ -9599,6 +9620,15 @@ loader-utils@^1.1.0, loader-utils@^1.2.3, loader-utils@^1.4.0: emojis-list "^3.0.0" json5 "^1.0.1" +loader-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz#e4cace5b816d425a166b5f097e10cd12b36064b0" + integrity sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" @@ -9727,10 +9757,10 @@ lodash@^4.15.0, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17. resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== -loglevel@^1.6.6: - version "1.6.7" - resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.7.tgz#b3e034233188c68b889f5b862415306f565e2c56" - integrity sha512-cY2eLFrQSAfVPhCgH1s7JI73tMbg9YC3v3+ZHVW67sBS7UxWzNEk/ZBbSfLykBWHp33dqqtOv82gjhKEi81T/A== +loglevel@^1.6.8: + version "1.6.8" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz#8a25fb75d092230ecd4457270d80b54e28011171" + integrity sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA== loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: version "1.4.0" @@ -9790,9 +9820,9 @@ make-dir@^2.0.0, make-dir@^2.1.0: semver "^5.6.0" make-dir@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.0.2.tgz#04a1acbf22221e1d6ef43559f43e05a90dbb4392" - integrity sha512-rYKABKutXa6vXTXhoV18cBE7PaewPXHe/Bdq4v+ZLMhxbWApkFFplT0LcbMW+6BbjnQXzZ/sAvSE/JdguApG5w== + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== dependencies: semver "^6.0.0" @@ -9842,6 +9872,11 @@ map-obj@^2.0.0: resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-2.0.0.tgz#a65cd29087a92598b8791257a523e021222ac1f9" integrity sha1-plzSkIepJZi4eRJXpSPgISIqwfk= +map-obj@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.1.0.tgz#b91221b542734b9f14256c0132c897c5d7256fd5" + integrity sha512-glc9y00wgtwcDmp7GaE/0b0OnxpNJsVf3ael/An6Fe2Q51LLwN1er6sdomLRzz5h0+yMpiYLhWYF5R7HeqVd4g== + map-or-similar@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/map-or-similar/-/map-or-similar-1.5.0.tgz#6de2653174adfb5d9edc33c69d3e92a1b76faf08" @@ -9860,9 +9895,9 @@ markdown-escapes@^1.0.0: integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== markdown-to-jsx@^6.9.1, markdown-to-jsx@^6.9.3: - version "6.11.0" - resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.11.0.tgz#a2e3f2bc781c3402d8bb0f8e0a12a186474623b0" - integrity sha512-RH7LCJQ4RFmPqVeZEesKaO1biRzB/k4utoofmTCp3Eiw6D7qfvK8fzZq/2bjEJAtVkfPrM5SMt5APGf2rnaKMg== + version "6.11.1" + resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-6.11.1.tgz#3931612cfffaa5fd6610ecf2a4055eccccb98fa8" + integrity sha512-FdtDAv8d9/tjyHxdCvWZxxOgK2icwzBkTq/dPk+XlQ2B+DYDcwE89FWGzT92erXQ0CQR/bQbpNK3loNYhYL70g== dependencies: prop-types "^15.6.2" unquote "^1.1.0" @@ -9966,20 +10001,24 @@ meow@^4.0.0: redent "^2.0.0" trim-newlines "^2.0.0" -meow@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-5.0.0.tgz#dfc73d63a9afc714a5e371760eb5c88b91078aa4" - integrity sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig== +meow@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/meow/-/meow-7.0.1.tgz#1ed4a0a50b3844b451369c48362eb0515f04c1dc" + integrity sha512-tBKIQqVrAHqwit0vfuFPY3LlzJYkEOFyKa3bPgxzNl6q/RtN8KQ+ALYEASYuFayzSAsjlhXj/JZ10rH85Q6TUw== dependencies: - camelcase-keys "^4.0.0" - decamelize-keys "^1.0.0" - loud-rejection "^1.0.0" - minimist-options "^3.0.1" - normalize-package-data "^2.3.4" - read-pkg-up "^3.0.0" - redent "^2.0.0" - trim-newlines "^2.0.0" - yargs-parser "^10.0.0" + "@types/minimist" "^1.2.0" + arrify "^2.0.1" + camelcase "^6.0.0" + camelcase-keys "^6.2.2" + decamelize-keys "^1.1.0" + hard-rejection "^2.1.0" + minimist-options "^4.0.2" + normalize-package-data "^2.5.0" + read-pkg-up "^7.0.1" + redent "^3.0.0" + trim-newlines "^3.0.0" + type-fest "^0.13.1" + yargs-parser "^18.1.3" merge-anything@^2.2.4: version "2.4.4" @@ -10057,17 +10096,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.43.0, "mime-db@>= 1.43.0 < 2": - version "1.43.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.43.0.tgz#0a12e0502650e473d735535050e7c8f4eb4fae58" - integrity sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ== +mime-db@1.44.0, "mime-db@>= 1.43.0 < 2": + version "1.44.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92" + integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg== mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.26" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.26.tgz#9c921fc09b7e149a65dfdc0da4d20997200b0a06" - integrity sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ== + version "2.1.27" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f" + integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w== dependencies: - mime-db "1.43.0" + mime-db "1.44.0" mime@1.6.0: version "1.6.0" @@ -10075,9 +10114,9 @@ mime@1.6.0: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.4.4: - version "2.4.4" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" - integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== + version "2.4.5" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.5.tgz#d8de2ecb92982dedbb6541c9b6841d7f218ea009" + integrity sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w== mimic-fn@^1.0.0: version "1.2.0" @@ -10101,14 +10140,13 @@ min-indent@^1.0.0: resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.0.tgz#cfc45c37e9ec0d8f0a0ec3dd4ef7f7c3abe39256" integrity sha1-z8RcN+nsDY8KDsPdTvf3w6vjklY= -mini-create-react-context@^0.3.0: - version "0.3.2" - resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.3.2.tgz#79fc598f283dd623da8e088b05db8cddab250189" - integrity sha512-2v+OeetEyliMt5VHMXsBhABoJ0/M4RCe7fatd/fBy6SMiKazUSEt3gxxypfnk2SHMkdBYvorHRoQxuGoiwbzAw== +mini-create-react-context@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/mini-create-react-context/-/mini-create-react-context-0.4.0.tgz#df60501c83151db69e28eac0ef08b4002efab040" + integrity sha512-b0TytUgFSbgFJGzJqXPKCFCBWigAjpjo+Fl7Vf7ZbKRDptszpppKxXH6DRXEABZ/gcEQczeb0iZ7JvL8e8jjCA== dependencies: - "@babel/runtime" "^7.4.0" - gud "^1.0.0" - tiny-warning "^1.0.2" + "@babel/runtime" "^7.5.5" + tiny-warning "^1.0.3" mini-css-extract-plugin@^0.7.0: version "0.7.0" @@ -10155,6 +10193,15 @@ minimist-options@^3.0.1: arrify "^1.0.1" is-plain-obj "^1.1.0" +minimist-options@^4.0.2: + version "4.1.0" + resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" @@ -10175,9 +10222,9 @@ minipass-flush@^1.0.5: minipass "^3.0.0" minipass-pipeline@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.2.tgz#3dcb6bb4a546e32969c7ad710f2c79a86abba93a" - integrity sha512-3JS5A2DKhD2g0Gg8x3yamO0pj7YeKGwVlDS90pF++kxptwx/F+B//roxf9SqYil5tQo65bijy+dAuAFZmYOouA== + version "1.2.3" + resolved "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz#55f7839307d74859d6e8ada9c3ebe72cec216a34" + integrity sha512-cFOknTvng5vqnwOpDsZTWhNll6Jf8o2x+/diplafmxpuIymAjzoOolZG0VvQf3V2HgqzJNhnuKHYp2BqDgz8IQ== dependencies: minipass "^3.0.0" @@ -10190,9 +10237,9 @@ minipass@^2.3.5, minipass@^2.6.0, minipass@^2.8.6, minipass@^2.9.0: yallist "^3.0.0" minipass@^3.0.0, minipass@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.1.tgz#7607ce778472a185ad6d89082aa2070f79cedcd5" - integrity sha512-UFqVihv6PQgwj8/yTGvl9kPz7xIAY+R5z6XYjRInD3Gk3qx6QGSD6zEcpeG4Dy/lQnv1J6zv8ejV90hyYIKf3w== + version "3.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== dependencies: yallist "^4.0.0" @@ -10339,9 +10386,9 @@ mz@^2.5.0: thenify-all "^1.0.0" nan@^2.12.1: - version "2.14.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.0.tgz#7818f722027b2459a86f0295d434d1fc2336c52c" - integrity sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg== + version "2.14.1" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" + integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== nanomatch@^1.2.9: version "1.2.13" @@ -10366,9 +10413,9 @@ natural-compare@^1.4.0: integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= nearley@^2.7.10: - version "2.19.1" - resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.1.tgz#4af4006e16645ff800e9f993c3af039857d9dbdc" - integrity sha512-xq47GIUGXxU9vQg7g/y1o1xuKnkO7ev4nRWqftmQrLkfnE/FjRqDaGOUakM8XHPn/6pW3bGjU2wgoJyId90rqg== + version "2.19.3" + resolved "https://registry.yarnpkg.com/nearley/-/nearley-2.19.3.tgz#ae3b040e27616b5348102c436d1719209476a5a1" + integrity sha512-FpAy1PmTsUpOtgxr23g4jRNvJHYzZEW2PixXeSzksLR/ykPfwKhAodc2+9wQhY+JneWLcvkDw6q7FJIsIdF/aQ== dependencies: commander "^2.19.0" moo "^0.5.0" @@ -10501,9 +10548,9 @@ node-notifier@^5.4.2: which "^1.3.0" node-releases@^1.1.29, node-releases@^1.1.53: - version "1.1.53" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.53.tgz#2d821bfa499ed7c5dffc5e2f28c88e78a08ee3f4" - integrity sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ== + version "1.1.55" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.55.tgz#8af23b7c561d8e2e6e36a46637bab84633b07cee" + integrity sha512-H3R3YR/8TjT5WPin/wOoHOUPHgvj8leuU/Keta/rwelEQN9pA/S2Dx8/se4pZ2LBxSd0nAGzsNzhqwa77v7F1w== nopt@^4.0.1: version "4.0.3" @@ -10680,9 +10727,12 @@ object-inspect@^1.7.0: integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== object-is@^1.0.1, object-is@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.2.tgz#6b80eb84fe451498f65007982f035a5b445edec4" - integrity sha512-Epah+btZd5wrrfjkJZq1AOB9O6OxUQto45hzFd7lXGrpHPGE0W1k+426yrZV+k6NJOzLNNW/nVsmZdIWsAqoOQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" + integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.1.1: version "1.1.1" @@ -10802,9 +10852,9 @@ open@^6.3.0: is-wsl "^1.1.0" open@^7.0.0: - version "7.0.3" - resolved "https://registry.yarnpkg.com/open/-/open-7.0.3.tgz#db551a1af9c7ab4c7af664139930826138531c48" - integrity sha512-sP2ru2v0P290WFfv49Ap8MF6PkzGNnGlAwHweB4WR4mr5d2d0woiCluUeJ218w7/+PmoBy9JmYgD5A4mLcWOFA== + version "7.0.4" + resolved "https://registry.yarnpkg.com/open/-/open-7.0.4.tgz#c28a9d315e5c98340bf979fdcb2e58664aa10d83" + integrity sha512-brSA+/yq+b08Hsr4c8fsEW2CRzk1BmfN3SAK/5VCHQ9bdoZJ4qa/+AfR0xHjlbbZUyPkUHs1b8x1RqdyZdkVqQ== dependencies: is-docker "^2.0.0" is-wsl "^2.1.1" @@ -10853,7 +10903,7 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-locale@^3.0.0, os-locale@^3.1.0: +os-locale@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== @@ -10912,7 +10962,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.2: +p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== @@ -11029,7 +11079,7 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-asn1@^5.0.0: +parse-asn1@^5.0.0, parse-asn1@^5.1.5: version "5.1.5" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz#003271343da58dc94cace494faef3d2147ecea0e" integrity sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ== @@ -11244,7 +11294,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.0.7: +picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: version "2.2.2" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== @@ -11324,21 +11374,21 @@ pnp-webpack-plugin@1.5.0: ts-pnp "^1.1.2" polished@^3.3.1: - version "3.5.1" - resolved "https://registry.yarnpkg.com/polished/-/polished-3.5.1.tgz#657b6faf4c2308f3e0b1951196803a5e5d67b122" - integrity sha512-GVbvskpBiDV5TknurGL6OyFfLHsCknxbU8w5iMppT8rW0tLEoQHrIRfrPNPqGXNj3HGhkjRvhmg59Fy7HSnCAw== + version "3.6.3" + resolved "https://registry.yarnpkg.com/polished/-/polished-3.6.3.tgz#68f4fe7ffad46530733029b939dd12978200cb59" + integrity sha512-QJ0q0b6gX1+0OJtPMfgVJxV0vg5XTa4im+Rca989dAtmsd/fEky3X+0A+V+OUXq1nyiDGplJwqD853dTS0gkPg== dependencies: - "@babel/runtime" "^7.8.7" + "@babel/runtime" "^7.9.2" popper.js@^1.14.4, popper.js@^1.14.7: version "1.16.1" resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1.tgz#2a223cb3dc7b6213d740e40372be40de43e65b1b" integrity sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ== -portfinder@^1.0.25: - version "1.0.25" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.25.tgz#254fd337ffba869f4b9d37edc298059cb4d35eca" - integrity sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg== +portfinder@^1.0.26: + version "1.0.26" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz#475658d56ca30bed72ac7f1378ed350bd1b64e70" + integrity sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ== dependencies: async "^2.6.2" debug "^3.1.1" @@ -11406,9 +11456,9 @@ postcss-discard-overridden@^4.0.1: postcss "^7.0.0" postcss-flexbugs-fixes@^4.1.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.0.tgz#662b3dcb6354638b9213a55eed8913bcdc8d004a" - integrity sha512-QRE0n3hpkxxS/OGvzOa+PDuy4mh/Jg4o9ui22/ko5iGYOG3M5dfJabjnAZjTdh2G9F85c7Hv8hWcEDEKW/xceQ== + version "4.2.1" + resolved "https://registry.yarnpkg.com/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-4.2.1.tgz#9218a65249f30897deab1033aced8578562a6690" + integrity sha512-9SiofaZ9CWpQWxOwRh1b/r85KD5y7GgvsNt1056k6OYLvWUun0czCvogfJgylC22uJTwW1KzY3Gz65NZRlvoiQ== dependencies: postcss "^7.0.26" @@ -11509,7 +11559,7 @@ postcss-modules-local-by-default@^3.0.2: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.0.0" -postcss-modules-scope@^2.1.1: +postcss-modules-scope@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz#385cae013cc7743f5a7d7602d1073a89eaae62ee" integrity sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ== @@ -11677,15 +11727,15 @@ postcss-value-parser@^3.0.0, postcss-value-parser@^3.3.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz#651ff4593aa9eda8d5d0d66593a2417aeaeb325d" - integrity sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg== +postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2, postcss-value-parser@^4.0.3, postcss-value-parser@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz#443f6a20ced6481a2bda4fa8532a6e55d789a2cb" + integrity sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ== -postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.23, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.5, postcss@^7.0.6: - version "7.0.27" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.27.tgz#cc67cdc6b0daa375105b7c424a85567345fc54d9" - integrity sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ== +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.26, postcss@^7.0.27, postcss@^7.0.30, postcss@^7.0.5, postcss@^7.0.6: + version "7.0.30" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.30.tgz#cc9378beffe46a02cbc4506a0477d05fcea9a8e2" + integrity sha512-nu/0m+NtIzoubO+xdAlwZl/u5S5vi/y6BCsoL8D+8IxsD3XvBS8X4YEADNIVXKVuQvduiucnRv+vPIqj56EGMQ== dependencies: chalk "^2.4.2" source-map "^0.6.1" @@ -11736,12 +11786,12 @@ pretty-format@^24.9.0: ansi-styles "^3.2.0" react-is "^16.8.4" -pretty-format@^25.2.1, pretty-format@^25.2.6: - version "25.2.6" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.2.6.tgz#542a1c418d019bbf1cca2e3620443bc1323cb8d7" - integrity sha512-DEiWxLBaCHneffrIT4B+TpMvkV9RNvvJrd3lY9ew1CEQobDzEXmYT1mg0hJhljZty7kCc10z13ohOFAE8jrUDg== +pretty-format@^25.2.1, pretty-format@^25.5.0: + version "25.5.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-25.5.0.tgz#7873c1d774f682c34b8d48b6743a2bf2ac55791a" + integrity sha512-kbo/kq2LQ/A/is0PQwsEHM7Ca6//bGPPvU6UnsdDRSKTWxT/ru/xb88v4BJf6a69H+uTytOEsTusT9ksd/1iWQ== dependencies: - "@jest/types" "^25.2.6" + "@jest/types" "^25.5.0" ansi-regex "^5.0.0" ansi-styles "^4.0.0" react-is "^16.12.0" @@ -11859,9 +11909,9 @@ prop-types@^15.5.4, prop-types@^15.5.8, prop-types@^15.6.0, prop-types@^15.6.1, react-is "^16.8.1" property-information@^5.0.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.4.0.tgz#16e08f13f4e5c4a7be2e4ec431c01c4f8dba869a" - integrity sha512-nmMWAm/3vKFGmmOWOcdLjgq/Hlxa+hsuR/px1Lp/UGEyc5A22A6l78Shc2C0E71sPmAqglni+HrS7L7VJ7AUCA== + version "5.5.0" + resolved "https://registry.yarnpkg.com/property-information/-/property-information-5.5.0.tgz#4dc075d493061a82e2b7d096f406e076ed859943" + integrity sha512-RgEbCx2HLa1chNgvChcx+rrCWD0ctBmGSE0M7lVm1yyv4UbvbrWoXp/BkVLZefzjrRBGW8/Js6uh/BnlHXFyjA== dependencies: xtend "^4.0.0" @@ -11963,9 +12013,9 @@ qs@6.7.0: integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== qs@^6.6.0: - version "6.9.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" - integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== + version "6.9.4" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687" + integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ== qs@~6.5.2: version "6.5.2" @@ -12009,6 +12059,11 @@ quick-lru@^1.0.0: resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-1.1.0.tgz#4360b17c61136ad38078397ff11416e186dcfbb8" integrity sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g= +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + raf@^3.4.0, raf@^3.4.1: version "3.4.1" resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" @@ -12121,9 +12176,9 @@ react-dev-utils@^9.0.0, react-dev-utils@^9.1.0: text-table "0.2.0" react-diff-view@^2.4.1: - version "2.4.3" - resolved "https://registry.yarnpkg.com/react-diff-view/-/react-diff-view-2.4.3.tgz#ad78f9760409757563f1a9b25682dc792a87baf6" - integrity sha512-7pCMzojlN2ql0ppg4Ppcg3STpJw3l98AA4fZqmUuSYNtX2D9jVLNHT60c+UGKQwfWRFKQPrswq0o4BOy4SpRzw== + version "2.4.4" + resolved "https://registry.yarnpkg.com/react-diff-view/-/react-diff-view-2.4.4.tgz#d255622ebaf9d1339600d5febccfc0bff30abf4a" + integrity sha512-eS+NIxOHpgGy/uGGB0wv4GvN6iXNaOlxiTPreBsKj6VpzbgsaeF5h084ZDQD9Q28gdCB5K5CQ5ZLqKfqEw+SPw== dependencies: classnames "^2.2.6" diff-match-patch "^1.0.4" @@ -12156,9 +12211,9 @@ react-dom@^16.10.2, react-dom@^16.8.3, react-dom@^16.8.6: scheduler "^0.19.1" react-draggable@^4.0.3: - version "4.2.0" - resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.2.0.tgz#40cc5209082ca7d613104bf6daf31372cc0e1114" - integrity sha512-5wFq//gEoeTYprnd4ze8GrFc+Rbnx+9RkOMR3vk4EbWxj02U6L6T3yrlKeiw4X5CtjD2ma2+b3WujghcXNRzkw== + version "4.4.2" + resolved "https://registry.yarnpkg.com/react-draggable/-/react-draggable-4.4.2.tgz#f3cefecee25f467f865144cda0d066e5f05f94a0" + integrity sha512-zLQs4R4bnBCGnCVTZiD8hPsHtkiJxgMpGDlRESM+EHQo8ysXhKJ2GKdJ8UxxLJdRVceX1j19jy+hQS2wHislPQ== dependencies: classnames "^2.2.5" prop-types "^15.6.0" @@ -12168,32 +12223,32 @@ react-error-overlay@^6.0.3: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.7.tgz#1dcfb459ab671d53f660a991513cb2f0a0553108" integrity sha512-TAv1KJFh3RhqxNvhzxj6LeT5NWklP6rDr2a0jaTfsZ5wSZWHOGeqQyejUp3xxLfPt2UpyJEcVQB/zyPcmonNFA== -react-fast-compare@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-2.0.4.tgz#e84b4d455b0fec113e0402c329352715196f81f9" - integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== +react-fast-compare@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.1.1.tgz#0becf31e3812fa70dc231e259f40d892d4767900" + integrity sha512-SCsAORWK59BvauR2L1BTdjQbJcSGJJz03U0awektk2hshLKrITDDFTlgGCqIZpTDlPC/NFlZee6xTMzXPVLiHw== react-focus-lock@^2.1.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.2.1.tgz#1d12887416925dc53481914b7cedd39494a3b24a" - integrity sha512-47g0xYcCTZccdzKRGufepY8oZ3W1Qg+2hn6u9SHZ0zUB6uz/4K4xJe7yYFNZ1qT6m+2JDm82F6QgKeBTbjW4PQ== + version "2.3.1" + resolved "https://registry.yarnpkg.com/react-focus-lock/-/react-focus-lock-2.3.1.tgz#9d5d85899773609c7eefa4fc54fff6a0f5f2fc47" + integrity sha512-j15cWLPzH0gOmRrUg01C09Peu8qbcdVqr6Bjyfxj80cNZmH+idk/bNBYEDSmkAtwkXI+xEYWSmHYqtaQhZ8iUQ== dependencies: "@babel/runtime" "^7.0.0" - focus-lock "^0.6.6" + focus-lock "^0.6.7" prop-types "^15.6.2" react-clientside-effect "^1.2.2" use-callback-ref "^1.2.1" use-sidecar "^1.0.1" react-helmet-async@^1.0.2: - version "1.0.4" - resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.0.4.tgz#079ef10b7fefcaee6240fefd150711e62463cc97" - integrity sha512-KTGHE9sz8N7+fCkZ2a3vzXH9eIkiTNhL2NhKR7XzzQl3WsGlCHh76arauJUIiGdfhjeMp7DY7PkASAmYFXeJYg== + version "1.0.6" + resolved "https://registry.yarnpkg.com/react-helmet-async/-/react-helmet-async-1.0.6.tgz#11c15c74e79b3f66670c73779bef3e0e352b1d4e" + integrity sha512-t+bhAI4NgxfEv8ez4r77cLfR4O4Z55E/FH2DT+uiE4U7yfWgAk7OAOi7IxHxuYEVLI26bqjZvlVCkpC5/5AoNA== dependencies: - "@babel/runtime" "^7.3.4" + "@babel/runtime" "^7.9.2" invariant "^2.2.4" prop-types "^15.7.2" - react-fast-compare "^2.0.4" + react-fast-compare "^3.0.1" shallowequal "^1.1.0" react-hotkeys@2.0.0: @@ -12212,9 +12267,9 @@ react-i18next@^10.13.1: html-parse-stringify2 "2.0.1" react-i18next@^11.3.3: - version "11.3.4" - resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.3.4.tgz#355df5fe5133e5e30302d166f529678100ffc968" - integrity sha512-IRZMD7PAM3C+fJNzRbyLNi1ZD0kc3Z3obBspJjEl+9H+ME41PhVor3BpdIqv/Rm7lUoGhMjmpu42J45ooJ61KA== + version "11.4.0" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-11.4.0.tgz#dde6bf3a695910af7a4270fea2e111bc331cf151" + integrity sha512-lyOZSSQkif4H9HnHN3iEKVkryLI+WkdZSEw3VAZzinZLopfYRMHVY5YxCopdkXPLEHs6S5GjKYPh3+j0j336Fg== dependencies: "@babel/runtime" "^7.3.1" html-parse-stringify2 "2.0.1" @@ -12294,33 +12349,33 @@ react-redux@^5.0.7: react-lifecycles-compat "^3.0.0" react-refresh@^0.8.0: - version "0.8.1" - resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.1.tgz#5500506ad6fc891fdd057d0bf3581f9310abc6a2" - integrity sha512-xZIKi49RtLUUSAZ4a4ut2xr+zr4+glOD5v0L413B55MPvlg4EQ6Ctx8PD4CmjlPGoAWmSCTmmkY59TErizNsow== + version "0.8.2" + resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.8.2.tgz#24bb0858eac92b0d7b0dd561747f0c9fd6c60327" + integrity sha512-n8GXxo3DwM2KtFEL69DAVhGc4A1THn2qjmfvSo3nze0NLCoPbywazeJPqdp0RdSGLmyhQzeyA+XPXOobbYlkzg== react-router-dom@^5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.1.2.tgz#06701b834352f44d37fbb6311f870f84c76b9c18" - integrity sha512-7BPHAaIwWpZS074UKaw1FjVdZBSVWEk8IuDXdB+OkLb8vd/WRQIpA4ag9WQk61aEfQs47wHyjWUoUGGZxpQXew== + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-5.2.0.tgz#9e65a4d0c45e13289e66c7b17c7e175d0ea15662" + integrity sha512-gxAmfylo2QUjcwxI63RhQ5G85Qqt4voZpUXSEqCwykV0baaOTQDR1f0PmY8AELqIyVc0NEZUj0Gov5lNGcXgsA== dependencies: "@babel/runtime" "^7.1.2" history "^4.9.0" loose-envify "^1.3.1" prop-types "^15.6.2" - react-router "5.1.2" + react-router "5.2.0" tiny-invariant "^1.0.2" tiny-warning "^1.0.0" -react-router@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.1.2.tgz#6ea51d789cb36a6be1ba5f7c0d48dd9e817d3418" - integrity sha512-yjEuMFy1ONK246B+rsa0cUam5OeAQ8pyclRDgpxuSCrAlJ1qN9uZ5IgyKC7gQg0w8OM50NXHEegPh/ks9YuR2A== +react-router@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-5.2.0.tgz#424e75641ca8747fbf76e5ecca69781aa37ea293" + integrity sha512-smz1DUuFHRKdcJC0jobGo8cVbhO3x50tCL4icacOlcwDOEQPq4TMqwx3sY1TP+DvtTgz4nm3thuo7A+BK2U0Dw== dependencies: "@babel/runtime" "^7.1.2" history "^4.9.0" hoist-non-react-statics "^3.1.0" loose-envify "^1.3.1" - mini-create-react-context "^0.3.0" + mini-create-react-context "^0.4.0" path-to-regexp "^1.7.0" prop-types "^15.6.2" react-is "^16.6.0" @@ -12458,7 +12513,7 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" -read-pkg-up@^7.0.0: +read-pkg-up@^7.0.0, read-pkg-up@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== @@ -12524,7 +12579,7 @@ read@1, read@~1.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" -"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.1: +"readable-stream@2 || 3", readable-stream@^3.0.2, readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== @@ -12552,12 +12607,12 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" -readdirp@~3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.3.0.tgz#984458d13a1e42e2e9f5841b129e162f369aff17" - integrity sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ== +readdirp@~3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz#9fdccdf9e9155805449221ac645e8303ab5b9ada" + integrity sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ== dependencies: - picomatch "^2.0.7" + picomatch "^2.2.1" realpath-native@^1.1.0: version "1.1.0" @@ -12618,6 +12673,14 @@ redent@^2.0.0: indent-string "^3.0.0" strip-indent "^2.0.0" +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + redux-devtools-extension@^2.13.5: version "2.13.8" resolved "https://registry.yarnpkg.com/redux-devtools-extension/-/redux-devtools-extension-2.13.8.tgz#37b982688626e5e4993ff87220c9bbb7cd2d96e1" @@ -12870,11 +12933,6 @@ require-directory@^2.1.1: resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - require-main-filename@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" @@ -12936,9 +12994,9 @@ resolve@1.1.7: integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.3.2: - version "1.15.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" - integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w== + version "1.17.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444" + integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w== dependencies: path-parse "^1.0.6" @@ -13019,11 +13077,9 @@ rsvp@^4.8.4: integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== run-async@^2.2.0, run-async@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.0.tgz#e59054a5b86876cfae07f431d18cbaddc594f1e8" - integrity sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg== - dependencies: - is-promise "^2.1.0" + version "2.4.1" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" + integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== run-queue@^1.0.0, run-queue@^1.0.3: version "1.0.3" @@ -13050,9 +13106,9 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@^5.2.0, safe-buffer@~5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" - integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex@^1.1.0: version "1.1.0" @@ -13093,9 +13149,9 @@ sass-loader@^8.0.0: semver "^6.3.0" sass@^1.26.3: - version "1.26.3" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.26.3.tgz#412df54486143b76b5a65cdf7569e86f44659f46" - integrity sha512-5NMHI1+YFYw4sN3yfKjpLuV9B5l7MqQ6FlkTcC4FT+oHbBRUZoSjHrrt/mE0nFXJyY2kQtU9ou9HxvFVjLFuuw== + version "1.26.5" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.26.5.tgz#2d7aecfbbabfa298567c8f06615b6e24d2d68099" + integrity sha512-FG2swzaZUiX53YzZSjSakzvGtlds0lcbF+URuU9mxOv7WBh7NhXEVDa4kPKN4hN6fC2TkOTOKqiqp6d53N9X5Q== dependencies: chokidar ">=2.0.0 <4.0.0" @@ -13121,10 +13177,10 @@ schema-utils@^1.0.0: ajv-errors "^1.0.0" ajv-keywords "^3.1.0" -schema-utils@^2.0.1, schema-utils@^2.5.0, schema-utils@^2.6.0, schema-utils@^2.6.1, schema-utils@^2.6.4, schema-utils@^2.6.5: - version "2.6.5" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.5.tgz#c758f0a7e624263073d396e29cd40aa101152d8a" - integrity sha512-5KXuwKziQrTVHh8j/Uxz+QUbxkaLW9X/86NBlx/gnKgtsZA2GIVMUn17qWhRFwF8jdYb3Dig5hRO/W5mZqy6SQ== +schema-utils@^2.0.1, schema-utils@^2.5.0, schema-utils@^2.6.1, schema-utils@^2.6.5, schema-utils@^2.6.6: + version "2.6.6" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.6.6.tgz#299fe6bd4a3365dc23d99fd446caff8f1d6c330c" + integrity sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA== dependencies: ajv "^6.12.0" ajv-keywords "^3.4.1" @@ -13168,6 +13224,11 @@ semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.3.2: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" @@ -13192,6 +13253,11 @@ serialize-javascript@^2.1.2: resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz#ecec53b0e0317bdc95ef76ab7074b7384785fa61" integrity sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ== +serialize-javascript@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.0.0.tgz#492e489a2d77b7b804ad391a5f5d97870952548e" + integrity sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw== + serve-favicon@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/serve-favicon/-/serve-favicon-2.5.0.tgz#935d240cdfe0f5805307fdfe967d88942a2cbcf0" @@ -13309,9 +13375,9 @@ shell-quote@1.7.2: integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== shelljs@^0.8.3: - version "0.8.3" - resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.3.tgz#a7f3319520ebf09ee81275b2368adb286659b097" - integrity sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A== + version "0.8.4" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" + integrity sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ== dependencies: glob "^7.0.0" interpret "^1.0.0" @@ -13438,13 +13504,14 @@ sockjs-client@1.4.0: json3 "^3.3.2" url-parse "^1.4.3" -sockjs@0.3.19: - version "0.3.19" - resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" - integrity sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw== +sockjs@0.3.20: + version "0.3.20" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz#b26a283ec562ef8b2687b44033a4eeceac75d855" + integrity sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA== dependencies: faye-websocket "^0.10.0" - uuid "^3.0.1" + uuid "^3.4.0" + websocket-driver "0.6.5" socks-proxy-agent@^4.0.0: version "4.0.2" @@ -13493,9 +13560,9 @@ source-map-resolve@^0.5.0: urix "^0.1.0" source-map-support@^0.5.6, source-map-support@~0.5.12: - version "0.5.16" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.16.tgz#0ae069e7fe3ba7538c64c98515e35339eac5a042" - integrity sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ== + version "0.5.19" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" + integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== dependencies: buffer-from "^1.0.0" source-map "^0.6.0" @@ -13534,14 +13601,14 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz#2ea450aee74f2a89bfb94519c07fcd6f41322977" - integrity sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA== + version "2.3.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== spdx-expression-parse@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" - integrity sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg== + version "3.0.1" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== dependencies: spdx-exceptions "^2.1.0" spdx-license-ids "^3.0.0" @@ -13563,7 +13630,7 @@ spdy-transport@^3.0.0: readable-stream "^3.0.6" wbuf "^1.7.3" -spdy@^4.0.1: +spdy@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz#b74f466203a3eda452c02492b91fb9e84a27677b" integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== @@ -13669,9 +13736,9 @@ stealthy-require@^1.1.1: integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks= store2@^2.7.1: - version "2.11.0" - resolved "https://registry.yarnpkg.com/store2/-/store2-2.11.0.tgz#307636a239014ef4d8f1c8b47afe903509484fc8" - integrity sha512-WeIZ5+c/KzBSutSqOjUCAkk1qTLVBcYUuvrhNx8ndjLZKdZRfP6Vv7AOxlynuL6tVU/6zt6e2CTHwWI5KE+fKg== + version "2.11.2" + resolved "https://registry.yarnpkg.com/store2/-/store2-2.11.2.tgz#a298e5e97b21b3ce7419b732540bc7c79cb007db" + integrity sha512-TQMKs+C6n9idtzLpxluikmDCYiDJrTbbIGn9LFxMg0BVTu+8JZKSlXTWYRpOFKlfKD5HlDWLVpJJyNGZ2e9l1A== storybook-addon-i18next@^1.2.1: version "1.3.0" @@ -13740,7 +13807,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.0.0, string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -13804,9 +13871,9 @@ string.prototype.trim@^1.2.1: function-bind "^1.1.1" string.prototype.trimend@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.0.tgz#ee497fd29768646d84be2c9b819e292439614373" - integrity sha512-EEJnGqa/xNfIg05SxiPSqRS7S9qwDhYts1TSLR1BQfYUfPe1stofgGKvwERK9+9yf+PpfBMlpBaCHucXGPQfUA== + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz#85812a6b847ac002270f5808146064c995fb6913" + integrity sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g== dependencies: define-properties "^1.1.3" es-abstract "^1.17.5" @@ -13830,9 +13897,9 @@ string.prototype.trimright@^2.1.1: string.prototype.trimend "^1.0.0" string.prototype.trimstart@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.0.tgz#afe596a7ce9de905496919406c9734845f01a2f2" - integrity sha512-iCP8g01NFYiiBOnwG1Xc3WZLyoo+RuBymwIlWncShXDDJYWN6DbnM3odslBJdgCdRlq94B5s63NWAZlcn2CS4w== + version "1.0.1" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54" + integrity sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw== dependencies: define-properties "^1.1.3" es-abstract "^1.17.5" @@ -13930,12 +13997,12 @@ strong-log-transformer@^2.0.0: through "^2.3.4" style-loader@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.1.3.tgz#9e826e69c683c4d9bf9db924f85e9abb30d5e200" - integrity sha512-rlkH7X/22yuwFYK357fMN/BxYOorfnfq0eD7+vqlemSK4wEcejFF1dg4zxP0euBW8NrYx2WZzZ8PPFevr7D+Kw== + version "1.2.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-1.2.1.tgz#c5cbbfbf1170d076cfdd86e0109c5bba114baa1a" + integrity sha512-ByHSTQvHLkWE9Ir5+lGbVOXhxX10fbprhLvdg96wedFZb4NDekDPxVKv5Fwmio+QcMlkkNfuK+5W1peQ5CUhZg== dependencies: - loader-utils "^1.2.3" - schema-utils "^2.6.4" + loader-utils "^2.0.0" + schema-utils "^2.6.6" styled-components@^4.4.0: version "4.4.1" @@ -14128,24 +14195,24 @@ terser-webpack-plugin@^1.4.3: worker-farm "^1.7.0" terser-webpack-plugin@^2.1.2: - version "2.3.5" - resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.5.tgz#5ad971acce5c517440ba873ea4f09687de2f4a81" - integrity sha512-WlWksUoq+E4+JlJ+h+U+QUzXpcsMSSNXkDy9lBVkSqDn1w23Gg29L/ary9GeJVYCGiNJJX7LnVc4bwL1N3/g1w== + version "2.3.6" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.6.tgz#a4014b311a61f87c6a1b217ef4f5a75bd0665a69" + integrity sha512-I8IDsQwZrqjdmOicNeE8L/MhwatAap3mUrtcAKJuilsemUNcX+Hier/eAzwStVqhlCxq0aG3ni9bK/0BESXkTg== dependencies: cacache "^13.0.1" - find-cache-dir "^3.2.0" - jest-worker "^25.1.0" - p-limit "^2.2.2" - schema-utils "^2.6.4" - serialize-javascript "^2.1.2" + find-cache-dir "^3.3.1" + jest-worker "^25.4.0" + p-limit "^2.3.0" + schema-utils "^2.6.6" + serialize-javascript "^3.0.0" source-map "^0.6.1" - terser "^4.4.3" + terser "^4.6.12" webpack-sources "^1.4.3" -terser@^4.1.2, terser@^4.4.3, terser@^4.6.3: - version "4.6.10" - resolved "https://registry.yarnpkg.com/terser/-/terser-4.6.10.tgz#90f5bd069ff456ddbc9503b18e52f9c493d3b7c2" - integrity sha512-qbF/3UOo11Hggsbsqm2hPa6+L4w7bkr+09FNseEe8xrcVD3APGLFqE+Oz1ZKAxjYnFsj80rLOfgAtJ0LNJjtTA== +terser@^4.1.2, terser@^4.6.12, terser@^4.6.3: + version "4.7.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-4.7.0.tgz#15852cf1a08e3256a80428e865a2fa893ffba006" + integrity sha512-Lfb0RiZcjRDXCC3OSHJpEkxJ9Qeqs6mp2v4jf2MHfy8vGERmVDuvjXdd/EnP5Deme5F2yBRBymKmKHCBg2echw== dependencies: commander "^2.20.0" source-map "~0.6.1" @@ -14242,7 +14309,7 @@ tiny-invariant@^1.0.2: resolved "https://registry.yarnpkg.com/tiny-invariant/-/tiny-invariant-1.1.0.tgz#634c5f8efdc27714b7f386c35e6760991d230875" integrity sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw== -tiny-warning@^1.0.0, tiny-warning@^1.0.2: +tiny-warning@^1.0.0, tiny-warning@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== @@ -14343,6 +14410,11 @@ trim-newlines@^2.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-2.0.0.tgz#b403d0b91be50c331dfc4b82eeceb22c3de16d20" integrity sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA= +trim-newlines@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" + integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + trim-off-newlines@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" @@ -14374,9 +14446,9 @@ ts-pnp@^1.1.2: integrity sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw== tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: - version "1.11.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.1.tgz#eb15d128827fbee2841549e171f45ed338ac7e35" - integrity sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA== + version "1.13.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" + integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== tsutils@^3.17.1: version "3.17.1" @@ -14414,6 +14486,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.13.1.tgz#0172cb5bce80b0bd542ea348db50c7e21834d934" + integrity sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== + type-fest@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" @@ -14448,9 +14525,9 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^3.7.2: - version "3.8.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" - integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== + version "3.9.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.2.tgz#64e9c8e9be6ea583c54607677dd4680a1cf35db9" + integrity sha512-q2ktq4n/uLuNNShyayit+DTobV2ApPEo/6so68JaD5ojvc/6GClBipedB9zNWYxRSAlZXAe405Rlijzl6qDiSw== ua-parser-js@^0.7.18: version "0.7.21" @@ -14458,12 +14535,11 @@ ua-parser-js@^0.7.18: integrity sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ== uglify-js@^3.1.4: - version "3.8.1" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.8.1.tgz#43bb15ce6f545eaa0a64c49fd29375ea09fa0f93" - integrity sha512-W7KxyzeaQmZvUFbGj4+YFshhVrMBGSg2IbcYAjGWGvx8DHvJMclbTDMpffdxFUGPBHjIytk7KJUR/KUXstUGDw== + version "3.9.3" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.9.3.tgz#4a285d1658b8a2ebaef9e51366b3a0f7acd79ec2" + integrity sha512-r5ImcL6QyzQGVimQoov3aL2ZScywrOgBXGndbWrdehKoSvGe/RmiE5Jpw/v+GvxODt6l2tpBXwA7n+qZVlHBMA== dependencies: commander "~2.20.3" - source-map "~0.6.1" uid-number@0.0.6: version "0.0.6" @@ -14673,9 +14749,9 @@ url@^0.11.0: querystring "0.2.0" use-callback-ref@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.2.1.tgz#898759ccb9e14be6c7a860abafa3ffbd826c89bb" - integrity sha512-C3nvxh0ZpaOxs9RCnWwAJ+7bJPwQI8LHF71LzbQ3BvzH5XkdtlkMadqElGevg5bYBDFip4sAnD4m06zAKebg1w== + version "1.2.3" + resolved "https://registry.yarnpkg.com/use-callback-ref/-/use-callback-ref-1.2.3.tgz#9f939dfb5740807bbf9dd79cdd4e99d27e827756" + integrity sha512-DPBPh1i2adCZoIArRlTuKRy7yue7QogtEnfv0AKrWsY+GA+4EKe37zhRDouNnyWMoNQFYZZRF+2dLHsWE4YvJA== use-sidecar@^1.0.1: version "1.0.2" @@ -14744,7 +14820,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.0.1, uuid@^3.3.2: +uuid@^3.0.1, uuid@^3.3.2, uuid@^3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== @@ -14851,14 +14927,23 @@ warning@^4.0.2, warning@^4.0.3: dependencies: loose-envify "^1.0.0" -watchpack@^1.6.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2" - integrity sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA== +watchpack-chokidar2@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz#9948a1866cbbd6cb824dea13a7ed691f6c8ddff0" + integrity sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA== dependencies: chokidar "^2.1.8" + +watchpack@^1.6.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz#c02e4d4d49913c3e7e122c3325365af9d331e9aa" + integrity sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g== + dependencies: graceful-fs "^4.1.2" neo-async "^2.5.0" + optionalDependencies: + chokidar "^3.4.0" + watchpack-chokidar2 "^2.0.0" wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" @@ -14908,9 +14993,9 @@ webpack-dev-middleware@^3.7.0, webpack-dev-middleware@^3.7.2: webpack-log "^2.0.0" webpack-dev-server@^3.10.1: - version "3.10.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.10.3.tgz#f35945036813e57ef582c2420ef7b470e14d3af0" - integrity sha512-e4nWev8YzEVNdOMcNzNeCN947sWJNd43E5XvsJzbAL08kGc2frm1tQ32hTJslRS+H65LCb/AaUCYU7fjHCpDeQ== + version "3.11.0" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz#8f154a3bce1bcfd1cc618ef4e703278855e7ff8c" + integrity sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" @@ -14920,31 +15005,31 @@ webpack-dev-server@^3.10.1: debug "^4.1.1" del "^4.1.1" express "^4.17.1" - html-entities "^1.2.1" + html-entities "^1.3.1" http-proxy-middleware "0.19.1" import-local "^2.0.0" internal-ip "^4.3.0" ip "^1.1.5" is-absolute-url "^3.0.3" killable "^1.0.1" - loglevel "^1.6.6" + loglevel "^1.6.8" opn "^5.5.0" p-retry "^3.0.1" - portfinder "^1.0.25" + portfinder "^1.0.26" schema-utils "^1.0.0" selfsigned "^1.10.7" semver "^6.3.0" serve-index "^1.9.1" - sockjs "0.3.19" + sockjs "0.3.20" sockjs-client "1.4.0" - spdy "^4.0.1" + spdy "^4.0.2" strip-ansi "^3.0.1" supports-color "^6.1.0" url "^0.11.0" webpack-dev-middleware "^3.7.2" webpack-log "^2.0.0" ws "^6.2.1" - yargs "12.0.5" + yargs "^13.3.2" webpack-hot-middleware@^2.25.0: version "2.25.0" @@ -14973,22 +15058,22 @@ webpack-sources@^1.1.0, webpack-sources@^1.4.0, webpack-sources@^1.4.1, webpack- source-map "~0.6.1" webpack-virtual-modules@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.2.1.tgz#8ab73d4df0fd37ed27bb8d823bc60ea7266c8bf7" - integrity sha512-0PWBlxyt4uGDofooIEanWhhyBOHdd+lr7QpYNDLC7/yc5lqJT8zlc04MTIBnKj+c2BlQNNuwE5er/Tg4wowHzA== + version "0.2.2" + resolved "https://registry.yarnpkg.com/webpack-virtual-modules/-/webpack-virtual-modules-0.2.2.tgz#20863dc3cb6bb2104729fff951fbe14b18bd0299" + integrity sha512-kDUmfm3BZrei0y+1NTHJInejzxfhtU8eDj2M7OKb2IWrPFAeO1SOH2KuQ68MSZu9IGEHcxbkKKR1v18FrUSOmA== dependencies: debug "^3.0.0" webpack@^4.33.0, webpack@^4.38.0, webpack@^4.41.5: - version "4.42.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.42.1.tgz#ae707baf091f5ca3ef9c38b884287cfe8f1983ef" - integrity sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg== + version "4.43.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz#c48547b11d563224c561dad1172c8aa0b8a678e6" + integrity sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g== dependencies: "@webassemblyjs/ast" "1.9.0" "@webassemblyjs/helper-module-context" "1.9.0" "@webassemblyjs/wasm-edit" "1.9.0" "@webassemblyjs/wasm-parser" "1.9.0" - acorn "^6.2.1" + acorn "^6.4.1" ajv "^6.10.2" ajv-keywords "^3.4.1" chrome-trace-event "^1.0.2" @@ -15005,9 +15090,16 @@ webpack@^4.33.0, webpack@^4.38.0, webpack@^4.41.5: schema-utils "^1.0.0" tapable "^1.1.3" terser-webpack-plugin "^1.4.3" - watchpack "^1.6.0" + watchpack "^1.6.1" webpack-sources "^1.4.1" +websocket-driver@0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" + integrity sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY= + dependencies: + websocket-extensions ">=0.1.1" + websocket-driver@>=0.5.1: version "0.7.3" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.3.tgz#a2d4e0d4f4f116f1e6297eba58b05d430100e9f9" @@ -15084,9 +15176,9 @@ widest-line@^3.1.0: string-width "^4.0.0" windows-release@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.2.0.tgz#8122dad5afc303d833422380680a79cdfa91785f" - integrity sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA== + version "3.3.0" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.3.0.tgz#dce167e9f8be733f21c849ebd4d03fe66b29b9f0" + integrity sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ== dependencies: execa "^1.0.0" @@ -15121,14 +15213,6 @@ worker-rpc@^0.1.0: dependencies: microevent.ts "~0.1.1" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" @@ -15241,7 +15325,7 @@ xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== -"y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: +y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== @@ -15257,26 +15341,9 @@ yallist@^4.0.0: integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.7.2: - version "1.8.3" - resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.8.3.tgz#2f420fca58b68ce3a332d0ca64be1d191dd3f87a" - integrity sha512-X/v7VDnK+sxbQ2Imq4Jt2PRUsRsP7UcpSl3Llg6+NRRqWLIvxkMFYtH1FmvwNGYRKKPa+EPA4qDBlI9WVG1UKw== - dependencies: - "@babel/runtime" "^7.8.7" - -yargs-parser@^10.0.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== - dependencies: - camelcase "^4.1.0" - -yargs-parser@^11.1.1: - version "11.1.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" - integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== - dependencies: - camelcase "^5.0.0" - decamelize "^1.2.0" + version "1.10.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.0.tgz#3b593add944876077d4d683fee01081bd9fff31e" + integrity sha512-yr2icI4glYaNG+KWONODapy2/jDdMSDnrONSjblABjD9B4Z5LgiircSt8m8sRZFNi08kG9Sm0uSHtEmP3zaEGg== yargs-parser@^13.1.0, yargs-parser@^13.1.2: version "13.1.2" @@ -15294,23 +15361,13 @@ yargs-parser@^15.0.1: camelcase "^5.0.0" decamelize "^1.2.0" -yargs@12.0.5: - version "12.0.5" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" - integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== +yargs-parser@^18.1.3: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== dependencies: - cliui "^4.0.0" + camelcase "^5.0.0" decamelize "^1.2.0" - find-up "^3.0.0" - get-caller-file "^1.0.1" - os-locale "^3.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1 || ^4.0.0" - yargs-parser "^11.1.1" yargs@13.2.4: version "13.2.4" @@ -15329,7 +15386,7 @@ yargs@13.2.4: y18n "^4.0.0" yargs-parser "^13.1.0" -yargs@^13.3.0: +yargs@^13.3.0, yargs@^13.3.2: version "13.3.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz#ad7ffefec1aa59565ac915f82dccb38a9c31a2dd" integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw== From 5c7491c2541feeb5ae132deb532ebfb398fc688d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 19 May 2020 10:43:10 +0200 Subject: [PATCH 23/54] Add unit test for hg modifications command --- .../spi/HgModificationsCommandTest.java | 90 ++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgModificationsCommandTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgModificationsCommandTest.java index 993b8a6fb9..914a063790 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgModificationsCommandTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/repository/spi/HgModificationsCommandTest.java @@ -25,7 +25,9 @@ package sonia.scm.repository.spi; import com.aragost.javahg.Changeset; +import com.aragost.javahg.commands.CopyCommand; import com.aragost.javahg.commands.RemoveCommand; +import com.aragost.javahg.commands.RenameCommand; import org.junit.Before; import org.junit.Test; import sonia.scm.repository.HgTestUtil; @@ -34,7 +36,7 @@ import sonia.scm.repository.Modifications; import java.io.File; import java.util.function.Consumer; -import static org.assertj.core.api.Java6Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThat; public class HgModificationsCommandTest extends IncomingOutgoingTestBase { @@ -83,6 +85,31 @@ public class HgModificationsCommandTest extends IncomingOutgoingTestBase { assertModifications.accept(outgoingModificationsCommand.getModifications(revision)); } + @Test + public void shouldReadRenamedFiles() throws Exception { + String oldFileName = "a.txt"; + String newFileName = "b.txt"; + writeNewFile(outgoing, outgoingDirectory, oldFileName, "bal bla"); + commit(outgoing, "added a.txt"); + RenameCommand.on(outgoing).execute(oldFileName, newFileName); + Changeset changeset = commit(outgoing, "rename a.txt to b.txt"); + String revision = String.valueOf(changeset.getRevision()); + Consumer assertModifications = assertRenamedFiles(oldFileName, newFileName); + assertModifications.accept(outgoingModificationsCommand.getModifications(revision)); + } + + @Test + public void shouldReadCopiedFiles() throws Exception { + String srcFileName = "a.txt"; + String newFileName = "b.txt"; + writeNewFile(outgoing, outgoingDirectory, srcFileName, "bal bla"); + commit(outgoing, "added a.txt"); + CopyCommand.on(outgoing).execute(srcFileName, newFileName); + Changeset changeset = commit(outgoing, "copy a.txt to b.txt"); + String revision = String.valueOf(changeset.getRevision()); + Consumer assertModifications = assertCopiedFiles(srcFileName, newFileName); + assertModifications.accept(outgoingModificationsCommand.getModifications(revision)); + } Consumer assertRemovedFiles(String fileName) { return (modifications) -> { @@ -98,9 +125,64 @@ public class HgModificationsCommandTest extends IncomingOutgoingTestBase { .hasSize(1) .extracting("path") .containsOnly(fileName); + assertThat(modifications.getRenamed()) + .as("renamed files modifications") + .isEmpty(); }; } + Consumer assertRenamedFiles(String oldFileName, String newFileName) { + return (modifications) -> { + assertThat(modifications).isNotNull(); + assertThat(modifications.getAdded()) + .as("added files modifications") + .hasSize(0); + assertThat(modifications.getModified()) + .as("modified files modifications") + .hasSize(0); + assertThat(modifications.getRemoved()) + .as("removed files modifications") + .isEmpty(); + assertThat(modifications.getRenamed()) + .as("renamed files modifications") + .hasSize(1) + .extracting("oldPath") + .containsOnly(oldFileName); + assertThat(modifications.getRenamed()) + .as("renamed files modifications") + .hasSize(1) + .extracting("newPath") + .containsOnly(newFileName); + }; + } + + Consumer assertCopiedFiles(String srcFileName, String newFileName) { + return (modifications) -> { + assertThat(modifications).isNotNull(); + assertThat(modifications.getAdded()) + .as("added files modifications") + .hasSize(0); + assertThat(modifications.getModified()) + .as("modified files modifications") + .hasSize(0); + assertThat(modifications.getRemoved()) + .as("removed files modifications") + .isEmpty(); + assertThat(modifications.getRenamed()) + .as("renamed files modifications") + .isEmpty(); + assertThat(modifications.getCopied()) + .as("copied files modifications") + .hasSize(1) + .extracting("sourcePath") + .containsOnly(srcFileName); + assertThat(modifications.getCopied()) + .as("copied files modifications") + .hasSize(1) + .extracting("targetPath") + .containsOnly(newFileName); + }; + } Consumer assertModifiedFiles(String file) { return (modifications) -> { @@ -116,6 +198,9 @@ public class HgModificationsCommandTest extends IncomingOutgoingTestBase { assertThat(modifications.getRemoved()) .as("removed files modifications") .hasSize(0); + assertThat(modifications.getRenamed()) + .as("renamed files modifications") + .hasSize(0); }; } @@ -133,6 +218,9 @@ public class HgModificationsCommandTest extends IncomingOutgoingTestBase { assertThat(modifications.getRemoved()) .as("removed files modifications") .hasSize(0); + assertThat(modifications.getRenamed()) + .as("renamed files modifications") + .hasSize(0); }; } } From 5f2a049c165b80ac01616af6b46259882893b36c Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 19 May 2020 10:48:04 +0200 Subject: [PATCH 24/54] do not measure coverage for frontend stories --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 666ca23869..22005b2d01 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -199,7 +199,7 @@ Maven setupMavenBuild() { def logConf = "scm-webapp/src/main/resources/logback.ci.xml" mvn.additionalArgs += " -Dlogback.configurationFile=${logConf}" mvn.additionalArgs += " -Dscm-it.logbackConfiguration=${logConf}" - mvn.additionalArgs += " -Dsonar.coverage.exclusions=**/*.test.ts,**/*.test.tsx" + mvn.additionalArgs += " -Dsonar.coverage.exclusions=**/*.test.ts,**/*.test.tsx,**/*.stories.tsx" if (isMainBranch() || isReleaseBranch()) { // Release starts javadoc, which takes very long, so do only for certain branches From a470831bf80ab6d1fa06fa3480f05d7fe872b6dd Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 19 May 2020 12:55:41 +0200 Subject: [PATCH 25/54] separate ExternalLink from ExternalNavLink --- .../src/layout/Footer.stories.tsx | 8 +-- scm-ui/ui-components/src/layout/Footer.tsx | 11 ++-- .../src/navigation/ExternalLink.tsx | 29 ++-------- .../src/navigation/ExternalNavLink.tsx | 56 +++++++++++++++++++ scm-ui/ui-components/src/navigation/index.ts | 2 + 5 files changed, 74 insertions(+), 32 deletions(-) create mode 100644 scm-ui/ui-components/src/navigation/ExternalNavLink.tsx diff --git a/scm-ui/ui-components/src/layout/Footer.stories.tsx b/scm-ui/ui-components/src/layout/Footer.stories.tsx index c25b618a87..d2b592a46e 100644 --- a/scm-ui/ui-components/src/layout/Footer.stories.tsx +++ b/scm-ui/ui-components/src/layout/Footer.stories.tsx @@ -32,7 +32,7 @@ import hitchhiker from "../__resources__/hitchhiker.png"; // @ts-ignore ignore unknown jpg import marvin from "../__resources__/marvin.jpg"; import NavLink from "../navigation/NavLink"; -import ExternalLink from "../navigation/ExternalLink"; +import ExternalNavLink from "../navigation/ExternalNavLink"; import { MemoryRouter } from "react-router-dom"; const trillian: Me = { @@ -50,9 +50,9 @@ const bindAvatar = (binder: Binder, avatar: string) => { }; const bindLinks = (binder: Binder) => { - binder.bind("footer.information", () => ); - binder.bind("footer.information", () => ); - binder.bind("footer.support", () => ); + binder.bind("footer.information", () => ); + binder.bind("footer.information", () => ); + binder.bind("footer.support", () => ); binder.bind("profile.setting", () => ); }; diff --git a/scm-ui/ui-components/src/layout/Footer.tsx b/scm-ui/ui-components/src/layout/Footer.tsx index 8f27e8042a..355a74c67e 100644 --- a/scm-ui/ui-components/src/layout/Footer.tsx +++ b/scm-ui/ui-components/src/layout/Footer.tsx @@ -29,7 +29,7 @@ import NavLink from "../navigation/NavLink"; import FooterSection from "./FooterSection"; import styled from "styled-components"; import { EXTENSION_POINT } from "../avatar/Avatar"; -import ExternalLink from "../navigation/ExternalLink"; +import ExternalNavLink from "../navigation/ExternalNavLink"; import { useTranslation } from "react-i18next"; type Props = { @@ -99,12 +99,15 @@ const Footer: FC = ({ me, version, links }) => { }> - + }> - - + + diff --git a/scm-ui/ui-components/src/navigation/ExternalLink.tsx b/scm-ui/ui-components/src/navigation/ExternalLink.tsx index 1565f6fa79..bf1dbad5ea 100644 --- a/scm-ui/ui-components/src/navigation/ExternalLink.tsx +++ b/scm-ui/ui-components/src/navigation/ExternalLink.tsx @@ -22,34 +22,15 @@ * SOFTWARE. */ import React, { FC } from "react"; -import classNames from "classnames"; type Props = { to: string; - icon?: string; - label: string; }; -// TODO is it used in the menu? should it use MenuContext for collapse state? - -const ExternalLink: FC = ({ to, icon, label }) => { - let showIcon; - if (icon) { - showIcon = ( - <> - {" "} - - ); - } - - return ( -

  • - - {showIcon} - {label} - -
  • - ); -}; +const ExternalLink: FC = ({ to, children }) => ( + + {children} + +); export default ExternalLink; diff --git a/scm-ui/ui-components/src/navigation/ExternalNavLink.tsx b/scm-ui/ui-components/src/navigation/ExternalNavLink.tsx new file mode 100644 index 0000000000..3b88b495ae --- /dev/null +++ b/scm-ui/ui-components/src/navigation/ExternalNavLink.tsx @@ -0,0 +1,56 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +import React, { FC } from "react"; +import classNames from "classnames"; +import ExternalLink from "./ExternalLink"; + +type Props = { + to: string; + icon?: string; + label: string; +}; + +// TODO is it used in the menu? should it use MenuContext for collapse state? + +const ExternalNavLink: FC = ({ to, icon, label }) => { + let showIcon; + if (icon) { + showIcon = ( + <> + {" "} + + ); + } + + return ( +
  • + + {showIcon} + {label} + +
  • + ); +}; + +export default ExternalNavLink; diff --git a/scm-ui/ui-components/src/navigation/index.ts b/scm-ui/ui-components/src/navigation/index.ts index 4dcce4321b..9ab01d755d 100644 --- a/scm-ui/ui-components/src/navigation/index.ts +++ b/scm-ui/ui-components/src/navigation/index.ts @@ -33,3 +33,5 @@ export { default as PrimaryNavigationLink } from "./PrimaryNavigationLink"; export { default as SecondaryNavigation } from "./SecondaryNavigation"; export { MenuContext, StateMenuContextProvider } from "./MenuContext"; export { default as SecondaryNavigationItem } from "./SecondaryNavigationItem"; +export { default as ExternalLink } from "./ExternalLink"; +export { default as ExternalNavLink } from "./ExternalNavLink"; From 50e4316886f50cf7245609bc4a4af74e4a6b0abb Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 19 May 2020 12:59:02 +0200 Subject: [PATCH 26/54] improve MarkdownLinkRenderer - render target _blank link for all external http links - render simple a link for all links with protocol or anchor links - render local html push link for all internal links --- .../src/MarkdownLinkRenderer.test.tsx | 90 +++++++++++-------- .../src/MarkdownLinkRenderer.tsx | 64 +++++++------ 2 files changed, 90 insertions(+), 64 deletions(-) diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx index d2a52f70e3..262fe43b31 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx @@ -21,52 +21,72 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -import React from "react"; -import { correctLocalLink } from "./MarkdownLinkRenderer"; +import { isAnchorLink, isExternalLink, isLinkWithProtocol, createLocalLink } from "./MarkdownLinkRenderer"; -const basePath = "/repo/space/name/sources/master/"; -const pathname = basePath + "README.md/"; - -describe("correctLocalLink tests", () => { - it("should return same directory", () => { - expect(correctLocalLink(pathname, "./another.md")).toBe(basePath + "./another.md/"); - expect(correctLocalLink(pathname, "./another.md#42")).toBe(basePath + "./another.md/#42"); +describe("test isAnchorLink", () => { + it("should return true", () => { + expect(isAnchorLink("#some-thing")).toBe(true); + expect(isAnchorLink("#/some/more/complicated-link")).toBe(true); }); - it("should return same url", () => { - expect(correctLocalLink(pathname, "")).toBe(pathname); - expect(correctLocalLink(pathname, "#42")).toBe("#42"); + it("should return false", () => { + expect(isAnchorLink("https://cloudogu.com")).toBe(false); + expect(isAnchorLink("/some/path/link")).toBe(false); + }); +}); + +describe("test isExternalLink", () => { + it("should return true", () => { + expect(isExternalLink("https://cloudogu.com")).toBe(true); + expect(isExternalLink("http://cloudogu.com")).toBe(true); + }); + + it("should return false", () => { + expect(isExternalLink("some/path/link")).toBe(false); + expect(isExternalLink("/some/path/link")).toBe(false); + expect(isExternalLink("#some-anchor")).toBe(false); + expect(isExternalLink("mailto:trillian@hitchhiker.com")).toBe(false); + }); +}); + +describe("test isLinkWithProtocol", () => { + it("should return true", () => { + expect(isLinkWithProtocol("ldap://[2001:db8::7]/c=GB?objectClass?one")).toBe(true); + expect(isLinkWithProtocol("mailto:trillian@hitchhiker.com")).toBe(true); + expect(isLinkWithProtocol("tel:+1-816-555-1212")).toBe(true); + expect(isLinkWithProtocol("urn:oasis:names:specification:docbook:dtd:xml:4.1.2")).toBe(true); + expect(isLinkWithProtocol("about:config")).toBe(true); + expect(isLinkWithProtocol("http://cloudogu.com")).toBe(true); + }); + it("should return false", () => { + expect(isExternalLink("some/path/link")).toBe(false); + expect(isExternalLink("/some/path/link")).toBe(false); + expect(isExternalLink("#some-anchor")).toBe(false); + }); +}); + +describe("test createLocalLink", () => { + const basePath = "/repo/space/name/sources/master/"; + const pathname = basePath + "README.md/"; + + it("should return same directory", () => { + expect(createLocalLink(pathname, "./another.md")).toBe(basePath + "./another.md/"); + expect(createLocalLink(pathname, "./another.md#42")).toBe(basePath + "./another.md/#42"); }); it("should return main directory", () => { - expect(correctLocalLink(pathname, "/")).toBe("/"); - expect(correctLocalLink(pathname, "/users/")).toBe("/users/"); - expect(correctLocalLink(pathname, "/users/#42")).toBe("/users/#42"); + expect(createLocalLink(pathname, "/")).toBe("/"); + expect(createLocalLink(pathname, "/users/")).toBe("/users/"); + expect(createLocalLink(pathname, "/users/#42")).toBe("/users/#42"); }); it("should return ascend directory", () => { - expect(correctLocalLink(pathname, "../")).toBe(basePath + "../"); - expect(correctLocalLink(pathname, "../../")).toBe(basePath + "../../"); + expect(createLocalLink(pathname, "../")).toBe(basePath + "../"); + expect(createLocalLink(pathname, "../../")).toBe(basePath + "../../"); }); it("should return deeper links", () => { - expect(correctLocalLink(pathname, "docs/Home.md")).toBe(basePath + "docs/Home.md/"); - expect(correctLocalLink(pathname, "docs/Home.md#42")).toBe(basePath + "docs/Home.md/#42"); - }); - - it("should return external link", () => { - expect(correctLocalLink(pathname, "https://foo.bar/baz#42")).toBe("https://foo.bar/baz#42"); - expect(correctLocalLink(pathname, "ldap://[2001:db8::7]/c=GB?objectClass?one")).toBe( - "ldap://[2001:db8::7]/c=GB?objectClass?one" - ); - expect(correctLocalLink(pathname, "mailto:John.Doe@example.com")).toBe("mailto:John.Doe@example.com"); - expect(correctLocalLink(pathname, "http://userid:password@example.com:8080")).toBe( - "http://userid:password@example.com:8080" - ); - expect(correctLocalLink(pathname, "tel:+1-816-555-1212")).toBe("tel:+1-816-555-1212"); - expect(correctLocalLink(pathname, "urn:oasis:names:specification:docbook:dtd:xml:4.1.2")).toBe( - "urn:oasis:names:specification:docbook:dtd:xml:4.1.2" - ); - expect(correctLocalLink(pathname, "about:config")).toBe("about:config"); + expect(createLocalLink(pathname, "docs/Home.md")).toBe(basePath + "docs/Home.md/"); + expect(createLocalLink(pathname, "docs/Home.md#42")).toBe(basePath + "docs/Home.md/#42"); }); }); diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx index 3b97bcedef..bc3afdf158 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx @@ -21,68 +21,74 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -import React, { FC, ReactNode } from "react"; +import React, { FC } from "react"; import { Link, useLocation } from "react-router-dom"; import { withContextPath } from "./urls"; +import ExternalLink from "./navigation/ExternalLink"; type Props = { - children: ReactNode; href: string; }; -const regex = new RegExp("[a-z]:"); +const externalLinkRegex = new RegExp("^http(s)?://"); +export const isExternalLink = (link: string) => { + return externalLinkRegex.test(link); +}; -/** - * Handle local SCM-Manager and external links - * - * @VisibleForTesting - */ -export function correctLocalLink(pathname: string, link: string) { - if (link === "") { - return pathname; - } +export const isAnchorLink = (link: string) => { + return link.startsWith("#"); +}; - // Leave uris unchanged which start with schemes or fragment - if (link.match(regex) || link.startsWith("#")) { - return link; - } +const linkWithProtcolRegex = new RegExp("^[a-z]+:"); +export const isLinkWithProtocol = (link: string) => { + return linkWithProtcolRegex.test(link); +}; +export const createLocalLink = (pathname: string, link: string) => { // Reference to the main directory possible if link starts with slash let base = ""; let path = link; if (!link.startsWith("/")) { base = pathname; // Remove last slash temporary - if (base.endsWith("/")) base = base.substring(0, base.length - 1); + if (base.endsWith("/")) { + base = base.substring(0, base.length - 1); + } + // Remove current called file from path base = base.substr(0, base.lastIndexOf("/") + 1); // Remove first slash for absolute consistence - if (path.startsWith("/")) path = path.substring(1); + if (path.startsWith("/")) { + path = path.substring(1); + } } // Link must end with fragment if it contains one const pathParts = path.split("#"); if (pathParts.length > 1) { // Add ending slash in front of fragment - if (!pathParts[0].endsWith("/")) pathParts[0] += "/"; + if (!pathParts[0].endsWith("/")) { + pathParts[0] += "/"; + } path = pathParts[0] + "#" + pathParts[1]; - } else { - // Add ending slash - if (!path.endsWith("/")) path += "/"; + } else if (!path.endsWith("/")) { + path += "/"; } return base + path; -} +}; -const MarkdownLinkRenderer: FC = ({ children, href }) => { +const MarkdownLinkRenderer: FC = ({ href, children }) => { const location = useLocation(); - const compositeUrl = correctLocalLink(withContextPath(location.pathname), href); - - if (compositeUrl.match(regex)) { - return {children}; + if (isExternalLink(href)) { + return {children}; + } else if (isAnchorLink(href) || isLinkWithProtocol(href)) { + return {children}; + } else { + const compositeUrl = createLocalLink(withContextPath(location.pathname), href); + return {children}; } - return {children}; }; export default MarkdownLinkRenderer; From d1f10ec5a72480ff133815f2bd151001b8974196 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 19 May 2020 15:51:33 +0200 Subject: [PATCH 27/54] rebuild MarkdownLinkRenderer and added real world use cases --- .../src/MarkdownLinkRenderer.test.tsx | 43 +++++---- .../src/MarkdownLinkRenderer.tsx | 92 ++++++++++--------- scm-ui/ui-components/src/MarkdownView.tsx | 10 +- 3 files changed, 83 insertions(+), 62 deletions(-) diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx index 262fe43b31..f6b01eb06b 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx @@ -66,27 +66,38 @@ describe("test isLinkWithProtocol", () => { }); describe("test createLocalLink", () => { - const basePath = "/repo/space/name/sources/master/"; - const pathname = basePath + "README.md/"; - - it("should return same directory", () => { - expect(createLocalLink(pathname, "./another.md")).toBe(basePath + "./another.md/"); - expect(createLocalLink(pathname, "./another.md#42")).toBe(basePath + "./another.md/#42"); + it("should handle relative links", () => { + const localLink = createLocalLink("/src", "/src/README.md", "docs/Home.md"); + expect(localLink).toBe("/src/docs/Home.md"); }); - it("should return main directory", () => { - expect(createLocalLink(pathname, "/")).toBe("/"); - expect(createLocalLink(pathname, "/users/")).toBe("/users/"); - expect(createLocalLink(pathname, "/users/#42")).toBe("/users/#42"); + it("should handle absolute links", () => { + const localLink = createLocalLink("/src", "/src/README.md", "/docs/Home.md"); + expect(localLink).toBe("/src/docs/Home.md"); }); - it("should return ascend directory", () => { - expect(createLocalLink(pathname, "../")).toBe(basePath + "../"); - expect(createLocalLink(pathname, "../../")).toBe(basePath + "../../"); + it("should handle relative links from locations with trailing slash", () => { + const localLink = createLocalLink("/src", "/src/README.md/", "/docs/Home.md"); + expect(localLink).toBe("/src/docs/Home.md"); }); - it("should return deeper links", () => { - expect(createLocalLink(pathname, "docs/Home.md")).toBe(basePath + "docs/Home.md/"); - expect(createLocalLink(pathname, "docs/Home.md#42")).toBe(basePath + "docs/Home.md/#42"); + it("should handle relative links from location outside of base", () => { + const localLink = createLocalLink("/src", "/info/readme", "docs/Home.md"); + expect(localLink).toBe("/src/docs/Home.md"); + }); + + it("should handle absolute links from location outside of base", () => { + const localLink = createLocalLink("/src", "/info/readme", "/docs/Home.md"); + expect(localLink).toBe("/src/docs/Home.md"); + }); + + it("should handle relative links from sub directories", () => { + const localLink = createLocalLink("/src", "/src/docs/index.md", "installation/linux.md"); + expect(localLink).toBe("/src/docs/installation/linux.md"); + }); + + it("should handle absolute links from sub directories", () => { + const localLink = createLocalLink("/src", "/src/docs/index.md", "/docs/Home.md"); + expect(localLink).toBe("/src/docs/Home.md"); }); }); diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx index bc3afdf158..30e187265e 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx @@ -21,14 +21,10 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -import React, { FC } from "react"; -import { Link, useLocation } from "react-router-dom"; -import { withContextPath } from "./urls"; +import React, {FC} from "react"; +import {Link, useLocation} from "react-router-dom"; import ExternalLink from "./navigation/ExternalLink"; - -type Props = { - href: string; -}; +import {withContextPath} from "./urls"; const externalLinkRegex = new RegExp("^http(s)?://"); export const isExternalLink = (link: string) => { @@ -44,51 +40,61 @@ export const isLinkWithProtocol = (link: string) => { return linkWithProtcolRegex.test(link); }; -export const createLocalLink = (pathname: string, link: string) => { - // Reference to the main directory possible if link starts with slash - let base = ""; - let path = link; - if (!link.startsWith("/")) { - base = pathname; - // Remove last slash temporary - if (base.endsWith("/")) { - base = base.substring(0, base.length - 1); - } - - // Remove current called file from path - base = base.substr(0, base.lastIndexOf("/") + 1); - - // Remove first slash for absolute consistence - if (path.startsWith("/")) { - path = path.substring(1); - } +const join = (left: string, right: string) => { + if (left.endsWith("/") && right.startsWith("/")) { + return left + right.substring(1); + } else if (!left.endsWith("/") && !right.startsWith("/")) { + return left + "/" + right; } - - // Link must end with fragment if it contains one - const pathParts = path.split("#"); - if (pathParts.length > 1) { - // Add ending slash in front of fragment - if (!pathParts[0].endsWith("/")) { - pathParts[0] += "/"; - } - path = pathParts[0] + "#" + pathParts[1]; - } else if (!path.endsWith("/")) { - path += "/"; - } - - return base + path; + return left + right; }; -const MarkdownLinkRenderer: FC = ({ href, children }) => { +export const createLocalLink = (basePath: string, currentPath: string, link: string) => { + if (link.startsWith("/")) { + return join(basePath, link); + } + if (!currentPath.startsWith(basePath)) { + return join(basePath, link); + } + let path = currentPath; + if (currentPath.endsWith("/")) { + path = currentPath.substring(0, currentPath.length - 2); + } + const lastSlash = path.lastIndexOf("/"); + if (lastSlash < 0) { + path = ""; + } else { + path = path.substring(0, lastSlash); + } + return join(path, link); +}; + +type LinkProps = { + href: string; +}; + +type Props = LinkProps & { + base: string; +}; + +const MarkdownLinkRenderer: FC = ({href, base, children}) => { const location = useLocation(); if (isExternalLink(href)) { return {children}; - } else if (isAnchorLink(href) || isLinkWithProtocol(href)) { + } else if (isLinkWithProtocol(href)) { return {children}; + } else if (isAnchorLink(href)) { + return {children}; } else { - const compositeUrl = createLocalLink(withContextPath(location.pathname), href); - return {children}; + const localLink = createLocalLink(base, location.pathname, href); + return {children}; } }; +// we use a factory method, because react-markdown does not pass +// base as prop down to our link component. +export const create = (base: string): FC => { + return props => ; +}; + export default MarkdownLinkRenderer; diff --git a/scm-ui/ui-components/src/MarkdownView.tsx b/scm-ui/ui-components/src/MarkdownView.tsx index 362e553d3b..546d1610a6 100644 --- a/scm-ui/ui-components/src/MarkdownView.tsx +++ b/scm-ui/ui-components/src/MarkdownView.tsx @@ -29,7 +29,7 @@ import { binder } from "@scm-manager/ui-extensions"; import ErrorBoundary from "./ErrorBoundary"; import SyntaxHighlighter from "./SyntaxHighlighter"; import MarkdownHeadingRenderer from "./MarkdownHeadingRenderer"; -import MarkdownLinkRenderer from "./MarkdownLinkRenderer"; +import { create } from "./MarkdownLinkRenderer"; import { useTranslation } from "react-i18next"; import Notification from "./Notification"; @@ -39,6 +39,8 @@ type Props = RouteComponentProps & { renderers?: any; skipHtml?: boolean; enableAnchorHeadings?: boolean; + // basePath for markdown links + basePath?: string; }; const xmlMarkupSample = `\`\`\`xml @@ -98,7 +100,7 @@ class MarkdownView extends React.Component { } render() { - const { content, renderers, renderContext, enableAnchorHeadings, skipHtml } = this.props; + const { content, renderers, renderContext, enableAnchorHeadings, skipHtml, basePath } = this.props; const rendererFactory = binder.getExtension("markdown-renderer-factory"); let rendererList = renderers; @@ -115,7 +117,9 @@ class MarkdownView extends React.Component { rendererList.heading = MarkdownHeadingRenderer; } - rendererList.link = MarkdownLinkRenderer; + if (basePath && !rendererList.link) { + rendererList.link = create(basePath); + } if (!rendererList.code) { rendererList.code = SyntaxHighlighter; From ffd04eb55b7d534487f2e0eb22375fa4b681bd5d Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Tue, 19 May 2020 15:52:11 +0200 Subject: [PATCH 28/54] added basePath to markdown components in order to allow navigation between md files --- .../components/content/MarkdownViewer.tsx | 5 +++-- .../content/SwitchableMarkdownViewer.tsx | 18 ++++++++++-------- .../repos/sources/containers/SourcesView.tsx | 11 +++++++++-- 3 files changed, 22 insertions(+), 12 deletions(-) diff --git a/scm-ui/ui-webapp/src/repos/sources/components/content/MarkdownViewer.tsx b/scm-ui/ui-webapp/src/repos/sources/components/content/MarkdownViewer.tsx index ce0eba4198..0ee70d5684 100644 --- a/scm-ui/ui-webapp/src/repos/sources/components/content/MarkdownViewer.tsx +++ b/scm-ui/ui-webapp/src/repos/sources/components/content/MarkdownViewer.tsx @@ -29,13 +29,14 @@ import styled from "styled-components"; type Props = { file: File; + basePath: string; }; const MarkdownContent = styled.div` padding: 0.5rem; `; -const MarkdownViewer: FC = ({ file }) => { +const MarkdownViewer: FC = ({ file, basePath }) => { const [loading, setLoading] = useState(true); const [error, setError] = useState(undefined); const [content, setContent] = useState(""); @@ -62,7 +63,7 @@ const MarkdownViewer: FC = ({ file }) => { return ( - + ); }; diff --git a/scm-ui/ui-webapp/src/repos/sources/components/content/SwitchableMarkdownViewer.tsx b/scm-ui/ui-webapp/src/repos/sources/components/content/SwitchableMarkdownViewer.tsx index 7a14bb75b4..e194667894 100644 --- a/scm-ui/ui-webapp/src/repos/sources/components/content/SwitchableMarkdownViewer.tsx +++ b/scm-ui/ui-webapp/src/repos/sources/components/content/SwitchableMarkdownViewer.tsx @@ -21,13 +21,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -import React, { FC, useState } from "react"; +import React, {FC, useState} from "react"; import styled from "styled-components"; import MarkdownViewer from "./MarkdownViewer"; import SourcecodeViewer from "./SourcecodeViewer"; -import { File } from "@scm-manager/ui-types"; -import { Button } from "@scm-manager/ui-components"; -import { useTranslation } from "react-i18next"; +import {File} from "@scm-manager/ui-types"; +import {Button} from "@scm-manager/ui-components"; +import {useTranslation} from "react-i18next"; const ToggleButton = styled(Button)` max-width: 1rem; @@ -43,10 +43,11 @@ const Container = styled.div` type Props = { file: File; + basePath: string; }; -const SwitchableMarkdownViewer: FC = ({ file }) => { - const { t } = useTranslation("repos"); +const SwitchableMarkdownViewer: FC = ({file, basePath}) => { + const {t} = useTranslation("repos"); const [renderMarkdown, setRenderMarkdown] = useState(true); const toggleMarkdown = () => { @@ -64,9 +65,10 @@ const SwitchableMarkdownViewer: FC = ({ file }) => { : t("sources.content.toggleButton.showMarkdown") } > - + - {renderMarkdown ? : } + {renderMarkdown ? : + } ); }; diff --git a/scm-ui/ui-webapp/src/repos/sources/containers/SourcesView.tsx b/scm-ui/ui-webapp/src/repos/sources/containers/SourcesView.tsx index 1b7b26479b..417525c5f6 100644 --- a/scm-ui/ui-webapp/src/repos/sources/containers/SourcesView.tsx +++ b/scm-ui/ui-webapp/src/repos/sources/containers/SourcesView.tsx @@ -76,13 +76,19 @@ class SourcesView extends React.Component { }); } + createBasePath() { + const { repository, revision } = this.props; + return `/repo/${repository.namespace}/${repository.name}/code/sources/${revision}/`; + } + showSources() { const { file, revision } = this.props; const { contentType, language } = this.state; + const basePath = this.createBasePath(); if (contentType.startsWith("image/")) { return ; } else if (contentType.includes("markdown")) { - return ; + return ; } else if (language) { return ; } else if (contentType.startsWith("text/")) { @@ -94,7 +100,8 @@ class SourcesView extends React.Component { props={{ file, contentType, - revision + revision, + basePath }} > From 2b1ba7e4f306d6e4771d1d935f3ff7c0a17112a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 19 May 2020 16:29:40 +0200 Subject: [PATCH 29/54] Update servlet version --- pom.xml | 2 +- .../sonia/scm/filter/GZipResponseStream.java | 17 +++++- .../filter/BufferedHttpServletRequest.java | 22 ++++++- .../filter/BufferedHttpServletResponse.java | 22 ++++++- .../scm/web/GitPermissionFilterTest.java | 61 +++++++++++-------- .../sonia/scm/web/HgServletInputStream.java | 18 +++++- .../scm/web/HgServletInputStreamTest.java | 17 +++++- .../java/sonia/scm/web/WireProtocolTest.java | 16 ++++- .../scm/ProxyPushStateDispatcherTest.java | 38 ++++++++++-- .../sonia/scm/WebResourceServletTest.java | 12 +++- .../scm/lifecycle/RestartServletTest.java | 18 +++++- 11 files changed, 205 insertions(+), 38 deletions(-) diff --git a/pom.xml b/pom.xml index b1e63cdadc..a25f3bda2e 100644 --- a/pom.xml +++ b/pom.xml @@ -907,7 +907,7 @@ 1.7.30 1.2.3 - 3.0.1 + 3.1.0 2.1.1 4.5.3.Final diff --git a/scm-core/src/main/java/sonia/scm/filter/GZipResponseStream.java b/scm-core/src/main/java/sonia/scm/filter/GZipResponseStream.java index e99ccf9b80..2693fdf3b0 100644 --- a/scm-core/src/main/java/sonia/scm/filter/GZipResponseStream.java +++ b/scm-core/src/main/java/sonia/scm/filter/GZipResponseStream.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.filter; //~--- non-JDK imports -------------------------------------------------------- @@ -39,6 +39,7 @@ import java.io.IOException; import java.util.zip.GZIPOutputStream; import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; import javax.servlet.http.HttpServletResponse; /** @@ -245,6 +246,20 @@ public class GZipResponseStream extends ServletOutputStream return closed; } + @Override + public boolean isReady() { + return true; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + try { + writeListener.onWritePossible(); + } catch (IOException e) { + logger.debug("could not call writeListener.onWritePossible()", e); + } + } + //~--- fields --------------------------------------------------------------- /** Field description */ diff --git a/scm-core/src/main/java/sonia/scm/web/filter/BufferedHttpServletRequest.java b/scm-core/src/main/java/sonia/scm/web/filter/BufferedHttpServletRequest.java index 04f725d4ed..e674d1d2e2 100644 --- a/scm-core/src/main/java/sonia/scm/web/filter/BufferedHttpServletRequest.java +++ b/scm-core/src/main/java/sonia/scm/web/filter/BufferedHttpServletRequest.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.web.filter; //~--- non-JDK imports -------------------------------------------------------- @@ -36,6 +36,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; +import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; @@ -197,6 +198,25 @@ public class BufferedHttpServletRequest extends HttpServletRequestWrapper return bais.read(buf, off, len); } + @Override + public boolean isFinished() { + return bais.available() == 0; + } + + @Override + public boolean isReady() { + return bais.available() > 0; + } + + @Override + public void setReadListener(ReadListener readListener) { + try { + readListener.onDataAvailable(); + } catch (IOException e) { + logger.debug("could not call readListener.onDataAvailable()", e); + } + } + //~--- fields ------------------------------------------------------------- /** Field description */ diff --git a/scm-core/src/main/java/sonia/scm/web/filter/BufferedHttpServletResponse.java b/scm-core/src/main/java/sonia/scm/web/filter/BufferedHttpServletResponse.java index 5d647659e5..0d13ed752f 100644 --- a/scm-core/src/main/java/sonia/scm/web/filter/BufferedHttpServletResponse.java +++ b/scm-core/src/main/java/sonia/scm/web/filter/BufferedHttpServletResponse.java @@ -21,11 +21,14 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.web.filter; //~--- JDK imports ------------------------------------------------------------ +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; @@ -37,6 +40,7 @@ import java.util.Map; import java.util.Set; import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; @@ -48,6 +52,8 @@ import javax.servlet.http.HttpServletResponseWrapper; public class BufferedHttpServletResponse extends HttpServletResponseWrapper { + private static final Logger LOG = LoggerFactory.getLogger(BufferedHttpServletResponse.class); + /** * Constructs ... * @@ -445,6 +451,20 @@ public class BufferedHttpServletResponse extends HttpServletResponseWrapper baos.write(param); } + @Override + public boolean isReady() { + return true; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + try { + writeListener.onWritePossible(); + } catch (IOException e) { + LOG.debug("could not call writeListener.onWritePossible()", e); + } + } + //~--- fields ------------------------------------------------------------- /** Field description */ diff --git a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/web/GitPermissionFilterTest.java b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/web/GitPermissionFilterTest.java index a3f3895770..486cffde8c 100644 --- a/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/web/GitPermissionFilterTest.java +++ b/scm-plugins/scm-git-plugin/src/test/java/sonia/scm/web/GitPermissionFilterTest.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.web; import org.junit.Test; @@ -33,6 +33,7 @@ import sonia.scm.repository.spi.ScmProviderHttpServlet; import sonia.scm.util.HttpUtil; import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; @@ -47,40 +48,40 @@ import static org.mockito.Mockito.when; /** * Unit tests for {@link GitPermissionFilter}. - * + * * Created by omilke on 19.05.2017. */ @RunWith(MockitoJUnitRunner.class) public class GitPermissionFilterTest { private final GitPermissionFilter permissionFilter = new GitPermissionFilter(new ScmConfiguration(), mock(ScmProviderHttpServlet.class)); - + @Mock private HttpServletResponse response; - + @Test public void testIsWriteRequest() { HttpServletRequest request = mockRequestWithMethodAndRequestURI("POST", "/scm/git/fanzy-project/git-receive-pack"); assertThat(permissionFilter.isWriteRequest(request), is(true)); - + request = mockRequestWithMethodAndRequestURI("GET", "/scm/git/fanzy-project/info/refs?service=git-receive-pack"); assertThat(permissionFilter.isWriteRequest(request), is(true)); - + request = mockRequestWithMethodAndRequestURI("GET", "/scm/git/fanzy-project/info/refs?service=some-other-service"); assertThat(permissionFilter.isWriteRequest(request), is(false)); - + request = mockRequestWithMethodAndRequestURI( - "PUT", + "PUT", "/scm/git/git-lfs-demo.git/info/lfs/objects/8fcebeb5698230685f92028e560f8f1683ebc15ec82a620ffad5c12a3c19bdec" ); assertThat(permissionFilter.isWriteRequest(request), is(true)); - + request = mockRequestWithMethodAndRequestURI( - "GET", + "GET", "/scm/git/git-lfs-demo.git/info/lfs/objects/8fcebeb5698230685f92028e560f8f1683ebc15ec82a620ffad5c12a3c19bdec" ); assertThat(permissionFilter.isWriteRequest(request), is(false)); - + request = mockRequestWithMethodAndRequestURI("POST", "/scm/git/git-lfs-demo.git/info/lfs/objects/batch"); assertThat(permissionFilter.isWriteRequest(request), is(false)); } @@ -97,45 +98,45 @@ public class GitPermissionFilterTest { @Test public void testSendNotEnoughPrivilegesErrorAsBrowser() throws IOException { HttpServletRequest request = mockGitReceivePackServiceRequest(); - + permissionFilter.sendNotEnoughPrivilegesError(request, response); - + verify(response).sendError(HttpServletResponse.SC_FORBIDDEN); } - + @Test public void testSendNotEnoughPrivilegesErrorAsGitClient() throws IOException { verifySendNotEnoughPrivilegesErrorAsGitClient("git/2.9.3"); } - + @Test public void testSendNotEnoughPrivilegesErrorAsJGitClient() throws IOException { verifySendNotEnoughPrivilegesErrorAsGitClient("JGit/4.2"); } - + private void verifySendNotEnoughPrivilegesErrorAsGitClient(String userAgent) throws IOException { HttpServletRequest request = mockGitReceivePackServiceRequest(); when(request.getHeader(HttpUtil.HEADER_USERAGENT)).thenReturn(userAgent); - + CapturingServletOutputStream stream = new CapturingServletOutputStream(); when(response.getOutputStream()).thenReturn(stream); - + permissionFilter.sendNotEnoughPrivilegesError(request, response); - + verify(response).setStatus(HttpServletResponse.SC_OK); - assertThat(stream.toString(), containsString("privileges")); + assertThat(stream.toString(), containsString("privileges")); } - + private HttpServletRequest mockGitReceivePackServiceRequest() { HttpServletRequest request = mockRequestWithMethodAndRequestURI("GET", "/git/info/refs"); when(request.getParameter("service")).thenReturn("git-receive-pack"); return request; } - + private static class CapturingServletOutputStream extends ServletOutputStream { private final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - + @Override public void write(int b) throws IOException { baos.write(b); @@ -145,11 +146,21 @@ public class GitPermissionFilterTest { public void close() throws IOException { baos.close(); } - + @Override public String toString() { return baos.toString(); } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + + } } - + } diff --git a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgServletInputStream.java b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgServletInputStream.java index 9262836d85..1f435703df 100644 --- a/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgServletInputStream.java +++ b/scm-plugins/scm-hg-plugin/src/main/java/sonia/scm/web/HgServletInputStream.java @@ -21,11 +21,12 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.web; import com.google.common.base.Preconditions; +import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -76,4 +77,19 @@ public class HgServletInputStream extends ServletInputStream { public void close() throws IOException { original.close(); } + + @Override + public boolean isFinished() { + return original.isFinished(); + } + + @Override + public boolean isReady() { + return original.isReady(); + } + + @Override + public void setReadListener(ReadListener readListener) { + original.setReadListener(readListener); + } } diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/HgServletInputStreamTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/HgServletInputStreamTest.java index b1c2ed60cd..1f06ede4c1 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/HgServletInputStreamTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/HgServletInputStreamTest.java @@ -21,13 +21,14 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.web; import com.google.common.base.Charsets; import com.google.common.io.ByteStreams; import org.junit.Test; +import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -69,6 +70,20 @@ public class HgServletInputStreamTest { public int read() { return input.read(); } + + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + } } } diff --git a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/WireProtocolTest.java b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/WireProtocolTest.java index 80f4094d48..29bd1b41a2 100644 --- a/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/WireProtocolTest.java +++ b/scm-plugins/scm-hg-plugin/src/test/java/sonia/scm/web/WireProtocolTest.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.web; import com.google.common.base.Charsets; @@ -31,6 +31,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import java.io.ByteArrayInputStream; @@ -181,6 +182,19 @@ public class WireProtocolTest { return input.read(); } + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + } } } diff --git a/scm-webapp/src/test/java/sonia/scm/ProxyPushStateDispatcherTest.java b/scm-webapp/src/test/java/sonia/scm/ProxyPushStateDispatcherTest.java index 3fbbfafdcd..422edb2ce5 100644 --- a/scm-webapp/src/test/java/sonia/scm/ProxyPushStateDispatcherTest.java +++ b/scm-webapp/src/test/java/sonia/scm/ProxyPushStateDispatcherTest.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; import com.google.common.base.Charsets; @@ -33,16 +33,23 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; +import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.InputStream; import java.net.HttpURLConnection; -import java.util.*; +import java.util.Collection; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.Vector; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.verify; @@ -173,7 +180,7 @@ public class ProxyPushStateDispatcherTest { private class DevServletInputStream extends ServletInputStream { - private InputStream inputStream; + private ByteArrayInputStream inputStream; private DevServletInputStream(String content) { inputStream = new ByteArrayInputStream(content.getBytes(Charsets.UTF_8)); @@ -183,6 +190,20 @@ public class ProxyPushStateDispatcherTest { public int read() throws IOException { return inputStream.read(); } + + @Override + public boolean isReady() { + return inputStream.available() > 0; + } + + @Override + public boolean isFinished() { + return inputStream.available() == 0; + } + + @Override + public void setReadListener(ReadListener readListener) { + } } private class DevServletOutputStream extends ServletOutputStream { @@ -193,6 +214,15 @@ public class ProxyPushStateDispatcherTest { public void write(int b) { stream.write(b); } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + } } } diff --git a/scm-webapp/src/test/java/sonia/scm/WebResourceServletTest.java b/scm-webapp/src/test/java/sonia/scm/WebResourceServletTest.java index 8364a53000..21727e56b3 100644 --- a/scm-webapp/src/test/java/sonia/scm/WebResourceServletTest.java +++ b/scm-webapp/src/test/java/sonia/scm/WebResourceServletTest.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; import com.google.common.base.Charsets; @@ -37,6 +37,7 @@ import sonia.scm.plugin.PluginLoader; import sonia.scm.plugin.UberWebResourceLoader; import javax.servlet.ServletOutputStream; +import javax.servlet.WriteListener; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; @@ -152,6 +153,15 @@ public class WebResourceServletTest { public void write(int b) { buffer.write(b); } + + @Override + public boolean isReady() { + return true; + } + + @Override + public void setWriteListener(WriteListener writeListener) { + } } } diff --git a/scm-webapp/src/test/java/sonia/scm/lifecycle/RestartServletTest.java b/scm-webapp/src/test/java/sonia/scm/lifecycle/RestartServletTest.java index 324f43dcb7..eeae7c697a 100644 --- a/scm-webapp/src/test/java/sonia/scm/lifecycle/RestartServletTest.java +++ b/scm-webapp/src/test/java/sonia/scm/lifecycle/RestartServletTest.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.lifecycle; import com.github.legman.Subscribe; @@ -34,6 +34,7 @@ import sonia.scm.Stage; import sonia.scm.event.ScmEventBus; import sonia.scm.event.ScmTestEventBus; +import javax.servlet.ReadListener; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -128,6 +129,21 @@ public class RestartServletTest { private ServletInputStream createServletInputStream(final InputStream inputStream) { return new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + + } + @Override public int read() throws IOException { return inputStream.read(); From 57160cc23285249eb5148aa9e32cbbbd3080a601 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 19 May 2020 21:29:13 +0200 Subject: [PATCH 30/54] Remove javax activation --- pom.xml | 6 ------ scm-core/pom.xml | 5 ----- 2 files changed, 11 deletions(-) diff --git a/pom.xml b/pom.xml index a25f3bda2e..d5794c2819 100644 --- a/pom.xml +++ b/pom.xml @@ -448,12 +448,6 @@ ${jaxb.version} - - javax.activation - activation - 1.1.1 - - diff --git a/scm-core/pom.xml b/scm-core/pom.xml index 5ba07696a4..f15b77cded 100644 --- a/scm-core/pom.xml +++ b/scm-core/pom.xml @@ -182,11 +182,6 @@ jaxb-runtime - - javax.activation - activation - - From 835433439845729f793a8179aaa6564548340453 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 19 May 2020 21:35:16 +0200 Subject: [PATCH 31/54] Update hamcrest version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d5794c2819..2ffec23a48 100644 --- a/pom.xml +++ b/pom.xml @@ -895,7 +895,7 @@ 2.28.2 - 1.3 + 2.1 5.6.2 From ef3617cec422141eca0d24baa340748bb82480ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 19 May 2020 21:41:07 +0200 Subject: [PATCH 32/54] Remove commons-logging --- scm-webapp/pom.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml index bf5fa38c28..f1f097b8c3 100644 --- a/scm-webapp/pom.xml +++ b/scm-webapp/pom.xml @@ -438,13 +438,6 @@ - - commons-logging - commons-logging - 1.1.3 - provided - - org.projectlombok lombok From 2daba944733536b98228163900541a0df317304d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 19 May 2020 21:57:21 +0200 Subject: [PATCH 33/54] Consolidate jaxb version --- pom.xml | 6 +++--- scm-core/pom.xml | 4 ++-- scm-webapp/pom.xml | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/pom.xml b/pom.xml index 2ffec23a48..2231e1dab0 100644 --- a/pom.xml +++ b/pom.xml @@ -437,8 +437,8 @@ - javax.xml.bind - jaxb-api + jakarta.xml.bind + jakarta.xml.bind-api ${jaxb.version} @@ -908,7 +908,7 @@ 1.19.4 2.11.0 4.2.3 - 2.3.1 + 2.3.2 6.1.4.Final diff --git a/scm-core/pom.xml b/scm-core/pom.xml index f15b77cded..7d78979d96 100644 --- a/scm-core/pom.xml +++ b/scm-core/pom.xml @@ -173,8 +173,8 @@ - javax.xml.bind - jaxb-api + jakarta.xml.bind + jakarta.xml.bind-api diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml index f1f097b8c3..f024ec62ec 100644 --- a/scm-webapp/pom.xml +++ b/scm-webapp/pom.xml @@ -203,15 +203,15 @@ - javax.xml.bind - jaxb-api - 2.3.1 + jakarta.xml.bind + jakarta.xml.bind-api + ${jaxb.version} org.glassfish.jaxb jaxb-runtime - 2.3.0 + ${jaxb.version} From b12b1ca5fe0294b06d482dfd887a62473eee1006 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 19 May 2020 21:57:55 +0200 Subject: [PATCH 34/54] Update rest assured version --- scm-it/pom.xml | 2 +- scm-it/src/test/java/sonia/scm/it/RoleITCase.java | 6 +++--- scm-it/src/test/java/sonia/scm/it/utils/TestData.java | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/scm-it/pom.xml b/scm-it/pom.xml index 146a7b33b2..bf9b4e6d78 100644 --- a/scm-it/pom.xml +++ b/scm-it/pom.xml @@ -102,7 +102,7 @@ io.rest-assured rest-assured - 3.1.0 + 4.3.0 test diff --git a/scm-it/src/test/java/sonia/scm/it/RoleITCase.java b/scm-it/src/test/java/sonia/scm/it/RoleITCase.java index e6b8ad5932..21f4c391ee 100644 --- a/scm-it/src/test/java/sonia/scm/it/RoleITCase.java +++ b/scm-it/src/test/java/sonia/scm/it/RoleITCase.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.it; import org.apache.http.HttpStatus; @@ -66,7 +66,7 @@ public class RoleITCase { given(VndMediaType.REPOSITORY_ROLE) .when() - .content("{" + + .body("{" + "\"name\": \"" + ROLE_NAME + "\"," + "\"verbs\": [\"read\",\"permissionRead\"]" + "}") @@ -84,7 +84,7 @@ public class RoleITCase { given(VndMediaType.REPOSITORY_PERMISSION) .when() - .content("{\n" + + .body("{\n" + "\t\"role\": \"" + ROLE_NAME + "\",\n" + "\t\"name\": \"" + USER + "\",\n" + "\t\"groupPermission\": false\n" + diff --git a/scm-it/src/test/java/sonia/scm/it/utils/TestData.java b/scm-it/src/test/java/sonia/scm/it/utils/TestData.java index 0df93cc2bd..14265c0052 100644 --- a/scm-it/src/test/java/sonia/scm/it/utils/TestData.java +++ b/scm-it/src/test/java/sonia/scm/it/utils/TestData.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.it.utils; import io.restassured.response.ValidatableResponse; @@ -86,7 +86,7 @@ public class TestData { String admin = isAdmin ? "true" : "false"; given(VndMediaType.USER) .when() - .content(new StringBuilder() + .body(new StringBuilder() .append(" {\n") .append(" \"active\": true,\n") .append(" \"admin\": ").append(admin).append(",\n") @@ -124,7 +124,7 @@ public class TestData { LOG.info("create group with group name: {} and description {}", groupName, desc); given(VndMediaType.GROUP) .when() - .content(getGroupJson(groupName,desc)) + .body(getGroupJson(groupName,desc)) .post(getGroupsUrl()) .then() .statusCode(HttpStatus.SC_CREATED) @@ -136,7 +136,7 @@ public class TestData { LOG.info("create permission with name {} and verbs {} using the endpoint: {}", username, verbs, defaultPermissionUrl); given(VndMediaType.REPOSITORY_PERMISSION) .when() - .content("{\n" + + .body("{\n" + "\t\"verbs\": " + verbs.stream().collect(Collectors.joining("\",\"", "[\"", "\"]")) + ",\n" + "\t\"name\": \"" + username + "\",\n" + "\t\"groupPermission\": false\n" + From 054f320455e3b5cc0adf80bd12df08d6a3781a0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Tue, 19 May 2020 23:08:19 +0200 Subject: [PATCH 35/54] Make change types explicit Without explicit change types, we cannot tell copy and rename apart. --- .../sonia/scm/repository/api/DiffFile.java | 8 ++- .../scm/repository/spi/GitDiffCommand.java | 6 ++- .../repository/spi/GitDiffResultCommand.java | 18 +++++++ .../DiffResultToDiffResultDtoMapper.java | 49 +++++++++---------- .../DiffResultToDiffResultDtoMapperTest.java | 28 ++++++++++- 5 files changed, 81 insertions(+), 28 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/api/DiffFile.java b/scm-core/src/main/java/sonia/scm/repository/api/DiffFile.java index b5cbd08ec7..fb1d102846 100644 --- a/scm-core/src/main/java/sonia/scm/repository/api/DiffFile.java +++ b/scm-core/src/main/java/sonia/scm/repository/api/DiffFile.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.repository.api; public interface DiffFile extends Iterable { @@ -33,4 +33,10 @@ public interface DiffFile extends Iterable { String getOldPath(); String getNewPath(); + + ChangeType getChangeType(); + + enum ChangeType { + ADD, MODIFY, DELETE, RENAME, COPY + } } diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java index 0e851456a7..adb7a7bd0e 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffCommand.java @@ -57,7 +57,7 @@ public class GitDiffCommand extends AbstractGitCommand implements DiffCommand { formatter.setRepository(repository); for (DiffEntry e : diff.getEntries()) { - if (!e.getOldId().equals(e.getNewId()) || !e.getNewPath().equals(e.getOldPath())) { + if (idOrPathChanged(e)) { formatter.format(e); } } @@ -67,6 +67,10 @@ public class GitDiffCommand extends AbstractGitCommand implements DiffCommand { }; } + private boolean idOrPathChanged(DiffEntry e) { + return !e.getOldId().equals(e.getNewId()) || !e.getNewPath().equals(e.getOldPath()); + } + static class DequoteOutputStream extends OutputStream { private static final String[] DEQUOTE_STARTS = { diff --git a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffResultCommand.java b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffResultCommand.java index e0cbffbc2a..fed865c576 100644 --- a/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffResultCommand.java +++ b/scm-plugins/scm-git-plugin/src/main/java/sonia/scm/repository/spi/GitDiffResultCommand.java @@ -108,6 +108,24 @@ public class GitDiffResultCommand extends AbstractGitCommand implements DiffResu return diffEntry.getNewPath(); } + @Override + public ChangeType getChangeType() { + switch (diffEntry.getChangeType()) { + case ADD: + return ChangeType.ADD; + case MODIFY: + return ChangeType.MODIFY; + case RENAME: + return ChangeType.RENAME; + case DELETE: + return ChangeType.DELETE; + case COPY: + return ChangeType.COPY; + default: + throw new IllegalArgumentException("Unknown change type: " + diffEntry.getChangeType()); + } + } + @Override public Iterator iterator() { String content = format(repository, diffEntry); 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 2c17abd30f..5057950149 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 @@ -26,7 +26,6 @@ package sonia.scm.api.v2.resources; import com.github.sdorra.spotter.ContentTypes; import com.github.sdorra.spotter.Language; -import com.google.common.base.Strings; import com.google.inject.Inject; import sonia.scm.repository.Repository; import sonia.scm.repository.api.DiffFile; @@ -42,7 +41,7 @@ import java.util.OptionalInt; import static de.otto.edison.hal.Links.linkingTo; /** - * TODO conflicts, copy and rename + * TODO conflicts */ class DiffResultToDiffResultDtoMapper { @@ -83,21 +82,29 @@ class DiffResultToDiffResultDtoMapper { String oldPath = file.getOldPath(); String path; - if (isFilePath(newPath) && isFileNull(oldPath)) { - path = newPath; - dto.setType("add"); - } else if (isFileNull(newPath) && isFilePath(oldPath)) { - path = oldPath; - dto.setType("delete"); - } else if (!newPath.equals(oldPath)) { - path = newPath; - dto.setType("rename"); - } else if (isFilePath(newPath) && isFilePath(oldPath)) { - path = newPath; - dto.setType("modify"); - } else { - // TODO copy? - throw new IllegalStateException("no file without path"); + switch (file.getChangeType()) { + case ADD: + path = newPath; + dto.setType("add"); + break; + case DELETE: + path = oldPath; + dto.setType("delete"); + break; + case RENAME: + path = newPath; + dto.setType("rename"); + break; + case MODIFY: + path = newPath; + dto.setType("modify"); + break; + case COPY: + path = newPath; + dto.setType("copy"); + break; + default: + throw new IllegalArgumentException("unknown change type: " + file.getChangeType()); } dto.setNewPath(newPath); @@ -119,14 +126,6 @@ class DiffResultToDiffResultDtoMapper { return dto; } - private boolean isFilePath(String path) { - return !isFileNull(path); - } - - private boolean isFileNull(String path) { - return Strings.isNullOrEmpty(path) || "/dev/null".equals(path); - } - private DiffResultDto.HunkDto mapHunk(Hunk hunk) { DiffResultDto.HunkDto dto = new DiffResultDto.HunkDto(); dto.setContent(hunk.getRawHeader()); 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 5b0ff6eff9..291b04e00c 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 @@ -63,6 +63,7 @@ class DiffResultToDiffResultDtoMapperTest { assertModifiedFile(files.get(1), "B.ts", "abc", "def", "typescript"); assertDeletedFile(files.get(2), "C.go", "ghi", "golang"); assertRenamedFile(files.get(3), "typo.ts", "okay.ts", "def", "fixed", "typescript"); + assertCopiedFile(files.get(4), "good.ts", "better.ts", "def", "fixed", "typescript"); DiffResultDto.HunkDto hunk = files.get(1).getHunks().get(0); assertHunk(hunk, "@@ -3,4 1,2 @@", 1, 2, 3, 4); @@ -108,7 +109,8 @@ class DiffResultToDiffResultDtoMapperTest { ) ), deletedFile("C.go", "ghi"), - renamedFile("okay.ts", "typo.ts", "fixed", "def") + renamedFile("okay.ts", "typo.ts", "fixed", "def"), + copiedFile("better.ts", "good.ts", "fixed", "def") ); } @@ -174,6 +176,15 @@ class DiffResultToDiffResultDtoMapperTest { assertThat(file.getLanguage()).isEqualTo(language); } + private void assertCopiedFile(DiffResultDto.FileDto file, String oldPath, String newPath, String oldRevision, String newRevision, String language) { + assertThat(file.getOldPath()).isEqualTo(oldPath); + assertThat(file.getNewPath()).isEqualTo(newPath); + assertThat(file.getOldRevision()).isEqualTo(oldRevision); + assertThat(file.getNewRevision()).isEqualTo(newRevision); + assertThat(file.getType()).isEqualTo("copy"); + assertThat(file.getLanguage()).isEqualTo(language); + } + private DiffResult result(DiffFile... files) { DiffResult result = mock(DiffResult.class); when(result.iterator()).thenReturn(Arrays.asList(files).iterator()); @@ -184,6 +195,7 @@ class DiffResultToDiffResultDtoMapperTest { DiffFile file = mock(DiffFile.class); when(file.getNewPath()).thenReturn(path); when(file.getNewRevision()).thenReturn(revision); + when(file.getChangeType()).thenReturn(DiffFile.ChangeType.ADD); when(file.iterator()).thenReturn(Arrays.asList(hunks).iterator()); return file; } @@ -192,6 +204,7 @@ class DiffResultToDiffResultDtoMapperTest { DiffFile file = mock(DiffFile.class); when(file.getOldPath()).thenReturn(path); when(file.getOldRevision()).thenReturn(revision); + when(file.getChangeType()).thenReturn(DiffFile.ChangeType.DELETE); when(file.iterator()).thenReturn(Arrays.asList(hunks).iterator()); return file; } @@ -202,6 +215,7 @@ class DiffResultToDiffResultDtoMapperTest { when(file.getNewRevision()).thenReturn(newRevision); when(file.getOldPath()).thenReturn(path); when(file.getOldRevision()).thenReturn(oldRevision); + when(file.getChangeType()).thenReturn(DiffFile.ChangeType.MODIFY); when(file.iterator()).thenReturn(Arrays.asList(hunks).iterator()); return file; } @@ -212,6 +226,18 @@ class DiffResultToDiffResultDtoMapperTest { when(file.getNewRevision()).thenReturn(newRevision); when(file.getOldPath()).thenReturn(oldPath); when(file.getOldRevision()).thenReturn(oldRevision); + when(file.getChangeType()).thenReturn(DiffFile.ChangeType.RENAME); + when(file.iterator()).thenReturn(emptyIterator()); + return file; + } + + private DiffFile copiedFile(String newPath, String oldPath, String newRevision, String oldRevision) { + DiffFile file = mock(DiffFile.class); + when(file.getNewPath()).thenReturn(newPath); + when(file.getNewRevision()).thenReturn(newRevision); + when(file.getOldPath()).thenReturn(oldPath); + when(file.getOldRevision()).thenReturn(oldRevision); + when(file.getChangeType()).thenReturn(DiffFile.ChangeType.COPY); when(file.iterator()).thenReturn(emptyIterator()); return file; } From 9f97442d4fc41690b8fb628703bfcd3e8392220b Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 20 May 2020 08:39:06 +0200 Subject: [PATCH 36/54] normalize paths with ".." and "." in markdown content --- .../src/MarkdownLinkRenderer.test.tsx | 15 ++++++ .../src/MarkdownLinkRenderer.tsx | 15 +++++- .../src/MarkdownView.stories.tsx | 4 +- .../src/__resources__/markdown-links.md.ts | 46 +++++++++++++++++++ 4 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 scm-ui/ui-components/src/__resources__/markdown-links.md.ts diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx index f6b01eb06b..3ee5e3f188 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx @@ -100,4 +100,19 @@ describe("test createLocalLink", () => { const localLink = createLocalLink("/src", "/src/docs/index.md", "/docs/Home.md"); expect(localLink).toBe("/src/docs/Home.md"); }); + + it("should resolve .. with in path", () => { + const localLink = createLocalLink("/src", "/src/docs/installation/index.md", "../../README.md"); + expect(localLink).toBe("/src/README.md"); + }); + + it("should resolve . with in path", () => { + const localLink = createLocalLink("/src", "/src/README.md", "./LICENSE.md"); + expect(localLink).toBe("/src/LICENSE.md"); + }); + + it("should handle complex path", () => { + const localLink = createLocalLink("/src", "/src/docs/installation/index.md", "./.././../docs/index.md"); + expect(localLink).toBe("/src/docs/index.md"); + }); }); diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx index 30e187265e..2de0846f28 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx @@ -49,6 +49,19 @@ const join = (left: string, right: string) => { return left + right; }; +const normalizePath = (path: string) => { + const stack = []; + const parts = path.split("/"); + for (const part of parts) { + if (part === "..") { + stack.pop(); + } else if (part !== ".") { + stack.push(part) + } + } + return stack.join("/") +}; + export const createLocalLink = (basePath: string, currentPath: string, link: string) => { if (link.startsWith("/")) { return join(basePath, link); @@ -66,7 +79,7 @@ export const createLocalLink = (basePath: string, currentPath: string, link: str } else { path = path.substring(0, lastSlash); } - return join(path, link); + return normalizePath(join(path, link)); }; type LinkProps = { diff --git a/scm-ui/ui-components/src/MarkdownView.stories.tsx b/scm-ui/ui-components/src/MarkdownView.stories.tsx index e43f9afd75..2c2e1cc9f4 100644 --- a/scm-ui/ui-components/src/MarkdownView.stories.tsx +++ b/scm-ui/ui-components/src/MarkdownView.stories.tsx @@ -30,6 +30,7 @@ import TestPage from "./__resources__/test-page.md"; import MarkdownWithoutLang from "./__resources__/markdown-without-lang.md"; import MarkdownXmlCodeBlock from "./__resources__/markdown-xml-codeblock.md"; import MarkdownInlineXml from "./__resources__/markdown-inline-xml.md"; +import MarkdownLinks from "./__resources__/markdown-links.md"; import Title from "./layout/Title"; import { Subtitle } from "./layout"; import { MemoryRouter } from "react-router-dom"; @@ -50,4 +51,5 @@ storiesOf("MarkdownView", module) - )); + )) + .add("Links", () => ); diff --git a/scm-ui/ui-components/src/__resources__/markdown-links.md.ts b/scm-ui/ui-components/src/__resources__/markdown-links.md.ts new file mode 100644 index 0000000000..46be993a3a --- /dev/null +++ b/scm-ui/ui-components/src/__resources__/markdown-links.md.ts @@ -0,0 +1,46 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +export default `# Links + +Show case for different style of markdown links. +Please note that some of the links may not work in storybook, +the story is mostly for checking if the links are rendered correct. + +## External + +External Links should be opened in a new tab: [external link](https://scm-manager.org) + +## Anchor + +Anchor Links should be rendered a simple a tag with an href: [anchor link](#sample) + +## Protocol + +Links with a protocol other than http should be rendered a simple a tag with an href e.g.: [mail link](mailto:marvin@hitchhiker.com) + +## Internal + +Internal links should be rendered by react-router: [internal link](/buttons) +`; From d316cf51c8a6980e14d44cde0e6c935950bb0645 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 20 May 2020 08:41:21 +0200 Subject: [PATCH 37/54] update storyshots to reflect changes --- .../src/__snapshots__/storyshots.test.ts.snap | 140 +++++++++++++----- 1 file changed, 104 insertions(+), 36 deletions(-) diff --git a/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap b/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap index 6bcb322fee..0a056f61cb 100644 --- a/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap +++ b/scm-ui/ui-components/src/__snapshots__/storyshots.test.ts.snap @@ -33060,6 +33060,7 @@ exports[`Storyshots Layout|Footer Default 1`] = `
  • SCM-Manager 2.0.0 @@ -33085,6 +33086,7 @@ exports[`Storyshots Layout|Footer Default 1`] = `
  • footer.support.community @@ -33093,6 +33095,7 @@ exports[`Storyshots Layout|Footer Default 1`] = `
  • footer.support.enterprise @@ -33182,6 +33185,7 @@ exports[`Storyshots Layout|Footer Full 1`] = `
  • SCM-Manager 2.0.0 @@ -33190,6 +33194,7 @@ exports[`Storyshots Layout|Footer Full 1`] = `
  • REST API @@ -33198,6 +33203,7 @@ exports[`Storyshots Layout|Footer Full 1`] = `
  • CLI @@ -33223,6 +33229,7 @@ exports[`Storyshots Layout|Footer Full 1`] = `
  • footer.support.community @@ -33231,6 +33238,7 @@ exports[`Storyshots Layout|Footer Full 1`] = `
  • footer.support.enterprise @@ -33239,6 +33247,7 @@ exports[`Storyshots Layout|Footer Full 1`] = `
  • FAQ @@ -33319,6 +33328,7 @@ exports[`Storyshots Layout|Footer With Avatar 1`] = `
  • SCM-Manager 2.0.0 @@ -33344,6 +33354,7 @@ exports[`Storyshots Layout|Footer With Avatar 1`] = `
  • footer.support.community @@ -33352,6 +33363,7 @@ exports[`Storyshots Layout|Footer With Avatar 1`] = `
  • footer.support.enterprise @@ -33436,6 +33448,7 @@ exports[`Storyshots Layout|Footer With Plugin Links 1`] = `
  • SCM-Manager 2.0.0 @@ -33444,6 +33457,7 @@ exports[`Storyshots Layout|Footer With Plugin Links 1`] = `
  • REST API @@ -33452,6 +33466,7 @@ exports[`Storyshots Layout|Footer With Plugin Links 1`] = `
  • CLI @@ -33477,6 +33492,7 @@ exports[`Storyshots Layout|Footer With Plugin Links 1`] = `
  • footer.support.community @@ -33485,6 +33501,7 @@ exports[`Storyshots Layout|Footer With Plugin Links 1`] = `
  • footer.support.enterprise @@ -33493,6 +33510,7 @@ exports[`Storyshots Layout|Footer With Plugin Links 1`] = `
  • FAQ @@ -33581,64 +33599,56 @@ exports[`Storyshots MarkdownView Default 1`] = `

    [Top] @@ -33854,8 +33860,7 @@ Deserunt officia esse aliquip consectetur duis ut labore laborum commodo aliquip

    [Top] @@ -34162,8 +34167,7 @@ Deserunt officia esse aliquip consectetur duis ut labore laborum commodo aliquip

    [Top] @@ -34228,8 +34232,7 @@ func main() {

    [Top] @@ -34251,8 +34254,7 @@ func main() { reprehenderit duis irure @@ -34278,8 +34280,7 @@ func main() { anim aute reprehenderit id eu ea. Aute excepteur proident @@ -34322,8 +34323,7 @@ func main() {

    Reprehenderit non eu quis in ad elit esse qui aute id incididunt @@ -34390,6 +34390,74 @@ exports[`Storyshots MarkdownView Inline Xml 1`] = ` `; +exports[`Storyshots MarkdownView Links 1`] = ` +

    +
    +
    +

    + Links +

    +

    + Show case for different style of markdown links. +Please note that some of the links may not work in storybook, +the story is mostly for checking if the links are rendered correct. +

    +

    + External +

    +

    + External Links should be opened in a new tab: + + external link + +

    +

    + Anchor +

    +

    + Anchor Links should be rendered a simple a tag with an href: + + anchor link + +

    +

    + Protocol +

    +

    + Links with a protocol other than http should be rendered a simple a tag with an href e.g.: + + mail link + +

    +

    + Internal +

    +

    + Internal links should be rendered by react-router: + + internal link + +

    +
    +
    +
    +`; + exports[`Storyshots MarkdownView Xml Code Block 1`] = `
    Date: Wed, 20 May 2020 07:50:12 +0200 Subject: [PATCH 38/54] Log changes --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 711639ae90..3f3a45a602 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -##Unreleased +## Unreleased +### Added +- Detect renamed files in git and hg diffs ([#1157](https://github.com/scm-manager/scm-manager/pull/1157)) ## [2.0.0-rc8] - 2020-05-08 ### Added From 96c8548fb118a6f3ec88ab04ee9c4abd47c60959 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 20 May 2020 09:24:31 +0200 Subject: [PATCH 39/54] Exclude cloned apis from jboss --- pom.xml | 46 ++++++++++++++++++++++++++++++++++++++++++++++ scm-webapp/pom.xml | 6 ++++++ 2 files changed, 52 insertions(+) diff --git a/pom.xml b/pom.xml index 2231e1dab0..a21fd91509 100644 --- a/pom.xml +++ b/pom.xml @@ -241,6 +241,16 @@ org.jboss.resteasy resteasy-core ${resteasy.version} + + + org.jboss.spec.javax.ws.rs + jboss-jaxrs-api_2.1_spec + + + org.jboss.spec.javax.xml.bind + jboss-jaxb-api_2.3_spec + + @@ -253,6 +263,12 @@ org.jboss.resteasy resteasy-jaxb-provider ${resteasy.version} + + + org.jboss.spec.javax.xml.bind + jboss-jaxb-api_2.3_spec + + @@ -267,6 +283,30 @@ ${resteasy.version} + + org.jboss.resteasy + resteasy-client-api + ${resteasy.version} + + + org.jboss.spec.javax.ws.rs + jboss-jaxrs-api_2.1_spec + + + + + + org.jboss.resteasy + resteasy-client + ${resteasy.version} + + + org.jboss.spec.javax.ws.rs + jboss-jaxrs-api_2.1_spec + + + + org.jboss.resteasy resteasy-guice @@ -277,6 +317,12 @@ org.jboss.resteasy resteasy-servlet-initializer ${resteasy.version} + + + org.jboss.spec.javax.ws.rs + jboss-jaxrs-api_2.1_spec + + From baf868b758ae8ebce468df19c5867f2a901570e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 20 May 2020 09:25:22 +0200 Subject: [PATCH 40/54] Configure duplicate finder to exclude test dependencies --- scm-webapp/pom.xml | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml index 7a080bc85b..054dace8d1 100644 --- a/scm-webapp/pom.xml +++ b/scm-webapp/pom.xml @@ -653,6 +653,20 @@ + + org.basepom.maven + duplicate-finder-maven-plugin + 1.3.0 + + false + false + false + false + true + true + false + + scm-webapp From 1bff965ba52b1244802be9a982f3107e184e3168 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 20 May 2020 09:41:27 +0200 Subject: [PATCH 41/54] Remove unused lib --- scm-plugins/scm-legacy-plugin/pom.xml | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/scm-plugins/scm-legacy-plugin/pom.xml b/scm-plugins/scm-legacy-plugin/pom.xml index 46bc9d99f2..0010f81b11 100644 --- a/scm-plugins/scm-legacy-plugin/pom.xml +++ b/scm-plugins/scm-legacy-plugin/pom.xml @@ -36,9 +36,9 @@ Support migrated repository urls and v1 passwords 2.0.0-SNAPSHOT smp - + - + @@ -48,13 +48,6 @@ provided - - javax.ws.rs - jsr311-api - 1.1.1 - compile - - From 799e34878aa70a962b323415bb6290438afbc226 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 20 May 2020 09:43:29 +0200 Subject: [PATCH 42/54] Exclude commons-logging --- pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pom.xml b/pom.xml index a21fd91509..9eed838b68 100644 --- a/pom.xml +++ b/pom.xml @@ -464,6 +464,12 @@ org.apache.httpcomponents httpclient 4.5.5 + + + commons-logging + commons-logging + + From 96c057090efbc351dec9c653e9234aa5fe9457fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 20 May 2020 09:48:27 +0200 Subject: [PATCH 43/54] Remove glassfish copy of javax.el --- scm-webapp/pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml index 054dace8d1..ff4e93594d 100644 --- a/scm-webapp/pom.xml +++ b/scm-webapp/pom.xml @@ -202,12 +202,6 @@ 3.0.0 - - org.glassfish - javax.el - 3.0.1-b11 - - jakarta.xml.bind jakarta.xml.bind-api From c2b9fe002154f665f155ecab875a2920bd82beab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 20 May 2020 10:14:28 +0200 Subject: [PATCH 44/54] Log changes --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 711639ae90..4c6f606c37 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,9 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -##Unreleased +## Unreleased +### Fixed +- Resolved conflicting dependencies for scm-webapp ([#1159](https://github.com/scm-manager/scm-manager/pull/1159)) ## [2.0.0-rc8] - 2020-05-08 ### Added From 12355f27545de989e1ce7fa93c72c3889f0a407d Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 20 May 2020 11:18:58 +0200 Subject: [PATCH 45/54] fixed review findings --- .../src/MarkdownLinkRenderer.test.tsx | 18 +++++++++++++++--- .../ui-components/src/MarkdownLinkRenderer.tsx | 18 +++++++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx index 3ee5e3f188..719baa254c 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx @@ -57,11 +57,13 @@ describe("test isLinkWithProtocol", () => { expect(isLinkWithProtocol("urn:oasis:names:specification:docbook:dtd:xml:4.1.2")).toBe(true); expect(isLinkWithProtocol("about:config")).toBe(true); expect(isLinkWithProtocol("http://cloudogu.com")).toBe(true); + expect(isLinkWithProtocol("file:///srv/git/project.git")).toBe(true); + expect(isLinkWithProtocol("ssh://trillian@server/project.git")).toBe(true); }); it("should return false", () => { - expect(isExternalLink("some/path/link")).toBe(false); - expect(isExternalLink("/some/path/link")).toBe(false); - expect(isExternalLink("#some-anchor")).toBe(false); + expect(isLinkWithProtocol("some/path/link")).toBe(false); + expect(isLinkWithProtocol("/some/path/link")).toBe(false); + expect(isLinkWithProtocol("#some-anchor")).toBe(false); }); }); @@ -106,11 +108,21 @@ describe("test createLocalLink", () => { expect(localLink).toBe("/src/README.md"); }); + it("should resolve .. to / if we reached the end", () => { + const localLink = createLocalLink("/", "/index.md", "../../README.md"); + expect(localLink).toBe("/README.md"); + }); + it("should resolve . with in path", () => { const localLink = createLocalLink("/src", "/src/README.md", "./LICENSE.md"); expect(localLink).toBe("/src/LICENSE.md"); }); + it("should resolve . with the current directory", () => { + const localLink = createLocalLink("/", "/README.md", "././LICENSE.md"); + expect(localLink).toBe("/LICENSE.md"); + }); + it("should handle complex path", () => { const localLink = createLocalLink("/src", "/src/docs/installation/index.md", "./.././../docs/index.md"); expect(localLink).toBe("/src/docs/index.md"); diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx index 2de0846f28..8ae1bc6135 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.tsx @@ -59,14 +59,26 @@ const normalizePath = (path: string) => { stack.push(part) } } - return stack.join("/") + const normalizedPath = stack.join("/") + if (normalizedPath.startsWith("/")) { + return normalizedPath; + } + return "/" + normalizedPath; +}; + +const isAbsolute = (link: string) => { + return link.startsWith("/"); +}; + +const isSubDirectoryOf = (basePath: string, currentPath: string) => { + return currentPath.startsWith(basePath); }; export const createLocalLink = (basePath: string, currentPath: string, link: string) => { - if (link.startsWith("/")) { + if (isAbsolute(link)) { return join(basePath, link); } - if (!currentPath.startsWith(basePath)) { + if (!isSubDirectoryOf(basePath, currentPath)) { return join(basePath, link); } let path = currentPath; From 4948f26b8eeeadb379f28d5c1186ec0766ba106d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 20 May 2020 11:25:35 +0200 Subject: [PATCH 46/54] Use fixed version of gitdiff parser --- package.json | 2 +- yarn.lock | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 4045306d30..f5194ee536 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "resolutions": { "babel-core": "7.0.0-bridge.0", - "gitdiff-parser": "https://github.com/scm-manager/gitdiff-parser#1da10408e52ad1d58b1f817dd1d658d9f2eb4087", + "gitdiff-parser": "https://github.com/scm-manager/gitdiff-parser#617747460280bf4522bb84d217a9064ac8eb6d3d", "lowlight": "1.13.1" }, "babel": { diff --git a/yarn.lock b/yarn.lock index bf850ef2f3..6cd638ce5b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7444,9 +7444,9 @@ gitconfiglocal@^1.0.0: dependencies: ini "^1.3.2" -gitdiff-parser@^0.1.2, "gitdiff-parser@https://github.com/scm-manager/gitdiff-parser#1da10408e52ad1d58b1f817dd1d658d9f2eb4087": +gitdiff-parser@^0.1.2, "gitdiff-parser@https://github.com/scm-manager/gitdiff-parser#617747460280bf4522bb84d217a9064ac8eb6d3d": version "0.1.2" - resolved "https://github.com/scm-manager/gitdiff-parser#1da10408e52ad1d58b1f817dd1d658d9f2eb4087" + resolved "https://github.com/scm-manager/gitdiff-parser#617747460280bf4522bb84d217a9064ac8eb6d3d" glob-base@^0.3.0: version "0.3.0" From b0abbbd5a698658f9f04bd96c685f993c836e376 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 20 May 2020 12:05:45 +0200 Subject: [PATCH 47/54] avoid code duplication --- .../src/MarkdownLinkRenderer.test.tsx | 41 ++++++++----------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx index 719baa254c..7a5b8e68dc 100644 --- a/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx +++ b/scm-ui/ui-components/src/MarkdownLinkRenderer.test.tsx @@ -69,62 +69,55 @@ describe("test isLinkWithProtocol", () => { describe("test createLocalLink", () => { it("should handle relative links", () => { - const localLink = createLocalLink("/src", "/src/README.md", "docs/Home.md"); - expect(localLink).toBe("/src/docs/Home.md"); + expectLocalLink("/src", "/src/README.md", "docs/Home.md", "/src/docs/Home.md"); }); it("should handle absolute links", () => { - const localLink = createLocalLink("/src", "/src/README.md", "/docs/Home.md"); - expect(localLink).toBe("/src/docs/Home.md"); + expectLocalLink("/src", "/src/README.md", "/docs/CHANGELOG.md", "/src/docs/CHANGELOG.md"); }); it("should handle relative links from locations with trailing slash", () => { - const localLink = createLocalLink("/src", "/src/README.md/", "/docs/Home.md"); - expect(localLink).toBe("/src/docs/Home.md"); + expectLocalLink("/src", "/src/README.md/", "/docs/LICENSE.md", "/src/docs/LICENSE.md"); }); it("should handle relative links from location outside of base", () => { - const localLink = createLocalLink("/src", "/info/readme", "docs/Home.md"); - expect(localLink).toBe("/src/docs/Home.md"); + expectLocalLink("/src", "/info/readme", "docs/index.md", "/src/docs/index.md"); }); it("should handle absolute links from location outside of base", () => { - const localLink = createLocalLink("/src", "/info/readme", "/docs/Home.md"); - expect(localLink).toBe("/src/docs/Home.md"); + expectLocalLink("/src", "/info/readme", "/info/index.md", "/src/info/index.md"); }); it("should handle relative links from sub directories", () => { - const localLink = createLocalLink("/src", "/src/docs/index.md", "installation/linux.md"); - expect(localLink).toBe("/src/docs/installation/linux.md"); + expectLocalLink("/src", "/src/docs/index.md", "installation/linux.md", "/src/docs/installation/linux.md"); }); it("should handle absolute links from sub directories", () => { - const localLink = createLocalLink("/src", "/src/docs/index.md", "/docs/Home.md"); - expect(localLink).toBe("/src/docs/Home.md"); + expectLocalLink("/src", "/src/docs/index.md", "/docs/CONTRIBUTIONS.md", "/src/docs/CONTRIBUTIONS.md"); }); it("should resolve .. with in path", () => { - const localLink = createLocalLink("/src", "/src/docs/installation/index.md", "../../README.md"); - expect(localLink).toBe("/src/README.md"); + expectLocalLink("/src", "/src/docs/installation/index.md", "../../README.md", "/src/README.md"); }); it("should resolve .. to / if we reached the end", () => { - const localLink = createLocalLink("/", "/index.md", "../../README.md"); - expect(localLink).toBe("/README.md"); + expectLocalLink("/", "/index.md", "../../README.md", "/README.md"); }); it("should resolve . with in path", () => { - const localLink = createLocalLink("/src", "/src/README.md", "./LICENSE.md"); - expect(localLink).toBe("/src/LICENSE.md"); + expectLocalLink("/src", "/src/README.md", "./SHAPESHIPS.md", "/src/SHAPESHIPS.md"); }); it("should resolve . with the current directory", () => { - const localLink = createLocalLink("/", "/README.md", "././LICENSE.md"); - expect(localLink).toBe("/LICENSE.md"); + expectLocalLink("/", "/README.md", "././HITCHHIKER.md", "/HITCHHIKER.md"); }); it("should handle complex path", () => { - const localLink = createLocalLink("/src", "/src/docs/installation/index.md", "./.././../docs/index.md"); - expect(localLink).toBe("/src/docs/index.md"); + expectLocalLink("/src", "/src/docs/installation/index.md", "./.././../docs/index.md", "/src/docs/index.md"); }); + + const expectLocalLink = (basePath: string, currentPath: string, link: string, expected: string) => { + const localLink = createLocalLink(basePath, currentPath, link); + expect(localLink).toBe(expected); + }; }); From 7a274abf0f9d418ec16f3524cd1926e5e7bb5a8a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 20 May 2020 12:20:06 +0200 Subject: [PATCH 48/54] Replace el api with implementation from glassfish Somehow, plugins failed to start without this. --- scm-webapp/pom.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/scm-webapp/pom.xml b/scm-webapp/pom.xml index ff4e93594d..54dbc131b7 100644 --- a/scm-webapp/pom.xml +++ b/scm-webapp/pom.xml @@ -196,18 +196,18 @@ 6.1.4.Final - - javax.el - javax.el-api - 3.0.0 - - jakarta.xml.bind jakarta.xml.bind-api ${jaxb.version} + + org.glassfish + javax.el + 3.0.1-b11 + + org.glassfish.jaxb jaxb-runtime From d32258b8fefd0dcf1316da00bca6b9276a345b2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Wed, 20 May 2020 12:38:11 +0200 Subject: [PATCH 49/54] Fix changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1628d676d5..ec2cc1af5d 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 - Detect renamed files in git and hg diffs ([#1157](https://github.com/scm-manager/scm-manager/pull/1157)) ### Fixed +- Missing copy on write in the data store ([#1155](https://github.com/scm-manager/scm-manager/pull/1155)) - Resolved conflicting dependencies for scm-webapp ([#1159](https://github.com/scm-manager/scm-manager/pull/1159)) ## [2.0.0-rc8] - 2020-05-08 @@ -31,7 +32,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Handle obscure line breaks in diff viewer ([#1129](https://github.com/scm-manager/scm-manager/pull/1129)) - Validate subversion client checksum ([#1113](https://github.com/scm-manager/scm-manager/issues/1113)) - Fix plugin manage permission ([#1135](https://github.com/scm-manager/scm-manager/pull/1135)) -- Missing copy on write in the data store ([#1155](https://github.com/scm-manager/scm-manager/pull/1155)) ## [2.0.0-rc7] - 2020-04-09 ### Added From 2a375066fbae410fd69ae4abcb9aea494c8fb092 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 21 May 2020 00:15:36 +0200 Subject: [PATCH 50/54] fix: upgrade jakarta.xml.bind:jakarta.xml.bind-api from 2.3.2 to 2.3.3 Snyk has created this PR to upgrade jakarta.xml.bind:jakarta.xml.bind-api from 2.3.2 to 2.3.3. See this package in NPM: https://www.npmjs.com/package/jakarta.xml.bind:jakarta.xml.bind-api See this project in Snyk: https://app.snyk.io/org/scm-manager/project/0397d943-538d-483e-9c87-a3f7e7665d7b?utm_source=github&utm_medium=upgrade-pr --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9eed838b68..6542f9c038 100644 --- a/pom.xml +++ b/pom.xml @@ -960,7 +960,7 @@ 1.19.4 2.11.0 4.2.3 - 2.3.2 + 2.3.3 6.1.4.Final From 6cde2a90ccfe4b1178c5d288448643ec70e9f278 Mon Sep 17 00:00:00 2001 From: snyk-bot Date: Thu, 21 May 2020 03:00:33 +0200 Subject: [PATCH 51/54] fix: upgrade org.junit-pioneer:junit-pioneer from 0.5.6 to 0.6.0 Snyk has created this PR to upgrade org.junit-pioneer:junit-pioneer from 0.5.6 to 0.6.0. See this package in NPM: https://www.npmjs.com/package/org.junit-pioneer:junit-pioneer See this project in Snyk: https://app.snyk.io/org/scm-manager/project/4ac22872-f5a6-4220-bfe8-e6e5bf4c5fcb?utm_source=github&utm_medium=upgrade-pr --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9eed838b68..f670edb32e 100644 --- a/pom.xml +++ b/pom.xml @@ -405,7 +405,7 @@ org.junit-pioneer junit-pioneer - 0.5.6 + 0.6.0 test From addf59c965ada2bb668dc5b8f7266a4f39daf0c8 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Sun, 24 May 2020 15:20:28 +0200 Subject: [PATCH 52/54] increase sonarqube timeout to 10 minutes --- Jenkinsfile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 7b0e8e9f08..ac469f4c22 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -109,10 +109,10 @@ node('docker') { // deploy java artifacts mvn.useDeploymentRepository([ - id: 'packages.scm-manager.org', - url: 'https://packages.scm-manager.org', - credentialsId: 'maven.scm-manager.org', - snapshotRepository: '/repository/snapshots/', + id: 'packages.scm-manager.org', + url: 'https://packages.scm-manager.org', + credentialsId: 'maven.scm-manager.org', + snapshotRepository: '/repository/snapshots/', releaseRepository: '/repository/releases/', type: 'Configurable' ]) @@ -230,7 +230,7 @@ boolean isMainBranch() { boolean waitForQualityGateWebhookToBeCalled() { boolean isQualityGateSucceeded = true - timeout(time: 5, unit: 'MINUTES') { // Needed when there is no webhook for example + timeout(time: 10, unit: 'MINUTES') { // Needed when there is no webhook for example def qGate = waitForQualityGate() echo "SonarQube Quality Gate status: ${qGate.status}" if (qGate.status != 'OK') { From 7636f1e845383a11ed0ce5630348bc29805443e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9=20Pfeuffer?= Date: Sat, 23 May 2020 19:06:02 +0200 Subject: [PATCH 53/54] Remove temp dir extension and use native junit annotation --- pom.xml | 12 ---------- .../sonia/scm/BasicContextProviderTest.java | 8 +++---- .../api/ModifyCommandBuilderTest.java | 9 ++++---- .../spi/ModifyWorkerHelperTest.java | 8 +++---- .../security/DefaultCipherHandlerTest.java | 8 +++---- .../sonia/scm/xml/XmlInstantAdapterTest.java | 10 ++++---- ...thBasedRepositoryLocationResolverTest.java | 7 +++--- .../repository/xml/XmlRepositoryDAOTest.java | 12 +++++----- .../java/sonia/scm/store/CopyOnWriteTest.java | 20 ++++++++-------- .../scm/store/JAXBPropertyFileAccessTest.java | 15 ++++++------ .../sonia/scm/it/AnonymousAccessITCase.java | 16 ++++--------- .../scm/ScmLogFilePropertyDefinerTest.java | 8 +++---- .../sonia/scm/lifecycle/VersionsTest.java | 18 +++++++-------- .../scm/plugin/DefaultPluginManagerTest.java | 13 ++++------- .../plugin/PendingPluginInstallationTest.java | 10 ++++---- .../sonia/scm/plugin/PluginInstallerTest.java | 14 +++++++---- .../plugin/SmpDescriptorExtractorTest.java | 12 ++++------ .../sonia/scm/plugin/UberClassLoaderTest.java | 10 ++++---- .../group/XmlGroupV1UpdateStepTest.java | 8 +++---- .../repository/CopyMigrationStrategyTest.java | 15 ++++++------ .../DefaultMigrationStrategyDAOTest.java | 7 +++--- .../InlineMigrationStrategyTest.java | 13 +++++------ .../MigrateVerbsToPermissionRolesTest.java | 9 ++++---- .../repository/MoveMigrationStrategyTest.java | 15 ++++++------ .../repository/PublicFlagUpdateStepTest.java | 7 ++---- .../XmlRepositoryFileNameUpdateStepTest.java | 10 ++++---- .../XmlRepositoryV1UpdateStepTest.java | 23 +++++++++---------- .../security/XmlSecurityV1UpdateStepTest.java | 11 ++++----- .../update/user/XmlUserV1UpdateStepTest.java | 8 +++---- 29 files changed, 143 insertions(+), 193 deletions(-) diff --git a/pom.xml b/pom.xml index f670edb32e..9c02195159 100644 --- a/pom.xml +++ b/pom.xml @@ -152,11 +152,6 @@ junit-vintage-engine - - org.junit-pioneer - junit-pioneer - - org.hamcrest hamcrest-core @@ -402,13 +397,6 @@ test - - org.junit-pioneer - junit-pioneer - 0.6.0 - test - - junit junit diff --git a/scm-core/src/test/java/sonia/scm/BasicContextProviderTest.java b/scm-core/src/test/java/sonia/scm/BasicContextProviderTest.java index 18ad14b5f6..babba7dd3d 100644 --- a/scm-core/src/test/java/sonia/scm/BasicContextProviderTest.java +++ b/scm-core/src/test/java/sonia/scm/BasicContextProviderTest.java @@ -27,15 +27,13 @@ package sonia.scm; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import java.nio.file.Path; import java.nio.file.Paths; import static org.assertj.core.api.Assertions.assertThat; -@ExtendWith(TempDirectory.class) class BasicContextProviderTest { @Nested @@ -68,13 +66,13 @@ class BasicContextProviderTest { private BasicContextProvider context; @BeforeEach - void setUpContext(@TempDirectory.TempDir Path baseDirectory) { + void setUpContext(@TempDir Path baseDirectory) { this.baseDirectory = baseDirectory; context = new BasicContextProvider(baseDirectory.toFile(), "x.y.z", Stage.PRODUCTION); } @Test - void shouldReturnAbsolutePathAsIs(@TempDirectory.TempDir Path path) { + void shouldReturnAbsolutePathAsIs(@TempDir Path path) { Path absolutePath = path.toAbsolutePath(); Path resolved = context.resolve(absolutePath); diff --git a/scm-core/src/test/java/sonia/scm/repository/api/ModifyCommandBuilderTest.java b/scm-core/src/test/java/sonia/scm/repository/api/ModifyCommandBuilderTest.java index abbfd0a638..a374a2272c 100644 --- a/scm-core/src/test/java/sonia/scm/repository/api/ModifyCommandBuilderTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/api/ModifyCommandBuilderTest.java @@ -21,14 +21,14 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.repository.api; import com.google.common.io.ByteSource; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.ArgumentCaptor; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; @@ -57,7 +57,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) -@ExtendWith(TempDirectory.class) class ModifyCommandBuilderTest { @Mock @@ -71,7 +70,7 @@ class ModifyCommandBuilderTest { Path workdir; @BeforeEach - void initWorkdir(@TempDirectory.TempDir Path temp) throws IOException { + void initWorkdir(@TempDir Path temp) throws IOException { workdir = Files.createDirectory(temp.resolve("workdir")); lenient().when(workdirProvider.createNewWorkdir()).thenReturn(workdir.toFile()); commandBuilder = new ModifyCommandBuilder(command, workdirProvider); @@ -207,7 +206,7 @@ class ModifyCommandBuilderTest { } @Test - void shouldDeleteTemporaryFiles(@TempDirectory.TempDir Path temp) throws IOException { + void shouldDeleteTemporaryFiles(@TempDir Path temp) throws IOException { ArgumentCaptor nameCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor fileCaptor = ArgumentCaptor.forClass(File.class); doNothing().when(worker).modify(nameCaptor.capture(), fileCaptor.capture()); diff --git a/scm-core/src/test/java/sonia/scm/repository/spi/ModifyWorkerHelperTest.java b/scm-core/src/test/java/sonia/scm/repository/spi/ModifyWorkerHelperTest.java index a4fbc1770b..1d675e0743 100644 --- a/scm-core/src/test/java/sonia/scm/repository/spi/ModifyWorkerHelperTest.java +++ b/scm-core/src/test/java/sonia/scm/repository/spi/ModifyWorkerHelperTest.java @@ -21,12 +21,11 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.repository.spi; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import sonia.scm.repository.Repository; import java.io.File; @@ -36,11 +35,10 @@ import java.nio.file.Path; import static org.assertj.core.api.Assertions.assertThat; -@ExtendWith(TempDirectory.class) class ModifyWorkerHelperTest { @Test - void shouldKeepExecutableFlag(@TempDirectory.TempDir Path temp) throws IOException { + void shouldKeepExecutableFlag(@TempDir Path temp) throws IOException { File target = createFile(temp, "executable.sh"); File newFile = createFile(temp, "other"); diff --git a/scm-core/src/test/java/sonia/scm/security/DefaultCipherHandlerTest.java b/scm-core/src/test/java/sonia/scm/security/DefaultCipherHandlerTest.java index 985e8eb1a8..6f88f71597 100644 --- a/scm-core/src/test/java/sonia/scm/security/DefaultCipherHandlerTest.java +++ b/scm-core/src/test/java/sonia/scm/security/DefaultCipherHandlerTest.java @@ -27,7 +27,7 @@ package sonia.scm.security; import com.google.common.io.Files; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.SCMContextProvider; @@ -45,7 +45,7 @@ import static org.mockito.Mockito.when; * * @author Sebastian Sdorra */ -@ExtendWith({MockitoExtension.class, TempDirectory.class}) +@ExtendWith({MockitoExtension.class}) public class DefaultCipherHandlerTest { @Mock @@ -58,7 +58,7 @@ public class DefaultCipherHandlerTest { * Tests loading and storing default key. */ @Test - void shouldLoadAndStoreDefaultKey(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldLoadAndStoreDefaultKey(@TempDir Path tempDir) throws IOException { File baseDirectory = tempDir.toFile(); when(context.getBaseDirectory()).thenReturn(baseDirectory); @@ -84,7 +84,7 @@ public class DefaultCipherHandlerTest { @Test @SuppressWarnings("UnstableApiUsage") // is ok for unit test - void shouldReEncodeOldFormattedDefaultKey(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldReEncodeOldFormattedDefaultKey(@TempDir Path tempDir) throws IOException { String oldKey = "17eXopruTtX3S4dJ9KTEmbZ-vfZztw=="; String encryptedValue = "A11kQF7wytpWCkjPflxJB-zUWJ1CVKU3qhwhRFq4Pvl6XqiS9V2w-gqNktqMX6YNDw=="; String plainValue = "Marvin The Paranoid Android - RAM"; diff --git a/scm-core/src/test/java/sonia/scm/xml/XmlInstantAdapterTest.java b/scm-core/src/test/java/sonia/scm/xml/XmlInstantAdapterTest.java index 917022c42e..3abac6c132 100644 --- a/scm-core/src/test/java/sonia/scm/xml/XmlInstantAdapterTest.java +++ b/scm-core/src/test/java/sonia/scm/xml/XmlInstantAdapterTest.java @@ -21,12 +21,11 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.xml; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import javax.xml.bind.JAXB; import javax.xml.bind.annotation.XmlAccessType; @@ -36,13 +35,12 @@ import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import java.nio.file.Path; import java.time.Instant; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; -@ExtendWith(TempDirectory.class) class XmlInstantAdapterTest { @Test - void shouldMarshalAndUnmarshalInstant(@TempDirectory.TempDir Path tempDirectory) { + void shouldMarshalAndUnmarshalInstant(@TempDir Path tempDirectory) { Path path = tempDirectory.resolve("instant.xml"); Instant instant = Instant.now(); diff --git a/scm-dao-xml/src/test/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolverTest.java b/scm-dao-xml/src/test/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolverTest.java index 019c4de862..7c474ea95c 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolverTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/repository/xml/PathBasedRepositoryLocationResolverTest.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.repository.xml; import com.google.common.base.Charsets; @@ -29,7 +29,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import org.mockito.junit.jupiter.MockitoSettings; @@ -52,7 +52,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) -@ExtendWith(TempDirectory.class) @MockitoSettings(strictness = Strictness.LENIENT) class PathBasedRepositoryLocationResolverTest { @@ -74,7 +73,7 @@ class PathBasedRepositoryLocationResolverTest { private PathBasedRepositoryLocationResolver resolver; @BeforeEach - void beforeEach(@TempDirectory.TempDir Path temp) { + void beforeEach(@TempDir Path temp) { this.basePath = temp; when(contextProvider.getBaseDirectory()).thenReturn(temp.toFile()); when(contextProvider.resolve(any(Path.class))).thenAnswer(invocation -> invocation.getArgument(0)); diff --git a/scm-dao-xml/src/test/java/sonia/scm/repository/xml/XmlRepositoryDAOTest.java b/scm-dao-xml/src/test/java/sonia/scm/repository/xml/XmlRepositoryDAOTest.java index c90a61d874..4b7bce2093 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/repository/xml/XmlRepositoryDAOTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/repository/xml/XmlRepositoryDAOTest.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.repository.xml; @@ -31,7 +31,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.Mock; import org.mockito.invocation.InvocationOnMock; import org.mockito.junit.jupiter.MockitoExtension; @@ -61,7 +61,7 @@ import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -@ExtendWith({MockitoExtension.class, TempDirectory.class}) +@ExtendWith({MockitoExtension.class}) @MockitoSettings(strictness = Strictness.LENIENT) class XmlRepositoryDAOTest { @@ -76,7 +76,7 @@ class XmlRepositoryDAOTest { private XmlRepositoryDAO dao; @BeforeEach - void createDAO(@TempDirectory.TempDir Path basePath) { + void createDAO(@TempDir Path basePath) { when(locationResolver.create(Path.class)).thenReturn( new RepositoryLocationResolver.RepositoryLocationResolverInstance() { @Override @@ -103,7 +103,7 @@ class XmlRepositoryDAOTest { when(locationResolver.remove(anyString())).thenAnswer(invocation -> basePath.resolve(invocation.getArgument(0).toString())); } - private Path createMockedRepoPath(@TempDirectory.TempDir Path basePath, InvocationOnMock invocation) { + private Path createMockedRepoPath(@TempDir Path basePath, InvocationOnMock invocation) { Path resolvedPath = basePath.resolve(invocation.getArgument(0).toString()); try { Files.createDirectories(resolvedPath); @@ -337,7 +337,7 @@ class XmlRepositoryDAOTest { private Path repositoryPath; @BeforeEach - void createMetadataFileForRepository(@TempDirectory.TempDir Path basePath) throws IOException { + void createMetadataFileForRepository(@TempDir Path basePath) throws IOException { repositoryPath = basePath.resolve("existing"); Files.createDirectories(repositoryPath); diff --git a/scm-dao-xml/src/test/java/sonia/scm/store/CopyOnWriteTest.java b/scm-dao-xml/src/test/java/sonia/scm/store/CopyOnWriteTest.java index e66fcd5b60..b2d9143655 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/store/CopyOnWriteTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/store/CopyOnWriteTest.java @@ -21,13 +21,12 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.store; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import java.io.FileOutputStream; import java.io.IOException; @@ -38,11 +37,10 @@ import java.nio.file.Paths; import static org.junit.jupiter.api.Assertions.assertThrows; import static sonia.scm.store.CopyOnWrite.withTemporaryFile; -@ExtendWith(TempDirectory.class) class CopyOnWriteTest { @Test - void shouldCreateNewFile(@TempDirectory.TempDir Path tempDir) { + void shouldCreateNewFile(@TempDir Path tempDir) { Path expectedFile = tempDir.resolve("toBeCreated.txt"); withTemporaryFile( @@ -53,7 +51,7 @@ class CopyOnWriteTest { } @Test - void shouldOverwriteExistingFile(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldOverwriteExistingFile(@TempDir Path tempDir) throws IOException { Path expectedFile = tempDir.resolve("toBeOverwritten.txt"); Files.createFile(expectedFile); @@ -65,7 +63,7 @@ class CopyOnWriteTest { } @Test - void shouldFailForDirectory(@TempDirectory.TempDir Path tempDir) { + void shouldFailForDirectory(@TempDir Path tempDir) { assertThrows(IllegalArgumentException.class, () -> withTemporaryFile( file -> new FileOutputStream(file.toFile()).write("should not be written".getBytes()), @@ -82,7 +80,7 @@ class CopyOnWriteTest { } @Test - void shouldKeepBackupIfTemporaryFileCouldNotBeWritten(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldKeepBackupIfTemporaryFileCouldNotBeWritten(@TempDir Path tempDir) throws IOException { Path unchangedOriginalFile = tempDir.resolve("notToBeDeleted.txt"); new FileOutputStream(unchangedOriginalFile.toFile()).write("this should be kept".getBytes()); @@ -98,7 +96,7 @@ class CopyOnWriteTest { } @Test - void shouldNotWrapRuntimeExceptions(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldNotWrapRuntimeExceptions(@TempDir Path tempDir) throws IOException { Path someFile = tempDir.resolve("something.txt"); assertThrows( @@ -111,7 +109,7 @@ class CopyOnWriteTest { } @Test - void shouldKeepBackupIfTemporaryFileIsMissing(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldKeepBackupIfTemporaryFileIsMissing(@TempDir Path tempDir) throws IOException { Path backedUpFile = tempDir.resolve("notToBeDeleted.txt"); new FileOutputStream(backedUpFile.toFile()).write("this should be kept".getBytes()); @@ -125,7 +123,7 @@ class CopyOnWriteTest { } @Test - void shouldDeleteExistingFile(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldDeleteExistingFile(@TempDir Path tempDir) throws IOException { Path expectedFile = tempDir.resolve("toBeReplaced.txt"); new FileOutputStream(expectedFile.toFile()).write("this should be removed".getBytes()); diff --git a/scm-dao-xml/src/test/java/sonia/scm/store/JAXBPropertyFileAccessTest.java b/scm-dao-xml/src/test/java/sonia/scm/store/JAXBPropertyFileAccessTest.java index bc498a9e04..0c6f4ac982 100644 --- a/scm-dao-xml/src/test/java/sonia/scm/store/JAXBPropertyFileAccessTest.java +++ b/scm-dao-xml/src/test/java/sonia/scm/store/JAXBPropertyFileAccessTest.java @@ -21,14 +21,14 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.store; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.SCMContextProvider; @@ -48,7 +48,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.lenient; -@ExtendWith(TempDirectory.class) @ExtendWith(MockitoExtension.class) class JAXBPropertyFileAccessTest { @@ -63,7 +62,7 @@ class JAXBPropertyFileAccessTest { JAXBPropertyFileAccess fileAccess; @BeforeEach - void initTempDir(@TempDirectory.TempDir Path tempDir) { + void initTempDir(@TempDir Path tempDir) { lenient().when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); lenient().when(contextProvider.resolve(any())).thenAnswer(invocation -> tempDir.resolve(invocation.getArgument(0).toString())); @@ -99,7 +98,7 @@ class JAXBPropertyFileAccessTest { } @Test - void shouldMoveStoreFileToRepositoryBasedLocation(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldMoveStoreFileToRepositoryBasedLocation(@TempDir Path tempDir) throws IOException { createV1StoreFile(tempDir, "myStore.xml"); fileAccess.forStoreName(STORE_NAME).moveAsRepositoryStore(Paths.get("myStore.xml"), REPOSITORY_ID); @@ -108,7 +107,7 @@ class JAXBPropertyFileAccessTest { } @Test - void shouldMoveAllStoreFilesToRepositoryBasedLocations(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldMoveAllStoreFilesToRepositoryBasedLocations(@TempDir Path tempDir) throws IOException { locationResolver.forClass(Path.class).createLocation("repoId2"); createV1StoreFile(tempDir, REPOSITORY_ID + ".xml"); @@ -122,7 +121,7 @@ class JAXBPropertyFileAccessTest { } } - private void createV1StoreFile(@TempDirectory.TempDir Path tempDir, String name) throws IOException { + private void createV1StoreFile(@TempDir Path tempDir, String name) throws IOException { Path v1Dir = tempDir.resolve("var").resolve("data").resolve(STORE_NAME); IOUtil.mkdirs(v1Dir.toFile()); Files.createFile(v1Dir.resolve(name)); @@ -132,7 +131,7 @@ class JAXBPropertyFileAccessTest { class ForMissingRepository { @Test - void shouldIgnoreStoreFile(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldIgnoreStoreFile(@TempDir Path tempDir) throws IOException { createV1StoreFile(tempDir, "myStore.xml"); fileAccess.forStoreName(STORE_NAME).moveAsRepositoryStore(Paths.get("myStore.xml"), REPOSITORY_ID); diff --git a/scm-it/src/test/java/sonia/scm/it/AnonymousAccessITCase.java b/scm-it/src/test/java/sonia/scm/it/AnonymousAccessITCase.java index afda4475fd..0994ca0dcb 100644 --- a/scm-it/src/test/java/sonia/scm/it/AnonymousAccessITCase.java +++ b/scm-it/src/test/java/sonia/scm/it/AnonymousAccessITCase.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.it; import io.restassured.RestAssured; @@ -31,14 +31,9 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.ArgumentsProvider; import org.junit.jupiter.params.provider.ArgumentsSource; -import org.junit.jupiter.params.provider.MethodSource; -import org.junitpioneer.jupiter.TempDirectory; import sonia.scm.it.utils.RepositoryUtil; import sonia.scm.it.utils.RestUtil; import sonia.scm.it.utils.ScmRequests; @@ -50,12 +45,10 @@ import sonia.scm.repository.client.api.RepositoryClientException; import javax.json.Json; import javax.json.JsonArray; import javax.servlet.http.HttpServletResponse; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Objects; -import java.util.stream.Stream; import static java.util.Collections.emptyMap; import static org.junit.Assert.assertEquals; @@ -65,7 +58,6 @@ import static sonia.scm.it.utils.TestData.USER_ANONYMOUS; import static sonia.scm.it.utils.TestData.WRITE; import static sonia.scm.it.utils.TestData.getDefaultRepositoryUrl; -@ExtendWith(TempDirectory.class) class AnonymousAccessITCase { @Test @@ -118,7 +110,7 @@ class AnonymousAccessITCase { @ParameterizedTest @ArgumentsSource(ScmTypes.class) - void shouldNotCloneRepository(String type, @TempDirectory.TempDir Path temporaryFolder) { + void shouldNotCloneRepository(String type, @TempDir Path temporaryFolder) { assertThrows(RepositoryClientException.class, () -> RepositoryUtil.createAnonymousRepositoryClient(type, Files.createDirectories(temporaryFolder).toFile())); } } @@ -142,7 +134,7 @@ class AnonymousAccessITCase { @ParameterizedTest @ArgumentsSource(ScmTypes.class) - void shouldCloneRepository(String type, @TempDirectory.TempDir Path temporaryFolder) throws IOException { + void shouldCloneRepository(String type, @TempDir Path temporaryFolder) throws IOException { RepositoryClient client = RepositoryUtil.createAnonymousRepositoryClient(type, Files.createDirectories(temporaryFolder).toFile()); assertEquals(1, Objects.requireNonNull(client.getWorkingCopy().list()).length); } diff --git a/scm-webapp/src/test/java/sonia/scm/ScmLogFilePropertyDefinerTest.java b/scm-webapp/src/test/java/sonia/scm/ScmLogFilePropertyDefinerTest.java index 6372c75aa1..4ad33b9697 100644 --- a/scm-webapp/src/test/java/sonia/scm/ScmLogFilePropertyDefinerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/ScmLogFilePropertyDefinerTest.java @@ -26,7 +26,7 @@ package sonia.scm; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -36,14 +36,14 @@ import java.util.Properties; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; -@ExtendWith({MockitoExtension.class, TempDirectory.class}) +@ExtendWith({MockitoExtension.class}) class ScmLogFilePropertyDefinerTest { @Mock private SCMContextProvider context; @Test - void shouldReturnPath(@TempDirectory.TempDir Path tempDir) { + void shouldReturnPath(@TempDir Path tempDir) { when(context.getBaseDirectory()).thenReturn(tempDir.toFile()); ScmLogFilePropertyDefiner definer = builder().create(); @@ -52,7 +52,7 @@ class ScmLogFilePropertyDefinerTest { } @Test - void shouldReturnOsxPath(@TempDirectory.TempDir Path tempDir) { + void shouldReturnOsxPath(@TempDir Path tempDir) { ScmLogFilePropertyDefiner definer = builder() .withOs("Mac OS X") .withUserHome(tempDir.toAbsolutePath().toString()) diff --git a/scm-webapp/src/test/java/sonia/scm/lifecycle/VersionsTest.java b/scm-webapp/src/test/java/sonia/scm/lifecycle/VersionsTest.java index a59de4fa25..c865d5e5cb 100644 --- a/scm-webapp/src/test/java/sonia/scm/lifecycle/VersionsTest.java +++ b/scm-webapp/src/test/java/sonia/scm/lifecycle/VersionsTest.java @@ -21,12 +21,12 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.lifecycle; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -41,7 +41,7 @@ import java.nio.file.Paths; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.doReturn; -@ExtendWith({MockitoExtension.class, TempDirectory.class}) +@ExtendWith({MockitoExtension.class}) class VersionsTest { @Mock @@ -51,7 +51,7 @@ class VersionsTest { private Versions versions; @Test - void shouldReturnTrueForVersionsPreviousTo160(@TempDirectory.TempDir Path directory) throws IOException { + void shouldReturnTrueForVersionsPreviousTo160(@TempDir Path directory) throws IOException { setVersion(directory, "1.59"); assertThat(versions.isPreviousVersionTooOld()).isTrue(); @@ -60,19 +60,19 @@ class VersionsTest { } @Test - void shouldReturnFalseForVersion160(@TempDirectory.TempDir Path directory) throws IOException { + void shouldReturnFalseForVersion160(@TempDir Path directory) throws IOException { setVersion(directory, "1.60"); assertThat(versions.isPreviousVersionTooOld()).isFalse(); } @Test - void shouldNotFailIfVersionContainsLineBreak(@TempDirectory.TempDir Path directory) throws IOException { + void shouldNotFailIfVersionContainsLineBreak(@TempDir Path directory) throws IOException { setVersion(directory, "1.59\n"); assertThat(versions.isPreviousVersionTooOld()).isTrue(); } @Test - void shouldReturnFalseForVersionsNewerAs160(@TempDirectory.TempDir Path directory) throws IOException { + void shouldReturnFalseForVersionsNewerAs160(@TempDir Path directory) throws IOException { setVersion(directory, "1.61"); assertThat(versions.isPreviousVersionTooOld()).isFalse(); @@ -81,13 +81,13 @@ class VersionsTest { } @Test - void shouldReturnFalseForNonExistingVersionFile(@TempDirectory.TempDir Path directory) { + void shouldReturnFalseForNonExistingVersionFile(@TempDir Path directory) { setVersionFile(directory.resolve("version.txt")); assertThat(versions.isPreviousVersionTooOld()).isFalse(); } @Test - void shouldWriteNewVersion(@TempDirectory.TempDir Path directory) { + void shouldWriteNewVersion(@TempDir Path directory) { Path config = directory.resolve("config"); doReturn(config).when(contextProvider).resolve(Paths.get("config")); doReturn("2.0.0").when(contextProvider).getVersion(); diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java index da7fce6527..afb7c4eea1 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java @@ -34,7 +34,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; @@ -48,7 +48,6 @@ import sonia.scm.lifecycle.Restarter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.Collections; import java.util.List; import java.util.Optional; @@ -56,7 +55,6 @@ import static java.util.Arrays.asList; import static java.util.Collections.singleton; import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.in; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.any; import static org.mockito.Mockito.doNothing; @@ -72,7 +70,6 @@ import static sonia.scm.plugin.PluginTestHelper.createAvailable; import static sonia.scm.plugin.PluginTestHelper.createInstalled; @ExtendWith(MockitoExtension.class) -@ExtendWith(TempDirectory.class) class DefaultPluginManagerTest { @Mock @@ -372,7 +369,7 @@ class DefaultPluginManagerTest { } @Test - void shouldCreateUninstallFile(@TempDirectory.TempDir Path temp) { + void shouldCreateUninstallFile(@TempDir Path temp) { InstalledPlugin mailPlugin = createInstalled("scm-mail-plugin"); when(mailPlugin.getDirectory()).thenReturn(temp); @@ -384,7 +381,7 @@ class DefaultPluginManagerTest { } @Test - void shouldMarkPluginForUninstall(@TempDirectory.TempDir Path temp) { + void shouldMarkPluginForUninstall(@TempDir Path temp) { InstalledPlugin mailPlugin = createInstalled("scm-mail-plugin"); when(mailPlugin.getDirectory()).thenReturn(temp); @@ -414,7 +411,7 @@ class DefaultPluginManagerTest { } @Test - void shouldThrowExceptionWhenUninstallingCorePlugin(@TempDirectory.TempDir Path temp) { + void shouldThrowExceptionWhenUninstallingCorePlugin(@TempDir Path temp) { InstalledPlugin mailPlugin = createInstalled("scm-mail-plugin"); when(mailPlugin.getDirectory()).thenReturn(temp); when(mailPlugin.isCore()).thenReturn(true); @@ -484,7 +481,7 @@ class DefaultPluginManagerTest { } @Test - void shouldUndoPendingInstallations(@TempDirectory.TempDir Path temp) throws IOException { + void shouldUndoPendingInstallations(@TempDir Path temp) throws IOException { InstalledPlugin mailPlugin = createInstalled("scm-ssh-plugin"); Path mailPluginPath = temp.resolve("scm-mail-plugin"); Files.createDirectories(mailPluginPath); diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/PendingPluginInstallationTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/PendingPluginInstallationTest.java index ba275bc820..b668870488 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/PendingPluginInstallationTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/PendingPluginInstallationTest.java @@ -21,12 +21,12 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.plugin; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.Answers; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -39,14 +39,14 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; -@ExtendWith({MockitoExtension.class, TempDirectory.class}) +@ExtendWith({MockitoExtension.class}) class PendingPluginInstallationTest { @Mock(answer = Answers.RETURNS_DEEP_STUBS) private AvailablePlugin plugin; @Test - void shouldDeleteFileOnCancel(@TempDirectory.TempDir Path directory) throws IOException { + void shouldDeleteFileOnCancel(@TempDir Path directory) throws IOException { Path file = directory.resolve("file"); Files.write(file, "42".getBytes()); @@ -59,7 +59,7 @@ class PendingPluginInstallationTest { } @Test - void shouldThrowExceptionIfCancelFailed(@TempDirectory.TempDir Path directory) { + void shouldThrowExceptionIfCancelFailed(@TempDir Path directory) { Path file = directory.resolve("file"); when(plugin.getDescriptor().getInformation().getName()).thenReturn("scm-awesome-plugin"); diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/PluginInstallerTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/PluginInstallerTest.java index 14bb26f87c..bccbb67f3c 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/PluginInstallerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/PluginInstallerTest.java @@ -21,13 +21,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.plugin; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.Answers; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -45,9 +45,13 @@ import java.util.Collections; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.anyInt; +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; -@ExtendWith({MockitoExtension.class, TempDirectory.class}) +@ExtendWith({MockitoExtension.class}) class PluginInstallerTest { @Mock @@ -65,7 +69,7 @@ class PluginInstallerTest { private Path directory; @BeforeEach - void setUpContext(@TempDirectory.TempDir Path directory) throws IOException { + void setUpContext(@TempDir Path directory) throws IOException { this.directory = directory; lenient().when(context.resolve(any())).then(ic -> { Path arg = ic.getArgument(0); diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/SmpDescriptorExtractorTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/SmpDescriptorExtractorTest.java index eea0a2f681..dd8dad5eca 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/SmpDescriptorExtractorTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/SmpDescriptorExtractorTest.java @@ -21,13 +21,12 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.plugin; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import java.io.IOException; import java.nio.file.Files; @@ -38,7 +37,6 @@ import java.util.zip.ZipOutputStream; import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.jupiter.api.Assertions.assertThrows; -@ExtendWith(TempDirectory.class) class SmpDescriptorExtractorTest { private static final String PLUGIN_XML = "\n" + @@ -66,7 +64,7 @@ class SmpDescriptorExtractorTest { "\n"; @Test - void shouldExtractPluginXml(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldExtractPluginXml(@TempDir Path tempDir) throws IOException { Path pluginFile = createZipFile(tempDir, "META-INF/scm/plugin.xml", PLUGIN_XML); InstalledPluginDescriptor installedPluginDescriptor = new SmpDescriptorExtractor().extractPluginDescriptor(pluginFile); @@ -75,14 +73,14 @@ class SmpDescriptorExtractorTest { } @Test - void shouldFailWithoutPluginXml(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldFailWithoutPluginXml(@TempDir Path tempDir) throws IOException { Path pluginFile = createZipFile(tempDir, "META-INF/wrong/plugin.xml", PLUGIN_XML); assertThrows(IOException.class, () -> new SmpDescriptorExtractor().extractPluginDescriptor(pluginFile)); } @Test - void shouldFailWithIllegalPluginXml(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldFailWithIllegalPluginXml(@TempDir Path tempDir) throws IOException { Path pluginFile = createZipFile(tempDir, "META-INF/scm/plugin.xml", "content"); assertThrows(IOException.class, () -> new SmpDescriptorExtractor().extractPluginDescriptor(pluginFile)); diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/UberClassLoaderTest.java b/scm-webapp/src/test/java/sonia/scm/plugin/UberClassLoaderTest.java index 59b8432882..375304e74a 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/UberClassLoaderTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/UberClassLoaderTest.java @@ -21,14 +21,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.plugin; import com.google.common.collect.ImmutableSet; import com.google.common.io.Resources; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import java.io.IOException; import java.net.URL; @@ -43,13 +42,12 @@ import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; -@ExtendWith(TempDirectory.class) class UberClassLoaderTest { private final URLClassLoader parentClassLoader = new URLClassLoader(new URL[0]); @Test - void shouldOnlyUseClassloaderOnce(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldOnlyUseClassloaderOnce(@TempDir Path tempDir) throws IOException { ClassLoader mailClassLoader = createClassLoader(tempDir, "plugin.txt", "mail"); ClassLoader reviewClassLoader = createClassLoader(mailClassLoader, tempDir, "plugin.txt", "review"); @@ -61,7 +59,7 @@ class UberClassLoaderTest { } @Test - void shouldReturnResourceFromEachPluginClassLoader(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldReturnResourceFromEachPluginClassLoader(@TempDir Path tempDir) throws IOException { ClassLoader mailClassLoader = createClassLoader(tempDir, "scm.txt", "mail"); ClassLoader reviewClassLoader = createClassLoader(tempDir, "scm.txt", "review"); diff --git a/scm-webapp/src/test/java/sonia/scm/update/group/XmlGroupV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/group/XmlGroupV1UpdateStepTest.java index 95e0dc12bf..434dc075d5 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/group/XmlGroupV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/group/XmlGroupV1UpdateStepTest.java @@ -21,14 +21,14 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.update.group; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; @@ -39,7 +39,6 @@ import sonia.scm.store.ConfigurationEntryStore; import sonia.scm.store.InMemoryConfigurationEntryStoreFactory; import sonia.scm.update.UpdateStepTestUtil; import sonia.scm.update.V1Properties; -import sonia.scm.update.V1Property; import javax.xml.bind.JAXBException; import java.io.IOException; @@ -55,7 +54,6 @@ import static org.mockito.Mockito.verify; import static sonia.scm.store.InMemoryConfigurationEntryStoreFactory.create; @ExtendWith(MockitoExtension.class) -@ExtendWith(TempDirectory.class) class XmlGroupV1UpdateStepTest { @Mock @@ -72,7 +70,7 @@ class XmlGroupV1UpdateStepTest { @BeforeEach - void mockScmHome(@TempDirectory.TempDir Path tempDir) { + void mockScmHome(@TempDir Path tempDir) { testUtil = new UpdateStepTestUtil(tempDir); updateStep = new XmlGroupV1UpdateStep(testUtil.getContextProvider(), groupDAO, storeFactory); } diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java index 267b2876da..1766c288f9 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/CopyMigrationStrategyTest.java @@ -21,13 +21,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.update.repository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.SCMContextProvider; @@ -44,7 +44,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -@ExtendWith(TempDirectory.class) @ExtendWith(MockitoExtension.class) class CopyMigrationStrategyTest { @@ -54,30 +53,30 @@ class CopyMigrationStrategyTest { RepositoryLocationResolver locationResolver; @BeforeEach - void mockContextProvider(@TempDirectory.TempDir Path tempDir) { + void mockContextProvider(@TempDir Path tempDir) { when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); } @BeforeEach - void createV1Home(@TempDirectory.TempDir Path tempDir) throws IOException { + void createV1Home(@TempDir Path tempDir) throws IOException { V1RepositoryFileSystem.createV1Home(tempDir); } @BeforeEach - void mockLocationResolver(@TempDirectory.TempDir Path tempDir) { + void mockLocationResolver(@TempDir Path tempDir) { RepositoryLocationResolver.RepositoryLocationResolverInstance instanceMock = mock(RepositoryLocationResolver.RepositoryLocationResolverInstance.class); when(locationResolver.forClass(Path.class)).thenReturn(instanceMock); when(instanceMock.createLocation(anyString())).thenAnswer(invocation -> tempDir.resolve((String) invocation.getArgument(0))); } @Test - void shouldUseStandardDirectory(@TempDirectory.TempDir Path tempDir) { + void shouldUseStandardDirectory(@TempDir Path tempDir) { Path target = new CopyMigrationStrategy(contextProvider, locationResolver).migrate("b4f-a9f0-49f7-ad1f-37d3aae1c55f", "some/more/directories/than/one", "git").get(); assertThat(target).isEqualTo(tempDir.resolve("b4f-a9f0-49f7-ad1f-37d3aae1c55f")); } @Test - void shouldCopyDataDirectory(@TempDirectory.TempDir Path tempDir) { + void shouldCopyDataDirectory(@TempDir Path tempDir) { Path target = new CopyMigrationStrategy(contextProvider, locationResolver).migrate("b4f-a9f0-49f7-ad1f-37d3aae1c55f", "some/more/directories/than/one", "git").get(); assertThat(target.resolve("data")).exists(); Path originalDataDir = tempDir diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/DefaultMigrationStrategyDAOTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/DefaultMigrationStrategyDAOTest.java index f9596d3a67..1bbba6317e 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/DefaultMigrationStrategyDAOTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/DefaultMigrationStrategyDAOTest.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.update.repository; import org.assertj.core.api.Assertions; @@ -29,7 +29,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.SCMContextProvider; @@ -43,7 +43,6 @@ import static org.mockito.Mockito.when; import static sonia.scm.update.repository.MigrationStrategy.INLINE; @ExtendWith(MockitoExtension.class) -@ExtendWith(TempDirectory.class) class DefaultMigrationStrategyDAOTest { @Mock @@ -52,7 +51,7 @@ class DefaultMigrationStrategyDAOTest { private ConfigurationStoreFactory storeFactory; @BeforeEach - void initStore(@TempDirectory.TempDir Path tempDir) { + void initStore(@TempDir Path tempDir) { when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); storeFactory = new JAXBConfigurationStoreFactory(contextProvider, null); } diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/InlineMigrationStrategyTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/InlineMigrationStrategyTest.java index 2d4a1ba03f..d236859af9 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/InlineMigrationStrategyTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/InlineMigrationStrategyTest.java @@ -21,13 +21,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.update.repository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.SCMContextProvider; @@ -41,7 +41,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -@ExtendWith(TempDirectory.class) @ExtendWith(MockitoExtension.class) class InlineMigrationStrategyTest { @@ -53,25 +52,25 @@ class InlineMigrationStrategyTest { RepositoryLocationResolver.RepositoryLocationResolverInstance locationResolverInstance; @BeforeEach - void mockContextProvider(@TempDirectory.TempDir Path tempDir) { + void mockContextProvider(@TempDir Path tempDir) { when(locationResolver.forClass(Path.class)).thenReturn(locationResolverInstance); when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); } @BeforeEach - void createV1Home(@TempDirectory.TempDir Path tempDir) throws IOException { + void createV1Home(@TempDir Path tempDir) throws IOException { V1RepositoryFileSystem.createV1Home(tempDir); } @Test - void shouldUseExistingDirectory(@TempDirectory.TempDir Path tempDir) { + void shouldUseExistingDirectory(@TempDir Path tempDir) { Path target = new InlineMigrationStrategy(contextProvider, locationResolver).migrate("b4f-a9f0-49f7-ad1f-37d3aae1c55f", "some/more/directories/than/one", "git").get(); assertThat(target).isEqualTo(resolveOldDirectory(tempDir)); verify(locationResolverInstance).setLocation("b4f-a9f0-49f7-ad1f-37d3aae1c55f", target); } @Test - void shouldMoveDataDirectory(@TempDirectory.TempDir Path tempDir) { + void shouldMoveDataDirectory(@TempDir Path tempDir) { new InlineMigrationStrategy(contextProvider, locationResolver).migrate("b4f-a9f0-49f7-ad1f-37d3aae1c55f", "some/more/directories/than/one", "git"); assertThat(resolveOldDirectory(tempDir).resolve("data")).exists(); } diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/MigrateVerbsToPermissionRolesTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/MigrateVerbsToPermissionRolesTest.java index 81dd03b4ed..72cabf5d8b 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/MigrateVerbsToPermissionRolesTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/MigrateVerbsToPermissionRolesTest.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.update.repository; import com.google.common.io.Resources; @@ -29,7 +29,7 @@ import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; @@ -51,7 +51,6 @@ import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) -@ExtendWith(TempDirectory.class) class MigrateVerbsToPermissionRolesTest { private static final String EXISTING_REPOSITORY_ID = "id"; @@ -65,7 +64,7 @@ class MigrateVerbsToPermissionRolesTest { private MigrateVerbsToPermissionRoles migration; @BeforeEach - void init(@TempDirectory.TempDir Path tempDir) throws IOException { + void init(@TempDir Path tempDir) throws IOException { URL metadataUrl = Resources.getResource("sonia/scm/update/repository/metadataWithoutRoles.xml"); Files.copy(metadataUrl.openStream(), tempDir.resolve("metadata.xml")); doAnswer(invocation -> { @@ -76,7 +75,7 @@ class MigrateVerbsToPermissionRolesTest { } @Test - void shouldUpdateToRolesIfPossible(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldUpdateToRolesIfPossible(@TempDir Path tempDir) throws IOException { migration.doUpdate(); List newMetadata = Files.readAllLines(tempDir.resolve("metadata.xml")); diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java index 02beffed00..658360d234 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/MoveMigrationStrategyTest.java @@ -21,13 +21,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.update.repository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.SCMContextProvider; @@ -41,7 +41,6 @@ import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -@ExtendWith(TempDirectory.class) @ExtendWith(MockitoExtension.class) class MoveMigrationStrategyTest { @@ -51,30 +50,30 @@ class MoveMigrationStrategyTest { RepositoryLocationResolver locationResolver; @BeforeEach - void mockContextProvider(@TempDirectory.TempDir Path tempDir) { + void mockContextProvider(@TempDir Path tempDir) { when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); } @BeforeEach - void createV1Home(@TempDirectory.TempDir Path tempDir) throws IOException { + void createV1Home(@TempDir Path tempDir) throws IOException { V1RepositoryFileSystem.createV1Home(tempDir); } @BeforeEach - void mockLocationResolver(@TempDirectory.TempDir Path tempDir) { + void mockLocationResolver(@TempDir Path tempDir) { RepositoryLocationResolver.RepositoryLocationResolverInstance instanceMock = mock(RepositoryLocationResolver.RepositoryLocationResolverInstance.class); when(locationResolver.forClass(Path.class)).thenReturn(instanceMock); when(instanceMock.createLocation(anyString())).thenAnswer(invocation -> tempDir.resolve((String) invocation.getArgument(0))); } @Test - void shouldUseStandardDirectory(@TempDirectory.TempDir Path tempDir) { + void shouldUseStandardDirectory(@TempDir Path tempDir) { Path target = new MoveMigrationStrategy(contextProvider, locationResolver).migrate("b4f-a9f0-49f7-ad1f-37d3aae1c55f", "some/more/directories/than/one", "git").get(); assertThat(target).isEqualTo(tempDir.resolve("b4f-a9f0-49f7-ad1f-37d3aae1c55f")); } @Test - void shouldMoveDataDirectory(@TempDirectory.TempDir Path tempDir) { + void shouldMoveDataDirectory(@TempDir Path tempDir) { Path target = new MoveMigrationStrategy(contextProvider, locationResolver).migrate("b4f-a9f0-49f7-ad1f-37d3aae1c55f", "some/more/directories/than/one", "git").get(); assertThat(target.resolve("data")).exists(); Path originalDataDir = tempDir diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/PublicFlagUpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/PublicFlagUpdateStepTest.java index 9d7c4333fe..54c5460c6e 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/PublicFlagUpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/PublicFlagUpdateStepTest.java @@ -21,13 +21,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.update.repository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; @@ -35,7 +35,6 @@ import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.SCMContext; import sonia.scm.repository.Repository; import sonia.scm.repository.RepositoryPermission; -import sonia.scm.repository.RepositoryRolePermissions; import sonia.scm.repository.RepositoryTestData; import sonia.scm.repository.xml.XmlRepositoryDAO; import sonia.scm.update.UpdateStepTestUtil; @@ -49,7 +48,6 @@ import java.nio.file.Path; import java.util.Collections; import static org.assertj.core.api.Assertions.assertThat; -import static org.junitpioneer.jupiter.TempDirectory.TempDir; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.never; @@ -58,7 +56,6 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) -@ExtendWith(TempDirectory.class) class PublicFlagUpdateStepTest { @Mock diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStepTest.java index 7e6d912336..3475fffac0 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryFileNameUpdateStepTest.java @@ -21,14 +21,13 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.update.repository; import com.google.common.io.Resources; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import sonia.scm.SCMContextProvider; import sonia.scm.repository.xml.PathBasedRepositoryLocationResolver; import sonia.scm.repository.xml.XmlRepositoryDAO; @@ -43,19 +42,18 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -@ExtendWith(TempDirectory.class) class XmlRepositoryFileNameUpdateStepTest { SCMContextProvider contextProvider = mock(SCMContextProvider.class); XmlRepositoryDAO repositoryDAO = mock(XmlRepositoryDAO.class); @BeforeEach - void mockScmHome(@TempDirectory.TempDir Path tempDir) { + void mockScmHome(@TempDir Path tempDir) { when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); } @Test - void shouldCopyRepositoriesFileToRepositoryPathsFile(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldCopyRepositoriesFileToRepositoryPathsFile(@TempDir Path tempDir) throws IOException { XmlRepositoryFileNameUpdateStep updateStep = new XmlRepositoryFileNameUpdateStep(contextProvider, repositoryDAO); URL url = Resources.getResource("sonia/scm/update/repository/formerV2RepositoryFile.xml"); Path configDir = tempDir.resolve("config"); diff --git a/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java index d9ea7d5766..6b0d2176f7 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/repository/XmlRepositoryV1UpdateStepTest.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.update.repository; import com.google.common.io.Resources; @@ -30,7 +30,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; @@ -63,7 +63,6 @@ import static org.mockito.Mockito.when; import static sonia.scm.update.repository.MigrationStrategy.MOVE; @ExtendWith(MockitoExtension.class) -@ExtendWith(TempDirectory.class) class XmlRepositoryV1UpdateStepTest { Injector injectorMock = MigrationStrategyMock.init(); @@ -85,7 +84,7 @@ class XmlRepositoryV1UpdateStepTest { XmlRepositoryV1UpdateStep updateStep; @BeforeEach - void createUpdateStepFromMocks(@TempDirectory.TempDir Path tempDir) { + void createUpdateStepFromMocks(@TempDir Path tempDir) { testUtil = new UpdateStepTestUtil(tempDir); updateStep = new XmlRepositoryV1UpdateStep( testUtil.getContextProvider(), @@ -100,7 +99,7 @@ class XmlRepositoryV1UpdateStepTest { class WithExistingDatabase { @BeforeEach - void createV1Home(@TempDirectory.TempDir Path tempDir) throws IOException { + void createV1Home(@TempDir Path tempDir) throws IOException { V1RepositoryFileSystem.createV1Home(tempDir); } @@ -165,7 +164,7 @@ class XmlRepositoryV1UpdateStepTest { } @Test - void shouldUseDirectoryFromStrategy(@TempDirectory.TempDir Path tempDir) throws JAXBException { + void shouldUseDirectoryFromStrategy(@TempDir Path tempDir) throws JAXBException { Path targetDir = tempDir.resolve("someDir"); MigrationStrategy.Instance strategyMock = injectorMock.getInstance(MoveMigrationStrategy.class); when(strategyMock.migrate("454972da-faf9-4437-b682-dc4a4e0aa8eb", "simple", "git")).thenReturn(of(targetDir)); @@ -195,7 +194,7 @@ class XmlRepositoryV1UpdateStepTest { } @Test - void shouldBackupOldRepositoryDatabaseFile(@TempDirectory.TempDir Path tempDir) throws JAXBException { + void shouldBackupOldRepositoryDatabaseFile(@TempDir Path tempDir) throws JAXBException { updateStep.doUpdate(); assertThat(tempDir.resolve("config").resolve("repositories.xml")).doesNotExist(); @@ -209,14 +208,14 @@ class XmlRepositoryV1UpdateStepTest { } @Test - void shouldNotFailIfFormerV2DatabaseExists(@TempDirectory.TempDir Path tempDir) throws JAXBException, IOException { + void shouldNotFailIfFormerV2DatabaseExists(@TempDir Path tempDir) throws JAXBException, IOException { createFormerV2RepositoriesFile(tempDir); updateStep.doUpdate(); } @Test - void shouldNotBackupFormerV2DatabaseFile(@TempDirectory.TempDir Path tempDir) throws JAXBException, IOException { + void shouldNotBackupFormerV2DatabaseFile(@TempDir Path tempDir) throws JAXBException, IOException { createFormerV2RepositoriesFile(tempDir); updateStep.doUpdate(); @@ -226,14 +225,14 @@ class XmlRepositoryV1UpdateStepTest { } @Test - void shouldGetNoMissingStrategiesWithFormerV2DatabaseFile(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldGetNoMissingStrategiesWithFormerV2DatabaseFile(@TempDir Path tempDir) throws IOException { createFormerV2RepositoriesFile(tempDir); assertThat(updateStep.getRepositoriesWithoutMigrationStrategies()).isEmpty(); } @Test - void shouldFindMissingStrategies(@TempDirectory.TempDir Path tempDir) throws IOException { + void shouldFindMissingStrategies(@TempDir Path tempDir) throws IOException { V1RepositoryFileSystem.createV1Home(tempDir); assertThat(updateStep.getRepositoriesWithoutMigrationStrategies()) @@ -244,7 +243,7 @@ class XmlRepositoryV1UpdateStepTest { "454972da-faf9-4437-b682-dc4a4e0aa8eb"); } - private void createFormerV2RepositoriesFile(@TempDirectory.TempDir Path tempDir) throws IOException { + private void createFormerV2RepositoriesFile(@TempDir Path tempDir) throws IOException { URL url = Resources.getResource("sonia/scm/update/repository/formerV2RepositoryFile.xml"); Path configDir = tempDir.resolve("config"); Files.createDirectories(configDir); diff --git a/scm-webapp/src/test/java/sonia/scm/update/security/XmlSecurityV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/security/XmlSecurityV1UpdateStepTest.java index aa1a19df7d..559b181199 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/security/XmlSecurityV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/security/XmlSecurityV1UpdateStepTest.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.update.security; import com.google.common.io.Resources; @@ -29,7 +29,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import sonia.scm.SCMContextProvider; @@ -50,7 +50,6 @@ import static org.mockito.Mockito.when; import static sonia.scm.store.InMemoryConfigurationEntryStoreFactory.create; @ExtendWith(MockitoExtension.class) -@ExtendWith(TempDirectory.class) class XmlSecurityV1UpdateStepTest { @Mock @@ -60,7 +59,7 @@ class XmlSecurityV1UpdateStepTest { ConfigurationEntryStore assignedPermissionStore; @BeforeEach - void mockScmHome(@TempDirectory.TempDir Path tempDir) { + void mockScmHome(@TempDir Path tempDir) { when(contextProvider.getBaseDirectory()).thenReturn(tempDir.toFile()); InMemoryConfigurationEntryStoreFactory inMemoryConfigurationEntryStoreFactory = create(); assignedPermissionStore = inMemoryConfigurationEntryStoreFactory.get("security"); @@ -71,7 +70,7 @@ class XmlSecurityV1UpdateStepTest { class WithExistingDatabase { @BeforeEach - void createConfigV1XML(@TempDirectory.TempDir Path tempDir) throws IOException { + void createConfigV1XML(@TempDir Path tempDir) throws IOException { Path configDir = tempDir.resolve("config"); Files.createDirectories(configDir); copyTestDatabaseFile(configDir, "config.xml"); @@ -109,7 +108,7 @@ class XmlSecurityV1UpdateStepTest { class WithExistingSecurityXml { @BeforeEach - void createSecurityV1XML(@TempDirectory.TempDir Path tempDir) throws IOException { + void createSecurityV1XML(@TempDir Path tempDir) throws IOException { Path configDir = tempDir.resolve("config"); Files.createDirectories(configDir); copyTestDatabaseFile(configDir, "securityV1.xml"); diff --git a/scm-webapp/src/test/java/sonia/scm/update/user/XmlUserV1UpdateStepTest.java b/scm-webapp/src/test/java/sonia/scm/update/user/XmlUserV1UpdateStepTest.java index 98ab3dfadd..da9e3ccb7d 100644 --- a/scm-webapp/src/test/java/sonia/scm/update/user/XmlUserV1UpdateStepTest.java +++ b/scm-webapp/src/test/java/sonia/scm/update/user/XmlUserV1UpdateStepTest.java @@ -21,14 +21,14 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ - + package sonia.scm.update.user; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; -import org.junitpioneer.jupiter.TempDirectory; +import org.junit.jupiter.api.io.TempDir; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.Mock; @@ -38,7 +38,6 @@ import sonia.scm.store.ConfigurationEntryStore; import sonia.scm.store.InMemoryConfigurationEntryStoreFactory; import sonia.scm.update.UpdateStepTestUtil; import sonia.scm.update.V1Properties; -import sonia.scm.update.V1Property; import sonia.scm.user.User; import sonia.scm.user.xml.XmlUserDAO; @@ -55,7 +54,6 @@ import static org.mockito.Mockito.verify; import static sonia.scm.store.InMemoryConfigurationEntryStoreFactory.create; @ExtendWith(MockitoExtension.class) -@ExtendWith(TempDirectory.class) class XmlUserV1UpdateStepTest { @Mock @@ -71,7 +69,7 @@ class XmlUserV1UpdateStepTest { private UpdateStepTestUtil testUtil; @BeforeEach - void mockScmHome(@TempDirectory.TempDir Path tempDir) { + void mockScmHome(@TempDir Path tempDir) { testUtil = new UpdateStepTestUtil(tempDir); updateStep = new XmlUserV1UpdateStep(testUtil.getContextProvider(), userDAO, storeFactory); } From 906ba78b2237f4a93ec1f62cdfff991e3c3e4c89 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Mon, 25 May 2020 06:57:04 +0200 Subject: [PATCH 54/54] fix wrong ci url --- pom.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 03c52b9fef..243a5df816 100644 --- a/pom.xml +++ b/pom.xml @@ -41,7 +41,6 @@ https://github.com/scm-manager/scm-manager - MIT License @@ -82,7 +81,7 @@ Jenkins - https://scm-manager.ci.cloudbees.com/ + https://oss.cloudogu.com/jenkins/