diff --git a/core/src/main/java/hudson/model/Hudson.java b/core/src/main/java/hudson/model/Hudson.java index a30487d9f5d2d9775cd3d1cb1a20c29774a49279..3e7dbcf06453bddde62d8ab1fd8da70976c23620 100644 --- a/core/src/main/java/hudson/model/Hudson.java +++ b/core/src/main/java/hudson/model/Hudson.java @@ -29,6 +29,7 @@ import hudson.scm.RepositoryBrowsers; import hudson.scm.SCM; import hudson.scm.SCMDescriptor; import hudson.scm.SCMS; +import hudson.scm.SubversionWorkspaceSelector; import hudson.search.CollectionSearchIndex; import hudson.search.SearchIndexBuilder; import hudson.security.ACL; @@ -84,6 +85,7 @@ import org.kohsuke.stapler.StaplerProxy; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; import org.kohsuke.stapler.export.Exported; +import org.tmatesoft.svn.core.internal.wc.admin.SVNAdminAreaFactory; import javax.servlet.ServletContext; import javax.servlet.ServletException; @@ -343,6 +345,9 @@ public final class Hudson extends View implements ItemGroup, Node, LOGGER.log(Level.SEVERE, "Failed to load proxy configuration", e); } + // do this before we load plugins so that plugins can change the selector. + SVNAdminAreaFactory.setSelector(new SubversionWorkspaceSelector()); + // load plugins. pluginManager = new PluginManager(context); diff --git a/core/src/main/java/hudson/scm/SubversionWorkspaceSelector.java b/core/src/main/java/hudson/scm/SubversionWorkspaceSelector.java new file mode 100644 index 0000000000000000000000000000000000000000..9d5685a3abe29be1c0c8879695d9dd26010d463e --- /dev/null +++ b/core/src/main/java/hudson/scm/SubversionWorkspaceSelector.java @@ -0,0 +1,47 @@ +package hudson.scm; + +import org.tmatesoft.svn.core.SVNException; +import org.tmatesoft.svn.core.internal.wc.admin.ISVNAdminAreaFactorySelector; +import org.tmatesoft.svn.core.internal.wc.admin.SVNAdminArea14; +import org.tmatesoft.svn.core.internal.wc.admin.SVNAdminAreaFactory; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; + +/** + * {@link ISVNAdminAreaFactorySelector} that uses 1.4 compatible workspace for new check out, + * but still supports 1.5 workspace, if asked to work with it. + * + *

+ * Since there are many tools out there that still don't support Subversion 1.5 (including + * all the major Unix distributions that haven't bundled Subversion 1.5), using 1.4 as the + * default would reduce the likelihood of the user running into "this SVN client can't work + * with this workspace version..." problem when using other SVN tools. + * + *

+ * The primary scenario of this is the use of command-line SVN client, either from shell + * script, Ant, or Maven. + * + * @author Kohsuke Kawaguchi + */ +public class SubversionWorkspaceSelector implements ISVNAdminAreaFactorySelector { + public SubversionWorkspaceSelector() { + // don't upgrade the workspace. + SVNAdminAreaFactory.setUpgradeEnabled(false); + } + + @SuppressWarnings({"cast", "unchecked"}) + public Collection getEnabledFactories(File path, Collection factories, boolean writeAccess) throws SVNException { + if(!writeAccess) // for reading, use all our available factories + return factories; + + // for writing, use 1.4 + Collection enabledFactories = new ArrayList(); + for (SVNAdminAreaFactory factory : (Collection)factories) + if (factory.getSupportedVersion() == SVNAdminArea14.WC_FORMAT) + enabledFactories.add(factory); + + return enabledFactories; + } +}