Skip to content
This repository was archived by the owner on Jun 12, 2022. It is now read-only.

Commit a28af93

Browse files
committed
Inline comment issues
1 parent e43edaa commit a28af93

File tree

11 files changed

+185
-88
lines changed

11 files changed

+185
-88
lines changed

pom.xml

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,12 @@
5555
<groupId>org.apache.httpcomponents</groupId>
5656
<artifactId>httpclient</artifactId>
5757
<version>4.5.3</version>
58-
<!--<scope>provided</scope>-->
58+
<exclusions>
59+
<exclusion>
60+
<groupId>commons-logging</groupId>
61+
<artifactId>commons-logging</artifactId>
62+
</exclusion>
63+
</exclusions>
5964
</dependency>
6065

6166
<dependency>
@@ -64,12 +69,6 @@
6469
<version>20170516</version>
6570
</dependency>
6671

67-
<dependency>
68-
<groupId>commons-beanutils</groupId>
69-
<artifactId>commons-beanutils</artifactId>
70-
<version>1.9.3</version>
71-
</dependency>
72-
7372
<dependency>
7473
<groupId>commons-io</groupId>
7574
<artifactId>commons-io</artifactId>

src/main/java/io/nthienan/phdiff/Configuration.java

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
package io.nthienan.phdiff;
22

3+
import org.sonar.api.CoreProperties;
34
import org.sonar.api.batch.BatchSide;
45
import org.sonar.api.batch.InstantiationStrategy;
56
import org.sonar.api.config.Settings;
67
import org.sonar.api.utils.System2;
78
import org.sonar.api.utils.log.Logger;
89
import org.sonar.api.utils.log.Loggers;
910

10-
import java.net.*;
11+
import java.net.Authenticator;
12+
import java.net.PasswordAuthentication;
13+
import java.net.Proxy;
14+
import java.net.ProxySelector;
15+
import java.net.URI;
16+
import java.net.URISyntaxException;
1117
import java.util.regex.Pattern;
1218

1319
@BatchSide
@@ -35,20 +41,24 @@ public Configuration(Settings settings, System2 system2) {
3541
this.gitHttpPattern = Pattern.compile("https?://*\\.*/(.*/.*)\\.git");
3642
}
3743

38-
public int diffId() {
39-
return settings.getInt(PhabricatorDifferentialPlugin.DIFF_ID);
44+
public String diffId() {
45+
return settings.getString(PhabricatorDifferentialPlugin.DIFF_ID);
4046
}
4147

4248
public String conduitToken() {
4349
return settings.getString(PhabricatorDifferentialPlugin.CONDUIT_TOKEN);
4450
}
4551

4652
public boolean isEnabled() {
47-
return settings.hasKey(PhabricatorDifferentialPlugin.PHID);
53+
return settings.hasKey(PhabricatorDifferentialPlugin.DIFF_ID);
4854
}
4955

5056
public String phabricatorUrl() {
51-
return settings.getString(PhabricatorDifferentialPlugin.PHABRICATOR_HOST);
57+
return settings.getString(PhabricatorDifferentialPlugin.PHABRICATOR_URL);
58+
}
59+
60+
public String projectKey() {
61+
return settings.getString(CoreProperties.PROJECT_KEY_PROPERTY);
5262
}
5363

5464
/**

src/main/java/io/nthienan/phdiff/PhabricatorDifferentialBot.java

Lines changed: 0 additions & 53 deletions
This file was deleted.

src/main/java/io/nthienan/phdiff/PhabricatorDifferentialPlugin.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.nthienan.phdiff;
22

33
import io.nthienan.phdiff.report.RemarkGlobalReportBuilder;
4+
import io.nthienan.phdiff.report.RemarkupInlineReportBuilder;
45
import io.nthienan.phdiff.report.RemarkupUtils;
56
import org.sonar.api.Plugin;
67
import org.sonar.api.Properties;
@@ -14,7 +15,7 @@
1415
*/
1516
@Properties({
1617
@Property(
17-
key = PhabricatorDifferentialPlugin.PHABRICATOR_HOST,
18+
key = PhabricatorDifferentialPlugin.PHABRICATOR_URL,
1819
name = "Phabricator URL",
1920
defaultValue = "http://localhost",
2021
description = "URL to access Phabricator.",
@@ -32,28 +33,22 @@
3233
name = "DIFF_ID",
3334
description = "Diff ID",
3435
global = false
35-
),
36-
@Property(
37-
key = PhabricatorDifferentialPlugin.PHID,
38-
name = "PHID",
39-
description = "Phabricator ID",
40-
global = false
4136
)
4237
})
4338
public class PhabricatorDifferentialPlugin implements Plugin {
4439

45-
public static final String PHABRICATOR_HOST = "sonar.phdiff.phabricatorUrl";
40+
public static final String PHABRICATOR_URL = "sonar.phdiff.phabricatorUrl";
4641
public static final String CONDUIT_TOKEN = "sonar.phdiff.conduitToken";
4742
public static final String DIFF_ID = "sonar.phdiff.diffId";
48-
public static final String PHID = "sonar.phdiff.phid";
4943

5044
@Override
5145
public void define(Context context) {
5246
context.addExtensions(
53-
PhabricatorDifferentialBot.class,
47+
PhabricatorDifferentialPostJob.class,
5448
Configuration.class,
5549
RemarkGlobalReportBuilder.class,
56-
RemarkupUtils.class
50+
RemarkupUtils.class,
51+
RemarkupInlineReportBuilder.class
5752
);
5853
}
5954
}
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
package io.nthienan.phdiff;
2+
3+
import io.nthienan.phdiff.conduit.ConduitClient;
4+
import io.nthienan.phdiff.conduit.ConduitException;
5+
import io.nthienan.phdiff.conduit.DifferentialClient;
6+
import io.nthienan.phdiff.differential.Diff;
7+
import io.nthienan.phdiff.issue.IssueComparator;
8+
import io.nthienan.phdiff.report.GlobalReportBuilder;
9+
import io.nthienan.phdiff.report.InlineReportBuilder;
10+
import org.sonar.api.batch.postjob.PostJob;
11+
import org.sonar.api.batch.postjob.PostJobContext;
12+
import org.sonar.api.batch.postjob.PostJobDescriptor;
13+
import org.sonar.api.batch.postjob.issue.PostJobIssue;
14+
import org.sonar.api.utils.log.Logger;
15+
import org.sonar.api.utils.log.Loggers;
16+
17+
import java.util.Comparator;
18+
import java.util.stream.StreamSupport;
19+
20+
/**
21+
* Compute comments to be added on the differential.
22+
*
23+
* @author nthienan
24+
*/
25+
public class PhabricatorDifferentialPostJob implements PostJob {
26+
27+
private static final Logger LOG = Loggers.get(PhabricatorDifferentialPostJob.class);
28+
29+
private static final Comparator<PostJobIssue> ISSUE_COMPARATOR = new IssueComparator();
30+
31+
private final GlobalReportBuilder reportBuilder;
32+
private final InlineReportBuilder inlineReportBuilder;
33+
private final String projectKey;
34+
private final Configuration configuration;
35+
private DifferentialClient differentialClient;
36+
37+
public PhabricatorDifferentialPostJob(GlobalReportBuilder reportBuilder, InlineReportBuilder inlineReportBuilder, Configuration configuration) {
38+
this.reportBuilder = reportBuilder;
39+
this.inlineReportBuilder = inlineReportBuilder;
40+
this.configuration = configuration;
41+
String url = this.configuration.phabricatorUrl();
42+
String token = this.configuration.conduitToken();
43+
this.differentialClient = new DifferentialClient(new ConduitClient(url, token));
44+
this.projectKey = configuration.projectKey();
45+
}
46+
47+
@Override
48+
public void describe(PostJobDescriptor descriptor) {
49+
descriptor
50+
.name("Phabricator Differential Issue Publisher")
51+
.requireProperty(PhabricatorDifferentialPlugin.DIFF_ID);
52+
}
53+
54+
@Override
55+
public void execute(PostJobContext context) {
56+
try {
57+
String diffID = configuration.diffId();
58+
Diff diff = differentialClient.fetchDiff(diffID);
59+
// issues are not accessible when the mode "issues" is not enabled
60+
if (context.analysisMode().isIssues()) {
61+
StreamSupport.stream(context.issues().spliterator(), false)
62+
.filter(PostJobIssue::isNew)
63+
.filter(i -> i.inputComponent().isFile())
64+
.sorted(ISSUE_COMPARATOR)
65+
.forEach(i -> {
66+
reportBuilder.add(i);
67+
String ic = inlineReportBuilder.issue(i).build();
68+
LOG.error(ic);
69+
String filePath = i.componentKey().replace(projectKey, "").substring(1);
70+
LOG.error(filePath);
71+
try {
72+
differentialClient.postInlineComment(diffID, filePath, i.line(), ic);
73+
} catch (ConduitException e) {
74+
LOG.error(e.getMessage());
75+
}
76+
});
77+
}
78+
LOG.error(reportBuilder.buildReport());
79+
differentialClient.postComment(diff.getRevisionId(), reportBuilder.buildReport());
80+
} catch (ConduitException e) {
81+
LOG.error(e.getMessage());
82+
}
83+
}
84+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,17 @@
11
package io.nthienan.phdiff.report;
22

3+
import org.sonar.api.batch.postjob.issue.PostJobIssue;
4+
5+
import java.util.List;
6+
37
/**
48
* Created on 12-Jul-17.
59
*
610
* @author nthienan
711
*/
812
public interface InlineReportBuilder {
13+
14+
InlineReportBuilder issue(PostJobIssue issue);
15+
16+
String build();
917
}

src/main/java/io/nthienan/phdiff/report/RemarkupUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public String message(String message) {
102102
}
103103

104104
public String rule(String ruleKey) {
105-
return link(String.format("%s/coding_rules#rule_key=%s",
105+
return link(String.format("%scoding_rules#rule_key=%s",
106106
this.ruleUrlPrefix, encodeForUrl(ruleKey)), "View rule");
107107
}
108108

src/main/kotlin/io/nthienan/phdiff/Application.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ open class Application {
2222

2323
@PostMapping
2424
fun test(): Diff {
25-
differentialClient.postComment("1", "**SonarQube** analysis reported **5** issues" +
26-
"- 1 Blocker issue ({icon bug color=red})\\n- 1 Critical issue ({icon arrow-circle-up color=red})\\n- 1 Major issue ({icon chevron-circle-up color=red})\\n- 1 Minor issue ({icon info-circle color=green})\\n- 1 Info issue ({icon chevron-circle-down color=green})\\n**Details as below**:\\n{icon bug color=red} //Line 15// - `src/main/java/com/tma/dc4b/ci/MyBadImpl.java`: A \"NullPointerException\" could be thrown; \"str\" is nullable here. [[ http://192.168.88.57:9000/coding_rules#rule_key=squid%3AS2259 | View rule ]]\\n{icon arrow-circle-up color=red} //Line 15// - `src/main/java/com/tma/dc4b/ci/MyBadImpl.java`: A \"NullPointerException\" could be thrown; \"str\" is nullable here. [[ http://192.168.88.57:9000/coding_rules#rule_key=squid%3AS2259 | View rule ]]\\n{icon chevron-circle-up color=red} //Line 15// - `src/main/java/com/tma/dc4b/ci/MyBadImpl.java`: A \"NullPointerException\" could be thrown; \"str\" is nullable here. [[ http://192.168.88.57:9000/coding_rules#rule_key=squid%3AS2259 | View rule ]]\\n{icon info-circle color=green} //Line 15// - `src/main/java/com/tma/dc4b/ci/MyBadImpl.java`: A \"NullPointerException\" could be thrown; \"str\" is nullable here. [[ http://192.168.88.57:9000/coding_rules#rule_key=squid%3AS2259 | View rule ]]\\n{icon chevron-circle-down color=green} //Line 15// - `src/main/java/com/tma/dc4b/ci/MyBadImpl.java`: A \"NullPointerException\" could be thrown; \"str\" is nullable here. [[ http://192.168.88.57:9000/coding_rules#rule_key=squid%3AS2259 | View rule ]]")
25+
differentialClient.postInlineComment("2", "src/main/java/io/nthienan/ci/MyBadImpl.java",
26+
21, "{icon chevron-circle-up color=red} \"str\" is already a string, there's no need to call \"toString()\" on it. [[http://localhost:9000//coding_rules#rule_key=S1858|View rule]]")
2727
return differentialClient.fetchDiff("1")
2828
}
2929

src/main/kotlin/io/nthienan/phdiff/conduit/DifferentialClient.kt

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,20 @@ class DifferentialClient(val conduitClient: ConduitClient) {
2525
@Throws(IOException::class, ConduitException::class)
2626
fun postComment(revisionID: String, message: String, silent: Boolean, action: String): JSONObject {
2727
var params = JSONObject()
28-
params.put("revision_id", revisionID)
29-
params.put("action", action)
30-
params.put("message", message)
31-
params.put("silent", silent)
28+
.put("revision_id", revisionID)
29+
.put("action", action)
30+
.put("message", message)
31+
.put("silent", silent)
32+
.put("attach_inlines", true)
3233
return conduitClient.perform("differential.createcomment", params)
3334
}
3435

3536
/**
3637
* Fetch a differential from Conduit
3738
* @return the Conduit API response
38-
* @throws IOException if there is a network error talking to Conduit
3939
* @throws ConduitException if any error is experienced talking to Conduit
4040
*/
41-
@Throws(IOException::class, ConduitException::class)
41+
@Throws(ConduitException::class)
4242
fun fetchDiff(diffID: String): Diff {
4343
val params = JSONObject().put("ids", arrayOf(diffID))
4444
val query = conduitClient.perform("differential.querydiffs", params)
@@ -67,10 +67,9 @@ class DifferentialClient(val conduitClient: ConduitClient) {
6767
* @param revisionID the revision ID (e.g. "D1234" without the "D")
6868
* @param message the string message to post
6969
* @return the Conduit API response
70-
* @throws IOException if there is a network error talking to Conduit
7170
* @throws ConduitException if any error is experienced talking to Conduit
7271
*/
73-
@Throws(ConduitException::class, IOException::class)
72+
@Throws(ConduitException::class)
7473
fun postComment(revisionID: String, message: String): JSONObject {
7574
return postComment(revisionID, message, true, "none")
7675
}
@@ -92,4 +91,22 @@ class DifferentialClient(val conduitClient: ConduitClient) {
9291
return query.getString("result")
9392
}
9493

94+
/**
95+
* Add an inline comment to a Differential revision.
96+
* @param diffID ID of the diff
97+
* @param file The path of file commented
98+
* @param line line number that will be commented
99+
* @param message the message
100+
* @throws ConduitException
101+
*/
102+
@Throws(ConduitException::class)
103+
fun postInlineComment(diffID: String, file: String, line: Int, message: String) {
104+
val params = JSONObject().put("diffID", diffID)
105+
.put("filePath", file)
106+
.put("isNewFile", true)
107+
.put("lineNumber", line)
108+
.put("content", message)
109+
conduitClient.perform("differential.createinline", params)
110+
}
111+
95112
}

src/main/kotlin/io/nthienan/phdiff/differential/Diff.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package io.nthienan.phdiff.differential
22

3-
import java.util.*
3+
import java.util.Date
44

55
/**
66
* Created on 18/07/2017.
@@ -14,4 +14,8 @@ class Diff {
1414
var branch: String = ""
1515
var unitStatus: Int = 0
1616
var lintStatus: Int = 0
17+
18+
fun getFormatedRevisionID(): String {
19+
return "D$revisionId"
20+
}
1721
}

0 commit comments

Comments
 (0)