*/
package org.sonar.xoo.extensions;
+import java.io.File;
import org.sonar.api.batch.bootstrap.ProjectBuilder;
import org.sonar.api.batch.bootstrap.ProjectDefinition;
import org.sonar.api.config.Settings;
-import java.io.File;
-
public class XooProjectBuilder extends ProjectBuilder {
private Settings settings;
return;
}
ProjectDefinition root = context.projectReactor().getRoot();
+ root.resetSources();
ProjectDefinition module = ProjectDefinition.create()
.setKey(root.getKey() + ":module1")
return sensorStrategy.isGlobal() ? projectRelativePath : moduleRelativePath;
}
+ public String getModuleRelativePath() {
+ return moduleRelativePath;
+ }
+
+ public String getProjectRelativePath() {
+ return projectRelativePath;
+ }
+
@Override
public String absolutePath() {
return PathUtils.sanitize(path().toString());
return indexedFile.relativePath();
}
+ public String getModuleRelativePath() {
+ return indexedFile.getModuleRelativePath();
+ }
+
+ public String getProjectRelativePath() {
+ return indexedFile.getProjectRelativePath();
+ }
+
@Override
public String absolutePath() {
return indexedFile.absolutePath();
package org.sonar.api.scan.issue.filter;
import java.util.Date;
-
import javax.annotation.CheckForNull;
import javax.annotation.concurrent.ThreadSafe;
-
import org.sonar.api.rule.RuleKey;
/**
@CheckForNull
Double gap();
+ /**
+ * @deprecated since 6.6 useless
+ */
+ @Deprecated
Date creationDate();
String projectKey();
.setStatus(InputFile.Status.ADDED)
.setCharset(StandardCharsets.ISO_8859_1);
- assertThat(inputFile.relativePath()).isEqualTo(MODULE_RELATIVE_PATH);
- assertThat(new File(inputFile.relativePath())).isRelative();
assertThat(inputFile.absolutePath()).endsWith("Foo.php");
assertThat(inputFile.filename()).isEqualTo("Foo.php");
assertThat(inputFile.uri()).hasPath(baseDir.resolve(PROJECT_RELATIVE_PATH).toUri().getPath());
assertThat(inputFile.lines()).isEqualTo(42);
assertThat(inputFile.charset()).isEqualTo(StandardCharsets.ISO_8859_1);
+ assertThat(inputFile.getModuleRelativePath()).isEqualTo(MODULE_RELATIVE_PATH);
+ assertThat(inputFile.getProjectRelativePath()).isEqualTo(PROJECT_RELATIVE_PATH);
+
+ assertThat(inputFile.relativePath()).isEqualTo(MODULE_RELATIVE_PATH);
+ assertThat(new File(inputFile.relativePath())).isRelative();
sensorStrategy.setGlobal(true);
assertThat(inputFile.relativePath()).isEqualTo(PROJECT_RELATIVE_PATH);
+ assertThat(new File(inputFile.relativePath())).isRelative();
}
@Test
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.internal.TestInputFileBuilder;
import org.sonar.api.batch.sensor.internal.SensorStorage;
-import org.sonar.api.config.Settings;
import org.sonar.api.config.internal.MapSettings;
import static org.assertj.core.api.Assertions.assertThat;
tokens.addToken(INPUT_FILE.newRange(1, 2, 1, 5), "foo");
fail("Expected exception");
} catch (Exception e) {
- assertThat(e).hasMessage("Tokens of file [moduleKey=foo, relative=src/Foo.java, basedir=foo] should be provided in order.\n" +
+ assertThat(e).hasMessage("Tokens of file src/Foo.java should be provided in order.\n" +
"Previous token: Range[from [line=1, lineOffset=6] to [line=1, lineOffset=10]]\n" +
"Last token: Range[from [line=1, lineOffset=2] to [line=1, lineOffset=5]]");
}
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.Collections;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.sonar.api.batch.ScannerSide;
-import org.sonar.api.batch.fs.IndexedFile;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.fs.InputFile.Type;
import org.sonar.api.batch.fs.InputFileFilter;
}
String parentRelativePath = getParentRelativePath(inputFile);
synchronized (this) {
- indexFileAndParentDir(inputFile, parentRelativePath);
progress.markAsIndexed(inputFile);
+ indexFileAndParentDir(inputFile, parentRelativePath);
}
LOG.debug("'{}' indexed {}with language '{}'", relativePath, type == Type.TEST ? "as test " : "", inputFile.language());
inputFileBuilder.checkMetadata(inputFile);
}
private class Progress {
- private final Set<Path> indexed = new HashSet<>();
+ private AtomicInteger indexedCount = new AtomicInteger(0);
private AtomicInteger excludedByPatternsCount = new AtomicInteger(0);
- void markAsIndexed(IndexedFile inputFile) {
- if (indexed.contains(inputFile.path())) {
+ void markAsIndexed(DefaultInputFile inputFile) {
+ if (componentStore.getFile(inputFile.getProjectRelativePath()) != null) {
throw MessageException.of("File " + inputFile + " can't be indexed twice. Please check that inclusion/exclusion patterns produce "
+ "disjoint sets for main and test files");
}
- indexed.add(inputFile.path());
- progressReport.message(indexed.size() + " " + pluralizeFiles(indexed.size()) + " indexed... (last one was " + inputFile.relativePath() + ")");
+ int count = indexedCount.incrementAndGet();
+ progressReport.message(count + " " + pluralizeFiles(count) + " indexed... (last one was " + inputFile.relativePath() + ")");
}
void increaseExcludedByPatternsCount() {
}
int count() {
- return indexed.size();
+ return indexedCount.get();
}
}
public InputComponentStore remove(InputFile inputFile) {
DefaultInputFile file = (DefaultInputFile) inputFile;
- inputFileCache.remove(file.moduleKey(), inputFile.relativePath());
+ inputFileCache.remove(file.moduleKey(), file.getModuleRelativePath());
return this;
}
public InputComponentStore put(InputFile inputFile) {
DefaultInputFile file = (DefaultInputFile) inputFile;
addToLanguageCache(file);
- inputFileCache.put(file.moduleKey(), inputFile.relativePath(), inputFile);
- globalInputFileCache.put(getProjectRelativePath(file), inputFile);
+ inputFileCache.put(file.moduleKey(), file.getModuleRelativePath(), inputFile);
+ globalInputFileCache.put(file.getProjectRelativePath(), inputFile);
inputComponents.put(inputFile.key(), inputFile);
filesByNameCache.put(inputFile.filename(), inputFile);
filesByExtensionCache.put(FileExtensionPredicate.getExtension(inputFile), inputFile);
public InputComponentStore put(InputDir inputDir) {
DefaultInputDir dir = (DefaultInputDir) inputDir;
inputDirCache.put(dir.moduleKey(), inputDir.relativePath(), inputDir);
+ // FIXME an InputDir can be already indexed by another module
globalInputDirCache.put(getProjectRelativePath(dir), inputDir);
inputComponents.put(inputDir.key(), inputDir);
return this;
}
- private String getProjectRelativePath(DefaultInputFile file) {
- return PathResolver.relativePath(getProjectBaseDir(), file.path());
- }
-
private String getProjectRelativePath(DefaultInputDir dir) {
return PathResolver.relativePath(getProjectBaseDir(), dir.path());
}
@Test
public void validateLineGreaterThanZero() {
- thrown.expectMessage("Line number should be positive for file [moduleKey=foo, relative=src/foo.php, basedir=foo].");
+ thrown.expectMessage("Line number should be positive for file src/foo.php.");
fileLineMeasures.setIntValue(HITS_METRIC_KEY, 0, 2);
}
@Test
public void validateLineLowerThanLineCount() {
- thrown.expectMessage("Line 4 is out of range for file [moduleKey=foo, relative=src/foo.php, basedir=foo]. File has 3 lines");
+ thrown.expectMessage("Line 4 is out of range for file src/foo.php. File has 3 lines");
fileLineMeasures.setIntValue(HITS_METRIC_KEY, 4, 2);
}
FileUtils.write(xooFile, "Sample xoo\ncontent");
thrown.expect(MessageException.class);
- thrown.expectMessage("can't be indexed twice. Please check that inclusion/exclusion patterns produce disjoint sets for main and test files");
+ thrown.expectMessage("File src/sample.xoo can't be indexed twice. Please check that inclusion/exclusion patterns produce disjoint sets for main and test files");
tester.newTask()
.properties(builder
.put("sonar.sources", "src,src/sample.xoo")
.build())
.execute();
+ }
+
+ // SONAR-9574
+ @Test
+ public void failForDuplicateInputFileInDifferentModules() throws IOException {
+ File srcDir = new File(baseDir, "module1/src");
+ srcDir.mkdir();
+
+ File xooFile = new File(srcDir, "sample.xoo");
+ FileUtils.write(xooFile, "Sample xoo\ncontent");
+
+ thrown.expect(MessageException.class);
+ thrown.expectMessage("File module1/src/sample.xoo can't be indexed twice. Please check that inclusion/exclusion patterns produce disjoint sets for main and test files");
+ tester.newTask()
+ .properties(builder
+ .put("sonar.sources", "module1/src")
+ .put("sonar.modules", "module1")
+ .put("module1.sonar.sources", "src")
+ .build())
+ .execute();
}
assertThat(result.inputFiles()).hasSize(1);
}
- @Test
- public void detectDuplicatedFilesInDifferentModules() throws IOException {
- File srcDir = new File(baseDir, "module1/src");
- srcDir.mkdir();
-
- File xooFile = new File(srcDir, "sample.xoo");
- FileUtils.write(xooFile, "Sample xoo\ncontent");
-
- TaskResult result = tester.newTask()
- .properties(builder
- .put("sonar.sources", "module1/src")
- .put("sonar.modules", "module1")
- .put("module1.sonar.sources", "src")
- .build())
- .execute();
-
- assertThat(result.inputFiles()).hasSize(1);
- }
}
}
private File prepareProject() throws IOException {
- File baseDir = temp.getRoot();
+ File baseDir = temp.newFolder();
File module1Dir = new File(baseDir, "module1");
module1Dir.mkdir();
import java.io.IOException;
import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
import java.nio.file.Path;
import org.junit.Before;
import org.junit.Rule;
.setBaseDir(baseDir.toFile())
.setWorkDir(workDir.toFile())
.setKey("root"), 0);
+ Path moduleBaseDir = baseDir.resolve("module1");
+ Files.createDirectories(moduleBaseDir);
DefaultInputModule module = new DefaultInputModule(ProjectDefinition.create()
- .setBaseDir(baseDir.resolve("module1").toFile())
+ .setBaseDir(moduleBaseDir.toFile())
.setWorkDir(workDir.toFile())
.setKey("module1"), 0);