Skip to content

Commit

Permalink
Merge branch 'master' into sq-8_2+azure-devops
Browse files Browse the repository at this point in the history
  • Loading branch information
mc1arke authored Oct 26, 2020
2 parents 544a9c6 + 6aa89b9 commit aa6bf52
Show file tree
Hide file tree
Showing 17 changed files with 326 additions and 55 deletions.
8 changes: 7 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,14 @@
/.idea/
*.iml

# Eclipse
/.classpath
/.project
/.settings/
/bin/

#Project libs
/sonarqube-lib/

#VSCode
.project
.project
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ dependencies {
compile('io.aexp.nodes.graphql:nodes:0.5.0') {
exclude group: 'com.fasterxml.jackson.core'
}
compileOnly 'com.google.code.findbugs:jsr305:3.0.2'
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
import org.sonar.ce.task.projectanalysis.measure.Measure;
import org.sonar.ce.task.projectanalysis.measure.MeasureRepository;
import org.sonar.ce.task.projectanalysis.metric.MetricRepository;
import org.sonar.core.issue.DefaultIssue;
import org.sonar.server.measure.Rating;

import java.io.UnsupportedEncodingException;
Expand Down Expand Up @@ -195,7 +194,7 @@ public String createAnalysisSummary(FormatterFactory formatterFactory) {
issueCounts.get(RuleType.SECURITY_HOTSPOT), "Vulnerability",
"Vulnerabilities"))), new ListItem(new Image("Code Smell",
baseImageUrl +
"/common/vulnerability.svg?sanitize=true"),
"/common/code_smell.svg?sanitize=true"),
new Text(" "), new Text(
pluralOf(issueCounts.get(RuleType.CODE_SMELL), "Code Smell",
"Code Smells")))),
Expand All @@ -221,7 +220,7 @@ public String createAnalysisSummary(FormatterFactory formatterFactory) {
}

public String createAnalysisIssueSummary(PostAnalysisIssueVisitor.ComponentIssue componentIssue, FormatterFactory formatterFactory) {
final DefaultIssue issue = componentIssue.getIssue();
final PostAnalysisIssueVisitor.LightIssue issue = componentIssue.getIssue();

String baseImageUrl = getBaseImageUrl();

Expand Down Expand Up @@ -313,6 +312,10 @@ public String getAnalysisProjectKey() {
return project.getKey();
}

public String getAnalysisProjectName() {
return project.getName();
}

public List<QualityGate.Condition> findFailedConditions() {
return qualityGate.getConditions().stream().filter(c -> c.getStatus() == QualityGate.EvaluationStatus.ERROR)
.collect(Collectors.toList());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,17 @@
*/
package com.github.mc1arke.sonarqube.plugin.ce.pullrequest;

import org.sonar.api.rules.RuleType;
import org.sonar.ce.task.projectanalysis.component.Component;
import org.sonar.ce.task.projectanalysis.issue.IssueVisitor;
import org.sonar.core.issue.DefaultIssue;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

import javax.annotation.CheckForNull;

public class PostAnalysisIssueVisitor extends IssueVisitor {

Expand All @@ -42,20 +46,115 @@ public List<ComponentIssue> getIssues() {
public static class ComponentIssue {

private final Component component;
private final DefaultIssue issue;
private final LightIssue issue;

ComponentIssue(Component component, DefaultIssue issue) {
super();
this.component = component;
this.issue = issue;
this.issue = (issue != null) ? new LightIssue(issue) : null;
// the null test is to please PostAnalysisIssueVisitorTest.checkAllIssuesCollected()
}

public Component getComponent() {
return component;
}

public DefaultIssue getIssue() {
public LightIssue getIssue() {
return issue;
}
}

/**
* A simple bean for holding the useful bits of a #{@link DefaultIssue}.
* <br>
* It presents a subset of the #{@link DefaultIssue} interface, hence the inconsistent getters names,
* and CheckForNull annotations.
*/
public static class LightIssue {

private final Long effortInMinutes;
private final String key;
private final Integer line;
private final String message;
private final String resolution;
private final String severity;
private final String status;
private final RuleType type;

private LightIssue(DefaultIssue issue) {
this.effortInMinutes = issue.effortInMinutes();
this.key = issue.key();
this.line = issue.getLine();
this.message = issue.getMessage();
this.resolution = issue.resolution();
this.severity = issue.severity();
this.status = issue.status();
this.type = issue.type();
}

@CheckForNull
public Long effortInMinutes() {
return effortInMinutes;
}

public String key() {
return key;
}

@CheckForNull
public Integer getLine() {
return line;
}

@CheckForNull
public String getMessage() {
return message;
}

@CheckForNull
public String resolution() {
return resolution;
}

public String severity() {
return severity;
}

public String getStatus() {
return status;
}

public String status() {
return status;
}

public RuleType type() {
return type;
}

@Override
public int hashCode() {
return Objects.hash(effortInMinutes, key, line, message, resolution, severity, status, type);
}

@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
LightIssue other = (LightIssue) obj;
return Objects.equals(effortInMinutes, other.effortInMinutes)
&& Objects.equals(key, other.key)
&& Objects.equals(line, other.line)
&& Objects.equals(message, other.message)
&& Objects.equals(resolution, other.resolution)
&& Objects.equals(severity, other.severity)
&& Objects.equals(status, other.status)
&& type == other.type;
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
public class CodeInsightsAnnotation {
@JsonProperty("line")
private final int line;
@JsonProperty("message")
@JsonProperty("summary")
private final String message;
@JsonProperty("path")
private final String path;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
public class CloudAnnotation extends CodeInsightsAnnotation {
@JsonProperty("external_id")
private final String externalId;
@JsonProperty("summary")
@JsonProperty("link")
private final String link;
@JsonProperty("annotation_type")
private final String annotationType;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ public DecorationResult createCheckRun(AnalysisDetails analysisDetails, AlmSetti

Map<String, Object> inputObjectArguments = new HashMap<>();
inputObjectArguments.put("repositoryId", repositoryAuthenticationToken.getRepositoryId());
inputObjectArguments.put("name", "Sonarqube Results");
inputObjectArguments.put("name", String.format("%s Sonarqube Results", analysisDetails.getAnalysisProjectName()));
inputObjectArguments.put("status", RequestableCheckStatusState.COMPLETED);
inputObjectArguments.put("conclusion", QualityGate.Status.OK == analysisDetails.getQualityGateStatus() ?
CheckConclusionState.SUCCESS : CheckConclusionState.FAILURE);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,16 @@ public DecorationResult decorateQualityGateStatus(AnalysisDetails analysis, AlmS

try {
final String apiURL = Optional.ofNullable(StringUtils.stripToNull(almSettingDto.getUrl()))
.orElse(analysis.getScannerProperty(PULLREQUEST_GITLAB_INSTANCE_URL)
.orElseThrow(() -> new IllegalStateException(String.format(
"Could not decorate Gitlab merge request. '%s' has not been set in scanner properties",
PULLREQUEST_GITLAB_INSTANCE_URL))));
.orElseGet(() -> analysis.getScannerProperty(PULLREQUEST_GITLAB_INSTANCE_URL)
.orElseThrow(() -> new IllegalStateException(String.format(
"Could not decorate Gitlab merge request. '%s' has not been set in scanner properties",
PULLREQUEST_GITLAB_INSTANCE_URL))));
final String apiToken = almSettingDto.getPersonalAccessToken();
final String projectId = analysis.getScannerProperty(PULLREQUEST_GITLAB_PROJECT_ID).orElseThrow(
() -> new IllegalStateException(String.format(
"Could not decorate Gitlab merge request. '%s' has not been set in scanner properties",
PULLREQUEST_GITLAB_PROJECT_ID)));
final String projectId = Optional.ofNullable(StringUtils.stripToNull(projectAlmSettingDto.getAlmRepo()))
.orElseGet(() -> analysis.getScannerProperty(PULLREQUEST_GITLAB_PROJECT_ID)
.orElseThrow(() -> new IllegalStateException(String.format(
"Could not decorate Gitlab merge request. '%s' has not been set in scanner properties",
PULLREQUEST_GITLAB_PROJECT_ID))));
final String pullRequestId = analysis.getBranchName();

final String projectURL = apiURL + String.format("/projects/%s", URLEncoder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package com.github.mc1arke.sonarqube.plugin.ce.pullrequest.markup;

import java.util.stream.IntStream;
import static com.google.common.html.HtmlEscapers.htmlEscaper;

public final class MarkdownFormatterFactory implements FormatterFactory {

Expand Down Expand Up @@ -110,7 +111,7 @@ public Formatter<Text> textFormatter() {
return new BaseFormatter<Text>() {
@Override
public String format(Text node, FormatterFactory formatterFactory) {
return node.getContent();
return htmlEscaper().escape(node.getContent()).trim();
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
package com.github.mc1arke.sonarqube.plugin.server.pullrequest.ws.action.gitlab;

import org.sonar.api.server.ws.Request;
import org.sonar.api.server.ws.WebService;
import org.sonar.db.DbClient;
import org.sonar.db.alm.setting.ProjectAlmSettingDto;
import org.sonar.server.component.ComponentFinder;
Expand All @@ -27,15 +28,25 @@
import com.github.mc1arke.sonarqube.plugin.server.pullrequest.ws.action.SetBindingAction;

public class SetGitlabBindingAction extends SetBindingAction {
private static final String REPOSITORY_PARAMETER = "repository";

public SetGitlabBindingAction(DbClient dbClient, ComponentFinder componentFinder, UserSession userSession) {
super(dbClient, componentFinder, userSession, "set_gitlab_binding");
}

@Override
protected void configureAction(WebService.NewAction action) {
super.configureAction(action);
action.createParam(REPOSITORY_PARAMETER);
}

@Override
protected ProjectAlmSettingDto createProjectAlmSettingDto(String projectUuid, String settingsUuid,
Request request) {
return new ProjectAlmSettingDto().setProjectUuid(projectUuid).setAlmSettingUuid(settingsUuid);
return new ProjectAlmSettingDto()
.setProjectUuid(projectUuid)
.setAlmSettingUuid(settingsUuid)
.setAlmRepo(request.param(REPOSITORY_PARAMETER));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
import org.sonar.ce.task.projectanalysis.measure.MeasureRepository;
import org.sonar.ce.task.projectanalysis.metric.Metric;
import org.sonar.ce.task.projectanalysis.metric.MetricRepository;
import org.sonar.core.issue.DefaultIssue;

import java.util.ArrayList;
import java.util.Arrays;
Expand Down Expand Up @@ -193,26 +192,26 @@ public void testCreateAnalysisSummary() {
doReturn(treeRootHolder).when(measuresHolder).getTreeRootHolder();

PostAnalysisIssueVisitor postAnalysisIssueVisitor = mock(PostAnalysisIssueVisitor.class);
DefaultIssue issue1 = mock(DefaultIssue.class);
PostAnalysisIssueVisitor.LightIssue issue1 = mock(PostAnalysisIssueVisitor.LightIssue.class);
doReturn(Issue.STATUS_CLOSED).when(issue1).status();

DefaultIssue issue2 = mock(DefaultIssue.class);
PostAnalysisIssueVisitor.LightIssue issue2 = mock(PostAnalysisIssueVisitor.LightIssue.class);
doReturn(Issue.STATUS_OPEN).when(issue2).status();
doReturn(RuleType.BUG).when(issue2).type();

DefaultIssue issue3 = mock(DefaultIssue.class);
PostAnalysisIssueVisitor.LightIssue issue3 = mock(PostAnalysisIssueVisitor.LightIssue.class);
doReturn(Issue.STATUS_OPEN).when(issue3).status();
doReturn(RuleType.SECURITY_HOTSPOT).when(issue3).type();

DefaultIssue issue4 = mock(DefaultIssue.class);
PostAnalysisIssueVisitor.LightIssue issue4 = mock(PostAnalysisIssueVisitor.LightIssue.class);
doReturn(Issue.STATUS_OPEN).when(issue4).status();
doReturn(RuleType.CODE_SMELL).when(issue4).type();

DefaultIssue issue5 = mock(DefaultIssue.class);
PostAnalysisIssueVisitor.LightIssue issue5 = mock(PostAnalysisIssueVisitor.LightIssue.class);
doReturn(Issue.STATUS_OPEN).when(issue5).status();
doReturn(RuleType.VULNERABILITY).when(issue5).type();

DefaultIssue issue6 = mock(DefaultIssue.class);
PostAnalysisIssueVisitor.LightIssue issue6 = mock(PostAnalysisIssueVisitor.LightIssue.class);
doReturn(Issue.STATUS_OPEN).when(issue6).status();
doReturn(RuleType.BUG).when(issue6).type();

Expand Down Expand Up @@ -339,7 +338,7 @@ public void testCreateAnalysisSummary() {
"2 Vulnerabilities")),
new ListItem(new Image(
"Code Smell",
"http://localhost:9000/static/communityBranchPlugin/common/vulnerability.svg?sanitize=true"),
"http://localhost:9000/static/communityBranchPlugin/common/code_smell.svg?sanitize=true"),
new Text(
" "),
new Text(
Expand Down Expand Up @@ -439,7 +438,7 @@ public void testCreateAnalysisSummary2() {
"0 Vulnerabilities")),
new ListItem(new Image(
"Code Smell",
"http://localhost:9000/static/communityBranchPlugin/common/vulnerability.svg?sanitize=true"),
"http://localhost:9000/static/communityBranchPlugin/common/code_smell.svg?sanitize=true"),
new Text(
" "),
new Text(
Expand Down Expand Up @@ -469,7 +468,7 @@ public void testCreateAnalysisSummary3() {
AnalysisDetails.MeasuresHolder measuresHolder = mock(AnalysisDetails.MeasuresHolder.class);
doReturn(treeRootHolder).when(measuresHolder).getTreeRootHolder();

DefaultIssue issue = mock(DefaultIssue.class);
PostAnalysisIssueVisitor.LightIssue issue = mock(PostAnalysisIssueVisitor.LightIssue.class);
doReturn(Issue.STATUS_OPEN).when(issue).status();
doReturn(RuleType.BUG).when(issue).type();
PostAnalysisIssueVisitor postAnalysisIssueVisitor = mock(PostAnalysisIssueVisitor.class);
Expand Down Expand Up @@ -546,7 +545,7 @@ public void testCreateAnalysisSummary3() {
"0 Vulnerabilities")),
new ListItem(new Image(
"Code Smell",
"http://host.name/path/common/vulnerability.svg?sanitize=true"),
"http://host.name/path/common/code_smell.svg?sanitize=true"),
new Text(
" "),
new Text(
Expand Down Expand Up @@ -644,7 +643,7 @@ public void testCreateAnalysisSummary4() {
"0 Vulnerabilities")),
new ListItem(new Image(
"Code Smell",
"http://localhost:9000/static/communityBranchPlugin/common/vulnerability.svg?sanitize=true"),
"http://localhost:9000/static/communityBranchPlugin/common/code_smell.svg?sanitize=true"),
new Text(
" "),
new Text(
Expand Down
Loading

0 comments on commit aa6bf52

Please sign in to comment.