aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/sonar-git-plugin/src/main/java/org/sonar/plugins/scm/git/JGitBlameCommand.java19
-rw-r--r--plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/GitScmProviderTest.java3
-rw-r--r--plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/JGitBlameCommandTest.java77
-rw-r--r--plugins/sonar-git-plugin/test-repos/dummy-git-nested.zipbin0 -> 60535 bytes
4 files changed, 86 insertions, 13 deletions
diff --git a/plugins/sonar-git-plugin/src/main/java/org/sonar/plugins/scm/git/JGitBlameCommand.java b/plugins/sonar-git-plugin/src/main/java/org/sonar/plugins/scm/git/JGitBlameCommand.java
index 0e4b43d67bc..6c15a8c871f 100644
--- a/plugins/sonar-git-plugin/src/main/java/org/sonar/plugins/scm/git/JGitBlameCommand.java
+++ b/plugins/sonar-git-plugin/src/main/java/org/sonar/plugins/scm/git/JGitBlameCommand.java
@@ -21,12 +21,15 @@ package org.sonar.plugins.scm.git;
import org.eclipse.jgit.api.Git;
import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryBuilder;
import org.sonar.api.BatchComponent;
import org.sonar.api.batch.InstantiationStrategy;
import org.sonar.api.batch.fs.FileSystem;
import org.sonar.api.batch.fs.InputFile;
import org.sonar.api.batch.scm.BlameCommand;
import org.sonar.api.batch.scm.BlameLine;
+import org.sonar.api.scan.filesystem.PathResolver;
import java.io.File;
import java.io.IOException;
@@ -36,14 +39,26 @@ import java.util.List;
@InstantiationStrategy(InstantiationStrategy.PER_BATCH)
public class JGitBlameCommand implements BlameCommand, BatchComponent {
+ private final PathResolver pathResolver;
+
+ public JGitBlameCommand(PathResolver pathResolver) {
+ this.pathResolver = pathResolver;
+ }
+
@Override
public void blame(FileSystem fs, Iterable<InputFile> files, BlameResult result) {
Git git = null;
File basedir = fs.baseDir();
try {
- git = Git.open(basedir);
+ Repository repo = new RepositoryBuilder()
+ .findGitDir(basedir)
+ .setMustExist(true)
+ .build();
+ git = Git.wrap(repo);
+ File gitBaseDir = repo.getWorkTree();
for (InputFile inputFile : files) {
- String filename = inputFile.relativePath();
+
+ String filename = pathResolver.relativePath(gitBaseDir, inputFile.file());
org.eclipse.jgit.blame.BlameResult blameResult = git.blame().setFilePath(filename).call();
List<BlameLine> lines = new ArrayList<BlameLine>();
for (int i = 0; i < blameResult.getResultContents().size(); i++) {
diff --git a/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/GitScmProviderTest.java b/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/GitScmProviderTest.java
index 97450a991fa..87f8f56a3e6 100644
--- a/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/GitScmProviderTest.java
+++ b/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/GitScmProviderTest.java
@@ -25,6 +25,7 @@ import org.junit.rules.ExpectedException;
import org.junit.rules.TemporaryFolder;
import org.sonar.api.config.PropertyDefinitions;
import org.sonar.api.config.Settings;
+import org.sonar.api.scan.filesystem.PathResolver;
import java.io.File;
import java.io.IOException;
@@ -46,7 +47,7 @@ public class GitScmProviderTest {
@Test
public void selectImplem() {
GitBlameCommand blameCommand = new GitBlameCommand();
- JGitBlameCommand jblameCommand = new JGitBlameCommand();
+ JGitBlameCommand jblameCommand = new JGitBlameCommand(new PathResolver());
Settings settings = new Settings(new PropertyDefinitions(new GitPlugin().getExtensions()));
GitScmProvider gitScmProvider = new GitScmProvider(settings, blameCommand, jblameCommand);
diff --git a/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/JGitBlameCommandTest.java b/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/JGitBlameCommandTest.java
index 9831bb787ee..20b96962f83 100644
--- a/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/JGitBlameCommandTest.java
+++ b/plugins/sonar-git-plugin/src/test/java/org/sonar/plugins/scm/git/JGitBlameCommandTest.java
@@ -31,6 +31,7 @@ import org.sonar.api.batch.fs.internal.DefaultFileSystem;
import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.batch.scm.BlameCommand.BlameResult;
import org.sonar.api.batch.scm.BlameLine;
+import org.sonar.api.scan.filesystem.PathResolver;
import org.sonar.api.utils.DateUtils;
import java.io.File;
@@ -48,6 +49,8 @@ import static org.mockito.Mockito.verify;
public class JGitBlameCommandTest {
+ private static final String DUMMY_JAVA = "src/main/java/org/dummy/Dummy.java";
+
@Rule
public ExpectedException thrown = ExpectedException.none();
@@ -59,11 +62,13 @@ public class JGitBlameCommandTest {
File projectDir = temp.newFolder();
javaUnzip(new File("test-repos/dummy-git.zip"), projectDir);
- JGitBlameCommand jGitBlameCommand = new JGitBlameCommand();
+ JGitBlameCommand jGitBlameCommand = new JGitBlameCommand(new PathResolver());
DefaultFileSystem fs = new DefaultFileSystem();
- fs.setBaseDir(new File(projectDir, "dummy-git"));
- DefaultInputFile inputFile = new DefaultInputFile("foo", "src/main/java/org/dummy/Dummy.java");
+ File baseDir = new File(projectDir, "dummy-git");
+ fs.setBaseDir(baseDir);
+ DefaultInputFile inputFile = new DefaultInputFile("foo", DUMMY_JAVA)
+ .setFile(new File(baseDir, DUMMY_JAVA));
fs.add(inputFile);
BlameResult blameResult = mock(BlameResult.class);
@@ -100,7 +105,56 @@ public class JGitBlameCommandTest {
new BlameLine(revisionDate, revision, author),
new BlameLine(revisionDate, revision, author),
new BlameLine(revisionDate, revision, author)));
+ }
+
+ @Test
+ public void testBlameOnNestedModule() throws IOException {
+ File projectDir = temp.newFolder();
+ javaUnzip(new File("test-repos/dummy-git-nested.zip"), projectDir);
+
+ JGitBlameCommand jGitBlameCommand = new JGitBlameCommand(new PathResolver());
+
+ DefaultFileSystem fs = new DefaultFileSystem();
+ File baseDir = new File(projectDir, "dummy-git-nested/dummy-project");
+ fs.setBaseDir(baseDir);
+ DefaultInputFile inputFile = new DefaultInputFile("foo", DUMMY_JAVA)
+ .setFile(new File(baseDir, DUMMY_JAVA));
+ fs.add(inputFile);
+ BlameResult blameResult = mock(BlameResult.class);
+ jGitBlameCommand.blame(fs, Arrays.<InputFile>asList(inputFile), blameResult);
+
+ Date revisionDate = DateUtils.parseDateTime("2012-07-17T16:12:48+0200");
+ String revision = "6b3aab35a3ea32c1636fee56f996e677653c48ea";
+ String author = "david@gageot.net";
+ verify(blameResult).add(inputFile,
+ Arrays.asList(
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author),
+ new BlameLine(revisionDate, revision, author)));
}
@Test
@@ -108,13 +162,14 @@ public class JGitBlameCommandTest {
File projectDir = temp.newFolder();
javaUnzip(new File("test-repos/dummy-git.zip"), projectDir);
- JGitBlameCommand jGitBlameCommand = new JGitBlameCommand();
+ JGitBlameCommand jGitBlameCommand = new JGitBlameCommand(new PathResolver());
DefaultFileSystem fs = new DefaultFileSystem();
File baseDir = new File(projectDir, "dummy-git");
fs.setBaseDir(baseDir);
- String relativePath = "src/main/java/org/dummy/Dummy.java";
- DefaultInputFile inputFile = new DefaultInputFile("foo", relativePath);
+ String relativePath = DUMMY_JAVA;
+ DefaultInputFile inputFile = new DefaultInputFile("foo", relativePath)
+ .setFile(new File(baseDir, relativePath));
fs.add(inputFile);
// Emulate a modification
@@ -132,16 +187,18 @@ public class JGitBlameCommandTest {
File projectDir = temp.newFolder();
javaUnzip(new File("test-repos/dummy-git.zip"), projectDir);
- JGitBlameCommand jGitBlameCommand = new JGitBlameCommand();
+ JGitBlameCommand jGitBlameCommand = new JGitBlameCommand(new PathResolver());
DefaultFileSystem fs = new DefaultFileSystem();
File baseDir = new File(projectDir, "dummy-git");
fs.setBaseDir(baseDir);
- String relativePath = "src/main/java/org/dummy/Dummy.java";
+ String relativePath = DUMMY_JAVA;
String relativePath2 = "src/main/java/org/dummy/Dummy2.java";
- DefaultInputFile inputFile = new DefaultInputFile("foo", relativePath);
+ DefaultInputFile inputFile = new DefaultInputFile("foo", relativePath)
+ .setFile(new File(baseDir, relativePath));
fs.add(inputFile);
- DefaultInputFile inputFile2 = new DefaultInputFile("foo", relativePath2);
+ DefaultInputFile inputFile2 = new DefaultInputFile("foo", relativePath2)
+ .setFile(new File(baseDir, relativePath2));
fs.add(inputFile2);
// Emulate a new file
diff --git a/plugins/sonar-git-plugin/test-repos/dummy-git-nested.zip b/plugins/sonar-git-plugin/test-repos/dummy-git-nested.zip
new file mode 100644
index 00000000000..b0ee03b6b16
--- /dev/null
+++ b/plugins/sonar-git-plugin/test-repos/dummy-git-nested.zip
Binary files differ