Author: kenney
Date: Thu Oct  5 09:07:28 2006
New Revision: 453277

URL: http://svn.apache.org/viewvc?view=rev&rev=453277
Log:
PR: SCM-239

Support Subversion 1.4 working copies.

Approach: instead of hacking another parser for some internal
format I'm using 'svn info' which also provides the URL in a more
implementation-independent way.

Changes: (mentioned verbosely here since there are some api additions,
but everything is backwards compatible)

* Added support for 'svn info', only at the SVN level.

* Removed old and unused Entry/EntriesReader

* Added a protected 'getRepositoryURL' to AbstractSvnScmProvider.
  Different implementations may use different methods to return
  that URL.

* Removed testcase for constructing a provider for the TestSvnScmProvider:
  Now the code to actually get the repo url is not in the abstract base class,
  I didn't see the need to implement a method in TestSvnScmProvider just so
  we can test it; all other methods there return null anyway.

* Implemented the getRepositoryURL in SvnExeScmProvider using the output
  from SvnInfoScmCommand. This method _CAN_ throw an ScmException, since it's
  performing an SCM action.

* Modified ScmRepositoryException to extend ScmException (not strictly needed 
but seems
  logical to me), and added a new constructor with a Throwable cause parameter.

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/command/info/
    
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/command/info/SvnInfoItem.java
   (with props)
    
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/command/info/SvnInfoScmResult.java
   (with props)
    
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/info/
    
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/info/SvnInfoCommand.java
   (with props)
    
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/info/SvnInfoConsumer.java
   (with props)
Removed:
    
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/util/EntriesReader.java
    
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/util/Entry.java
Modified:
    
maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/repository/ScmRepositoryException.java
    
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/AbstractSvnScmProvider.java
    
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
    
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
    
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

Modified: 
maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/repository/ScmRepositoryException.java
URL: 
http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/repository/ScmRepositoryException.java?view=diff&rev=453277&r1=453276&r2=453277
==============================================================================
--- 
maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/repository/ScmRepositoryException.java
 (original)
+++ 
maven/scm/trunk/maven-scm-api/src/main/java/org/apache/maven/scm/repository/ScmRepositoryException.java
 Thu Oct  5 09:07:28 2006
@@ -16,6 +16,8 @@
  * limitations under the License.
  */
 
+import org.apache.maven.scm.ScmException;
+
 import java.util.List;
 
 /**
@@ -23,13 +25,18 @@
  * @version $Id$
  */
 public class ScmRepositoryException
-    extends Exception
+    extends ScmException
 {
     private List validationMessages;
 
     public ScmRepositoryException( String msg )
     {
         super( msg );
+    }
+
+    public ScmRepositoryException( String msg, Throwable cause )
+    {
+        super( msg, cause );
     }
 
     public ScmRepositoryException( String msg, List validationMessages )

Modified: 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/AbstractSvnScmProvider.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/AbstractSvnScmProvider.java?view=diff&rev=453277&r1=453276&r2=453277
==============================================================================
--- 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/AbstractSvnScmProvider.java
 (original)
+++ 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/AbstractSvnScmProvider.java
 Thu Oct  5 09:07:28 2006
@@ -33,17 +33,14 @@
 import org.apache.maven.scm.provider.AbstractScmProvider;
 import org.apache.maven.scm.provider.ScmProviderRepository;
 import org.apache.maven.scm.provider.svn.command.SvnCommand;
+import org.apache.maven.scm.provider.svn.command.info.SvnInfoScmResult;
 import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
-import org.apache.maven.scm.provider.svn.util.EntriesReader;
-import org.apache.maven.scm.provider.svn.util.Entry;
 import org.apache.maven.scm.repository.ScmRepository;
 import org.apache.maven.scm.repository.ScmRepositoryException;
 import org.apache.maven.scm.repository.UnknownRepositoryStructure;
 
 import java.io.File;
-import java.io.FileReader;
 import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -104,47 +101,24 @@
             throw new ScmRepositoryException( path.getAbsolutePath() + " isn't 
a valid directory." );
         }
 
-        File svnDirectory = new File( path, ".svn" );
-
-        if ( !svnDirectory.exists() )
+        if ( !new File( path, ".svn" ).exists() )
         {
             throw new ScmRepositoryException( path.getAbsolutePath() + " isn't 
a svn checkout directory." );
         }
 
-        File svnEntriesFile = new File( svnDirectory, "entries" );
-
-        String svnUrl = null;
-
         try
         {
-            FileReader reader = new FileReader( svnEntriesFile );
-
-            EntriesReader entriesReader = new EntriesReader();
-
-            List entries = entriesReader.read( reader );
-
-            for ( Iterator i = entries.iterator(); i.hasNext(); )
-            {
-                Entry svnEntry = (Entry) i.next();
-
-                if ( "".equals( svnEntry.getName() ) )
-                {
-                    svnUrl = svnEntry.getUrl();
-                }
-            }
+            return makeProviderScmRepository( getRepositoryURL( path ), ':' );
         }
-        catch ( Exception e )
+        catch ( ScmException e )
         {
-            ScmRepositoryException ex = new ScmRepositoryException( "Can't 
read " + svnEntriesFile.getAbsolutePath() );
-
-            ex.setStackTrace( e.getStackTrace() );
-
-            throw ex;
+            // XXX We should allow throwing of SCMException.
+            throw new ScmRepositoryException( "Error executing info command", 
e );
         }
-
-        return makeProviderScmRepository( svnUrl, ':' );
     }
 
+    protected abstract String getRepositoryURL( File path )
+        throws ScmException;
 
     public List validateScmUrl( String scmSpecificUrl, char delimiter )
     {
@@ -355,6 +329,16 @@
         SvnCommand cmd = getListCommand();
 
         return (ListScmResult) executeCommand( cmd, repository, fileSet, 
parameters );
+    }
+
+    protected abstract SvnCommand getInfoCommand();
+
+    public SvnInfoScmResult info( ScmRepository repository, ScmFileSet 
fileSet, CommandParameters parameters )
+        throws ScmException
+    {
+        SvnCommand cmd = getInfoCommand();
+
+        return (SvnInfoScmResult) executeCommand( cmd, repository, fileSet, 
parameters );
     }
 
 }

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/command/info/SvnInfoItem.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/command/info/SvnInfoItem.java?view=auto&rev=453277
==============================================================================
--- 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/command/info/SvnInfoItem.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/command/info/SvnInfoItem.java
 Thu Oct  5 09:07:28 2006
@@ -0,0 +1,146 @@
+package org.apache.maven.scm.provider.svn.command.info;
+
+/*
+ * 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.
+ */
+
+/**
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Kenney Westerhof</a>
+ *
+ * $Id$
+ */
+public class SvnInfoItem
+{
+    private String path;
+
+    private String url;
+
+    private String repositoryRoot;
+
+    private String repositoryUUID;
+
+    private String revision;
+
+    private String nodeKind;
+
+    private String schedule;
+
+    private String lastChangedAuthor;
+
+    private String lastChangedRevision;
+
+    private String lastChangedDate;
+
+    public String getPath()
+    {
+        return path;
+    }
+
+    public void setPath( String path )
+    {
+        this.path = path;
+    }
+
+    public String getURL()
+    {
+        return url;
+    }
+
+    public void setURL( String url )
+    {
+        this.url = url;
+    }
+
+    public String getRepositoryRoot()
+    {
+        return repositoryRoot;
+    }
+
+    public void setRepositoryRoot( String repositoryRoot )
+    {
+        this.repositoryRoot = repositoryRoot;
+    }
+
+    public String getRepositoryUUID()
+    {
+        return repositoryUUID;
+    }
+
+    public void setRepositoryUUID( String repositoryUUID )
+    {
+        this.repositoryUUID = repositoryUUID;
+    }
+
+    public String getRevision()
+    {
+        return revision;
+    }
+
+    public void setRevision( String revision )
+    {
+        this.revision = revision;
+    }
+
+    public String getNodeKind()
+    {
+        return nodeKind;
+    }
+
+    public void setNodeKind( String nodeKind )
+    {
+        this.nodeKind = nodeKind;
+    }
+
+    public String getSchedule()
+    {
+        return schedule;
+    }
+
+    public void setSchedule( String schedule )
+    {
+        this.schedule = schedule;
+    }
+
+    public String getLastChangedAuthor()
+    {
+        return lastChangedAuthor;
+    }
+
+    public void setLastChangedAuthor( String lastChangedAuthor )
+    {
+        this.lastChangedAuthor = lastChangedAuthor;
+    }
+
+    public String getLastChangedRevision()
+    {
+        return lastChangedRevision;
+    }
+
+    public void setLastChangedRevision( String lastChangedRevision )
+    {
+        this.lastChangedRevision = lastChangedRevision;
+    }
+
+    public String getLastChangedDate()
+    {
+        return lastChangedDate;
+    }
+
+    public void setLastChangedDate( String lastChangedDate )
+    {
+        this.lastChangedDate = lastChangedDate;
+    }
+}

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

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/command/info/SvnInfoScmResult.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/command/info/SvnInfoScmResult.java?view=auto&rev=453277
==============================================================================
--- 
maven/scm/trunk/maven-scm-providers/maven-scm-providers-svn/maven-scm-provider-svn-commons/src/main/java/org/apache/maven/scm/provider/svn/command/info/SvnInfoScmResult.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/command/info/SvnInfoScmResult.java
 Thu Oct  5 09:07:28 2006
@@ -0,0 +1,59 @@
+package org.apache.maven.scm.provider.svn.command.info;
+
+import org.apache.maven.scm.ScmResult;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/*
+ * 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.
+ */
+
+/**
+ * @author <a href="mailto:[EMAIL PROTECTED]">Kenney Westerhof</a>
+ *
+ * $Id$
+ */
+public class SvnInfoScmResult
+    extends ScmResult
+{
+    private List infoItems;
+
+    public SvnInfoScmResult( String commandLine, String providerMessage, 
String commandOutput, boolean success )
+    {
+        super( commandLine, providerMessage, commandOutput, success );
+
+        infoItems = new ArrayList( 0 );
+    }
+
+    public SvnInfoScmResult( String commandLine, List files )
+    {
+        super( commandLine, null, null, true );
+
+        this.infoItems = files;
+    }
+
+    public SvnInfoScmResult( List files, ScmResult result )
+    {
+        super( result );
+
+        this.infoItems = files;
+    }
+
+    public List getInfoItems()
+    {
+        return infoItems;
+    }
+}

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

Modified: 
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/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/TestSvnScmProvider.java?view=diff&rev=453277&r1=453276&r2=453277
==============================================================================
--- 
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
 (original)
+++ 
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
 Thu Oct  5 09:07:28 2006
@@ -18,6 +18,8 @@
 
 import org.apache.maven.scm.provider.svn.command.SvnCommand;
 
+import java.io.File;
+
 public class TestSvnScmProvider
     extends AbstractSvnScmProvider
 {
@@ -67,6 +69,16 @@
     }
 
     protected SvnCommand getListCommand()
+    {
+        return null;
+    }
+
+    protected SvnCommand getInfoCommand()
+    {
+        return null;
+    }
+
+    protected String getRepositoryURL( File path )
     {
         return null;
     }

Modified: 
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/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/repository/SvnScmProviderRepositoryTest.java?view=diff&rev=453277&r1=453276&r2=453277
==============================================================================
--- 
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
 (original)
+++ 
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
 Thu Oct  5 09:07:28 2006
@@ -18,12 +18,9 @@
 
 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:[EMAIL PROTECTED]">Emmanuel Venisse</a>
  * @version $Id$
@@ -120,18 +117,6 @@
         throws Exception
     {
         testIllegalUrl( "file:/tmp/svn" );
-    }
-
-    // ----------------------------------------------------------------------
-    // Testing provider from path
-    // ----------------------------------------------------------------------
-
-    public void testSvnFromPath()
-        throws Exception
-    {
-        TestSvnScmProvider provider = new TestSvnScmProvider();
-
-        provider.makeProviderScmRepository( new File( getBasedir() ) );
     }
 
     // ----------------------------------------------------------------------

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/SvnExeScmProvider.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/SvnExeScmProvider.java?view=diff&rev=453277&r1=453276&r2=453277
==============================================================================
--- 
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
 (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/SvnExeScmProvider.java
 Thu Oct  5 09:07:28 2006
@@ -16,18 +16,26 @@
  * limitations under the License.
  */
 
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
 import org.apache.maven.scm.provider.svn.AbstractSvnScmProvider;
 import org.apache.maven.scm.provider.svn.command.SvnCommand;
+import org.apache.maven.scm.provider.svn.command.info.SvnInfoItem;
+import org.apache.maven.scm.provider.svn.command.info.SvnInfoScmResult;
 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.info.SvnInfoCommand;
 import org.apache.maven.scm.provider.svn.svnexe.command.list.SvnListCommand;
 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;
+import org.apache.maven.scm.repository.ScmRepositoryException;
+
+import java.io.File;
 
 /**
  * @author <a href="mailto:[EMAIL PROTECTED]">Emmanuel Venisse</a>
@@ -84,5 +92,29 @@
     protected SvnCommand getListCommand()
     {
         return new SvnListCommand();
+    }
+
+    public SvnCommand getInfoCommand()
+    {
+        return new SvnInfoCommand();
+    }
+
+    /**
+     * Implements retrieving the repository url for a certain path using the 
'svn info' command.
+     */
+    protected String getRepositoryURL( File path )
+        throws ScmException
+    {
+        // Note: I need to supply just 1 absolute path, but ScmFileSet won't 
let me without
+        // a basedir (which isn't used here anyway), so use a dummy file.
+        SvnInfoScmResult result = info( null, new ScmFileSet( new File( "" ), 
path ), null );
+
+        if ( result.getInfoItems().size() != 1 )
+        {
+            throw new ScmRepositoryException( "Cannot find URL: "
+                + ( result.getInfoItems().size() == 0 ? "no" : "multiple" ) + 
" items returned by the info command" );
+        }
+
+        return ( (SvnInfoItem) result.getInfoItems().get( 0 ) ).getURL();
     }
 }

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/info/SvnInfoCommand.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/info/SvnInfoCommand.java?view=auto&rev=453277
==============================================================================
--- 
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/info/SvnInfoCommand.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/info/SvnInfoCommand.java
 Thu Oct  5 09:07:28 2006
@@ -0,0 +1,126 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.info;
+
+/*
+ * 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.CommandParameters;
+import org.apache.maven.scm.ScmException;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.command.AbstractCommand;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.svn.command.SvnCommand;
+import org.apache.maven.scm.provider.svn.command.info.SvnInfoScmResult;
+import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
+import org.apache.maven.scm.provider.svn.svnexe.command.SvnCommandLineUtils;
+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.util.Iterator;
+
+/**
+ *
+ * @author <a href="mailto:[EMAIL PROTECTED]">Kenney Westerhof</a>
+ *
+ * $Id$
+ */
+public class SvnInfoCommand
+    extends AbstractCommand
+    implements SvnCommand
+{
+    private static final File TMP_DIR = new File( System.getProperty( 
"java.io.tmpdir" ) );
+
+    protected ScmResult executeCommand( ScmProviderRepository repository, 
ScmFileSet fileSet,
+                                        CommandParameters parameters )
+        throws ScmException
+    {
+        return executeInfoCommand( (SvnScmProviderRepository) repository, 
fileSet, parameters, false, null );
+    }
+
+    public SvnInfoScmResult executeInfoCommand( SvnScmProviderRepository 
repository, ScmFileSet fileSet,
+                                                CommandParameters parameters, 
boolean recursive, String revision )
+        throws ScmException
+    {
+        Commandline cl = createCommandLine( repository, fileSet, recursive, 
revision );
+
+        SvnInfoConsumer consumer = new SvnInfoConsumer();
+
+        CommandLineUtils.StringStreamConsumer stderr = new 
CommandLineUtils.StringStreamConsumer();
+
+        getLogger().info( "Executing: " + SvnCommandLineUtils.cryptPassword( 
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 command.", ex );
+        }
+
+        if ( exitCode != 0 )
+        {
+            return new SvnInfoScmResult( cl.toString(), "The svn command 
failed.", stderr.getOutput(), false );
+        }
+
+        return new SvnInfoScmResult( cl.toString(), consumer.getInfoItems() );
+    }
+
+    private static Commandline createCommandLine( SvnScmProviderRepository 
repository, ScmFileSet fileSet,
+                                                  boolean recursive, String 
revision )
+    {
+        Commandline cl = SvnCommandLineUtils.getBaseSvnCommandLine( TMP_DIR, 
repository );
+
+        cl.createArgument().setValue( "info" );
+
+        if ( recursive )
+        {
+            cl.createArgument().setValue( "--recursive" );
+        }
+
+        if ( StringUtils.isNotEmpty( revision ) )
+        {
+            cl.createArgument().setValue( "-r" );
+
+            cl.createArgument().setValue( revision );
+        }
+
+        Iterator it = fileSet.getFileList().iterator();
+
+        while ( it.hasNext() )
+        {
+            File file = (File) it.next();
+
+            if ( repository == null )
+            {
+                cl.createArgument().setValue( file.getPath() );
+            }
+            else
+            {
+                cl.createArgument().setValue( repository.getUrl() + "/" + 
file.getPath().replace( '\\', '/' ) );
+            }
+        }
+
+        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/info/SvnInfoCommand.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/info/SvnInfoCommand.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/info/SvnInfoConsumer.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/info/SvnInfoConsumer.java?view=auto&rev=453277
==============================================================================
--- 
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/info/SvnInfoConsumer.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/info/SvnInfoConsumer.java
 Thu Oct  5 09:07:28 2006
@@ -0,0 +1,108 @@
+package org.apache.maven.scm.provider.svn.svnexe.command.info;
+
+/*
+ * 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.provider.svn.command.info.SvnInfoItem;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:[EMAIL PROTECTED]">Kenney Westerhof</a>
+ * @version $Id$
+ */
+public class SvnInfoConsumer
+    implements StreamConsumer
+{
+    private List infoItems = new ArrayList();
+
+    private SvnInfoItem currentItem = new SvnInfoItem();
+
+    public void consumeLine( String s )
+    {
+        if ( s.equals( "" ) )
+        {
+            if ( currentItem != null )
+            {
+                infoItems.add( currentItem );
+            }
+
+            currentItem = new SvnInfoItem();
+        }
+        else if ( s.startsWith( "Path: " ) )
+        {
+            currentItem.setPath( getValue( s ) );
+        }
+        else if ( s.startsWith( "URL: " ) )
+        {
+            currentItem.setURL( getValue( s ) );
+        }
+        else if ( s.startsWith( "Repository Root: " ) )
+        {
+            currentItem.setRepositoryRoot( getValue( s ) );
+        }
+        else if ( s.startsWith( "Repository UUID: " ) )
+        {
+            currentItem.setRepositoryUUID( getValue( s ) );
+        }
+        else if ( s.startsWith( "Revision: " ) )
+        {
+            currentItem.setRevision( getValue( s ) );
+        }
+        else if ( s.startsWith( "Node Kind: " ) )
+        {
+            currentItem.setNodeKind( getValue( s ) );
+        }
+        else if ( s.startsWith( "Schedule: " ) )
+        {
+            currentItem.setSchedule( getValue( s ) );
+        }
+        else if ( s.startsWith( "Last Changed Author: " ) )
+        {
+            currentItem.setLastChangedAuthor( getValue( s ) );
+        }
+        else if ( s.startsWith( "Last Changed Rev: " ) )
+        {
+            currentItem.setLastChangedRevision( getValue( s ) );
+        }
+        else if ( s.startsWith( "Last Changed Date: " ) )
+        {
+            currentItem.setLastChangedDate( getValue( s ) );
+        }
+    }
+
+    private static String getValue( String s )
+    {
+        int idx = s.indexOf( ": " );
+
+        if ( idx < 0 )
+        {
+            // FIXME: Can't throw any exceptions in consumeLine..
+            return null;
+        }
+        else
+        {
+            return s.substring( idx + 2 );
+        }
+    }
+
+    public List getInfoItems()
+    {
+        return infoItems;
+    }
+}

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


Reply via email to