diff options
author | Julien HENRY <julien.henry@sonarsource.com> | 2014-10-06 17:36:29 +0200 |
---|---|---|
committer | Julien HENRY <julien.henry@sonarsource.com> | 2014-10-06 17:40:24 +0200 |
commit | 46886205f918fb2066968d096f2561dde5db5eaa (patch) | |
tree | fc2a8c79f43d0c2340e35a01de77725be8c0e0ce /plugins | |
parent | f64d211e0d1b77adcd21421d18de2dcf3f51d23d (diff) | |
download | sonarqube-46886205f918fb2066968d096f2561dde5db5eaa.tar.gz sonarqube-46886205f918fb2066968d096f2561dde5db5eaa.zip |
SONAR-5677 Fix support of Git project not at the root of repository tree
Diffstat (limited to 'plugins')
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 Binary files differnew file mode 100644 index 00000000000..b0ee03b6b16 --- /dev/null +++ b/plugins/sonar-git-plugin/test-repos/dummy-git-nested.zip |