diff --git a/src/main/java/org/sonar/plugins/scm/svn/SvnBlameCommand.java b/src/main/java/org/sonar/plugins/scm/svn/SvnBlameCommand.java index 52c6ebd..1c07a7b 100644 --- a/src/main/java/org/sonar/plugins/scm/svn/SvnBlameCommand.java +++ b/src/main/java/org/sonar/plugins/scm/svn/SvnBlameCommand.java @@ -72,6 +72,8 @@ public void blame(final BlameInput input, final BlameOutput output) { private void blame(SVNClientManager clientManager, FileSystem fs, InputFile inputFile, BlameOutput output) { String filename = inputFile.relativePath(); + LOG.debug("Annotate file {}", filename); + AnnotationHandler handler = new AnnotationHandler(); try { SVNStatusClient statusClient = clientManager.getStatusClient(); @@ -112,10 +114,14 @@ public SVNClientManager getClientManager() { ISVNOptions options = SVNWCUtil.createDefaultOptions(true); String password = configuration.password(); final char[] passwordValue = password != null ? password.toCharArray() : null; + String passPhrase = configuration.passPhrase(); + final char[] passPhraseValue = passPhrase != null ? passPhrase.toCharArray() : null; ISVNAuthenticationManager authManager = SVNWCUtil.createDefaultAuthenticationManager( null, configuration.username(), passwordValue, + configuration.privateKey(), + passPhraseValue, false); return SVNClientManager.newInstance(options, authManager); } diff --git a/src/main/java/org/sonar/plugins/scm/svn/SvnConfiguration.java b/src/main/java/org/sonar/plugins/scm/svn/SvnConfiguration.java index 084b6bb..4033281 100644 --- a/src/main/java/org/sonar/plugins/scm/svn/SvnConfiguration.java +++ b/src/main/java/org/sonar/plugins/scm/svn/SvnConfiguration.java @@ -20,6 +20,9 @@ package org.sonar.plugins.scm.svn; import com.google.common.collect.ImmutableList; +import java.io.File; +import java.util.List; +import javax.annotation.CheckForNull; import org.sonar.api.BatchComponent; import org.sonar.api.CoreProperties; import org.sonar.api.PropertyType; @@ -28,16 +31,14 @@ import org.sonar.api.config.Settings; import org.sonar.api.resources.Qualifiers; -import javax.annotation.CheckForNull; - -import java.util.List; - @InstantiationStrategy(InstantiationStrategy.PER_BATCH) public class SvnConfiguration implements BatchComponent { private static final String CATEGORY_SVN = "SVN"; public static final String USER_PROP_KEY = "sonar.svn.username"; + public static final String PRIVATE_KEY_PATH_PROP_KEY = "sonar.svn.privateKeyPath"; public static final String PASSWORD_PROP_KEY = "sonar.svn.password.secured"; + public static final String PASSPHRASE_PROP_KEY = "sonar.svn.passphrase.secured"; private final Settings settings; public SvnConfiguration(Settings settings) { @@ -63,6 +64,24 @@ public static List getProperties() { .category(CoreProperties.CATEGORY_SCM) .subCategory(CATEGORY_SVN) .index(1) + .build(), + PropertyDefinition.builder(PRIVATE_KEY_PATH_PROP_KEY) + .name("Path to private key file") + .description("Used only for SVN+SSH authentication") + .type(PropertyType.STRING) + .onQualifiers(Qualifiers.PROJECT) + .category(CoreProperties.CATEGORY_SCM) + .subCategory(CATEGORY_SVN) + .index(2) + .build(), + PropertyDefinition.builder(PASSPHRASE_PROP_KEY) + .name("Passphrase") + .description("Optional passphrase to be used for SVN+SSH authentication") + .type(PropertyType.PASSWORD) + .onQualifiers(Qualifiers.PROJECT) + .category(CoreProperties.CATEGORY_SCM) + .subCategory(CATEGORY_SVN) + .index(3) .build()); } @@ -76,4 +95,14 @@ public String password() { return settings.getString(PASSWORD_PROP_KEY); } + @CheckForNull + public File privateKey() { + return settings.hasKey(PRIVATE_KEY_PATH_PROP_KEY) ? new File(settings.getString(PRIVATE_KEY_PATH_PROP_KEY)) : null; + } + + @CheckForNull + public String passPhrase() { + return settings.getString(PASSPHRASE_PROP_KEY); + } + }