You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm-commits@maven.apache.org by ev...@apache.org on 2006/02/26 12:17:05 UTC

svn commit: r381077 [2/6] - in /maven/scm/trunk/maven-scm-providers: ./ maven-scm-provider-svn/ maven-scm-providers-svn/ maven-scm-providers-svn/maven-scm-provider-svn-commons/ maven-scm-providers-svn/maven-scm-provider-svn-commons/src/ maven-scm-provi...

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/SvnTagBranchUtilsTest.java
URL: http://svn.apache.org/viewcvs/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/SvnTagBranchUtilsTest.java?rev=381077&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/SvnTagBranchUtilsTest.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/SvnTagBranchUtilsTest.java Sun Feb 26 03:16:52 2006
@@ -0,0 +1,318 @@
+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;
+import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
+import org.apache.maven.scm.repository.ScmRepository;
+
+/**
+ * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
+ * @version $Id$
+ */
+public class SvnTagBranchUtilsTest
+    extends ScmTestCase
+{
+    // ----------------------------------------------------------------------
+    // appendPath
+    // ----------------------------------------------------------------------
+
+    public void testAppendPath()
+        throws Exception
+    {
+        assertEquals( "http://foo.com/svn/myproject/tags/foo",
+                      SvnTagBranchUtils.appendPath( "http://foo.com/svn", "myproject/tags/foo" ) );
+    }
+
+    public void testAppendPathNullAddlPath()
+        throws Exception
+    {
+        assertEquals( "http://foo.com/svn", SvnTagBranchUtils.appendPath( "http://foo.com/svn", null ) );
+    }
+
+    public void testAppendPathNullAddlTrailingSlash()
+        throws Exception
+    {
+        assertEquals( "http://foo.com/svn", SvnTagBranchUtils.appendPath( "http://foo.com/svn/", null ) );
+    }
+
+    public void testAppendPathTrailingSlash()
+        throws Exception
+    {
+        assertEquals( "http://foo.com/svn/myproject/tags/foo",
+                      SvnTagBranchUtils.appendPath( "http://foo.com/svn/", "myproject/tags/foo" ) );
+    }
+
+    public void testAppendPathLeadingAndTrailingSlash()
+        throws Exception
+    {
+        assertEquals( "http://foo.com/svn/myproject/tags/foo",
+                      SvnTagBranchUtils.appendPath( "http://foo.com/svn/", "/myproject/tags/foo" ) );
+    }
+
+    // ----------------------------------------------------------------------
+    // getProjectRoot
+    // ----------------------------------------------------------------------
+
+    public void testGetProjectRootTagBranchTrunk()
+        throws Exception
+    {
+        // All of these should equate to the same project root
+        String[] paths = new String[]{"scm:svn:http://foo.com/svn/tags/my-tag", "scm:svn:http://foo.com/svn/tags",
+            "scm:svn:http://foo.com/svn/branches/my-branch", "scm:svn:http://foo.com/svn/branches",
+            "scm:svn:http://foo.com/svn/trunk", "scm:svn:http://foo.com/svn/trunk/some/path/to/some/file"};
+
+        for ( int i = 0; i < paths.length; i++ )
+        {
+            testGetProjectRoot( paths[i], "http://foo.com/svn" );
+        }
+    }
+
+    public void testGetProjectRootNoRootSpecifier()
+        throws Exception
+    {
+        testGetProjectRoot( "scm:svn:http://foo.com/svn/", "http://foo.com/svn" );
+
+        testGetProjectRoot( "scm:svn:http://foo.com/svn", "http://foo.com/svn" );
+
+        testGetProjectRoot( "scm:svn:http://foo.com/svn/ntags", "http://foo.com/svn/ntags" );
+
+        testGetProjectRoot( "scm:svn:http://foo.com/svn/nbranches", "http://foo.com/svn/nbranches" );
+    }
+
+    public void testGetProjectRootLooksLikeRootSpecifier()
+        throws Exception
+    {
+        testGetProjectRoot( "scm:svn:http://foo.com/svn/tagst", "http://foo.com/svn/tagst" );
+
+        testGetProjectRoot( "scm:svn:http://foo.com/svn/tagst/tags", "http://foo.com/svn/tagst" );
+
+        testGetProjectRoot( "scm:svn:http://foo.com/svn/branchess", "http://foo.com/svn/branchess" );
+
+    }
+
+    public void testGetProjectRootDoubleProjectRoots()
+        throws Exception
+    {
+        // Not sure why anyone would do this, but creating test case to assure it behavior stays consistent
+        testGetProjectRoot( "scm:svn:http://foo.com/svn/tags/my-tag/tags/another-tag/", "http://foo.com/svn" );
+    }
+
+    // ----------------------------------------------------------------------
+    // resolveTagUrl
+    // ----------------------------------------------------------------------
+
+    public void testResolveTagRelative()
+        throws Exception
+    {
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/", "my-tag", "http://foo.com/svn/tags/my-tag" );
+
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/trunk", "my-tag", "http://foo.com/svn/tags/my-tag" );
+
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/trunk/", "my-tag", "http://foo.com/svn/tags/my-tag" );
+
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/branches", "my-tag", "http://foo.com/svn/tags/my-tag" );
+
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/tags", "my-tag", "http://foo.com/svn/tags/my-tag" );
+    }
+
+    public void testResolveTagAbsolute()
+        throws Exception
+    {
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/", "http://foo.com/svn/branches/my-tag",
+                           "http://foo.com/svn/branches/my-tag" );
+
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/", "file://C://svn/some/crazy/path/my-tag",
+                           "file://C://svn/some/crazy/path/my-tag" );
+
+    }
+
+    public void testResolveTagViewCVS()
+        throws Exception
+    {
+        assertEquals( "http://foo.com/cgi-bin/viewcvs.cgi/svn/tags/my-tag?root=test", SvnTagBranchUtils.resolveTagUrl(
+            "http://foo.com/cgi-bin/viewcvs.cgi/svn/trunk/?root=test", "/my-tag/" ) );
+    }
+
+    public void testResolveTagWithSlashes()
+        throws Exception
+    {
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/", "/my-tag/", "http://foo.com/svn/tags/my-tag" );
+
+        testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "/my-branch/", "http://foo.com/svn/branches/my-branch" );
+
+        testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "http://foo.com/svn/myproject/branches/", "/my-branch/",
+                              "http://foo.com/svn/myproject/branches/my-branch" );
+    }
+
+    public void testResolveTagWithTagOverwritingBase()
+        throws Exception
+    {
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/", "branches/my-tag", "http://foo.com/svn/branches/my-tag" );
+
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/", "tags/my-tag", "http://foo.com/svn/tags/my-tag" );
+
+        // Not sure why you would ever specify a tag of /trunk/foo,
+        // but create the test case to assure consistent behavior in the future
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/", "trunk/my-tag", "http://foo.com/svn/trunk/my-tag" );
+
+        testResolveTagUrl( "scm:svn:svn+ssh://foo.com/svn/trunk/my_path/to/my_dir", "my-tag",
+                           "svn+ssh://foo.com/svn/tags/my-tag" );
+
+    }
+
+    public void testResolveTagWithTagBaseSpecified()
+        throws Exception
+    {
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/", "../tags", "my-tag", "../tags/my-tag" );
+
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/", "http://foo.com/svn/non-standard/tag/dir/", "my-tag",
+                           "http://foo.com/svn/non-standard/tag/dir/my-tag" );
+    }
+
+    public void testResolveTagLooksLikeOverwriteTagBase()
+        throws Exception
+    {
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/", "tagst/my-tag", "http://foo.com/svn/tags/tagst/my-tag" );
+
+        testResolveTagUrl( "scm:svn:http://foo.com/svn/", "metatags/my-tag",
+                           "http://foo.com/svn/tags/metatags/my-tag" );
+    }
+
+    public void testResolveBranchSimple()
+        throws Exception
+    {
+        testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "my-branch", "http://foo.com/svn/branches/my-branch" );
+
+        testResolveBranchUrl( "scm:svn:svn+ssh://foo.com/svn/trunk", "my-branch",
+                              "svn+ssh://foo.com/svn/branches/my-branch" );
+
+        testResolveBranchUrl( "scm:svn:svn+ssh://foo.com/svn/trunk/my_path/to/my_dir", "my-branch",
+                              "svn+ssh://foo.com/svn/branches/my-branch" );
+
+        testResolveBranchUrl( "scm:svn:http://foo.com/svn/trunk", "branches/my-branch",
+                              "http://foo.com/svn/branches/my-branch" );
+
+        testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "subbranches/my-branch",
+                              "http://foo.com/svn/branches/subbranches/my-branch" );
+
+    }
+
+    public void testResolveBranchTagBase()
+        throws Exception
+    {
+        testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "../branches", "my-branch", "../branches/my-branch" );
+
+        testResolveBranchUrl( "scm:svn:http://foo.com/svn/", "http://foo.com/svn/non-standard/branch/dir", "my-branch",
+                              "http://foo.com/svn/non-standard/branch/dir/my-branch" );
+    }
+
+    // ----------------------------------------------------------------------
+    // revisionArgument
+    // ----------------------------------------------------------------------
+
+    public void testIsRevisionArgumentSimple()
+    {
+        assertTrue( SvnTagBranchUtils.isRevisionSpecifier( "12345" ) );
+
+        assertTrue( SvnTagBranchUtils.isRevisionSpecifier( "hEaD" ) );
+
+        assertTrue( SvnTagBranchUtils.isRevisionSpecifier( "bAsE" ) );
+
+        assertTrue( SvnTagBranchUtils.isRevisionSpecifier( "cOmMiTtEd" ) );
+
+        assertTrue( SvnTagBranchUtils.isRevisionSpecifier( "pReV" ) );
+
+        assertTrue( SvnTagBranchUtils.isRevisionSpecifier( "{2005-1-1}" ) );
+
+    }
+
+    public void testIsRevisionArgumentRange()
+    {
+        assertTrue( SvnTagBranchUtils.isRevisionSpecifier( "12345:12345" ) );
+
+        assertTrue( SvnTagBranchUtils.isRevisionSpecifier( "1:2" ) );
+
+        assertTrue( SvnTagBranchUtils.isRevisionSpecifier( "hEaD:bAsE" ) );
+
+        assertTrue( SvnTagBranchUtils.isRevisionSpecifier( "BaSe:CoMmItTeD" ) );
+
+        assertTrue( SvnTagBranchUtils.isRevisionSpecifier( "{2004-1-1}:{2005-1-1}" ) );
+
+        assertFalse( SvnTagBranchUtils.isRevisionSpecifier( "BASE:" ) );
+        assertFalse( SvnTagBranchUtils.isRevisionSpecifier( ":BASE" ) );
+
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    private SvnScmProviderRepository getSvnRepository( String scmUrl )
+        throws Exception
+    {
+        ScmRepository repository = getScmManager().makeScmRepository( scmUrl );
+
+        return (SvnScmProviderRepository) repository.getProviderRepository();
+    }
+
+    private void testGetProjectRoot( String scmUrl, String expected )
+        throws Exception
+    {
+        assertEquals( expected, SvnTagBranchUtils.getProjectRoot( getSvnRepository( scmUrl ).getUrl() ) );
+    }
+
+    private void testResolveTagUrl( String scmUrl, String tag, String expected )
+        throws Exception
+    {
+        testResolveTagUrl( scmUrl, null, tag, expected );
+    }
+
+    private void testResolveTagUrl( String scmUrl, String tagBase, String tag, String expected )
+        throws Exception
+    {
+        SvnScmProviderRepository repository = getSvnRepository( scmUrl );
+
+        if ( tagBase != null )
+        {
+            repository.setTagBase( tagBase );
+        }
+
+        assertEquals( repository.getTagBase(), tagBase );
+        assertEquals( expected, SvnTagBranchUtils.resolveTagUrl( repository, tag ) );
+    }
+
+    private void testResolveBranchUrl( String scmUrl, String branch, String expected )
+        throws Exception
+    {
+        testResolveBranchUrl( scmUrl, null, branch, expected );
+    }
+
+    private void testResolveBranchUrl( String scmUrl, String tagBase, String branch, String expected )
+        throws Exception
+    {
+        SvnScmProviderRepository repository = getSvnRepository( scmUrl );
+        if ( tagBase != null )
+        {
+            repository.setTagBase( tagBase );
+        }
+
+        assertEquals( repository.getTagBase(), tagBase );
+        assertEquals( expected, SvnTagBranchUtils.resolveBranchUrl( repository, branch ) );
+    }
+
+}

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/SvnTagBranchUtilsTest.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/SvnTagBranchUtilsTest.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/TestSvnScmProvider.java
URL: http://svn.apache.org/viewcvs/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/TestSvnScmProvider.java?rev=381077&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/TestSvnScmProvider.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/TestSvnScmProvider.java Sun Feb 26 03:16:52 2006
@@ -0,0 +1,67 @@
+package org.apache.maven.scm.provider.svn;
+
+/*
+ * Copyright 2003-2005 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.provider.svn.command.SvnCommand;
+
+public class TestSvnScmProvider
+    extends AbstractSvnScmProvider
+{
+    protected SvnCommand getAddCommand()
+    {
+        return null;
+    }
+    
+    protected SvnCommand getChangeLogCommand()
+    {
+        return null;
+    }
+    
+    protected SvnCommand getCheckInCommand()
+    {
+        return null;
+    }
+    
+    protected SvnCommand getCheckOutCommand()
+    {
+        return null;
+    }
+    
+    protected SvnCommand getDiffCommand()
+    {
+        return null;
+    }
+    
+    protected SvnCommand getRemoveCommand()
+    {
+        return null;
+    }
+    
+    protected SvnCommand getStatusCommand()
+    {
+        return null;
+    }
+    
+    protected SvnCommand getTagCommand()
+    {
+        return null;
+    }
+    
+    protected SvnCommand getUpdateCommand()
+    {
+        return null;
+    }
+}

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/TestSvnScmProvider.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/TestSvnScmProvider.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/repository/SvnScmProviderRepositoryTest.java
URL: http://svn.apache.org/viewcvs/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/repository/SvnScmProviderRepositoryTest.java?rev=381077&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/java/org/apache/maven/scm/provider/svn/repository/SvnScmProviderRepositoryTest.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/repository/SvnScmProviderRepositoryTest.java Sun Feb 26 03:16:52 2006
@@ -0,0 +1,175 @@
+package org.apache.maven.scm.provider.svn.repository;
+
+/*
+ * 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;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.provider.svn.TestSvnScmProvider;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.apache.maven.scm.repository.ScmRepositoryException;
+
+import java.io.File;
+
+/**
+ * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
+ * @version $Id$
+ */
+public class SvnScmProviderRepositoryTest
+    extends ScmTestCase
+{
+    private ScmManager scmManager;
+
+    public void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        scmManager = getScmManager();
+    }
+
+    // ----------------------------------------------------------------------
+    // Testing legal URLs
+    // ----------------------------------------------------------------------
+
+    public void testLegalFileURL()
+        throws Exception
+    {
+        testUrl( "scm:svn:file:///tmp/repo", "file:///tmp/repo", null );
+    }
+
+    public void testLegalLocalhostFileURL()
+        throws Exception
+    {
+        testUrl( "scm:svn:file://localhost/tmp/repo", "file://localhost/tmp/repo", null );
+    }
+
+    public void testLegalHttpURL()
+        throws Exception
+    {
+        testUrl( "scm:svn:http://subversion.tigris.org", "http://subversion.tigris.org", null );
+    }
+
+    public void testLegalHttpsURL()
+        throws Exception
+    {
+        testUrl( "scm:svn:https://subversion.tigris.org", "https://subversion.tigris.org", null );
+    }
+
+    public void testLegalSvnURL()
+        throws Exception
+    {
+        testUrl( "scm:svn:svn://subversion.tigris.org", "svn://subversion.tigris.org", null );
+    }
+
+    public void testLegalSvnPlusUsernameURL()
+        throws Exception
+    {
+        testUrl( "scm:svn:svn://username@subversion.tigris.org", "svn://subversion.tigris.org", "username" );
+    }
+
+    public void testLegalSvnPlusSshURL()
+        throws Exception
+    {
+        testUrl( "scm:svn:svn+ssh://subversion.tigris.org", "svn+ssh://subversion.tigris.org", null );
+    }
+
+    public void testLegalSvnPlusSshPlusUsernameURL()
+        throws Exception
+    {
+        testUrl( "scm:svn:svn+ssh://username@subversion.tigris.org", "svn+ssh://username@subversion.tigris.org", null );
+    }
+
+    public void testLegalSvnPortUrl()
+            throws Exception
+    {
+        testUrl("scm:svn:http://username@subversion.tigris.org:8800/pmgt/trunk", "http://subversion.tigris.org:8800/pmgt/trunk", "username", 8800);
+        testUrl("scm:svn:https://username@subversion.tigris.org:8080/pmgt/trunk", "https://subversion.tigris.org:8080/pmgt/trunk", "username", 8080);
+        testUrl("scm:svn:svn://username@subversion.tigris.org:8800/pmgt/trunk", "svn://subversion.tigris.org:8800/pmgt/trunk", "username", 8800);
+        testUrl("scm:svn:svn+ssh://username@subversion.tigris.org:8080/pmgt/trunk", "svn+ssh://username@subversion.tigris.org:8080/pmgt/trunk", null, 8080);
+    }
+
+    // ----------------------------------------------------------------------
+    // Testing illegal URLs
+    // ----------------------------------------------------------------------
+
+    public void testIllegalFileUrl()
+        throws Exception
+    {
+        testIllegalUrl( "file:/tmp/svn" );
+    }
+
+    // ----------------------------------------------------------------------
+    // Testing provider from path
+    // ----------------------------------------------------------------------
+
+    public void testSvnFromPath()
+        throws Exception
+    {
+        TestSvnScmProvider provider = new TestSvnScmProvider();
+
+        provider.makeProviderScmRepository( new File( getBasedir() ) );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    private void testUrl( String scmUrl, String expectedUrl, String expectedUser )
+        throws Exception
+    {
+        ScmRepository repository = scmManager.makeScmRepository( scmUrl );
+
+        assertNotNull( "ScmManager.makeScmRepository() returned null", repository );
+
+        assertNotNull( "The provider repository was null.", repository.getProviderRepository() );
+
+        assertTrue( "The SCM Repository isn't a " + SvnScmProviderRepository.class.getName() + ".",
+                    repository.getProviderRepository() instanceof SvnScmProviderRepository );
+
+        SvnScmProviderRepository providerRepository = (SvnScmProviderRepository) repository.getProviderRepository();
+
+        assertEquals( "url is incorrect", expectedUrl, providerRepository.getUrl() );
+
+        assertEquals( "User is incorrect", expectedUser, providerRepository.getUser() );
+    }
+
+    private void testUrl(String scmUrl, String expectedUrl, String expectedUser, int expectedPort)
+            throws Exception
+    {
+        testUrl(scmUrl, expectedUrl, expectedUser);
+
+        ScmRepository repository = scmManager.makeScmRepository(scmUrl);
+
+        assertEquals( "Port is incorrect",
+                expectedPort, ((SvnScmProviderRepository) repository.getProviderRepository()).getPort());
+    }
+
+    private void testIllegalUrl( String url )
+        throws Exception
+    {
+        try
+        {
+            scmManager.makeScmRepository( "scm:svn:" + url );
+
+            fail( "Expected a ScmRepositoryException while testing the url '" + url + "'." );
+        }
+        catch ( ScmRepositoryException e )
+        {
+            // expected
+        }
+    }
+}

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/repository/SvnScmProviderRepositoryTest.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/repository/SvnScmProviderRepositoryTest.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/resources/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewcvs/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/resources/META-INF/plexus/components.xml?rev=381077&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/resources/META-INF/plexus/components.xml (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/resources/META-INF/plexus/components.xml Sun Feb 26 03:16:52 2006
@@ -0,0 +1,9 @@
+<component-set>
+  <components>
+    <component>
+      <role>org.apache.maven.scm.provider.ScmProvider</role>
+      <role-hint>svn</role-hint>
+      <implementation>org.apache.maven.scm.provider.svn.TestSvnScmProvider</implementation>
+    </component>
+  </components>
+</component-set>

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/resources/META-INF/plexus/components.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/test/resources/META-INF/plexus/components.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Sun Feb 26 03:16:52 2006
@@ -0,0 +1,2 @@
+maven-scm-provider-svnexe.iml
+target

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/pom.xml
URL: http://svn.apache.org/viewcvs/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/pom.xml?rev=381077&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/pom.xml (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/pom.xml Sun Feb 26 03:16:52 2006
@@ -0,0 +1,23 @@
+<project>
+  <parent>
+    <artifactId>maven-scm-providers-svn</artifactId>
+    <groupId>org.apache.maven.scm</groupId>
+    <version>1.0-beta-3-SNAPSHOT</version>
+  </parent>
+  <modelVersion>4.0.0</modelVersion>
+  <artifactId>maven-scm-provider-svnexe</artifactId>
+  <name>Maven SCM Subversion Provider - SVN Executable Impl.</name>
+  <version>1.0-beta-3-SNAPSHOT</version>
+  <dependencies>
+    <dependency>
+      <groupId>regexp</groupId>
+      <artifactId>regexp</artifactId>
+      <version>1.3</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.maven.scm</groupId>
+      <artifactId>maven-scm-provider-svn-commons</artifactId>
+      <version>1.0-beta-3-SNAPSHOT</version>
+    </dependency>
+  </dependencies>
+</project>

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/pom.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/pom.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/SvnExeScmProvider.java
URL: http://svn.apache.org/viewcvs/maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/SvnExeScmProvider.java?rev=381077&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/SvnExeScmProvider.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/SvnExeScmProvider.java Sun Feb 26 03:16:52 2006
@@ -0,0 +1,85 @@
+package org.apache.maven.scm.provider.svn.svnexe;
+
+/*
+ * Copyright 2003-2005 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 java.util.List;
+
+import org.apache.maven.scm.provider.svn.AbstractSvnScmProvider;
+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.add.SvnAddCommand;
+import org.apache.maven.scm.provider.svn.svnexe.command.changelog.SvnChangeLogCommand;
+import org.apache.maven.scm.provider.svn.svnexe.command.checkin.SvnCheckInCommand;
+import org.apache.maven.scm.provider.svn.svnexe.command.checkout.SvnCheckOutCommand;
+import org.apache.maven.scm.provider.svn.svnexe.command.diff.SvnDiffCommand;
+import org.apache.maven.scm.provider.svn.svnexe.command.remove.SvnRemoveCommand;
+import org.apache.maven.scm.provider.svn.svnexe.command.status.SvnStatusCommand;
+import org.apache.maven.scm.provider.svn.svnexe.command.tag.SvnTagCommand;
+import org.apache.maven.scm.provider.svn.svnexe.command.update.SvnUpdateCommand;
+
+/**
+ * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
+ * @version $Id$
+ */
+public class SvnExeScmProvider
+    extends AbstractSvnScmProvider
+{
+    protected SvnCommand getAddCommand()
+    {
+        return new SvnAddCommand();
+    }
+
+    protected SvnCommand getChangeLogCommand()
+    {
+        return new SvnChangeLogCommand();
+    }
+
+    protected SvnCommand getCheckInCommand()
+    {
+        return new SvnCheckInCommand();
+    }
+
+    protected SvnCommand getCheckOutCommand()
+    {
+        return new SvnCheckOutCommand();
+    }
+
+    protected SvnCommand getDiffCommand()
+    {
+        return new SvnDiffCommand();
+    }
+
+    protected SvnCommand getRemoveCommand()
+    {
+        return new SvnRemoveCommand();
+    }
+
+    protected SvnCommand getStatusCommand()
+    {
+        return new SvnStatusCommand();
+    }
+
+    protected SvnCommand getTagCommand()
+    {
+        return new SvnTagCommand();
+    }
+
+    protected SvnCommand getUpdateCommand()
+    {
+        return new SvnUpdateCommand();
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/SvnExeScmProvider.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svnexe/src/main/java/org/apache/maven/scm/provider/svn/svnexe/SvnExeScmProvider.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 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/SvnCommandLineUtils.java
URL: http://svn.apache.org/viewcvs/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/SvnCommandLineUtils.java?rev=381077&view=auto
==============================================================================
--- 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/SvnCommandLineUtils.java (added)
+++ 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/SvnCommandLineUtils.java Sun Feb 26 03:16:52 2006
@@ -0,0 +1,131 @@
+package org.apache.maven.scm.provider.svn.svnexe.command;
+
+/*
+ * 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.log.ScmLogger;
+import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
+import org.apache.maven.scm.provider.svn.util.SvnUtil;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+import java.io.File;
+
+/**
+ * Command line construction utility.
+ *
+ * @author Brett Porter
+ * @version $Id$
+ */
+public class SvnCommandLineUtils
+{
+    public static void addFiles( Commandline cl, File[] files )
+    {
+        for ( int i = 0; i < files.length; i++ )
+        {
+            cl.createArgument().setValue( files[i].getPath().replace( '\\', '/' ) );
+        }
+    }
+
+    public static Commandline getBaseSvnCommandLine( File workingDirectory, SvnScmProviderRepository repository )
+    {
+        Commandline cl = new Commandline();
+
+        cl.setExecutable( "svn" );
+
+        cl.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+
+        if ( !StringUtils.isEmpty( System.getProperty( "maven.scm.svn.config_directory" ) ) )
+        {
+            cl.createArgument().setValue( "--config-dir" );
+            cl.createArgument().setValue( System.getProperty( "maven.scm.svn.config_directory" ) );
+        }
+        else if ( !StringUtils.isEmpty( SvnUtil.getSettings().getConfigDirectory() ) )
+        {
+            cl.createArgument().setValue( "--config-dir" );
+            cl.createArgument().setValue( SvnUtil.getSettings().getConfigDirectory() );
+        }
+
+        if ( !StringUtils.isEmpty( repository.getUser() ) )
+        {
+            cl.createArgument().setValue( "--username" );
+
+            cl.createArgument().setValue( repository.getUser() );
+        }
+
+        if ( !StringUtils.isEmpty( repository.getPassword() ) )
+        {
+            cl.createArgument().setValue( "--password" );
+
+            cl.createArgument().setValue( repository.getPassword() );
+        }
+
+        cl.createArgument().setValue( "--non-interactive" );
+
+        return cl;
+    }
+
+    public static int execute( Commandline cl, StreamConsumer consumer, CommandLineUtils.StringStreamConsumer stderr,
+                               ScmLogger logger )
+        throws CommandLineException
+    {
+        int exitCode = CommandLineUtils.executeCommandLine( cl, consumer, stderr );
+
+        exitCode = checkIfCleanUpIsNeeded( exitCode, cl, consumer, stderr, logger );
+
+        return exitCode;
+    }
+
+    public static int execute( Commandline cl, CommandLineUtils.StringStreamConsumer stdout,
+                               CommandLineUtils.StringStreamConsumer stderr, ScmLogger logger )
+        throws CommandLineException
+    {
+        int exitCode = CommandLineUtils.executeCommandLine( cl, stdout, stderr );
+
+        exitCode = checkIfCleanUpIsNeeded( exitCode, cl, stdout, stderr, logger );
+
+        return exitCode;
+    }
+
+    private static int checkIfCleanUpIsNeeded( int exitCode, Commandline cl, StreamConsumer consumer,
+                                               CommandLineUtils.StringStreamConsumer stderr, ScmLogger logger )
+        throws CommandLineException
+    {
+        if ( exitCode != 0 && stderr.getOutput() != null && stderr.getOutput().indexOf( "'svn cleanup'" ) > 0 &&
+            stderr.getOutput().indexOf( "'svn help cleanup'" ) > 0 )
+        {
+            logger.info( "Svn command failed due to some locks in working copy. We try to run a 'svn cleanup'." );
+
+            if ( executeCleanUp( cl.getWorkingDirectory(), consumer, stderr ) == 0 )
+            {
+                exitCode = CommandLineUtils.executeCommandLine( cl, consumer, stderr );
+            }
+        }
+        return exitCode;
+    }
+
+    public static int executeCleanUp( File workinDirectory, StreamConsumer stdout, StreamConsumer stderr )
+        throws CommandLineException
+    {
+        Commandline cl = new Commandline();
+        cl.setExecutable( "svn" );
+        cl.setWorkingDirectory( workinDirectory.getAbsolutePath() );
+        return CommandLineUtils.executeCommandLine( cl, stdout, stderr );
+    }
+}

Propchange: 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/SvnCommandLineUtils.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 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/SvnCommandLineUtils.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 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/add/SvnAddCommand.java
URL: http://svn.apache.org/viewcvs/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/add/SvnAddCommand.java?rev=381077&view=auto
==============================================================================
--- 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/add/SvnAddCommand.java (added)
+++ 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/add/SvnAddCommand.java Sun Feb 26 03:16:52 2006
@@ -0,0 +1,103 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.add;
+
+/*
+ * 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.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.command.add.AbstractAddCommand;
+import org.apache.maven.scm.command.add.AddScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.svn.command.SvnCommand;
+import org.apache.maven.scm.provider.svn.svnexe.command.SvnCommandLineUtils;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+
+/**
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @version $Id$
+ */
+public class SvnAddCommand
+    extends AbstractAddCommand
+    implements SvnCommand
+{
+    protected ScmResult executeAddCommand( ScmProviderRepository repository, ScmFileSet fileSet, String message,
+                                           boolean binary )
+        throws ScmException
+    {
+        // TODO: could do this with propset?
+        if ( binary )
+        {
+            throw new ScmException( "This provider does not yet support binary files" );
+        }
+
+        if ( fileSet.getFiles().length == 0 )
+        {
+            throw new ScmException( "You must provide at least one file/directory to add" );
+        }
+
+        Commandline cl = createCommandLine( fileSet.getBasedir(), fileSet.getFiles() );
+
+        SvnAddConsumer consumer = new SvnAddConsumer( getLogger() );
+
+        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+
+        getLogger().info( "Working directory: " + fileSet.getBasedir().getAbsolutePath() );
+        getLogger().info( "Command line: " + cl );
+
+        int exitCode;
+
+        try
+        {
+            exitCode = SvnCommandLineUtils.execute( cl, consumer, stderr, getLogger() );
+        }
+        catch ( CommandLineException ex )
+        {
+            throw new ScmException( "Error while executing command.", ex );
+        }
+
+        if ( exitCode != 0 )
+        {
+            return new AddScmResult( cl.toString(), "The svn command failed.", stderr.getOutput(), false );
+        }
+
+        return new AddScmResult( cl.toString(), consumer.getAddedFiles() );
+    }
+
+    private static Commandline createCommandLine( File workingDirectory, File[] files )
+    {
+        // Base command line doesn't make sense here - username/password not needed, and non-interactive is not valid
+
+        Commandline cl = new Commandline();
+
+        cl.setExecutable( "svn" );
+
+        cl.setWorkingDirectory( workingDirectory.getAbsolutePath() );
+
+        cl.createArgument().setValue( "add" );
+
+        cl.createArgument().setValue( "--non-recursive" );
+
+        SvnCommandLineUtils.addFiles( cl, files );
+
+        return cl;
+    }
+
+}

Propchange: 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/add/SvnAddCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 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/add/SvnAddCommand.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 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/add/SvnAddConsumer.java
URL: http://svn.apache.org/viewcvs/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/add/SvnAddConsumer.java?rev=381077&view=auto
==============================================================================
--- 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/add/SvnAddConsumer.java (added)
+++ 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/add/SvnAddConsumer.java Sun Feb 26 03:16:52 2006
@@ -0,0 +1,85 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.add;
+
+/*
+ * 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.ScmFile;
+import org.apache.maven.scm.ScmFileStatus;
+import org.apache.maven.scm.log.ScmLogger;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @version $Id$
+ */
+public class SvnAddConsumer
+    implements StreamConsumer
+{
+    private ScmLogger logger;
+
+    private List addedFiles = new ArrayList();
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public SvnAddConsumer( ScmLogger logger )
+    {
+        this.logger = logger;
+    }
+
+    // ----------------------------------------------------------------------
+    // StreamConsumer Implementation
+    // ----------------------------------------------------------------------
+
+    public void consumeLine( String line )
+    {
+        if ( line.length() <= 3 )
+        {
+            logger.warn( "Unexpected input, the line must be at least three characters long. Line: '" + line + "'." );
+
+            return;
+        }
+
+        String statusString = line.substring( 0, 1 );
+
+        String file = line.substring( 3 );
+
+        ScmFileStatus status;
+
+        if ( statusString.equals( "A" ) )
+        {
+            status = ScmFileStatus.ADDED;
+        }
+        else
+        {
+            logger.info( "Unknown file status: '" + statusString + "'." );
+
+            return;
+        }
+
+        addedFiles.add( new ScmFile( file, status ) );
+    }
+
+    public List getAddedFiles()
+    {
+        return addedFiles;
+    }
+
+}

Propchange: 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/add/SvnAddConsumer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 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/add/SvnAddConsumer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 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/changelog/SvnChangeLogCommand.java
URL: http://svn.apache.org/viewcvs/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/changelog/SvnChangeLogCommand.java?rev=381077&view=auto
==============================================================================
--- 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/changelog/SvnChangeLogCommand.java (added)
+++ 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/changelog/SvnChangeLogCommand.java Sun Feb 26 03:16:52 2006
@@ -0,0 +1,128 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.changelog;
+
+/*
+ * 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.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.command.changelog.AbstractChangeLogCommand;
+import org.apache.maven.scm.command.changelog.ChangeLogScmResult;
+import org.apache.maven.scm.command.changelog.ChangeLogSet;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.svn.SvnTagBranchUtils;
+import org.apache.maven.scm.provider.svn.command.SvnCommand;
+import org.apache.maven.scm.provider.svn.svnexe.command.SvnCommandLineUtils;
+import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+/**
+ * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
+ * @version $Id$
+ */
+public class SvnChangeLogCommand
+    extends AbstractChangeLogCommand
+    implements SvnCommand
+{
+    private final static String DATE_FORMAT = "yyyy-MM-dd HH:mm:ss Z";
+
+    protected ChangeLogScmResult executeChangeLogCommand( ScmProviderRepository repo, ScmFileSet fileSet,
+                                                          Date startDate, Date endDate, String branch,
+                                                          String datePattern )
+        throws ScmException
+    {
+        Commandline cl =
+            createCommandLine( (SvnScmProviderRepository) repo, fileSet.getBasedir(), branch, startDate, endDate );
+
+        SvnChangeLogConsumer consumer = new SvnChangeLogConsumer( getLogger(), datePattern );
+
+        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+
+        getLogger().info( "Executing: " + cl );
+        getLogger().info( "Working directory: " + cl.getWorkingDirectory().getAbsolutePath() );
+
+        int exitCode;
+
+        try
+        {
+            exitCode = SvnCommandLineUtils.execute( cl, consumer, stderr, getLogger() );
+        }
+        catch ( CommandLineException ex )
+        {
+            throw new ScmException( "Error while executing svn command.", ex );
+        }
+
+        if ( exitCode != 0 )
+        {
+            return new ChangeLogScmResult( cl.toString(), "The svn command failed.", stderr.getOutput(), false );
+        }
+
+        return new ChangeLogScmResult( cl.toString(),
+                                       new ChangeLogSet( consumer.getModifications(), startDate, endDate ) );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public static Commandline createCommandLine( SvnScmProviderRepository repository, File workingDirectory,
+                                                 String branch, Date startDate, Date endDate )
+    {
+        SimpleDateFormat dateFormat = new SimpleDateFormat( DATE_FORMAT );
+
+        dateFormat.setTimeZone( TimeZone.getTimeZone( "GMT" ) );
+
+        Commandline cl = SvnCommandLineUtils.getBaseSvnCommandLine( workingDirectory, repository );
+
+        cl.createArgument().setValue( "log" );
+
+        cl.createArgument().setValue( "-v" );
+
+        // TODO: May want to add some kind of support for --stop-on-copy and --limit NUM
+
+        if ( startDate != null )
+        {
+            cl.createArgument().setValue( "-r" );
+
+            if ( endDate != null )
+            {
+                cl.createArgument().setValue(
+                    "{" + dateFormat.format( startDate ) + "}" + ":" + "{" + dateFormat.format( endDate ) + "}" );
+            }
+            else
+            {
+                cl.createArgument().setValue( "{" + dateFormat.format( startDate ) + "}:HEAD" );
+            }
+        }
+
+        if ( branch != null )
+        {
+            // By specifying a branch and this repository url below, subversion should show 
+            // the changelog of that branch, but limit it to paths that also occur in this repository.
+            cl.createArgument().setValue( SvnTagBranchUtils.resolveBranchUrl( repository, branch ) );
+        }
+
+        cl.createArgument().setValue( repository.getUrl() );
+
+        return cl;
+    }
+}

Propchange: 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/changelog/SvnChangeLogCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 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/changelog/SvnChangeLogCommand.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 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/changelog/SvnChangeLogConsumer.java
URL: http://svn.apache.org/viewcvs/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/changelog/SvnChangeLogConsumer.java?rev=381077&view=auto
==============================================================================
--- 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/changelog/SvnChangeLogConsumer.java (added)
+++ 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/changelog/SvnChangeLogConsumer.java Sun Feb 26 03:16:52 2006
@@ -0,0 +1,278 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.changelog;
+
+/*
+ * 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.ChangeFile;
+import org.apache.maven.scm.log.ScmLogger;
+import org.apache.maven.scm.provider.svn.SvnChangeSet;
+import org.apache.maven.scm.util.AbstractConsumer;
+import org.apache.regexp.RE;
+import org.apache.regexp.RESyntaxException;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
+ * @version $Id$
+ */
+public class SvnChangeLogConsumer
+    extends AbstractConsumer
+{
+    /**
+     * Date formatter for svn timestamp (after a little massaging)
+     */
+    private static final String SVN_TIMESTAMP_PATTERN = "yyyy-MM-dd HH:mm:ss zzzzzzzzz";
+
+    /**
+     * State machine constant: expecting header
+     */
+    private static final int GET_HEADER = 1;
+
+    /**
+     * State machine constant: expecting file information
+     */
+    private static final int GET_FILE = 2;
+
+    /**
+     * State machine constant: expecting comments
+     */
+    private static final int GET_COMMENT = 3;
+
+    /**
+     * A file line begins with a space character
+     */
+    private static final String FILE_BEGIN_TOKEN = " ";
+
+    /**
+     * The file section ends with a blank line
+     */
+    private static final String FILE_END_TOKEN = "";
+
+    /**
+     * The filename starts after 5 characters
+     */
+    private static final int FILE_START_INDEX = 5;
+
+    /**
+     * The comment section ends with a dashed line
+     */
+    private static final String COMMENT_END_TOKEN =
+        "------------------------------------" + "------------------------------------";
+
+    /**
+     * The pattern used to match svn header lines
+     */
+    private static final String pattern = "^rev (\\d+):\\s+" + // revision number
+        "(\\w+)\\s+\\|\\s+" + // author username
+        "(\\d+-\\d+-\\d+ " + // date 2002-08-24
+        "\\d+:\\d+:\\d+) " + // time 16:01:00
+        "([\\-+])(\\d\\d)(\\d\\d)"; // gmt offset -0400
+
+    private static final String pattern2 = "^r(\\d+)\\s+\\|\\s+" +          // revision number
+        "(\\(\\S+\\s+\\S+\\)|\\S+)\\s+\\|\\s+" + // author username
+        "(\\d+-\\d+-\\d+ " +             // date 2002-08-24
+        "\\d+:\\d+:\\d+) " +             // time 16:01:00
+        "([\\-+])(\\d\\d)(\\d\\d)";      // gmt offset -0400
+
+    /**
+     * Current status of the parser
+     */
+    private int status = GET_HEADER;
+
+    /**
+     * List of change log entries
+     */
+    private List entries = new ArrayList();
+
+    /**
+     * The current log entry being processed by the parser
+     */
+    private SvnChangeSet currentChange;
+
+    /**
+     * The current revision of the entry being processed by the parser
+     */
+    private String currentRevision;
+
+    /**
+     * The current comment of the entry being processed by the parser
+     */
+    private StringBuffer currentComment;
+
+    /**
+     * The regular expression used to match header lines
+     */
+    private RE headerRegexp;
+
+    private RE headerRegexp2;
+
+    private String userDateFormat;
+
+    /**
+     * Default constructor.
+     */
+    public SvnChangeLogConsumer( ScmLogger logger, String userDateFormat )
+    {
+        super( logger );
+
+        this.userDateFormat = userDateFormat;
+
+        try
+        {
+            headerRegexp = new RE( pattern );
+            headerRegexp2 = new RE( pattern2 );
+        }
+        catch ( RESyntaxException ex )
+        {
+            throw new RuntimeException(
+                "INTERNAL ERROR: Could not create regexp to parse svn log file. This shouldn't happen. Something is probably wrong with the oro installation.",
+                ex );
+        }
+    }
+
+    public List getModifications()
+    {
+        return entries;
+    }
+
+    // ----------------------------------------------------------------------
+    // StreamConsumer Implementation
+    // ----------------------------------------------------------------------
+
+    public void consumeLine( String line )
+    {
+        switch ( status )
+        {
+            case GET_HEADER:
+                processGetHeader( line );
+                break;
+            case GET_FILE:
+                processGetFile( line );
+                break;
+            case GET_COMMENT:
+                processGetComment( line );
+                break;
+            default:
+                throw new IllegalStateException( "Unknown state: " + status );
+        }
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    /**
+     * Process the current input line in the GET_HEADER state.  The
+     * author, date, and the revision of the entry are gathered.  Note,
+     * Subversion does not have per-file revisions, instead, the entire
+     * repository is given a single revision number, which is used for
+     * the revision number of each file.
+     *
+     * @param line A line of text from the svn log output
+     */
+    private void processGetHeader( String line )
+    {
+        if ( !headerRegexp.match( line ) )
+        {
+            if ( !headerRegexp2.match( line ) )
+            {
+                return;
+            }
+            else
+            {
+                headerRegexp = headerRegexp2;
+            }
+        }
+
+        currentRevision = headerRegexp.getParen( 1 );
+
+        currentChange = new SvnChangeSet();
+
+        currentChange.setAuthor( headerRegexp.getParen( 2 ) );
+
+        currentChange.setDate( parseDate() );
+
+        status = GET_FILE;
+    }
+
+    /**
+     * Process the current input line in the GET_FILE state.  This state
+     * adds each file entry line to the current change log entry.  Note,
+     * the revision number for the entire entry is used for the revision
+     * number of each file.
+     *
+     * @param line A line of text from the svn log output
+     */
+    private void processGetFile( String line )
+    {
+        if ( line.startsWith( FILE_BEGIN_TOKEN ) )
+        {
+            // Skip the status flags and just get the name of the file
+            String name = line.substring( FILE_START_INDEX );
+            currentChange.addFile( new ChangeFile( name, currentRevision ) );
+
+            status = GET_FILE;
+        }
+        else if ( line.equals( FILE_END_TOKEN ) )
+        {
+            // Create a buffer for the collection of the comment now
+            // that we are leaving the GET_FILE state.
+            currentComment = new StringBuffer();
+
+            status = GET_COMMENT;
+        }
+    }
+
+    /**
+     * Process the current input line in the GET_COMMENT state.  This
+     * state gathers all of the comments that are part of a log entry.
+     *
+     * @param line a line of text from the svn log output
+     */
+    private void processGetComment( String line )
+    {
+        if ( line.equals( COMMENT_END_TOKEN ) )
+        {
+            currentChange.setComment( currentComment.toString() );
+
+            entries.add( currentChange );
+
+            status = GET_HEADER;
+        }
+        else
+        {
+            currentComment.append( line ).append( '\n' );
+        }
+    }
+
+    /**
+     * Converts the date timestamp from the svn output into a date
+     * object.
+     *
+     * @return A date representing the timestamp of the log entry.
+     */
+    private Date parseDate()
+    {
+        StringBuffer date = new StringBuffer().append( headerRegexp.getParen( 3 ) ).append( " GMT" )
+            .append( headerRegexp.getParen( 4 ) ).append( headerRegexp.getParen( 5 ) ).append( ':' )
+            .append( headerRegexp.getParen( 6 ) );
+
+        return parseDate( date.toString(), userDateFormat, SVN_TIMESTAMP_PATTERN );
+    }
+}

Propchange: 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/changelog/SvnChangeLogConsumer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 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/changelog/SvnChangeLogConsumer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 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/checkin/SvnCheckInCommand.java
URL: http://svn.apache.org/viewcvs/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/checkin/SvnCheckInCommand.java?rev=381077&view=auto
==============================================================================
--- 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/checkin/SvnCheckInCommand.java (added)
+++ 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/checkin/SvnCheckInCommand.java Sun Feb 26 03:16:52 2006
@@ -0,0 +1,123 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.checkin;
+
+/*
+ * 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.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.command.checkin.AbstractCheckInCommand;
+import org.apache.maven.scm.command.checkin.CheckInScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.svn.command.SvnCommand;
+import org.apache.maven.scm.provider.svn.svnexe.command.SvnCommandLineUtils;
+import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+import java.io.IOException;
+
+/**
+ * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
+ * @version $Id$
+ */
+public class SvnCheckInCommand
+    extends AbstractCheckInCommand
+    implements SvnCommand
+{
+    protected CheckInScmResult executeCheckInCommand( ScmProviderRepository repo, ScmFileSet fileSet, String message,
+                                                      String tag )
+        throws ScmException
+    {
+        if ( !StringUtils.isEmpty( tag ) )
+        {
+            throw new ScmException( "This provider can't handle tags." );
+        }
+
+        File messageFile = FileUtils.createTempFile( "maven-scm-", ".commit", null );
+
+        try
+        {
+            FileUtils.fileWrite( messageFile.getAbsolutePath(), message );
+        }
+        catch ( IOException ex )
+        {
+            return new CheckInScmResult( null, "Error while making a temporary file for the commit message: " +
+                ex.getMessage(), null, false );
+        }
+
+        Commandline cl = createCommandLine( (SvnScmProviderRepository) repo, fileSet, messageFile );
+
+        SvnCheckInConsumer consumer = new SvnCheckInConsumer( getLogger(), fileSet.getBasedir() );
+
+        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+
+        getLogger().info( "Working directory: " + fileSet.getBasedir().getAbsolutePath() );
+        getLogger().info( "Command line: " + cl );
+
+        int exitCode;
+
+        try
+        {
+            exitCode = SvnCommandLineUtils.execute( cl, consumer, stderr, getLogger() );
+        }
+        catch ( CommandLineException ex )
+        {
+            throw new ScmException( "Error while executing command.", ex );
+        }
+        finally
+        {
+            try
+            {
+                FileUtils.forceDelete( messageFile );
+            }
+            catch ( IOException ex )
+            {
+                // ignore
+            }
+        }
+
+        if ( exitCode != 0 )
+        {
+            return new CheckInScmResult( cl.toString(), "The svn command failed.", stderr.getOutput(), false );
+        }
+
+        return new CheckInScmResult( cl.toString(), consumer.getCheckedInFiles() );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public static Commandline createCommandLine( SvnScmProviderRepository repository, ScmFileSet fileSet,
+                                                 File messageFile )
+    {
+        Commandline cl = SvnCommandLineUtils.getBaseSvnCommandLine( fileSet.getBasedir(), repository );
+
+        cl.createArgument().setValue( "commit" );
+
+        cl.createArgument().setValue( "--file" );
+
+        cl.createArgument().setValue( messageFile.getAbsolutePath() );
+
+        SvnCommandLineUtils.addFiles( cl, fileSet.getFiles() );
+
+        return cl;
+    }
+}

Propchange: 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/checkin/SvnCheckInCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 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/checkin/SvnCheckInCommand.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 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/checkin/SvnCheckInConsumer.java
URL: http://svn.apache.org/viewcvs/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/checkin/SvnCheckInConsumer.java?rev=381077&view=auto
==============================================================================
--- 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/checkin/SvnCheckInConsumer.java (added)
+++ 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/checkin/SvnCheckInConsumer.java Sun Feb 26 03:16:52 2006
@@ -0,0 +1,141 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.checkin;
+
+/*
+ * 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.ScmFile;
+import org.apache.maven.scm.ScmFileStatus;
+import org.apache.maven.scm.log.ScmLogger;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
+ * @version $Id$
+ */
+public class SvnCheckInConsumer
+    implements StreamConsumer
+{
+    private final static String SENDING_TOKEN = "Sending        ";
+
+    private final static String ADDING_TOKEN = "Adding         ";
+
+    private final static String TRANSMITTING_TOKEN = "Transmitting file data";
+
+    private final static String COMMITTED_REVISION_TOKEN = "Committed revision";
+
+    private ScmLogger logger;
+
+    private File workingDirectory;
+
+    private List checkedInFiles = new ArrayList();
+
+    private int revision;
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public SvnCheckInConsumer( ScmLogger logger, File workingDirectory )
+    {
+        this.logger = logger;
+
+        this.workingDirectory = workingDirectory;
+    }
+
+    // ----------------------------------------------------------------------
+    // StreamConsumer Implementation
+    // ----------------------------------------------------------------------
+
+    public void consumeLine( String line )
+    {
+        logger.debug( line );
+
+        if ( line.length() <= 3 )
+        {
+            logger.warn( "Unexpected input, the line must be at least three characters long. Line: '" + line + "'." );
+
+            return;
+        }
+
+        String file;
+
+        if ( line.startsWith( COMMITTED_REVISION_TOKEN ) )
+        {
+            String revisionString = line.substring( COMMITTED_REVISION_TOKEN.length() + 1, line.length() - 1 );
+
+            revision = parseInt( revisionString );
+
+            return;
+        }
+        else if ( line.startsWith( SENDING_TOKEN ) )
+        {
+            file = line.substring( SENDING_TOKEN.length() );
+        }
+        else if ( line.startsWith( ADDING_TOKEN ) )
+        {
+            file = line.substring( ADDING_TOKEN.length() );
+        }
+        else if ( line.startsWith( TRANSMITTING_TOKEN ) )
+        {
+            // ignore
+            return;
+        }
+        else
+        {
+            logger.info( "Unknown line: '" + line + "'" );
+
+            return;
+        }
+
+        // If the file isn't a file; don't add it.
+        if ( !new File( workingDirectory, file ).isFile() )
+        {
+            return;
+        }
+
+        checkedInFiles.add( new ScmFile( file, ScmFileStatus.CHECKED_IN ) );
+    }
+
+    public List getCheckedInFiles()
+    {
+        return checkedInFiles;
+    }
+
+    public int getRevision()
+    {
+        return revision;
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    private int parseInt( String revisionString )
+    {
+        try
+        {
+            return Integer.parseInt( revisionString );
+        }
+        catch ( NumberFormatException ex )
+        {
+            return 0;
+        }
+    }
+}

Propchange: 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/checkin/SvnCheckInConsumer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 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/checkin/SvnCheckInConsumer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 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/viewcvs/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?rev=381077&view=auto
==============================================================================
--- 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 (added)
+++ 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 Feb 26 03:16:52 2006
@@ -0,0 +1,106 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.checkout;
+
+/*
+ * 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.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.command.checkout.AbstractCheckOutCommand;
+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.command.SvnCommand;
+import org.apache.maven.scm.provider.svn.svnexe.command.SvnCommandLineUtils;
+import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
+import org.codehaus.plexus.util.cli.CommandLineException;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+
+/**
+ * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
+ * @version $Id$
+ */
+public class SvnCheckOutCommand
+    extends AbstractCheckOutCommand
+    implements SvnCommand
+{
+    protected CheckOutScmResult executeCheckOutCommand( ScmProviderRepository repo, ScmFileSet fileSet, String tag )
+        throws ScmException
+    {
+        SvnScmProviderRepository repository = (SvnScmProviderRepository) repo;
+
+        String url = repository.getUrl();
+        if ( tag != null )
+        {
+            url = SvnTagBranchUtils.resolveTagUrl( repository, tag );
+        }
+
+        // TODO: revision
+        Commandline cl = createCommandLine( repository, fileSet.getBasedir(), null, url );
+
+        SvnCheckOutConsumer consumer = new SvnCheckOutConsumer( getLogger(), fileSet.getBasedir().getParentFile() );
+
+        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+
+        int exitCode;
+
+        getLogger().info( "Working directory: " + fileSet.getBasedir().getAbsolutePath() );
+        getLogger().info( "Command line: " + cl );
+
+        try
+        {
+            exitCode = SvnCommandLineUtils.execute( cl, consumer, stderr, getLogger() );
+        }
+        catch ( CommandLineException ex )
+        {
+            throw new ScmException( "Error while executing command.", ex );
+        }
+
+        if ( exitCode != 0 )
+        {
+            return new CheckOutScmResult( cl.toString(), "The svn command failed.", stderr.getOutput(), false );
+        }
+
+        return new CheckOutScmResult( cl.toString(), consumer.getCheckedOutFiles() );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public static Commandline createCommandLine( SvnScmProviderRepository repository, File workingDirectory,
+                                                 String revision, String url )
+    {
+        Commandline cl = SvnCommandLineUtils.getBaseSvnCommandLine( workingDirectory.getParentFile(), repository );
+
+        cl.createArgument().setValue( "checkout" );
+
+        if ( revision != null )
+        {
+            cl.createArgument().setValue( "-r" );
+
+            cl.createArgument().setValue( revision );
+        }
+
+        cl.createArgument().setValue( url );
+
+        cl.createArgument().setValue( workingDirectory.getName() );
+
+        return cl;
+    }
+}

Propchange: 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
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 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
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: 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/SvnCheckOutConsumer.java
URL: http://svn.apache.org/viewcvs/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/SvnCheckOutConsumer.java?rev=381077&view=auto
==============================================================================
--- 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/SvnCheckOutConsumer.java (added)
+++ 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/SvnCheckOutConsumer.java Sun Feb 26 03:16:52 2006
@@ -0,0 +1,126 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.checkout;
+
+/*
+ * 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.ScmFile;
+import org.apache.maven.scm.ScmFileStatus;
+import org.apache.maven.scm.log.ScmLogger;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
+ * @version $Id$
+ */
+public class SvnCheckOutConsumer
+    implements StreamConsumer
+{
+    private final static String CHECKED_OUT_REVISION_TOKEN = "Checked out revision";
+
+    private ScmLogger logger;
+
+    private File workingDirectory;
+
+    private List checkedOutFiles = new ArrayList();
+
+    private int revision;
+
+    public SvnCheckOutConsumer( ScmLogger logger, File workingDirectory )
+    {
+        this.logger = logger;
+
+        this.workingDirectory = workingDirectory;
+    }
+
+    // ----------------------------------------------------------------------
+    // StreamConsumer Implementation
+    // ----------------------------------------------------------------------
+
+    public void consumeLine( String line )
+    {
+        logger.debug( line );
+
+        if ( line.length() <= 3 )
+        {
+            logger.warn( "Unexpected input, the line must be at least three characters long. Line: '" + line + "'." );
+
+            return;
+        }
+
+        String statusString = line.substring( 0, 1 );
+
+        String file = line.substring( 3 ).trim();
+
+        ScmFileStatus status;
+
+        if ( line.startsWith( CHECKED_OUT_REVISION_TOKEN ) )
+        {
+            String revisionString = line.substring( CHECKED_OUT_REVISION_TOKEN.length() + 1, line.length() - 1 );
+
+            try
+            {
+                revision = Integer.parseInt( revisionString );
+            }
+            catch ( NumberFormatException ex )
+            {
+                // ignored
+            }
+
+            return;
+        }
+        else if ( statusString.equals( "A" ) )
+        {
+            status = ScmFileStatus.ADDED;
+        }
+        else if ( statusString.equals( "U" ) )
+        {
+            status = ScmFileStatus.UPDATED;
+        }
+        else
+        {
+            logger.info( "Unknown file status: '" + statusString + "'." );
+
+            return;
+        }
+
+        // If the file isn't a file; don't add it.
+        if ( !new File( workingDirectory, file ).isFile() )
+        {
+            logger.debug( "Skipping non-file: " + file );
+            return;
+        }
+
+        checkedOutFiles.add( new ScmFile( file, status ) );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public List getCheckedOutFiles()
+    {
+        return checkedOutFiles;
+    }
+
+    public int getRevision()
+    {
+        return revision;
+    }
+}

Propchange: 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/SvnCheckOutConsumer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 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/SvnCheckOutConsumer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"