Skip to content

Override workdir to avoid having to copy files into a RW directory #32

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Oct 13, 2017
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -39,4 +39,4 @@ RUN gradle clean build -x test

USER app
WORKDIR /code
CMD cp -R /code /tmp/ && /usr/src/app/build/codeclimate-sonar /tmp/code /config.json
CMD ["/usr/src/app/build/codeclimate-sonar", "/code", "/config.json"]
4 changes: 2 additions & 2 deletions src/main/java/cc/App.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package cc;

import cc.analysis.SonarLintFactory;
import cc.files.Finder;
import org.sonarlint.cli.EngineWrapper;
import org.sonarlint.cli.InputFileFinder;
import org.sonarlint.cli.Options;
import org.sonarlint.cli.analysis.SonarLintFactory;
import org.sonarlint.cli.config.ConfigurationReader;
import org.sonarlint.cli.report.ReportFactory;
import org.sonarlint.cli.util.System2;
@@ -30,7 +30,7 @@ public static void execute(System2 system) {
InputFileFinder fileFinder = new Finder(config.getIncludePaths(), config.getTestsPatterns(), charset);
ReportFactory reportFactory = new cc.report.ReportFactory(charset);
ConfigurationReader reader = new ConfigurationReader();
SonarLintFactory sonarLintFactory = new SonarLintFactory(reader);
SonarLintFactory sonarLintFactory = new SonarLintFactory(reader, config.getSonarlintDir());
Path projectHome = getProjectHome(system);

int exitCode = new EngineWrapper(new Options(), sonarLintFactory, reportFactory, fileFinder, projectHome).run();
7 changes: 7 additions & 0 deletions src/main/java/cc/Config.java
Original file line number Diff line number Diff line change
@@ -7,6 +7,8 @@

import java.io.FileReader;
import java.nio.charset.Charset;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;

@@ -17,6 +19,7 @@ public class Config {
private class EngineConfig {
String charset;
List<String> testsPatterns;
String sonarlintDir;
}

public List<String> getIncludePaths() {
@@ -31,6 +34,10 @@ public String getTestsPatterns() {
return joinPatterns(config.testsPatterns);
}

public Path getSonarlintDir() {
return Paths.get("/tmp/sonarlint");
}

String joinPatterns(List<String> patterns) {
if (patterns == null) {
return null;
34 changes: 34 additions & 0 deletions src/main/java/cc/analysis/SonarLintFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package cc.analysis;

import org.sonarlint.cli.analysis.LogOutputWrapper;
import org.sonarlint.cli.analysis.SonarLint;
import org.sonarlint.cli.config.ConfigurationReader;
import org.sonarlint.cli.util.Logger;
import org.sonarsource.sonarlint.core.StandaloneSonarLintEngineImpl;
import org.sonarsource.sonarlint.core.client.api.standalone.StandaloneGlobalConfiguration;
import org.sonarsource.sonarlint.core.client.api.standalone.StandaloneSonarLintEngine;

import java.nio.file.Path;

public class SonarLintFactory extends org.sonarlint.cli.analysis.SonarLintFactoryWrapper {
private static final Logger LOGGER = Logger.get();
private Path workDir;

public SonarLintFactory(ConfigurationReader reader, Path workDir) {
super(reader);
this.workDir = workDir;
}

@Override
public SonarLint createSonarLint(Path projectHome, boolean mustBeConnected, boolean verbose) {
LOGGER.info("Standalone mode");

StandaloneGlobalConfiguration config = StandaloneGlobalConfiguration.builder()
.addPlugins(plugins())
.setLogOutput(new LogOutputWrapper(LOGGER, verbose))
.build();

StandaloneSonarLintEngine engine = new StandaloneSonarLintEngineImpl(config);
return new StandaloneSonarLint(engine, workDir);
}
}
39 changes: 39 additions & 0 deletions src/main/java/cc/analysis/StandaloneSonarLint.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package cc.analysis;

import org.sonarlint.cli.analysis.IssueCollector;
import org.sonarlint.cli.report.ReportFactory;
import org.sonarsource.sonarlint.core.client.api.common.analysis.AnalysisResults;
import org.sonarsource.sonarlint.core.client.api.common.analysis.ClientInputFile;
import org.sonarsource.sonarlint.core.client.api.standalone.StandaloneAnalysisConfiguration;
import org.sonarsource.sonarlint.core.client.api.standalone.StandaloneSonarLintEngine;
import org.sonarsource.sonarlint.core.tracking.IssueTrackable;
import org.sonarsource.sonarlint.core.tracking.Trackable;

import java.nio.file.Path;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class StandaloneSonarLint extends org.sonarlint.cli.analysis.StandaloneSonarLint {
private StandaloneSonarLintEngine engine;
private Path workDir;

public StandaloneSonarLint(StandaloneSonarLintEngine engine, Path workDir) {
super(engine);
this.engine = engine;
this.workDir = workDir;
}

@Override
protected void doAnalysis(Map<String, String> properties, ReportFactory reportFactory, List<ClientInputFile> inputFiles, Path baseDirPath) {
Date start = new Date();

IssueCollector collector = new IssueCollector();
StandaloneAnalysisConfiguration config = new StandaloneAnalysisConfiguration(baseDirPath, workDir, inputFiles, properties);
AnalysisResults result = engine.analyze(config, collector);
Collection<Trackable> trackables = collector.get().stream().map(IssueTrackable::new).collect(Collectors.toList());
generateReports(trackables, result, reportFactory, baseDirPath.getFileName().toString(), baseDirPath, start);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.sonarlint.cli.analysis;

import org.sonarlint.cli.util.Logger;

public class LogOutputWrapper extends DefaultLogOutput {
public LogOutputWrapper(Logger logger, boolean verbose) {
super(logger, verbose);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.sonarlint.cli.analysis;

import org.sonarlint.cli.config.ConfigurationReader;

import java.net.URL;

public class SonarLintFactoryWrapper extends SonarLintFactory {
public SonarLintFactoryWrapper(ConfigurationReader configurationReader) {
super(configurationReader);
}

public URL[] plugins() {
try {
return loadPlugins();
} catch (Exception e) {
throw new IllegalStateException("Error loading plugins", e);
}
}
}
7 changes: 7 additions & 0 deletions src/test/java/cc/ConfigTest.java
Original file line number Diff line number Diff line change
@@ -3,6 +3,7 @@
import org.junit.Test;

import java.nio.charset.Charset;
import java.nio.file.Paths;

import static org.assertj.core.api.Assertions.assertThat;

@@ -43,4 +44,10 @@ public void null_tests_patterns_does_not_cause_error() throws Exception {
Config config = Config.gson().fromJson("{\"config\":{}}", Config.class);
assertThat(config.getTestsPatterns()).isNull();
}

@Test
public void has_default_work_dir() throws Exception {
Config config = Config.gson().fromJson("{}", Config.class);
assertThat(config.getSonarlintDir()).isEqualTo(Paths.get("/tmp/sonarlint"));
}
}