Skip to content

Commit 396837b

Browse files
committed
Merge pull request #89 from christ66/JENKINS-22568
[FIXED JENKINS-22568] Subversion polling does not work with parameters.
2 parents 7fecc42 + 9affb65 commit 396837b

File tree

2 files changed

+119
-84
lines changed

2 files changed

+119
-84
lines changed

src/main/java/hudson/scm/SubversionSCM.java

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,10 @@
6565
import hudson.Launcher;
6666
import hudson.Util;
6767
import hudson.init.InitMilestone;
68-
import hudson.model.AbstractDescribableImpl;
69-
import hudson.model.Descriptor;
70-
import hudson.model.Item;
71-
import hudson.model.ItemGroup;
72-
import hudson.model.ModelObject;
73-
import hudson.model.TaskListener;
74-
import hudson.model.AbstractBuild;
75-
import hudson.model.AbstractProject;
76-
import hudson.model.Hudson;
68+
import hudson.model.*;
7769

7870
import java.io.ByteArrayOutputStream;
71+
import java.net.URLClassLoader;
7972
import java.nio.charset.UnsupportedCharsetException;
8073
import java.security.KeyStore;
8174
import java.security.KeyStoreException;
@@ -90,8 +83,6 @@
9083
import hudson.util.ListBoxModel;
9184
import jenkins.model.Jenkins;
9285
import jenkins.model.Jenkins.MasterComputer;
93-
import hudson.model.ParametersAction;
94-
import hudson.model.Run;
9586
import hudson.remoting.Callable;
9687
import hudson.remoting.Channel;
9788
import hudson.remoting.VirtualChannel;
@@ -194,7 +185,6 @@
194185
import com.trilead.ssh2.DebugLogger;
195186
import com.trilead.ssh2.SCPClient;
196187
import com.trilead.ssh2.crypto.Base64;
197-
import hudson.model.Job;
198188

199189
/**
200190
* Subversion SCM.
@@ -1402,7 +1392,7 @@ else if (project.getLastBuild()!=null) {
14021392
for (ModuleLocation loc: getLocations()) {
14031393
String url;
14041394
try {
1405-
url = loc.getSVNURL().toDecodedString();
1395+
url = loc.getExpandedLocation(project).getSVNURL().toDecodedString();
14061396
} catch (SVNException ex) {
14071397
ex.printStackTrace(listener.error(Messages.SubversionSCM_pollChanges_exception(loc.getURL())));
14081398
return BUILD_NOW;
@@ -2907,6 +2897,32 @@ public static List<ModuleLocation> parse(String[] remoteLocations, String[] cred
29072897
return modules;
29082898
}
29092899

2900+
/**
2901+
* If a subversion remote uses $VAR or ${VAR} as a parameterized build,
2902+
* we expand the url. This will expand using the DEFAULT item. If there
2903+
* is a choice parameter, it will expand with the FIRST item.
2904+
*/
2905+
public ModuleLocation getExpandedLocation(Job<?, ?> project) {
2906+
String url = this.getURL();
2907+
String returnURL = url;
2908+
for (JobProperty property : project.getProperties().values()) {
2909+
if (property instanceof ParametersDefinitionProperty) {
2910+
ParametersDefinitionProperty pdp = (ParametersDefinitionProperty) property;
2911+
for (String propertyName : pdp.getParameterDefinitionNames()) {
2912+
if (url.contains(propertyName)) {
2913+
ParameterDefinition pd = pdp.getParameterDefinition(propertyName);
2914+
String replacement = String.valueOf(pd.getDefaultParameterValue().createVariableResolver(null).resolve(propertyName));
2915+
returnURL = returnURL.replace("${" + propertyName + "}", replacement);
2916+
returnURL = returnURL.replace("$" + propertyName, replacement);
2917+
}
2918+
}
2919+
}
2920+
}
2921+
2922+
return new ModuleLocation(returnURL, credentialsId, getLocalDir(), getDepthOption(),
2923+
isIgnoreExternalsOption());
2924+
}
2925+
29102926
@Extension
29112927
public static class DescriptorImpl extends Descriptor<ModuleLocation> {
29122928

@@ -3082,12 +3098,12 @@ public FormValidation doCheckLocal(@QueryParameter String value) throws IOExcept
30823098
/**
30833099
* Property to control whether SCM polling happens from the slave or master
30843100
*/
3085-
private static boolean POLL_FROM_MASTER = Boolean.getBoolean(SubversionSCM.class.getName()+".pollFromMaster");
3101+
private static boolean POLL_FROM_MASTER = Boolean.getBoolean(SubversionSCM.class.getName() + ".pollFromMaster");
30863102

30873103
/**
30883104
* If set to non-null, read configuration from this directory instead of "~/.subversion".
30893105
*/
3090-
public static String CONFIG_DIR = System.getProperty(SubversionSCM.class.getName()+".configDir");
3106+
public static String CONFIG_DIR = System.getProperty(SubversionSCM.class.getName() + ".configDir");
30913107

30923108
/**
30933109
* Enables trace logging of Ganymed SSH library.

src/test/java/hudson/scm/SubversionSCMTest.java

Lines changed: 88 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -25,83 +25,36 @@
2525
*/
2626
package hudson.scm;
2727

28-
import static hudson.scm.SubversionSCM.compareSVNAuthentications;
29-
import static org.jvnet.hudson.test.recipes.PresetData.DataSet.ANONYMOUS_READONLY;
30-
3128
import com.cloudbees.plugins.credentials.Credentials;
3229
import com.cloudbees.plugins.credentials.CredentialsScope;
3330
import com.cloudbees.plugins.credentials.SystemCredentialsProvider;
3431
import com.cloudbees.plugins.credentials.domains.Domain;
3532
import com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl;
33+
import com.gargoylesoftware.htmlunit.*;
34+
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
35+
import com.gargoylesoftware.htmlunit.html.HtmlForm;
36+
import com.gargoylesoftware.htmlunit.html.HtmlPage;
37+
import hudson.EnvVars;
3638
import hudson.FilePath;
3739
import hudson.Launcher;
3840
import hudson.Proc;
39-
import hudson.model.BuildListener;
40-
import hudson.model.FreeStyleBuild;
41-
import hudson.model.Item;
42-
import hudson.model.Result;
43-
import hudson.model.TaskListener;
44-
import hudson.model.AbstractBuild;
45-
import hudson.model.AbstractProject;
46-
import hudson.model.Cause;
47-
import hudson.model.FreeStyleProject;
48-
import hudson.model.ParametersAction;
49-
import hudson.model.Run;
50-
import hudson.model.StringParameterValue;
41+
import hudson.model.*;
5142
import hudson.scm.ChangeLogSet.Entry;
5243
import hudson.scm.SubversionSCM.ModuleLocation;
5344
import hudson.scm.browsers.Sventon;
54-
import hudson.scm.subversion.CheckoutUpdater;
55-
import hudson.scm.subversion.UpdateUpdater;
56-
import hudson.scm.subversion.UpdateWithCleanUpdater;
57-
import hudson.scm.subversion.UpdateWithRevertUpdater;
58-
import hudson.scm.subversion.WorkspaceUpdater;
45+
import hudson.scm.subversion.*;
5946
import hudson.slaves.DumbSlave;
6047
import hudson.triggers.SCMTrigger;
6148
import hudson.util.FormValidation;
6249
import hudson.util.StreamTaskListener;
63-
64-
import java.io.BufferedReader;
65-
import java.io.File;
66-
import java.io.FileReader;
67-
import java.io.IOException;
68-
import java.io.PrintWriter;
69-
import java.net.MalformedURLException;
70-
import java.net.URL;
71-
import java.nio.charset.Charset;
72-
import java.util.ArrayList;
73-
import java.util.Arrays;
74-
import java.util.Collection;
75-
import java.util.Collections;
76-
import java.util.Date;
77-
import java.util.List;
78-
import java.util.concurrent.Callable;
79-
import java.util.concurrent.ExecutionException;
80-
import java.util.concurrent.Future;
81-
8250
import org.dom4j.Document;
8351
import org.dom4j.io.DOMReader;
8452
import org.junit.Test;
85-
import org.jvnet.hudson.test.Bug;
86-
import org.jvnet.hudson.test.Email;
53+
import org.jvnet.hudson.test.*;
8754
import org.jvnet.hudson.test.HudsonHomeLoader.CopyExisting;
88-
import org.jvnet.hudson.test.TestBuilder;
89-
import org.jvnet.hudson.test.Url;
90-
import org.jvnet.hudson.test.CaptureEnvironmentBuilder;
9155
import org.jvnet.hudson.test.recipes.PresetData;
92-
import org.tmatesoft.svn.core.SVNCancelException;
93-
import org.tmatesoft.svn.core.SVNDepth;
94-
import org.tmatesoft.svn.core.SVNErrorCode;
95-
import org.tmatesoft.svn.core.SVNErrorMessage;
96-
import org.tmatesoft.svn.core.SVNException;
97-
import org.tmatesoft.svn.core.SVNPropertyValue;
98-
import org.tmatesoft.svn.core.SVNURL;
99-
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
100-
import org.tmatesoft.svn.core.auth.SVNAuthentication;
101-
import org.tmatesoft.svn.core.auth.SVNPasswordAuthentication;
102-
import org.tmatesoft.svn.core.auth.SVNSSHAuthentication;
103-
import org.tmatesoft.svn.core.auth.SVNSSLAuthentication;
104-
import org.tmatesoft.svn.core.auth.SVNUserNameAuthentication;
56+
import org.tmatesoft.svn.core.*;
57+
import org.tmatesoft.svn.core.auth.*;
10558
import org.tmatesoft.svn.core.internal.wc.admin.SVNAdminAreaFactory;
10659
import org.tmatesoft.svn.core.io.SVNRepository;
10760
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
@@ -110,18 +63,17 @@
11063
import org.tmatesoft.svn.core.wc.SVNStatus;
11164
import org.tmatesoft.svn.core.wc.SVNWCUtil;
11265

113-
import com.gargoylesoftware.htmlunit.ElementNotFoundException;
114-
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
115-
import com.gargoylesoftware.htmlunit.HttpMethod;
116-
import com.gargoylesoftware.htmlunit.WebConnection;
117-
import com.gargoylesoftware.htmlunit.WebRequestSettings;
118-
import com.gargoylesoftware.htmlunit.WebResponse;
119-
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
120-
import com.gargoylesoftware.htmlunit.html.HtmlForm;
121-
import com.gargoylesoftware.htmlunit.html.HtmlPage;
122-
import hudson.EnvVars;
123-
import hudson.model.EnvironmentContributor;
124-
import hudson.model.TopLevelItem;
66+
import java.io.*;
67+
import java.net.MalformedURLException;
68+
import java.net.URL;
69+
import java.nio.charset.Charset;
70+
import java.util.*;
71+
import java.util.concurrent.Callable;
72+
import java.util.concurrent.ExecutionException;
73+
import java.util.concurrent.Future;
74+
75+
import static hudson.scm.SubversionSCM.compareSVNAuthentications;
76+
import static org.jvnet.hudson.test.recipes.PresetData.DataSet.ANONYMOUS_READONLY;
12577

12678
/**
12779
* @author Kohsuke Kawaguchi
@@ -344,6 +296,73 @@ public void testRevisionParameter() throws Exception {
344296
assertBuildStatus(Result.SUCCESS,b);
345297
}
346298

299+
@Bug(22568)
300+
public void testPollingWithDefaultParametersWithCurlyBraces() throws Exception {
301+
FreeStyleProject p = createFreeStyleProject();
302+
303+
String url = "http://svn.codehaus.org/sxc/tags/sxc-0.5/sxc-core/src/test/java/com/envoisolutions/sxc/builder/";
304+
p.setScm(new SubversionSCM("${REPO}" + url.substring(10)));
305+
String var = url.substring(0, 10);
306+
ParametersDefinitionProperty property = new ParametersDefinitionProperty(new StringParameterDefinition("REPO", var));
307+
p.addProperty(property);
308+
309+
FreeStyleBuild b = p.scheduleBuild2(0, new Cause.UserIdCause(),
310+
new ParametersAction(new StringParameterValue("REPO", var))).get();
311+
312+
assertBuildStatus(Result.SUCCESS,b);
313+
assertTrue(b.getWorkspace().child("Node.java").exists());
314+
315+
// as a baseline, this shouldn't detect any change
316+
TaskListener listener = createTaskListener();
317+
PollingResult poll = p.poll(listener);
318+
assertFalse("Polling shouldn't have any changes.", poll.hasChanges());
319+
}
320+
321+
@Bug(22568)
322+
public void testPollingWithDefaultParametersWithOutCurlyBraces() throws Exception {
323+
FreeStyleProject p = createFreeStyleProject();
324+
325+
String url = "http://svn.codehaus.org/sxc/tags/sxc-0.5/sxc-core/src/test/java/com/envoisolutions/sxc/builder/";
326+
p.setScm(new SubversionSCM("$REPO" + url.substring(10)));
327+
String var = url.substring(0, 10);
328+
ParametersDefinitionProperty property = new ParametersDefinitionProperty(new StringParameterDefinition("REPO", var));
329+
p.addProperty(property);
330+
331+
FreeStyleBuild b = p.scheduleBuild2(0, new Cause.UserIdCause(),
332+
new ParametersAction(new StringParameterValue("REPO", var))).get();
333+
334+
assertBuildStatus(Result.SUCCESS,b);
335+
assertTrue(b.getWorkspace().child("Node.java").exists());
336+
337+
// as a baseline, this shouldn't detect any change
338+
TaskListener listener = createTaskListener();
339+
PollingResult poll = p.poll(listener);
340+
assertFalse("Polling shouldn't have any changes.", poll.hasChanges());
341+
}
342+
343+
@Bug(22568)
344+
public void testPollingWithChoiceParametersWithOutCurlyBraces() throws Exception {
345+
FreeStyleProject p = createFreeStyleProject();
346+
347+
String url = "http://svn.codehaus.org/sxc/tags/sxc-0.5/sxc-core/src/test/java/com/envoisolutions/sxc/builder/";
348+
p.setScm(new SubversionSCM("${REPO}" + url.substring(10)));
349+
String var = url.substring(0, 10);
350+
ParametersDefinitionProperty property = new ParametersDefinitionProperty(new ChoiceParameterDefinition("REPO", new String[] {var, "test"}, ""));
351+
p.addProperty(property);
352+
353+
FreeStyleBuild b = p.scheduleBuild2(0, new Cause.UserIdCause(),
354+
new ParametersAction(new StringParameterValue("REPO", var))).get();
355+
356+
assertBuildStatus(Result.SUCCESS,b);
357+
assertTrue(b.getWorkspace().child("Node.java").exists());
358+
359+
// as a baseline, this shouldn't detect any change
360+
TaskListener listener = createTaskListener();
361+
PollingResult poll = p.poll(listener);
362+
assertFalse("Polling shouldn't have any changes.", poll.hasChanges());
363+
}
364+
365+
347366
public void testRevisionParameterFolding() throws Exception {
348367
FreeStyleProject p = createFreeStyleProject();
349368
String url = "https://svn.jenkins-ci.org/trunk/hudson/test-projects/trivial-ant";

0 commit comments

Comments
 (0)