[...]
[INFO] --- sonar-maven-plugin:3.0.1:sonar (default-cli) @ my-test ---
[...]
[INFO] 0/3 files analyzed
[WARNING] Missing blame information for the following files:
[WARNING] * C:/workspace_452/my-test/src/main/java/com/company/HttpTestClient.java
[WARNING] * C:/workspace_452/my-test/src/test/java/com/company/HttpTestClientTest.java
[WARNING] * C:/workspace_452/my-test/src/main/java/com/company/CommandLineHelper.java
[WARNING] This may lead to missing/broken features in SonarQube
[INFO] Analysis report generated in C:\workspace_452\my-test\target\sonar\batch-report
[...]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.447 s
[INFO] Finished at: 2016-04-05T15:22:23+02:00
[INFO] Final Memory: 61M/339M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.0.1:sonar (default-cli) on project my-test: Error when executing blame for file src/main/java/com/company/CommandLineHelper.java: svn: E170001: Authentication required for '[Subversion 401 message]' -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.sonarsource.scanner.maven:sonar-maven-plugin:3.0.1:sonar (default-cli) on project my-test: Error when executing blame for file src/main/java/com/company/CommandLineHelper.java
[...]
Caused by: org.tmatesoft.svn.core.SVNAuthenticationException: svn: E170001: Authentication required for '[Subversion 401 message]'
at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.authenticationFailed(SVNErrorManager.java:47)
at org.tmatesoft.svn.core.internal.wc.SVNErrorManager.authenticationFailed(SVNErrorManager.java:41)
at org.tmatesoft.svn.core.internal.wc.DefaultSVNAuthenticationManager.getFirstAuthentication(DefaultSVNAuthenticationManager.java:203)
at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:716)
at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:398)
at org.tmatesoft.svn.core.internal.io.dav.http.HTTPConnection.request(HTTPConnection.java:386)
at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.performHttpRequest(DAVConnection.java:863)
at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.exchangeCapabilities(DAVConnection.java:699)
at org.tmatesoft.svn.core.internal.io.dav.DAVConnection.open(DAVConnection.java:118)
at org.tmatesoft.svn.core.internal.io.dav.DAVRepository.openConnection(DAVRepository.java:1049)
at org.tmatesoft.svn.core.internal.io.dav.DAVRepository.hasCapability(DAVRepository.java:877)
at org.tmatesoft.svn.core.io.SVNRepository.assertServerIsMergeInfoCapable(SVNRepository.java:787)
at org.tmatesoft.svn.core.io.SVNRepository.getFileRevisions(SVNRepository.java:756)
at org.tmatesoft.svn.core.internal.wc2.remote.SvnRemoteAnnotate.run(SvnRemoteAnnotate.java:111)
at org.tmatesoft.svn.core.internal.wc2.remote.SvnRemoteAnnotate.run(SvnRemoteAnnotate.java:35)
at org.tmatesoft.svn.core.internal.wc2.SvnOperationRunner.run(SvnOperationRunner.java:21)
at org.tmatesoft.svn.core.wc2.SvnOperationFactory.run(SvnOperationFactory.java:1235)
at org.tmatesoft.svn.core.wc2.SvnOperation.run(SvnOperation.java:294)
at org.tmatesoft.svn.core.wc.SVNLogClient.doAnnotate(SVNLogClient.java:295)
at org.sonar.plugins.scm.svn.SvnBlameCommand.blame(SvnBlameCommand.java:100)
[...]
...
%APPDATA%/Subversion/auth
On Windows machines name\password credentials are often stored encrypted. Unfortunately, SVNKit is not able to decrypt such credentials, therefore they are not used (just skipped).
SVNClientManager clientManager = SVNClientManager.newInstance(SVNWCUtil.createDefaultOptions(true), SVNWCUtil.createDefaultAuthenticationManager());
clientManager.getLogClient().doAnnotate(new File(directory, "pom.xml"), SVNRevision.UNDEFINED, SVNRevision.create(1), SVNRevision.BASE, true, true, null, null);
public class ProvideMavenScmSvnCredentialsExtension extends ProjectBuilder {
@Override
public void build(Context context) {
String scmUser = ...
String scmPassword = ...
// Fill credentials in root
context.projectReactor().getRoot().setProperty("sonar.svn.username", scmUser);
context.projectReactor().getRoot().setProperty("sonar.svn.password.secured", scmPassword);
// Perhaps better on all projects including modules ...
for (ProjectDefinition p : context.projectReactor().getProjects()) {
p.setProperty("sonar.svn.username", scmUser);
p.setProperty("sonar.svn.password.secured", scmPassword);
}
}
}
com.company.foo:bar-java-module.sonar.svn.username=myLogin
public class MyExtension extends ProjectBuilder {
private Settings settings;
public MyExtension(Settings settings) {
this.settings = settings;
}
@Override
public void build(Context context) {
this.settings.setProperty("sonar.svn.username", "myUser");
this.settings.setProperty("sonar.svn.password.secured", "myPassword");
}
}