From 3fe37370a447fa81979d77a62eec69b7b37bd8ca Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Tue, 10 Sep 2019 16:36:32 +0200 Subject: [PATCH 01/17] remove unnecessary buttongroup --- .../packages/ui-components/src/Breadcrumb.js | 60 ++++++++++++------- 1 file changed, 37 insertions(+), 23 deletions(-) diff --git a/scm-ui-components/packages/ui-components/src/Breadcrumb.js b/scm-ui-components/packages/ui-components/src/Breadcrumb.js index d2f3409af6..5b0f151c61 100644 --- a/scm-ui-components/packages/ui-components/src/Breadcrumb.js +++ b/scm-ui-components/packages/ui-components/src/Breadcrumb.js @@ -1,10 +1,9 @@ //@flow import React from "react"; -import { Link } from "react-router-dom"; -import type { Branch, Repository } from "@scm-manager/ui-types"; +import {Link} from "react-router-dom"; +import type {Branch, Repository} from "@scm-manager/ui-types"; import injectSheet from "react-jss"; -import { ExtensionPoint, binder } from "@scm-manager/ui-extensions"; -import {ButtonGroup} from "./buttons"; +import {binder, ExtensionPoint} from "@scm-manager/ui-extensions"; import classNames from "classnames"; type Props = { @@ -64,33 +63,48 @@ class Breadcrumb extends React.Component { } render() { - const { classes, baseUrl, branch, defaultBranch, branches, revision, path, repository } = this.props; + const { + classes, + baseUrl, + branch, + defaultBranch, + branches, + revision, + path, + repository + } = this.props; return ( <>
-

From ba68cec4fa07148b9a71b290a15905d793a0b6d2 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Wed, 11 Sep 2019 14:54:07 +0200 Subject: [PATCH 02/17] add validator for filepath --- .../packages/ui-components/src/validation.js | 8 +++++++- scm-ui/src/users/components/userValidation.js | 4 ++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/scm-ui-components/packages/ui-components/src/validation.js b/scm-ui-components/packages/ui-components/src/validation.js index fcfffcee45..221f9f12ea 100644 --- a/scm-ui-components/packages/ui-components/src/validation.js +++ b/scm-ui-components/packages/ui-components/src/validation.js @@ -5,7 +5,7 @@ export const isNameValid = (name: string) => { return nameRegex.test(name); }; -const mailRegex = /^[ -~]+@[A-Za-z0-9][\w\-.]*\.[A-Za-z0-9][A-Za-z0-9-]+$/; +const mailRegex = /^[ -~]+@[A-Za-z0-9][\w\-.]*\.[A-Za-z0-9][A-Za-z0-9-]+$/; export const isMailValid = (mail: string) => { return mailRegex.test(mail); @@ -14,3 +14,9 @@ export const isMailValid = (mail: string) => { export const isNumberValid = (number: string) => { return !isNaN(number); }; + +const pathRegex = /^((?!\/{2,}).)*$/; + +export const isValidPath = (path: string) => { + return pathRegex.test(path); +}; diff --git a/scm-ui/src/users/components/userValidation.js b/scm-ui/src/users/components/userValidation.js index c9460fdd50..8078df4bcd 100644 --- a/scm-ui/src/users/components/userValidation.js +++ b/scm-ui/src/users/components/userValidation.js @@ -2,9 +2,9 @@ import { validation } from "@scm-manager/ui-components"; -const { isNameValid, isMailValid } = validation; +const { isNameValid, isMailValid, isValidPath } = validation; -export { isNameValid, isMailValid }; +export { isNameValid, isMailValid, isValidPath }; export const isDisplayNameValid = (displayName: string) => { if (displayName) { From d160c484162e64e599322eea36c01240fc4b7cd2 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Thu, 12 Sep 2019 10:27:11 +0200 Subject: [PATCH 03/17] changed success color as defined in styleguide --- scm-ui/styles/scm.scss | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scm-ui/styles/scm.scss b/scm-ui/styles/scm.scss index 48d66e9768..ab864bc335 100644 --- a/scm-ui/styles/scm.scss +++ b/scm-ui/styles/scm.scss @@ -5,8 +5,7 @@ $blue: #33b2e8; $mint: #11dfd0; $info: $blue; - -// $footer-background-color +$success: #00c79b; .is-ellipsis-overflow { overflow: hidden; From 6cad53ec875d283b7ca3d236a778da310b03f1b3 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Thu, 12 Sep 2019 11:29:42 +0200 Subject: [PATCH 04/17] Add unit test --- .../ui-components/src/validation.test.js | 183 ++++++++++-------- 1 file changed, 99 insertions(+), 84 deletions(-) diff --git a/scm-ui-components/packages/ui-components/src/validation.test.js b/scm-ui-components/packages/ui-components/src/validation.test.js index d50996ff2b..6348bd67ba 100644 --- a/scm-ui-components/packages/ui-components/src/validation.test.js +++ b/scm-ui-components/packages/ui-components/src/validation.test.js @@ -2,102 +2,117 @@ import * as validator from "./validation"; describe("test name validation", () => { - it("should return false", () => { - // invalid names taken from ValidationUtilTest.java - const invalidNames = [ - "@test", - " test 123", - " test 123 ", - "test 123 ", - "test/123", - "test%123", - "test:123", - "t ", - " t", - " t ", - "", + // invalid names taken from ValidationUtilTest.java + const invalidNames = [ + "@test", + " test 123", + " test 123 ", + "test 123 ", + "test/123", + "test%123", + "test:123", + "t ", + " t", + " t ", + "", - " invalid_name", - "another%one", - "!!!", - "!_!" - ]; - for (let name of invalidNames) { + " invalid_name", + "another%one", + "!!!", + "!_!" + ]; + for (let name of invalidNames) { + it(`should return false for '${name}'`, () => { expect(validator.isNameValid(name)).toBe(false); - } - }); + }); + } - it("should return true", () => { - // valid names taken from ValidationUtilTest.java - const validNames = [ - "test", - "test.git", - "Test123.git", - "Test123-git", - "Test_user-123.git", - "test@scm-manager.de", - "test123", - "tt", - "t", - "valid_name", - "another1", - "stillValid", - "this.one_as-well", - "and@this" - ]; - for (let name of validNames) { + // valid names taken from ValidationUtilTest.java + const validNames = [ + "test", + "test.git", + "Test123.git", + "Test123-git", + "Test_user-123.git", + "test@scm-manager.de", + "test123", + "tt", + "t", + "valid_name", + "another1", + "stillValid", + "this.one_as-well", + "and@this" + ]; + for (let name of validNames) { + it(`should return true for '${name}'`, () => { expect(validator.isNameValid(name)).toBe(true); - } - }); + }); + } }); describe("test mail validation", () => { - it("should return false", () => { - // invalid taken from ValidationUtilTest.java - const invalid = [ - "ostfalia.de", - "@ostfalia.de", - "s.sdorra@", - "s.sdorra@ostfalia", - "s.sdorra@ ostfalia.de", - "s.sdorra@[ostfalia.de" - ]; - for (let mail of invalid) { + // invalid taken from ValidationUtilTest.java + const invalid = [ + "ostfalia.de", + "@ostfalia.de", + "s.sdorra@", + "s.sdorra@ostfalia", + "s.sdorra@ ostfalia.de", + "s.sdorra@[ostfalia.de" + ]; + for (let mail of invalid) { + it(`should return false for '${mail}'`, () => { expect(validator.isMailValid(mail)).toBe(false); - } - }); + }); + } - it("should return true", () => { - // valid taken from ValidationUtilTest.java - const valid = [ - "s.sdorra@ostfalia.de", - "sdorra@ostfalia.de", - "s.sdorra@hbk-bs.de", - "s.sdorra@gmail.com", - "s.sdorra@t.co", - "s.sdorra@ucla.college", - "s.sdorra@example.xn--p1ai", - "s.sdorra@scm.solutions", - "s'sdorra@scm.solutions", - "\"S Sdorra\"@scm.solutions" - ]; - for (let mail of valid) { + // valid taken from ValidationUtilTest.java + const valid = [ + "s.sdorra@ostfalia.de", + "sdorra@ostfalia.de", + "s.sdorra@hbk-bs.de", + "s.sdorra@gmail.com", + "s.sdorra@t.co", + "s.sdorra@ucla.college", + "s.sdorra@example.xn--p1ai", + "s.sdorra@scm.solutions", + "s'sdorra@scm.solutions", + "\"S Sdorra\"@scm.solutions" + ]; + for (let mail of valid) { + it(`should return true for '${mail}'`, () => { expect(validator.isMailValid(mail)).toBe(true); - } - }); + }); + } }); describe("test number validation", () => { - it("should return false", () => { - const invalid = ["1a", "35gu", "dj6", "45,5", "test"]; - for (let number of invalid) { - expect(validator.isNumberValid(number)).toBe(false); - } - }); - it("should return true", () => { - const valid = ["1", "35", "2", "235", "34.4"]; - for (let number of valid) { + const invalid = ["1a", "35gu", "dj6", "45,5", "test"]; + for (let number of invalid) { + it(`should return false for '${number}'`, () => { + expect(validator.isNumberValid(number)).toBe(false); + }); + } + const valid = ["1", "35", "2", "235", "34.4"]; + for (let number of valid) { + it(`should return true for '${number}'`, () => { expect(validator.isNumberValid(number)).toBe(true); - } - }); + }); + } +}); + +describe("test path validation", () => { + const invalid = ["//", "some//path", "end//"]; + for (let path of invalid) { + it(`should return false for '${path}'`, () => { + expect(validator.isValidPath(path)).toBe(false); + }); + } + const valid = ["", "/", "dir", "some/path", "end/"]; + for (let path of valid) { + it(`should return true for '${path}'`, () => { + expect(validator.isValidPath(path)).toBe(true); + }); + } }); From d40bf94bd362acb60afcbbb765bdd2e556dd5e5d Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Thu, 12 Sep 2019 11:32:51 +0200 Subject: [PATCH 05/17] changed primary color definitions to initial color definitions, added class for initial color/background styling --- scm-ui/styles/scm.scss | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/scm-ui/styles/scm.scss b/scm-ui/styles/scm.scss index ab864bc335..18c22dc029 100644 --- a/scm-ui/styles/scm.scss +++ b/scm-ui/styles/scm.scss @@ -2,21 +2,36 @@ @import "bulma/sass/utilities/functions"; $blue: #33b2e8; +$cyan: $blue; +$green: #00c79b; $mint: #11dfd0; -$info: $blue; -$success: #00c79b; - .is-ellipsis-overflow { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } +.is-word-break { + -webkit-hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + hyphens: auto; + word-break: break-all; +} + .has-rounded-border { border-radius: 0.25rem; } +.has-text-initial { + color: initial; +} + +.has-background-initial { + background-color: initial; +} + .is-full-width { width: 100%; } @@ -28,14 +43,6 @@ $success: #00c79b; padding: 0 0 0 3.8em !important; } -.is-word-break { - -webkit-hyphens: auto; - -moz-hyphens: auto; - -ms-hyphens: auto; - hyphens: auto; - word-break: break-all; -} - .main { min-height: calc(100vh - 260px); } From 7807f5d49db5f96279b6c72414e96c32700109c7 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Thu, 12 Sep 2019 11:36:49 +0200 Subject: [PATCH 06/17] rename path validation method --- scm-ui-components/packages/ui-components/src/validation.js | 2 +- scm-ui/src/users/components/userValidation.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/scm-ui-components/packages/ui-components/src/validation.js b/scm-ui-components/packages/ui-components/src/validation.js index 221f9f12ea..98a36c6f0e 100644 --- a/scm-ui-components/packages/ui-components/src/validation.js +++ b/scm-ui-components/packages/ui-components/src/validation.js @@ -17,6 +17,6 @@ export const isNumberValid = (number: string) => { const pathRegex = /^((?!\/{2,}).)*$/; -export const isValidPath = (path: string) => { +export const isPathValid = (path: string) => { return pathRegex.test(path); }; diff --git a/scm-ui/src/users/components/userValidation.js b/scm-ui/src/users/components/userValidation.js index 8078df4bcd..e53dce229c 100644 --- a/scm-ui/src/users/components/userValidation.js +++ b/scm-ui/src/users/components/userValidation.js @@ -2,9 +2,9 @@ import { validation } from "@scm-manager/ui-components"; -const { isNameValid, isMailValid, isValidPath } = validation; +const { isNameValid, isMailValid, isPathValid } = validation; -export { isNameValid, isMailValid, isValidPath }; +export { isNameValid, isMailValid, isPathValid }; export const isDisplayNameValid = (displayName: string) => { if (displayName) { From 6ef37ac4dea7d578f08c93d746581021c6b68930 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Thu, 12 Sep 2019 11:37:54 +0200 Subject: [PATCH 07/17] reverted adding class for initial color/background styling --- scm-ui/styles/scm.scss | 8 -------- 1 file changed, 8 deletions(-) diff --git a/scm-ui/styles/scm.scss b/scm-ui/styles/scm.scss index 18c22dc029..de25bd4c1a 100644 --- a/scm-ui/styles/scm.scss +++ b/scm-ui/styles/scm.scss @@ -24,14 +24,6 @@ $mint: #11dfd0; border-radius: 0.25rem; } -.has-text-initial { - color: initial; -} - -.has-background-initial { - background-color: initial; -} - .is-full-width { width: 100%; } From 17125d9c338396352958640ded3f8186d8d784f0 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Thu, 12 Sep 2019 11:39:04 +0200 Subject: [PATCH 08/17] Fix unit test --- .../packages/ui-components/src/validation.test.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scm-ui-components/packages/ui-components/src/validation.test.js b/scm-ui-components/packages/ui-components/src/validation.test.js index 6348bd67ba..4af5d755d0 100644 --- a/scm-ui-components/packages/ui-components/src/validation.test.js +++ b/scm-ui-components/packages/ui-components/src/validation.test.js @@ -106,13 +106,13 @@ describe("test path validation", () => { const invalid = ["//", "some//path", "end//"]; for (let path of invalid) { it(`should return false for '${path}'`, () => { - expect(validator.isValidPath(path)).toBe(false); + expect(validator.isPathValid(path)).toBe(false); }); } const valid = ["", "/", "dir", "some/path", "end/"]; for (let path of valid) { it(`should return true for '${path}'`, () => { - expect(validator.isValidPath(path)).toBe(true); + expect(validator.isPathValid(path)).toBe(true); }); } }); From 0c668f0e4b7b75c98aab7b5b03d1d87f0c7d14d1 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Thu, 12 Sep 2019 12:55:10 +0200 Subject: [PATCH 09/17] add option to transmit className prop to Modal --- .../packages/ui-components/src/modals/Modal.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/scm-ui-components/packages/ui-components/src/modals/Modal.js b/scm-ui-components/packages/ui-components/src/modals/Modal.js index d0d96977c6..960f8277f0 100644 --- a/scm-ui-components/packages/ui-components/src/modals/Modal.js +++ b/scm-ui-components/packages/ui-components/src/modals/Modal.js @@ -8,13 +8,12 @@ type Props = { body: any, footer?: any, active: boolean, + className?: string }; - - class Modal extends React.Component { render() { - const { title, closeFunction, body, footer, active } = this.props; + const { title, closeFunction, body, footer, active, className } = this.props; const isActive = active ? "is-active" : null; @@ -24,7 +23,7 @@ class Modal extends React.Component { } return ( -
+
From a9fbd5f21ac1d786780323a2fc18b712a8848cc2 Mon Sep 17 00:00:00 2001 From: Eduard Heimbuch Date: Thu, 12 Sep 2019 14:44:42 +0200 Subject: [PATCH 10/17] remove buttongroup from extensionpoint --- .../src/repos/sources/containers/Content.js | 20 +++++++++---------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/scm-ui/src/repos/sources/containers/Content.js b/scm-ui/src/repos/sources/containers/Content.js index b9032ae681..4d297c05bc 100644 --- a/scm-ui/src/repos/sources/containers/Content.js +++ b/scm-ui/src/repos/sources/containers/Content.js @@ -106,17 +106,15 @@ class Content extends React.Component {
{selector}
- - - +
From 4d40c488343f0af5d4cfb58de866a194b50c822f Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Thu, 12 Sep 2019 14:47:48 +0200 Subject: [PATCH 11/17] import color gradations from the style guide and exported css3 vars for reuse --- scm-ui/styles/scm.scss | 117 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/scm-ui/styles/scm.scss b/scm-ui/styles/scm.scss index de25bd4c1a..5f13da601b 100644 --- a/scm-ui/styles/scm.scss +++ b/scm-ui/styles/scm.scss @@ -74,6 +74,123 @@ hr.header-with-actions { @import "bulma/bulma"; @import "bulma-tooltip/dist/css/bulma-tooltip"; +$dark-75: scale-color($dark, $lightness: 25%); +$dark-50: scale-color($dark, $lightness: 50%); +$dark-25: scale-color($dark, $lightness: 75%); +$info-75: scale-color($info, $lightness: 25%); +$info-50: scale-color($info, $lightness: 50%); +$info-25: scale-color($info, $lightness: 75%); +$link-75: scale-color($link, $lightness: 25%); +$link-50: scale-color($link, $lightness: 50%); +$link-25: scale-color($link, $lightness: 75%); +$primary-75: scale-color($primary, $lightness: 25%); +$primary-50: scale-color($primary, $lightness: 50%); +$primary-25: scale-color($primary, $lightness: 75%); +$success-75: scale-color($success, $lightness: 25%); +$success-50: scale-color($success, $lightness: 50%); +$success-25: scale-color($success, $lightness: 75%); +$warning-75: scale-color($warning, $lightness: 25%); +$warning-50: scale-color($warning, $lightness: 50%); +$warning-25: scale-color($warning, $lightness: 75%); +$danger-75: scale-color($danger, $lightness: 25%); +$danger-50: scale-color($danger, $lightness: 50%); +$danger-25: scale-color($danger, $lightness: 75%); + +:root { + --dark: #{$dark}; + --dark-75: #{$dark-75}; + --dark-50: #{$dark-50}; + --dark-25: #{$dark-25}; + --info: #{$info}; + --info-75: #{$info-75}; + --info-50: #{$info-50}; + --info-25: #{$info-25}; + --link: #{$link}; + --link-75: #{$link-75}; + --link-50: #{$link-50}; + --link-25: #{$link-25}; + --primary: #{$primary}; + --primary-75: #{$primary-75}; + --primary-50: #{$primary-50}; + --primary-25: #{$primary-25}; + --success: #{$success}; + --success-75: #{$success-75}; + --success-50: #{$success-50}; + --success-25: #{$success-25}; + --warning: #{$warning}; + --warning-75: #{$warning-75}; + --warning-50: #{$warning-50}; + --warning-25: #{$warning-25}; + --danger: #{$danger}; + --danger-75: #{$danger-75}; + --danger-50: #{$danger-50}; + --danger-25: #{$danger-25}; +} + +.has-background-dark-75 { + background-color: scale-color($dark, $lightness: 25%); +} +.has-background-dark-50 { + background-color: scale-color($dark, $lightness: 50%); +} +.has-background-dark-25 { + background-color: scale-color($dark, $lightness: 75%); +} +.has-background-info-75 { + background-color: scale-color($info, $lightness: 25%); +} +.has-background-info-50 { + background-color: scale-color($info, $lightness: 50%); +} +.has-background-info-25 { + background-color: scale-color($info, $lightness: 75%); +} +.has-background-link-75 { + background-color: scale-color($link, $lightness: 25%); +} +.has-background-link-50 { + background-color: scale-color($link, $lightness: 50%); +} +.has-background-link-25 { + background-color: scale-color($link, $lightness: 75%); +} +.has-background-primary-75 { + background-color: scale-color($primary, $lightness: 25%); +} +.has-background-primary-50 { + background-color: scale-color($primary, $lightness: 50%); +} +.has-background-primary-25 { + background-color: scale-color($primary, $lightness: 75%); +} +.has-background-success-75 { + background-color: scale-color($success, $lightness: 25%); +} +.has-background-success-50 { + background-color: scale-color($success, $lightness: 50%); +} +.has-background-success-25 { + background-color: scale-color($success, $lightness: 75%); +} +.has-background-warning-75 { + background-color: scale-color($warning, $lightness: 25%); +} +.has-background-warning-50 { + background-color: scale-color($warning, $lightness: 50%); +} +.has-background-warning-25 { + background-color: scale-color($warning, $lightness: 75%); +} +.has-background-danger-75 { + background-color: scale-color($danger, $lightness: 25%); +} +.has-background-danger-50 { + background-color: scale-color($danger, $lightness: 50%); +} +.has-background-danger-25 { + background-color: scale-color($danger, $lightness: 75%); +} + // import at the end, because we need a lot of stuff from bulma/bulma .box-link-shadow { &:hover, From 62cfc8484c16ba884ba67ac33fdbc58b529a44d8 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Thu, 12 Sep 2019 16:06:40 +0200 Subject: [PATCH 12/17] add css vars for grey tones --- scm-ui/styles/scm.scss | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/scm-ui/styles/scm.scss b/scm-ui/styles/scm.scss index 5f13da601b..9fbbae806b 100644 --- a/scm-ui/styles/scm.scss +++ b/scm-ui/styles/scm.scss @@ -97,22 +97,15 @@ $danger-50: scale-color($danger, $lightness: 50%); $danger-25: scale-color($danger, $lightness: 75%); :root { - --dark: #{$dark}; - --dark-75: #{$dark-75}; - --dark-50: #{$dark-50}; - --dark-25: #{$dark-25}; - --info: #{$info}; - --info-75: #{$info-75}; - --info-50: #{$info-50}; - --info-25: #{$info-25}; - --link: #{$link}; - --link-75: #{$link-75}; - --link-50: #{$link-50}; - --link-25: #{$link-25}; + // asc sorted derived-variables --primary: #{$primary}; --primary-75: #{$primary-75}; --primary-50: #{$primary-50}; --primary-25: #{$primary-25}; + --info: #{$info}; + --info-75: #{$info-75}; + --info-50: #{$info-50}; + --info-25: #{$info-25}; --success: #{$success}; --success-75: #{$success-75}; --success-50: #{$success-50}; @@ -125,6 +118,18 @@ $danger-25: scale-color($danger, $lightness: 75%); --danger-75: #{$danger-75}; --danger-50: #{$danger-50}; --danger-25: #{$danger-25}; + --light: #{$light}; + --dark: #{$dark}; + --dark-75: #{$dark-75}; + --dark-50: #{$dark-50}; + --dark-25: #{$dark-25}; + --background: #{$background}; + --border: #{$border}; + --text: #{$text}; + --link: #{$link}; + --link-75: #{$link-75}; + --link-50: #{$link-50}; + --link-25: #{$link-25}; } .has-background-dark-75 { From 938e52fda0636c73052bf9612ff819789bb6d173 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Fri, 13 Sep 2019 15:33:15 +0200 Subject: [PATCH 13/17] Do not delete files that are not there --- .../sonia/scm/repository/spi/ModifyCommandRequest.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/scm-core/src/main/java/sonia/scm/repository/spi/ModifyCommandRequest.java b/scm-core/src/main/java/sonia/scm/repository/spi/ModifyCommandRequest.java index a108a73546..d61e17c785 100644 --- a/scm-core/src/main/java/sonia/scm/repository/spi/ModifyCommandRequest.java +++ b/scm-core/src/main/java/sonia/scm/repository/spi/ModifyCommandRequest.java @@ -122,10 +122,12 @@ public class ModifyCommandRequest implements Resetable, Validateable { } void cleanup() { - try { - IOUtil.delete(content); - } catch (IOException e) { - LOG.warn("could not delete temporary file {}", content, e); + if (content.exists()) { + try { + IOUtil.delete(content); + } catch (IOException e) { + LOG.warn("could not delete temporary file {}", content, e); + } } } } From fcba0999a7046f42742aa10b1544b4a657e23a1c Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Fri, 13 Sep 2019 15:48:48 +0000 Subject: [PATCH 14/17] Close branch feature/editor_file_create From 1bf49eab7bd2e86712ca1b2cad277310dd54dd80 Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Fri, 13 Sep 2019 18:13:10 +0200 Subject: [PATCH 15/17] Add constructor with cause --- scm-core/src/main/java/sonia/scm/BadRequestException.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scm-core/src/main/java/sonia/scm/BadRequestException.java b/scm-core/src/main/java/sonia/scm/BadRequestException.java index 544ed75a0b..3290e77521 100644 --- a/scm-core/src/main/java/sonia/scm/BadRequestException.java +++ b/scm-core/src/main/java/sonia/scm/BadRequestException.java @@ -6,4 +6,8 @@ public abstract class BadRequestException extends ExceptionWithContext { public BadRequestException(List context, String message) { super(context, message); } + + public BadRequestException(List context, String message, Exception cause) { + super(context, message, cause); + } } From 8033034beda0bb172714462787bc2ba7771bae80 Mon Sep 17 00:00:00 2001 From: Florian Scholdei Date: Fri, 13 Sep 2019 18:31:27 +0200 Subject: [PATCH 16/17] remove duplication --- scm-ui/styles/scm.scss | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/scm-ui/styles/scm.scss b/scm-ui/styles/scm.scss index 9fbbae806b..1409e29caf 100644 --- a/scm-ui/styles/scm.scss +++ b/scm-ui/styles/scm.scss @@ -133,67 +133,67 @@ $danger-25: scale-color($danger, $lightness: 75%); } .has-background-dark-75 { - background-color: scale-color($dark, $lightness: 25%); + background-color: $dark-75; } .has-background-dark-50 { - background-color: scale-color($dark, $lightness: 50%); + background-color: $dark-50; } .has-background-dark-25 { - background-color: scale-color($dark, $lightness: 75%); + background-color: $dark-25; } .has-background-info-75 { - background-color: scale-color($info, $lightness: 25%); + background-color: $info-75; } .has-background-info-50 { - background-color: scale-color($info, $lightness: 50%); + background-color: $info-50; } .has-background-info-25 { - background-color: scale-color($info, $lightness: 75%); + background-color: $info-25; } .has-background-link-75 { - background-color: scale-color($link, $lightness: 25%); + background-color: $link-75; } .has-background-link-50 { - background-color: scale-color($link, $lightness: 50%); + background-color: $link-50; } .has-background-link-25 { - background-color: scale-color($link, $lightness: 75%); + background-color: $link-25; } .has-background-primary-75 { - background-color: scale-color($primary, $lightness: 25%); + background-color: $primary-75; } .has-background-primary-50 { - background-color: scale-color($primary, $lightness: 50%); + background-color: $primary-50; } .has-background-primary-25 { - background-color: scale-color($primary, $lightness: 75%); + background-color: $primary-25; } .has-background-success-75 { - background-color: scale-color($success, $lightness: 25%); + background-color: $success-75; } .has-background-success-50 { - background-color: scale-color($success, $lightness: 50%); + background-color: $success-50; } .has-background-success-25 { - background-color: scale-color($success, $lightness: 75%); + background-color: $success-25; } .has-background-warning-75 { - background-color: scale-color($warning, $lightness: 25%); + background-color: $warning-75; } .has-background-warning-50 { - background-color: scale-color($warning, $lightness: 50%); + background-color: $warning-50; } .has-background-warning-25 { - background-color: scale-color($warning, $lightness: 75%); + background-color: $warning-25; } .has-background-danger-75 { - background-color: scale-color($danger, $lightness: 25%); + background-color: $danger-75; } .has-background-danger-50 { - background-color: scale-color($danger, $lightness: 50%); + background-color: $danger-50; } .has-background-danger-25 { - background-color: scale-color($danger, $lightness: 75%); + background-color: $danger-25; } // import at the end, because we need a lot of stuff from bulma/bulma From 01422587052af5ed356c7572e2869c3e0a47e58c Mon Sep 17 00:00:00 2001 From: Rene Pfeuffer Date: Mon, 16 Sep 2019 09:55:38 +0200 Subject: [PATCH 17/17] Extract plugin creation for unit tests to util class --- .../InstalledPluginResourceTest.java | 17 ++------- .../api/v2/resources/PluginDtoMapperTest.java | 33 ++++------------- .../scm/plugin/DefaultPluginManagerTest.java | 31 +--------------- .../sonia/scm/plugin/PluginTestHelper.java | 37 +++++++++++++++++++ 4 files changed, 49 insertions(+), 69 deletions(-) create mode 100644 scm-webapp/src/test/java/sonia/scm/plugin/PluginTestHelper.java diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/InstalledPluginResourceTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/InstalledPluginResourceTest.java index 7fa0081c5c..8971ab5a8d 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/InstalledPluginResourceTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/InstalledPluginResourceTest.java @@ -33,6 +33,7 @@ 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 sonia.scm.plugin.PluginTestHelper.createInstalled; @ExtendWith(MockitoExtension.class) class InstalledPluginResourceTest { @@ -85,7 +86,7 @@ class InstalledPluginResourceTest { @Test void getInstalledPlugins() throws URISyntaxException, UnsupportedEncodingException { - InstalledPlugin installedPlugin = createPlugin(); + InstalledPlugin installedPlugin = createInstalled(""); when(pluginManager.getInstalled()).thenReturn(Collections.singletonList(installedPlugin)); when(collectionMapper.mapInstalled(Collections.singletonList(installedPlugin))).thenReturn(new MockedResultDto()); @@ -104,7 +105,7 @@ class InstalledPluginResourceTest { PluginInformation pluginInformation = new PluginInformation(); pluginInformation.setVersion("2.0.0"); pluginInformation.setName("pluginName"); - InstalledPlugin installedPlugin = createPlugin(pluginInformation); + InstalledPlugin installedPlugin = createInstalled(pluginInformation); when(pluginManager.getInstalled("pluginName")).thenReturn(Optional.of(installedPlugin)); @@ -123,18 +124,6 @@ class InstalledPluginResourceTest { } } - private InstalledPlugin createPlugin() { - return createPlugin(new PluginInformation()); - } - - private InstalledPlugin createPlugin(PluginInformation information) { - InstalledPlugin plugin = mock(InstalledPlugin.class); - InstalledPluginDescriptor descriptor = mock(InstalledPluginDescriptor.class); - lenient().when(descriptor.getInformation()).thenReturn(information); - lenient().when(plugin.getDescriptor()).thenReturn(descriptor); - return plugin; - } - @Nested class WithoutAuthorization { diff --git a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PluginDtoMapperTest.java b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PluginDtoMapperTest.java index 5cf6bdd45a..27e3ca32ea 100644 --- a/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PluginDtoMapperTest.java +++ b/scm-webapp/src/test/java/sonia/scm/api/v2/resources/PluginDtoMapperTest.java @@ -21,6 +21,8 @@ import java.net.URI; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static sonia.scm.plugin.PluginTestHelper.createAvailable; +import static sonia.scm.plugin.PluginTestHelper.createInstalled; @ExtendWith(MockitoExtension.class) class PluginDtoMapperTest { @@ -72,22 +74,16 @@ class PluginDtoMapperTest { @Test void shouldAppendInstalledSelfLink() { - InstalledPlugin plugin = createInstalled(); + InstalledPlugin plugin = createInstalled(createPluginInformation()); PluginDto dto = mapper.mapInstalled(plugin); assertThat(dto.getLinks().getLinkBy("self").get().getHref()) .isEqualTo("https://hitchhiker.com/v2/plugins/installed/scm-cas-plugin"); } - private InstalledPlugin createInstalled(PluginInformation information) { - InstalledPlugin plugin = mock(InstalledPlugin.class, Answers.RETURNS_DEEP_STUBS); - when(plugin.getDescriptor().getInformation()).thenReturn(information); - return plugin; - } - @Test void shouldAppendAvailableSelfLink() { - AvailablePlugin plugin = createAvailable(); + AvailablePlugin plugin = createAvailable(createPluginInformation()); PluginDto dto = mapper.mapAvailable(plugin); assertThat(dto.getLinks().getLinkBy("self").get().getHref()) @@ -96,7 +92,7 @@ class PluginDtoMapperTest { @Test void shouldNotAppendInstallLinkWithoutPermissions() { - AvailablePlugin plugin = createAvailable(); + AvailablePlugin plugin = createAvailable(createPluginInformation()); PluginDto dto = mapper.mapAvailable(plugin); assertThat(dto.getLinks().getLinkBy("install")).isEmpty(); @@ -105,7 +101,7 @@ class PluginDtoMapperTest { @Test void shouldAppendInstallLink() { when(subject.isPermitted("plugin:manage")).thenReturn(true); - AvailablePlugin plugin = createAvailable(); + AvailablePlugin plugin = createAvailable(createPluginInformation()); PluginDto dto = mapper.mapAvailable(plugin); assertThat(dto.getLinks().getLinkBy("install").get().getHref()) @@ -123,25 +119,10 @@ class PluginDtoMapperTest { @Test void shouldAppendDependencies() { - AvailablePlugin plugin = createAvailable(); + AvailablePlugin plugin = createAvailable(createPluginInformation()); when(plugin.getDescriptor().getDependencies()).thenReturn(ImmutableSet.of("one", "two")); PluginDto dto = mapper.mapAvailable(plugin); assertThat(dto.getDependencies()).containsOnly("one", "two"); } - - private InstalledPlugin createInstalled() { - return createInstalled(createPluginInformation()); - } - - private AvailablePlugin createAvailable() { - return createAvailable(createPluginInformation()); - } - - private AvailablePlugin createAvailable(PluginInformation information) { - AvailablePluginDescriptor descriptor = mock(AvailablePluginDescriptor.class); - when(descriptor.getInformation()).thenReturn(information); - return new AvailablePlugin(descriptor); - } - } 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 322163ee1a..16e1e2d73a 100644 --- a/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java +++ b/scm-webapp/src/test/java/sonia/scm/plugin/DefaultPluginManagerTest.java @@ -26,6 +26,8 @@ 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.*; +import static sonia.scm.plugin.PluginTestHelper.createAvailable; +import static sonia.scm.plugin.PluginTestHelper.createInstalled; @ExtendWith(MockitoExtension.class) class DefaultPluginManagerTest { @@ -354,33 +356,4 @@ class DefaultPluginManagerTest { } } - - private AvailablePlugin createAvailable(String name) { - PluginInformation information = new PluginInformation(); - information.setName(name); - return createAvailable(information); - } - - private InstalledPlugin createInstalled(String name) { - PluginInformation information = new PluginInformation(); - information.setName(name); - return createInstalled(information); - } - - private InstalledPlugin createInstalled(PluginInformation information) { - InstalledPlugin plugin = mock(InstalledPlugin.class, Answers.RETURNS_DEEP_STUBS); - returnInformation(plugin, information); - return plugin; - } - - private AvailablePlugin createAvailable(PluginInformation information) { - AvailablePluginDescriptor descriptor = mock(AvailablePluginDescriptor.class); - lenient().when(descriptor.getInformation()).thenReturn(information); - return new AvailablePlugin(descriptor); - } - - private void returnInformation(Plugin mockedPlugin, PluginInformation information) { - when(mockedPlugin.getDescriptor().getInformation()).thenReturn(information); - } - } diff --git a/scm-webapp/src/test/java/sonia/scm/plugin/PluginTestHelper.java b/scm-webapp/src/test/java/sonia/scm/plugin/PluginTestHelper.java new file mode 100644 index 0000000000..7e3577d775 --- /dev/null +++ b/scm-webapp/src/test/java/sonia/scm/plugin/PluginTestHelper.java @@ -0,0 +1,37 @@ +package sonia.scm.plugin; + +import org.mockito.Answers; + +import static org.mockito.Mockito.lenient; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class PluginTestHelper { + public static AvailablePlugin createAvailable(String name) { + PluginInformation information = new PluginInformation(); + information.setName(name); + return createAvailable(information); + } + + public static InstalledPlugin createInstalled(String name) { + PluginInformation information = new PluginInformation(); + information.setName(name); + return createInstalled(information); + } + + public static InstalledPlugin createInstalled(PluginInformation information) { + InstalledPlugin plugin = mock(InstalledPlugin.class, Answers.RETURNS_DEEP_STUBS); + returnInformation(plugin, information); + return plugin; + } + + public static AvailablePlugin createAvailable(PluginInformation information) { + AvailablePluginDescriptor descriptor = mock(AvailablePluginDescriptor.class); + lenient().when(descriptor.getInformation()).thenReturn(information); + return new AvailablePlugin(descriptor); + } + + private static void returnInformation(Plugin mockedPlugin, PluginInformation information) { + when(mockedPlugin.getDescriptor().getInformation()).thenReturn(information); + } +}