Skip to content

Commit a7b5fe9

Browse files
committed
Fix #117 Parent selector (&) not supported in variable declaration
1 parent d5f6b59 commit a7b5fe9

File tree

14 files changed

+171
-23
lines changed

14 files changed

+171
-23
lines changed

.travis.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ env:
1010
- secure: "HJzMrBMjJ9+H1UroodSLo0tiUrBytZQz1EqGykWqU/PcgwVjVSTPqvLmFkfPbIZm3on9GElblUQqXV3/J9X2UTu4a/ZmWL5v09Tk2O12jKGbFV71LtlDFvvIoy8DtIIfnE0r642wyu6ii3VVt1J6FI/oixNmF25S6DdWDaA+q3NWlA+MZEae3n1YuQmhkpgoMkWe6xC3H6Oxdo0XgTn0SfqfBES8IM+3hG4FCU6tYfOVoffVEUd1eq3J9W7aGfMQ4zTEAorwroyWuFRDbG+W+PK8uMUJpSDDzjq3271yJAFPtLlGL2f+JPZO5GUui1IW+VM4Ju9YhQ5MiYzQXpdIUKFtBQZr480PrmTL9hP0zZFJA/QkBYr6otyBvaDOEkM1Bv/I9v2EjiutfVKVP09FKIEMNASdCCvtJ6p+BS3r2a74MZNcFtqcjXPd8ROxrh49n6hrkt99jvwsybgTpsgayTxT0N6Pdd1ni6sAiQ3LtXo6vFCi2apJ1v1hBoOXRfNvIdq00inyQI/P3LNcQzXLTou63oh2Z+I7UJcQHnl0pc4pndQMQm4A+22fFUrXRByPJK2dZpd7l/PSIEl0reirzk3UIUw1qmJlZyabAmPJPzPjvodjbH3pH5mK0S050UNDXi6G1u+F91td5gMrXxq3sA4/GIp1RpyoovSrOzIZEf4="
1111
- secure: "P3gRgSFJNUfku81Yl61Fh5QbkH5E4ccFSv9zbwNwQQkTVNTXd3Zv5TVTjt/eXI/wM7PZnDrhWxz8y7D4J1vZjqvbIGnmXyjsm/jX83HTDt70aE/4N4oKCZcEr783H2xlXcUnrxPXW87vV4Bw/JU7EVF26jC1tAIrnfVUMfNxYMpxCi19S7Qg72nOGcNgDJbQj/Unl7UEmbEPV4POiytwF6oVDWLp+Ys8JjujeS9rCtd6vzKxBR08WLAlqG07SSLb98UxCZA+p+D7uFfQMOAkp91L9S+vXXn0FIDczmEEYaAnPRJYszDfaEr6aQSvIQVyaWVqLYBKuSFZpnXPqyczgtXgNVk1H01gRtXPjF18kAD8e/UT/n4x9YvsN7FRDr5mXO0wd/XPmbZ9D2ZrOqDNKNzFv3LdnzpWL1BJsgAbI/nhUqjz1WJ+WVUXDq6jNMegJOXGRia04D05XKBgW71ULmMZrKNufab1l9Hy2gEVpZ0AgUlSxRLNmvYLh1TZTS9Tp2ONHEBkVEFo3tbt7hP8MeTM/6sqwhhY27CGv9yfmEMBLNURDodaXAyUQEBBbCF6KLIkX+RoQsvho2+TZE1jxheY1MffL+MlWtmbVCpK46W7yeB1Gk+AptY7vJ5JsRa+RWrrwFEChfgymWJfIwPiFVRm947XAv6QirsWNJV9fqw="
1212
matrix:
13-
- SQ_VERSION=LTS
14-
- SQ_VERSION=LATEST_RELEASE
13+
- SQ_VERSION=LATEST_RELEASE[6.7]
14+
- SQ_VERSION=DEV
1515

1616
cache:
1717
directories:

CONTRIBUTING.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,5 @@ You feel like:
1414

1515
## Building / Testing / Releasing
1616
* Building and running unit tests: `mvn clean install`
17-
* Building and running unit tests and running integration tests: `mvn clean install -Pits -Dsonar.runtimeVersion=$VERSION` ($VERSION = 'LTS' or 'LATEST_RELEASE'). Behind a proxy, add `-Dhttps.proxyHost=localhost -Dhttps.proxyPort=3128 -Dhttp.proxyHost=localhost -Dhttp.proxyPort=3128`.
17+
* Building and running unit tests and running integration tests: `mvn clean install -Pits -Dsonar.runtimeVersion=$VERSION` ($VERSION = 'LATEST_RELEASE[X.X]' or 'DEV'). Behind a proxy, add `-Dhttps.proxyHost=localhost -Dhttps.proxyPort=3128 -Dhttp.proxyHost=localhost -Dhttp.proxyPort=3128`.
1818
* Releasing on Maven Central: `mvn clean deploy -Possrh`

appveyor.yml

+2-2
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ install:
1212

1313
environment:
1414
matrix:
15-
- SQ_VERSION: "LTS"
16-
- SQ_VERSION: "LATEST_RELEASE"
15+
- SQ_VERSION: "LATEST_RELEASE[6.7]"
16+
- SQ_VERSION: "DEV"
1717

1818
platform:
1919
- x64

css-frontend/src/main/java/org/sonar/css/parser/LexicalGrammar.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,13 @@ public enum LexicalGrammar implements GrammarRuleKey {
197197

198198
SCSS_MIXIN_BLOCK,
199199

200-
SCSS_PARENT_SELECTOR,
201200
SCSS_PARENT_SELECTOR_KEYWORD,
201+
SCSS_PARENT_SELECTOR_KEYWORD_WITH_SPACING,
202+
SCSS_PARENT_SELECTOR,
203+
SCSS_PARENT_SELECTOR_WITH_SPACING,
202204
SCSS_PARENT_SELECTOR_COMBINATOR,
203205
SCSS_PARENT_REFERENCING_SELECTOR,
206+
SCSS_PARENT_REFERENCING_SELECTOR_WITH_SPACING,
204207
SCSS_PLACEHOLDER_SELECTOR,
205208

206209
SCSS_EXTEND,
@@ -594,6 +597,7 @@ private static void scss(LexerlessGrammarBuilder b) {
594597
b.rule(SCSS_DOLLAR).is(b.token(GenericTokenType.LITERAL, "$"));
595598
b.rule(SCSS_ELLIPSIS).is(b.token(GenericTokenType.LITERAL, "..."));
596599
b.rule(SCSS_PARENT_SELECTOR_KEYWORD).is("&");
600+
b.rule(SCSS_PARENT_SELECTOR_KEYWORD_WITH_SPACING).is(SPACING, "&");
597601

598602
b.rule(SCSS_VARIABLE_PREFIX).is(SPACING, SCSS_DOLLAR);
599603
b.rule(SCSS_DEFAULT_KEYWORD).is(SPACING, b.token(GenericTokenType.LITERAL, "!default"));

css-frontend/src/main/java/org/sonar/css/parser/scss/ScssGrammar.java

+35-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,23 @@
2626
import org.sonar.css.tree.impl.SeparatedList;
2727
import org.sonar.css.tree.impl.css.InternalSyntaxToken;
2828
import org.sonar.plugins.css.api.tree.Tree;
29-
import org.sonar.plugins.css.api.tree.css.*;
29+
import org.sonar.plugins.css.api.tree.css.AttributeMatcherExpressionTree;
30+
import org.sonar.plugins.css.api.tree.css.AttributeSelectorTree;
31+
import org.sonar.plugins.css.api.tree.css.ClassSelectorTree;
32+
import org.sonar.plugins.css.api.tree.css.CompoundSelectorTree;
33+
import org.sonar.plugins.css.api.tree.css.DeclarationTree;
34+
import org.sonar.plugins.css.api.tree.css.DelimiterTree;
35+
import org.sonar.plugins.css.api.tree.css.IdSelectorTree;
36+
import org.sonar.plugins.css.api.tree.css.IdentifierTree;
37+
import org.sonar.plugins.css.api.tree.css.PropertyTree;
38+
import org.sonar.plugins.css.api.tree.css.PseudoIdentifierTree;
39+
import org.sonar.plugins.css.api.tree.css.SelectorCombinatorTree;
40+
import org.sonar.plugins.css.api.tree.css.SelectorTree;
41+
import org.sonar.plugins.css.api.tree.css.StatementBlockTree;
42+
import org.sonar.plugins.css.api.tree.css.StyleSheetTree;
43+
import org.sonar.plugins.css.api.tree.css.TypeSelectorTree;
44+
import org.sonar.plugins.css.api.tree.css.ValueCommaSeparatedListTree;
45+
import org.sonar.plugins.css.api.tree.css.ValueTree;
3046
import org.sonar.plugins.css.api.tree.scss.*;
3147

3248
/**
@@ -129,6 +145,8 @@ public Tree ANY_WITHOUT_COMMA_SEPARATED_LIST() {
129145
public Tree ANY_SASS_SCRIPT_EXPRESSION() {
130146
return b.<Tree>nonterminal().is(
131147
b.firstOf(
148+
SCSS_PARENT_REFERENCING_SELECTOR_WITH_SPACING(),
149+
SCSS_PARENT_SELECTOR_WITH_SPACING(),
132150
VALUE_COMMA_SEPARATED_LIST(),
133151
IMPORTANT_FLAG(),
134152
SCSS_GLOBAL_FLAG(),
@@ -154,6 +172,8 @@ public Tree ANY_SASS_SCRIPT_EXPRESSION() {
154172
public Tree ANY_SASS_SCRIPT_EXPRESSION_WITHOUT_COMMA_SEPARATED_LIST() {
155173
return b.<Tree>nonterminal().is(
156174
b.firstOf(
175+
SCSS_PARENT_REFERENCING_SELECTOR_WITH_SPACING(),
176+
SCSS_PARENT_SELECTOR_WITH_SPACING(),
157177
IMPORTANT_FLAG(),
158178
SCSS_GLOBAL_FLAG(),
159179
SCSS_DEFAULT_FLAG(),
@@ -353,6 +373,11 @@ public ScssParentSelectorTree SCSS_PARENT_SELECTOR() {
353373
f.scssParentSelector(b.token(LexicalGrammar.SCSS_PARENT_SELECTOR_KEYWORD)));
354374
}
355375

376+
public ScssParentSelectorTree SCSS_PARENT_SELECTOR_WITH_SPACING() {
377+
return b.<ScssParentSelectorTree>nonterminal(LexicalGrammar.SCSS_PARENT_SELECTOR_WITH_SPACING).is(
378+
f.scssParentSelector(b.token(LexicalGrammar.SCSS_PARENT_SELECTOR_KEYWORD_WITH_SPACING)));
379+
}
380+
356381
public ScssParentReferencingSelectorTree SCSS_PARENT_REFERENCING_SELECTOR() {
357382
return b.<ScssParentReferencingSelectorTree>nonterminal(LexicalGrammar.SCSS_PARENT_REFERENCING_SELECTOR).is(
358383
f.scssParentReferencingSelector(
@@ -362,6 +387,15 @@ public ScssParentReferencingSelectorTree SCSS_PARENT_REFERENCING_SELECTOR() {
362387
IDENTIFIER_NO_WS())));
363388
}
364389

390+
public ScssParentReferencingSelectorTree SCSS_PARENT_REFERENCING_SELECTOR_WITH_SPACING() {
391+
return b.<ScssParentReferencingSelectorTree>nonterminal(LexicalGrammar.SCSS_PARENT_REFERENCING_SELECTOR_WITH_SPACING).is(
392+
f.scssParentReferencingSelector(
393+
SCSS_PARENT_SELECTOR_WITH_SPACING(),
394+
b.firstOf(
395+
SCSS_INTERPOLATED_IDENTIFIER_NO_WS(),
396+
IDENTIFIER_NO_WS())));
397+
}
398+
365399
public ScssPlaceholderSelectorTree SCSS_PLACEHOLDER_SELECTOR() {
366400
return b.<ScssPlaceholderSelectorTree>nonterminal(LexicalGrammar.SCSS_PLACEHOLDER_SELECTOR).is(
367401
f.scssPlaceholderSelector(

css-frontend/src/main/java/org/sonar/css/tree/impl/scss/ScssVariableDeclarationTreeImpl.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -82,14 +82,14 @@ public ValueTree value() {
8282
@Nullable
8383
public ScssDefaultFlagTree defaultFlag() {
8484
Optional<ScssDefaultFlagTree> defaultFlag = value.firstValueElementOfType(ScssDefaultFlagTree.class);
85-
return defaultFlag.isPresent() ? defaultFlag.get() : null;
85+
return defaultFlag.orElse(null);
8686
}
8787

8888
@Override
8989
@Nullable
9090
public ScssGlobalFlagTree globalFlag() {
9191
Optional<ScssGlobalFlagTree> globalFlag = value.firstValueElementOfType(ScssGlobalFlagTree.class);
92-
return globalFlag.isPresent() ? globalFlag.get() : null;
92+
return globalFlag.orElse(null);
9393
}
9494

9595
@Override
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* SonarQube CSS / SCSS / Less Analyzer
3+
* Copyright (C) 2013-2017 David RACODON
4+
* mailto: david.racodon@gmail.com
5+
*
6+
* This program is free software; you can redistribute it and/or
7+
* modify it under the terms of the GNU Lesser General Public
8+
* License as published by the Free Software Foundation; either
9+
* version 3 of the License, or (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+
* Lesser General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Lesser General Public License
17+
* along with this program; if not, write to the Free Software Foundation,
18+
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19+
*/
20+
package org.sonar.css.parser.scss;
21+
22+
import org.junit.Test;
23+
import org.sonar.css.parser.LexicalGrammar;
24+
import org.sonar.plugins.css.api.tree.scss.ScssParentReferencingSelectorTree;
25+
26+
import static org.fest.assertions.Assertions.assertThat;
27+
28+
public class ScssParentReferencingSelectorWithSpacingTreeTest extends ScssTreeTest {
29+
30+
public ScssParentReferencingSelectorWithSpacingTreeTest() {
31+
super(LexicalGrammar.SCSS_PARENT_REFERENCING_SELECTOR_WITH_SPACING);
32+
}
33+
34+
@Test
35+
public void scssParentReferencingSelector() {
36+
checkParsed("&-bar", "-bar");
37+
checkParsed(" &-bar", "-bar");
38+
checkParsed("&bar", "bar");
39+
checkParsed(" &bar", "bar");
40+
}
41+
42+
@Test
43+
public void notScssParentReferencingSelector() {
44+
checkNotParsed("&");
45+
checkNotParsed("& bar");
46+
}
47+
48+
private void checkParsed(String toParse, String expectedIdentifier) {
49+
ScssParentReferencingSelectorTree tree = (ScssParentReferencingSelectorTree) parser().parse(toParse);
50+
assertThat(tree).isNotNull();
51+
assertThat(tree.parent()).isNotNull();
52+
assertThat(tree.append()).isNotNull();
53+
assertThat(tree.text()).isEqualTo(expectedIdentifier);
54+
}
55+
56+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/*
2+
* SonarQube CSS / SCSS / Less Analyzer
3+
* Copyright (C) 2013-2017 David RACODON
4+
* mailto: david.racodon@gmail.com
5+
*
6+
* This program is free software; you can redistribute it and/or
7+
* modify it under the terms of the GNU Lesser General Public
8+
* License as published by the Free Software Foundation; either
9+
* version 3 of the License, or (at your option) any later version.
10+
*
11+
* This program is distributed in the hope that it will be useful,
12+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14+
* Lesser General Public License for more details.
15+
*
16+
* You should have received a copy of the GNU Lesser General Public License
17+
* along with this program; if not, write to the Free Software Foundation,
18+
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19+
*/
20+
package org.sonar.css.parser.scss;
21+
22+
import org.junit.Test;
23+
import org.sonar.css.parser.LexicalGrammar;
24+
import org.sonar.plugins.css.api.tree.scss.ScssParentSelectorTree;
25+
26+
import static org.fest.assertions.Assertions.assertThat;
27+
28+
public class ScssParentSelectorWithSpacingTreeTest extends ScssTreeTest {
29+
30+
public ScssParentSelectorWithSpacingTreeTest() {
31+
super(LexicalGrammar.SCSS_PARENT_SELECTOR_WITH_SPACING);
32+
}
33+
34+
@Test
35+
public void sscsParentSelector() {
36+
checkParsed("&");
37+
checkParsed(" &");
38+
}
39+
40+
private void checkParsed(String toParse) {
41+
ScssParentSelectorTree tree = (ScssParentSelectorTree) parser().parse(toParse);
42+
assertThat(tree).isNotNull();
43+
assertThat(tree.parentSelector()).isNotNull();
44+
assertThat(tree.parentSelector().text()).isEqualTo("&");
45+
}
46+
47+
}

css-frontend/src/test/java/org/sonar/css/parser/scss/ScssSassScriptExpressionTreeTest.java

+3
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ public void scssSassScriptExpression() {
3737
checkParsed("1 + 2");
3838
checkParsed("(a: 2, b: 3)");
3939
checkParsed("abc((a: 2, b: 3))");
40+
checkParsed("&");
41+
checkParsed("&-name");
42+
checkParsed("&-name abc");
4043
}
4144

4245
private ValueTree checkParsed(String toParse) {

css-frontend/src/test/java/org/sonar/css/parser/scss/ScssVariableDeclarationTreeTest.java

+5
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ public void scssVariableDeclaration() {
5656
checkParsed(" $abc : 123");
5757
checkParsed(" $abc : 123;");
5858
checkParsed(" $abc: 10, $def");
59+
checkParsed(" $abc:&");
60+
checkParsed(" $abc:&-name");
61+
checkParsed(" $abc: &");
62+
checkParsed(" $abc: &-name");
63+
checkParsed(" $abc: &-name abc");
5964

6065
checkParsed("$grid-gutter-widths: (\n" +
6166
" xs: $grid-gutter-width-base,\n" +

its/plugin/tests/src/test/java/org/sonar/css/Tests.java

+7-7
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import com.sonar.orchestrator.Orchestrator;
2323
import com.sonar.orchestrator.build.SonarScanner;
2424
import com.sonar.orchestrator.locator.FileLocation;
25+
import com.sonar.orchestrator.locator.MavenLocation;
2526
import org.junit.ClassRule;
2627
import org.junit.runner.RunWith;
2728
import org.junit.runners.Suite;
@@ -53,8 +54,8 @@ public class Tests {
5354

5455
@ClassRule
5556
public static final Orchestrator ORCHESTRATOR = Orchestrator.builderEnv()
56-
.addPlugin(FileLocation.byWildcardFilename(new File("../../../sonar-css-plugin/target"), "sonar-css-plugin-*-SNAPSHOT.jar"))
57-
.addPlugin(FileLocation.byWildcardFilename(new File("../plugins/css-custom-rules-plugin/target"), "css-custom-rules-plugin-*-SNAPSHOT.jar"))
57+
.setSonarVersion(System.getProperty("sonar.runtimeVersion", "DEV"))
58+
.addPlugin(FileLocation.byWildcardMavenFilename(new File("../../../sonar-css-plugin/target"), "sonar-css-plugin-*-SNAPSHOT.jar"))
5859
.restoreProfileAtStartup(FileLocation.ofClasspath("/org/sonar/css/profiles/css-zero-units-only-profile.xml"))
5960
.restoreProfileAtStartup(FileLocation.ofClasspath("/org/sonar/css/profiles/less-zero-units-only-profile.xml"))
6061
.restoreProfileAtStartup(FileLocation.ofClasspath("/org/sonar/css/profiles/scss-zero-units-only-profile.xml"))
@@ -68,11 +69,10 @@ public class Tests {
6869
.build();
6970

7071
public static SonarScanner createSonarScannerBuild() {
71-
SonarScanner build = SonarScanner.create();
72-
build.setProjectVersion("1.0");
73-
build.setSourceEncoding("UTF-8");
74-
build.setSourceDirs("src");
75-
return build;
72+
return SonarScanner.create()
73+
.setProjectVersion("1.0")
74+
.setSourceEncoding("UTF-8")
75+
.setSourceDirs("src");
7676
}
7777

7878
public static void setCssProfile(String profileName, String projectKey) {

its/ruling/tests/src/test/java/org/sonar/css/its/CssTest.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import com.sonar.orchestrator.Orchestrator;
2424
import com.sonar.orchestrator.build.SonarScanner;
2525
import com.sonar.orchestrator.locator.FileLocation;
26+
import com.sonar.orchestrator.locator.MavenLocation;
2627
import org.junit.Before;
2728
import org.junit.ClassRule;
2829
import org.junit.Test;
@@ -39,9 +40,9 @@ public class CssTest {
3940

4041
@ClassRule
4142
public static Orchestrator orchestrator = Orchestrator.builderEnv()
43+
.setSonarVersion(System.getProperty("sonar.runtimeVersion", "DEV"))
4244
.addPlugin(FileLocation.byWildcardMavenFilename(new File("../../../sonar-css-plugin/target"), "sonar-css-plugin-*-SNAPSHOT.jar"))
43-
.setOrchestratorProperty("litsVersion", "0.6")
44-
.addPlugin("lits")
45+
.addPlugin(MavenLocation.of("org.sonarsource.sonar-lits-plugin", "sonar-lits-plugin", "0.6"))
4546
.build();
4647

4748
@Before
@@ -70,13 +71,11 @@ public void test() throws Exception {
7071
.setProjectKey("project")
7172
.setSourceDirs("./")
7273
.setSourceEncoding("UTF-8")
73-
.setProperty("sonar.import_unknown_files", "true")
7474
.setProperty("sonar.analysis.mode", "preview")
75-
.setProperty("sonar.issuesReport.html.enable", "true")
7675
.setProperty("dump.old", FileLocation.of("src/test/expected").getFile().getAbsolutePath())
7776
.setProperty("dump.new", FileLocation.of("target/actual").getFile().getAbsolutePath())
7877
.setProperty("lits.differences", litsDifferencesFile.getAbsolutePath())
79-
.setProperty("sonar.cpd.skip", "true");
78+
.setProperty("sonar.cpd.exclusions", "**/*");
8079
orchestrator.executeBuild(build);
8180

8281
assertThat(Files.asCharSource(litsDifferencesFile, StandardCharsets.UTF_8).read()).isEmpty();

pom.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@
127127
<dependency>
128128
<groupId>org.sonarsource.orchestrator</groupId>
129129
<artifactId>sonar-orchestrator</artifactId>
130-
<version>3.15.2.1322</version>
130+
<version>3.22.0.1791</version>
131131
<exclusions>
132132
<exclusion>
133133
<groupId>com.oracle</groupId>

travis.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ git fetch --unshallow
66

77
mvn -B clean install -Pits -Dsonar.runtimeVersion=$SQ_VERSION
88

9-
if [ "$SQ_VERSION" == "LTS" ]; then
9+
if [ "$SQ_VERSION" == "DEV" ]; then
1010

1111
mvnCommand='mvn -B sonar:sonar'
1212
commonArgs="-Dsonar.host.url=https://sonarcloud.io -Dsonar.login=$SONAR_TOKEN -Dsonar.organization=racodond-github"

0 commit comments

Comments
 (0)