Author: evenisse Date: Sun Sep 24 06:36:00 2006 New Revision: 449403 URL: http://svn.apache.org/viewvc?view=rev&rev=449403 Log: [SCM-217] Fix svn+ssh svn urls with username Submitted by: Jerome Lacoste
Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/SvnCommandUtils.java (with props) maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/SvnCommandUtilsTest.java (with props) Modified: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/checkout/SvnCheckOutCommand.java maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnTagCommand.java maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnExeTagCommandTckTest.java Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/SvnCommandUtils.java URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/SvnCommandUtils.java?view=auto&rev=449403 ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/SvnCommandUtils.java (added) +++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/SvnCommandUtils.java Sun Sep 24 06:36:00 2006 @@ -0,0 +1,51 @@ +package org.apache.maven.scm.provider.svn; + +/* + * Copyright 2001-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.codehaus.plexus.util.StringUtils; + +/** + * Command utilities for svn commands. + * + * @author <a href="mailto:[EMAIL PROTECTED]">Jerome Lacoste</a> + * @version $Id$ + */ +public class SvnCommandUtils +{ + + /** + * Add or overrides the username into a url with a svn+ssh scheme. + * + * Svn 1.3.1 doesn't use the username information specified by --username when the url + * uses the svn+ssh scheme. This allows to fix it. See MRELEASE-35. + * + * @param url the url, not <code>null</code> + * @param username the username, may be <code>null</code> + * @return the fixed url + * @throws NullPointerException if url is <code>null</code> + */ + public static String fixUrl( String url, String username ) + { + if ( ! StringUtils.isEmpty(username) && url.startsWith( "svn+ssh://" ) ) { + // is there a username to override ? If so we cut after + int idx = url.indexOf( '@' ); + int cutIdx = idx < 0 ? "svn+ssh://".length() : idx + 1; + url = "svn+ssh://" + username + "@" + url.substring( cutIdx ); + } + return url; + } +} Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/SvnCommandUtils.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/SvnCommandUtils.java ------------------------------------------------------------------------------ svn:keywords = "Author Date Id Revision" Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/SvnCommandUtilsTest.java URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/SvnCommandUtilsTest.java?view=auto&rev=449403 ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/SvnCommandUtilsTest.java (added) +++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/SvnCommandUtilsTest.java Sun Sep 24 06:36:00 2006 @@ -0,0 +1,79 @@ +package org.apache.maven.scm.provider.svn; + +/* + * Copyright 2001-2006 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import org.apache.maven.scm.ScmTestCase; + +/** + * @author <a href="mailto:[EMAIL PROTECTED]">Jerome Lacoste</a> + * @version $Id$ + */ +public class SvnCommandUtilsTest + extends ScmTestCase +{ + // ---------------------------------------------------------------------- + // appendPath + // ---------------------------------------------------------------------- + + public void testFixUrlHttpUrlsAreIgnored() + throws Exception + { + String unchanged = "http://foo.com/svn/myproject/tags/foo"; + assertEquals( unchanged, + SvnCommandUtils.fixUrl( unchanged, null ) ); + assertEquals( unchanged, + SvnCommandUtils.fixUrl( unchanged, "" ) ); + assertEquals( unchanged, + SvnCommandUtils.fixUrl( unchanged, "user" ) ); + } + + public void testFixUrlNPEifNullURL() + throws Exception + { + try + { + SvnCommandUtils.fixUrl( null, "user" ); + fail("expected NPE"); + } + catch ( NullPointerException e ) + { + assertTrue(true); // expected + } + } + + public void testFixUrlSvnSshUrlsUsernameIsAddedWhenUserSpecified() + throws Exception + { + assertEquals( "svn+ssh://foo.com/svn/myproject", + SvnCommandUtils.fixUrl( "svn+ssh://foo.com/svn/myproject", null ) ); + assertEquals( "svn+ssh://foo.com/svn/myproject", + SvnCommandUtils.fixUrl( "svn+ssh://foo.com/svn/myproject", "" ) ); + assertEquals( "svn+ssh://[EMAIL PROTECTED]/svn/myproject", + SvnCommandUtils.fixUrl( "svn+ssh://foo.com/svn/myproject", "user" ) ); + } + + public void testFixUrlSvnSshUrlsUsernameIsOverridenWhenUserSpecified() + throws Exception + { + assertEquals( "svn+ssh://[EMAIL PROTECTED]/svn/myproject", + SvnCommandUtils.fixUrl( "svn+ssh://[EMAIL PROTECTED]/svn/myproject", null ) ); + assertEquals( "svn+ssh://[EMAIL PROTECTED]/svn/myproject", + SvnCommandUtils.fixUrl( "svn+ssh://[EMAIL PROTECTED]/svn/myproject", "" ) ); + assertEquals( "svn+ssh://[EMAIL PROTECTED]/svn/myproject", + SvnCommandUtils.fixUrl( "svn+ssh://[EMAIL PROTECTED]/svn/myproject", "user2" ) ); + } +} Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/SvnCommandUtilsTest.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/SvnCommandUtilsTest.java ------------------------------------------------------------------------------ svn:keywords = "Author Date Id Revision" Modified: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/checkout/SvnCheckOutCommand.java URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/checkout/SvnCheckOutCommand.java?view=diff&rev=449403&r1=449402&r2=449403 ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/checkout/SvnCheckOutCommand.java (original) +++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/checkout/SvnCheckOutCommand.java Sun Sep 24 06:36:00 2006 @@ -22,6 +22,7 @@ import org.apache.maven.scm.command.checkout.CheckOutScmResult; import org.apache.maven.scm.provider.ScmProviderRepository; import org.apache.maven.scm.provider.svn.SvnTagBranchUtils; +import org.apache.maven.scm.provider.svn.SvnCommandUtils; import org.apache.maven.scm.provider.svn.command.SvnCommand; import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository; import org.apache.maven.scm.provider.svn.svnexe.command.SvnCommandLineUtils; @@ -51,6 +52,8 @@ { url = SvnTagBranchUtils.resolveTagUrl( repository, tag ); } + + url = SvnCommandUtils.fixUrl( url, repository.getUser() ); // TODO: revision Commandline cl = createCommandLine( repository, fileSet.getBasedir(), null, url ); Modified: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnTagCommand.java URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnTagCommand.java?view=diff&rev=449403&r1=449402&r2=449403 ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnTagCommand.java (original) +++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnTagCommand.java Sun Sep 24 06:36:00 2006 @@ -25,6 +25,7 @@ import org.apache.maven.scm.command.tag.TagScmResult; import org.apache.maven.scm.provider.ScmProviderRepository; import org.apache.maven.scm.provider.svn.SvnTagBranchUtils; +import org.apache.maven.scm.provider.svn.SvnCommandUtils; import org.apache.maven.scm.provider.svn.command.SvnCommand; import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository; import org.apache.maven.scm.provider.svn.svnexe.command.SvnCommandLineUtils; @@ -131,7 +132,7 @@ // // ---------------------------------------------------------------------- - private static Commandline createCommandLine( SvnScmProviderRepository repository, File workingDirectory, + public static Commandline createCommandLine( SvnScmProviderRepository repository, File workingDirectory, String tag, File messageFile ) { Commandline cl = SvnCommandLineUtils.getBaseSvnCommandLine( workingDirectory, repository ); @@ -145,7 +146,8 @@ cl.createArgument().setValue( "." ); // Note: this currently assumes you have the tag base checked out too - cl.createArgument().setValue( SvnTagBranchUtils.resolveTagUrl( repository, tag ) ); + String tagUrl = SvnTagBranchUtils.resolveTagUrl( repository, tag ); + cl.createArgument().setValue( SvnCommandUtils.fixUrl( tagUrl, repository.getUser() ) ); return cl; } Modified: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnExeTagCommandTckTest.java URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnExeTagCommandTckTest.java?view=diff&rev=449403&r1=449402&r2=449403 ============================================================================== --- maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnExeTagCommandTckTest.java (original) +++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/test/java/org/apache/maven/scm/provider/svn/svnexe/command/tag/SvnExeTagCommandTckTest.java Sun Sep 24 06:36:00 2006 @@ -17,6 +17,13 @@ */ import org.apache.maven.scm.provider.svn.command.tag.SvnTagCommandTckTest; +import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository; +import org.apache.maven.scm.provider.svn.svnexe.command.changelog.SvnChangeLogCommand; +import org.apache.maven.scm.repository.ScmRepository; +import org.codehaus.plexus.util.cli.Commandline; + +import java.io.File; +import java.util.Date; /** * This test tests the tag command. @@ -27,4 +34,30 @@ public class SvnExeTagCommandTckTest extends SvnTagCommandTckTest { + public void testTagUserNameSvnSsh() + throws Exception + { + File messageFile = File.createTempFile( "maven-scm", "commit" ); + + testCommandLine( "scm:svn:svn+ssh://foo.com/svn/trunk", "svntag", messageFile, "user", + "svn --username user --non-interactive copy --file " + messageFile.getAbsolutePath() + + " . svn+ssh://[EMAIL PROTECTED]/svn/tags/svntag" ); + } + + private void testCommandLine( String scmUrl, String tag, File messageFile, String user, String commandLine ) + throws Exception + { + File workingDirectory = getTestFile( "target/svn-update-command-test" ); + + ScmRepository repository = getScmManager().makeScmRepository( scmUrl ); + + SvnScmProviderRepository svnRepository = (SvnScmProviderRepository) repository.getProviderRepository(); + + svnRepository.setUser( user ); + + Commandline cl = + SvnTagCommand.createCommandLine( svnRepository, workingDirectory, tag, messageFile ); + + assertEquals( commandLine, cl.toString() ); + } }