748f0d26b18a07c2477758ebc37c39bbf62243b6 .../java/hudson/plugins/sonar/SonarPublisher.java | 30 +++++++++++++++++++--- .../hudson/plugins/sonar/utils/SonarMaven.java | 10 ++++++-- .../hudson/plugins/sonar/utils/SonarUtils.java | 10 ++++++++ .../plugins/sonar/SonarPublisher/config.jelly | 10 +++++++- .../plugins/sonar/SonarPublisher/config.properties | 3 ++- src/main/webapp/help-escape-branch.html | 8 ++++++ 6 files changed, 63 insertions(+), 8 deletions(-) diff --git a/src/main/java/hudson/plugins/sonar/SonarPublisher.java b/src/main/java/hudson/plugins/sonar/SonarPublisher.java index 41998bd..379d863 100644 --- a/src/main/java/hudson/plugins/sonar/SonarPublisher.java +++ b/src/main/java/hudson/plugins/sonar/SonarPublisher.java @@ -85,6 +85,13 @@ public class SonarPublisher extends Notifier { private String branch; /** + * Optional + * + * Indicates if the branch string specified should have invalid characters replaced with _ + */ + private boolean escapeBranch; + + /** * Optional. * * @since 1.6 @@ -144,37 +151,40 @@ public class SonarPublisher extends Notifier { String installationName, TriggersConfig triggers, String jobAdditionalProperties, String mavenOpts) { - this(installationName, null, null, triggers, jobAdditionalProperties, mavenOpts, null, null, null); + this(installationName, null, false, null, triggers, jobAdditionalProperties, mavenOpts, null, null, null); } public SonarPublisher(String installationName, TriggersConfig triggers, String jobAdditionalProperties, String mavenOpts, String mavenInstallationName, String rootPom) { - this(installationName, null, null, triggers, jobAdditionalProperties, mavenOpts, mavenInstallationName, rootPom, null); + this(installationName, null, false, null, triggers, jobAdditionalProperties, mavenOpts, mavenInstallationName, rootPom, null); } public SonarPublisher(String installationName, String branch, + boolean escapeBranch, String language, TriggersConfig triggers, String jobAdditionalProperties, String mavenOpts, String mavenInstallationName, String rootPom) { - this(installationName, branch, language, triggers, jobAdditionalProperties, mavenOpts, mavenInstallationName, rootPom, null); + this(installationName, branch, escapeBranch, language, triggers, jobAdditionalProperties, mavenOpts, mavenInstallationName, rootPom, null); } public SonarPublisher(String installationName, String branch, + boolean escapeBranch, String language, TriggersConfig triggers, String jobAdditionalProperties, String mavenOpts, String mavenInstallationName, String rootPom, String jdk) { - this(installationName, branch, language, triggers, jobAdditionalProperties, mavenOpts, mavenInstallationName, rootPom, jdk, null, null, false); + this(installationName, branch, escapeBranch, language, triggers, jobAdditionalProperties, mavenOpts, mavenInstallationName, rootPom, jdk, null, null, false); } @DataBoundConstructor public SonarPublisher(String installationName, String branch, + boolean escapeBranch, String language, TriggersConfig triggers, String jobAdditionalProperties, String mavenOpts, @@ -182,6 +192,7 @@ public class SonarPublisher extends Notifier { super(); this.installationName = installationName; this.branch = branch; + this.escapeBranch = escapeBranch; this.language = language; this.jdk = jdk; // Triggers @@ -251,6 +262,17 @@ public class SonarPublisher extends Notifier { } /** + * @return escapeBranch + */ + public boolean isEscapeBranch(){ + return escapeBranch; + } + + public void setEscapeBranch(boolean escapeBranch){ + this.escapeBranch = escapeBranch; + } + + /** * @return triggers configuration */ public TriggersConfig getTriggers() { diff --git a/src/main/java/hudson/plugins/sonar/utils/SonarMaven.java b/src/main/java/hudson/plugins/sonar/utils/SonarMaven.java index e715b94..7e4b602 100644 --- a/src/main/java/hudson/plugins/sonar/utils/SonarMaven.java +++ b/src/main/java/hudson/plugins/sonar/utils/SonarMaven.java @@ -92,8 +92,14 @@ public final class SonarMaven extends Maven { argsBuilder.appendMasked("sonar.jdbc.username", getInstallation().getDatabaseLogin()); argsBuilder.appendMasked("sonar.jdbc.password", getInstallation().getDatabasePassword()); argsBuilder.append("sonar.host.url", getInstallation().getServerUrl()); - - argsBuilder.append("sonar.branch", publisher.getBranch()); + + if(publisher.isEscapeBranch()){ + EnvVars envVars = build.getEnvironment(listener); + argsBuilder.append("sonar.branch", SonarUtils.escapeInvalidBranchCharacters(envVars.expand(publisher.getBranch()))); + } else { + argsBuilder.append("sonar.branch", publisher.getBranch()); + } + argsBuilder.append("sonar.language", publisher.getLanguage()); if (StringUtils.isNotBlank(getInstallation().getSonarLogin())) { diff --git a/src/main/java/hudson/plugins/sonar/utils/SonarUtils.java b/src/main/java/hudson/plugins/sonar/utils/SonarUtils.java index 4b5300e..9b92ec2 100644 --- a/src/main/java/hudson/plugins/sonar/utils/SonarUtils.java +++ b/src/main/java/hudson/plugins/sonar/utils/SonarUtils.java @@ -79,4 +79,14 @@ public final class SonarUtils { } return null; } + + /** + * Escapes characters not found in the regex [^0-9a-zA-Z:-_\\.:] + * http://jira.codehaus.org/browse/SONAR-4188 - for valid character regex + * @param branch name to clean + * @return cleaned up branch name + */ + public static String escapeInvalidBranchCharacters(String branchName){ + return branchName.replaceAll("[^0-9a-zA-Z:-_\\.:]", "_"); + } } diff --git a/src/main/resources/hudson/plugins/sonar/SonarPublisher/config.jelly b/src/main/resources/hudson/plugins/sonar/SonarPublisher/config.jelly index beafb50..b7f70a9 100644 --- a/src/main/resources/hudson/plugins/sonar/SonarPublisher/config.jelly +++ b/src/main/resources/hudson/plugins/sonar/SonarPublisher/config.jelly @@ -14,7 +14,7 @@ - +