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 jv...@apache.org on 2008/04/05 23:58:57 UTC

svn commit: r645182 [3/5] - in /maven/scm/trunk/maven-scm-providers/maven-scm-providers-git: ./ maven-scm-provider-git-commons/ maven-scm-provider-git-commons/src/ maven-scm-provider-git-commons/src/main/ maven-scm-provider-git-commons/src/main/java/ m...

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,201 @@
+package org.apache.maven.scm.provider.git.gitexe.command.checkin;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.ScmFile;
+import org.apache.maven.scm.ScmFileSet;
+import org.apache.maven.scm.ScmFileStatus;
+import org.apache.maven.scm.ScmVersion;
+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.git.command.GitCommand;
+import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
+import org.apache.maven.scm.provider.git.gitexe.command.GitCommandLineUtils;
+import org.apache.maven.scm.provider.git.gitexe.command.add.GitAddCommand;
+import org.apache.maven.scm.provider.git.gitexe.command.status.GitStatusCommand;
+import org.apache.maven.scm.provider.git.gitexe.command.status.GitStatusConsumer;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
+ */
+public class GitCheckInCommand extends AbstractCheckInCommand implements GitCommand
+{
+    protected CheckInScmResult executeCheckInCommand( ScmProviderRepository repo, ScmFileSet fileSet, String message,
+                                                      ScmVersion version )
+        throws ScmException
+    {
+    	GitScmProviderRepository repository = (GitScmProviderRepository) repo;
+
+        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+        CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
+
+        int exitCode;
+
+        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 );
+        }
+
+        try
+        {
+            if ( !fileSet.getFileList().isEmpty() )
+            {
+                // if specific fileSet is given, we have to git-add them first
+                // otherwise we will use 'git-commit -a' later
+
+                Commandline clAdd = GitAddCommand.createCommandLine( fileSet.getBasedir(), fileSet.getFileList() );
+                
+                exitCode = GitCommandLineUtils.execute( clAdd, stdout, stderr, getLogger() );
+                
+                if ( exitCode != 0 )
+                {
+                    return new CheckInScmResult( clAdd.toString(), "The git-add command failed.", stderr.getOutput(), false );
+                }
+
+            }
+            
+            // git-commit doesn't show single files, but only summary :/
+            // so we must run git-status and consume the output
+            // borrow a few things from the git-status command
+            Commandline clStatus = GitStatusCommand.createCommandLine( repository, fileSet );
+            
+            GitStatusConsumer statusConsumer = new GitStatusConsumer( getLogger(), fileSet.getBasedir() );
+            exitCode = GitCommandLineUtils.execute( clStatus, statusConsumer, stderr, getLogger() );
+            if ( exitCode != 0 )
+            {
+                // git-status returns non-zero if nothing to do
+                getLogger().info( "nothing added to commit but untracked files present (use \"git add\" to track)" );
+            }
+            
+        	Commandline clCommit = createCommitCommandLine(repository, fileSet, messageFile);
+        	
+            exitCode = GitCommandLineUtils.execute( clCommit, stdout, stderr, getLogger() );
+	        if ( exitCode != 0 )
+	        {
+	            return new CheckInScmResult( clCommit.toString(), "The git-commit command failed.", stderr.getOutput(), false );
+	        }
+	        
+	        Commandline cl = createPushCommandLine( repository, fileSet, version );
+	
+            exitCode = GitCommandLineUtils.execute( cl, stdout, stderr, getLogger() );
+	        if ( exitCode != 0 )
+	        {
+	            return new CheckInScmResult( cl.toString(), "The git-push command failed.", stderr.getOutput(), false );
+	        }
+
+	        List checkedInFiles = new ArrayList( statusConsumer.getChangedFiles().size() );
+	        
+	        // rewrite all detected files to now have status 'checked_in'
+	        for ( Iterator it = statusConsumer.getChangedFiles().iterator(); it.hasNext(); )
+	        {
+	            ScmFile scmfile = new ScmFile( ((ScmFile) it.next()).getPath(), ScmFileStatus.CHECKED_IN );
+	            
+	            if ( fileSet.getFileList().isEmpty() ) {
+	                checkedInFiles.add( scmfile );	                
+	            }
+	            else
+	            {
+	                // if a specific fileSet is given, we have to check if the file is really tracked
+	                for ( Iterator itfl = fileSet.getFileList().iterator(); itfl.hasNext(); )
+	                {
+	                    File f = (File) itfl.next();
+	                    if ( f.toString().equals( scmfile.getPath() )) 
+	                    {
+	                        checkedInFiles.add( scmfile );                  
+	                    }
+
+	                }
+	            }
+	        }
+	        
+	        return new CheckInScmResult( cl.toString(), checkedInFiles );
+        }
+        finally
+        {
+            try
+            {
+                FileUtils.forceDelete( messageFile );
+            }
+            catch ( IOException ex )
+            {
+                // ignore
+            }
+        }
+
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public static Commandline createPushCommandLine( GitScmProviderRepository repository, ScmFileSet fileSet,
+    		                                         ScmVersion version )
+        throws ScmException
+    {
+        Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( fileSet.getBasedir(), "push");
+
+        //X TODO handle version
+        
+        return cl;
+    }
+    
+    public static Commandline createCommitCommandLine( GitScmProviderRepository repository, ScmFileSet fileSet,
+                                                       File messageFile )
+	throws ScmException
+	{
+		Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( fileSet.getBasedir(), "commit");
+
+		cl.createArgument().setValue( "--verbose" );
+		
+		cl.createArgument().setValue( "-F" );
+		cl.createArgument().setValue( messageFile.getAbsolutePath() );
+
+		if ( fileSet.getFileList().isEmpty() ) 
+		{
+		    // commit all tracked files
+		    cl.createArgument().setValue( "-a" );
+		}
+		else 
+		{
+		    // specify exactly which files to commit 
+		    GitCommandLineUtils.addTarget( cl, fileSet.getFileList() );
+		}
+		
+		return cl;
+	}
+
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommand.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,187 @@
+package org.apache.maven.scm.provider.git.gitexe.command.checkout;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.ScmFileStatus;
+import org.apache.maven.scm.ScmTag;
+import org.apache.maven.scm.ScmVersion;
+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.git.command.GitCommand;
+import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
+import org.apache.maven.scm.provider.git.gitexe.command.GitCommandLineUtils;
+import org.apache.maven.scm.provider.git.gitexe.command.list.GitListCommand;
+import org.apache.maven.scm.provider.git.gitexe.command.list.GitListConsumer;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+
+/**
+ * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
+ */
+public class GitCheckOutCommand extends AbstractCheckOutCommand implements GitCommand
+{
+    /**
+     * For git, the given repository is a remote one.
+     * We have to clone it first if the working directory does not contain a git repo yet,
+     * otherwise we have to git-pull it.
+     * 
+     * TODO We currently assume a '.git' directory, so this does not work for --bare repos
+     */
+    protected CheckOutScmResult executeCheckOutCommand( ScmProviderRepository repo, ScmFileSet fileSet,
+                                                        ScmVersion version )
+        throws ScmException
+    {
+        GitScmProviderRepository repository = (GitScmProviderRepository) repo;
+
+        if ( GitScmProviderRepository.PROTOCOL_FILE.equals( repository.getProtocol() ) &&
+             repository.getUrl().indexOf( fileSet.getBasedir().getPath() ) >= 0 ) 
+        {
+            throw new ScmException( "remote repository must not be the working directory" );
+        }
+
+        int exitCode;
+
+        CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
+        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+        
+
+        if ( !fileSet.getBasedir().exists() || 
+             !( new File( fileSet.getBasedir(), ".git" ).exists() ) )
+        {
+            if ( fileSet.getBasedir().exists() ) 
+            {
+                // git refuses to clone otherwise
+                fileSet.getBasedir().delete();
+            }
+            
+            // no git repo seems to exist, let's clone the original repo
+            Commandline clClone = createCloneCommand( repository, fileSet.getBasedir() );
+            
+            exitCode = GitCommandLineUtils.execute( clClone, stdout, stderr, getLogger() );
+            if ( exitCode != 0 )
+            {
+                return new CheckOutScmResult( clClone.toString(), "The git-clone command failed.", stderr.getOutput(), false );
+            }
+        }
+
+        if ( fileSet.getBasedir().exists() && 
+             new File( fileSet.getBasedir(), ".git" ).exists() ) 
+        {
+            // git repo exists, so we must git-pull the changes
+            Commandline clPull = createPullCommand( repository, fileSet.getBasedir(), version );
+            
+            exitCode = GitCommandLineUtils.execute( clPull, stdout, stderr, getLogger() );
+            if ( exitCode != 0 )
+            {
+                return new CheckOutScmResult( clPull.toString(), "The git-pull command failed.", stderr.getOutput(), false );
+            }
+        }
+        
+        // and now lets do the git-checkout itself
+        Commandline cl = createCommandLine( repository, fileSet.getBasedir(), version );
+
+        exitCode = GitCommandLineUtils.execute( cl, stdout, stderr, getLogger() );
+        if ( exitCode != 0 )
+        {
+            return new CheckOutScmResult( cl.toString(), "The git-checkout command failed.", stderr.getOutput(), false );
+        }
+
+        // and now search for the files
+        GitListConsumer listConsumer = new GitListConsumer( getLogger()
+        		                                          , fileSet.getBasedir()
+        		                                          , ScmFileStatus.CHECKED_IN);
+
+        Commandline clList = GitListCommand.createCommandLine( repository, fileSet.getBasedir() );
+        
+        exitCode = GitCommandLineUtils.execute( clList, listConsumer, stderr, getLogger() );
+        if ( exitCode != 0 )
+        {
+            return new CheckOutScmResult( clList.toString(), "The git-ls-files command failed.", stderr.getOutput(), false );
+        }
+
+        return new CheckOutScmResult( cl.toString(), listConsumer.getListedFiles() );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public static Commandline createCommandLine( GitScmProviderRepository repository, File workingDirectory,
+                                                 ScmVersion version )
+    {
+        Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( workingDirectory, "checkout" );
+
+        
+        if ( version != null && StringUtils.isNotEmpty( version.getName() ) )
+        {
+            cl.createArgument().setValue( version.getName() );
+        }
+
+        return cl;
+    }
+    
+    /**
+     * create a git-clone repository command 
+     */
+    private Commandline createCloneCommand( GitScmProviderRepository repository, File workingDirectory )
+    {
+        Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( workingDirectory.getParentFile(), "clone" );
+        
+        cl.createArgument().setValue( repository.getUrl() );
+        
+        cl.createArgument().setFile( workingDirectory );
+        
+        return cl;
+    }
+    
+    /**
+     * create a git-pull repository command 
+     */
+    private Commandline createPullCommand( GitScmProviderRepository repository, File workingDirectory,
+                                           ScmVersion version )
+    {
+        Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( workingDirectory, "pull" );
+        
+        cl.createArgument().setValue( repository.getUrl() );
+        
+        if ( version != null && StringUtils.isNotEmpty( version.getName() ) )
+        {
+            if ( version instanceof ScmTag )
+            {
+            	cl.createArgument().setValue( "tag" );
+            	cl.createArgument().setValue( version.getName() );
+            }
+            else
+            {
+            	cl.createArgument().setValue( version.getName() + ":" + version.getName() );
+            }
+        }
+        else {
+        	cl.createArgument().setValue( "master" );
+        }
+        return cl;
+    }    
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommand.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/diff/GitDiffCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/diff/GitDiffCommand.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/diff/GitDiffCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/diff/GitDiffCommand.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,96 @@
+package org.apache.maven.scm.provider.git.gitexe.command.diff;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.ScmVersion;
+import org.apache.maven.scm.command.diff.AbstractDiffCommand;
+import org.apache.maven.scm.command.diff.DiffScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.git.command.GitCommand;
+import org.apache.maven.scm.provider.git.command.diff.GitDiffConsumer;
+import org.apache.maven.scm.provider.git.gitexe.command.GitCommandLineUtils;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+
+/**
+ * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
+ */
+public class GitDiffCommand extends AbstractDiffCommand implements GitCommand
+{
+    protected DiffScmResult executeDiffCommand( ScmProviderRepository repo, ScmFileSet fileSet, ScmVersion startVersion,
+                                                ScmVersion endVersion )
+        throws ScmException
+    {
+        GitDiffConsumer consumer = new GitDiffConsumer( getLogger(), fileSet.getBasedir() );
+        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+        int exitCode;
+
+        Commandline clDiff2Index = createCommandLine( fileSet.getBasedir(), startVersion, endVersion, false );
+
+        exitCode = GitCommandLineUtils.execute( clDiff2Index, consumer, stderr, getLogger() );
+        if ( exitCode != 0 )
+        {
+            return new DiffScmResult( clDiff2Index.toString(), "The git-diff command failed.", stderr.getOutput(), false );
+        }
+
+        Commandline clDiff2Head = createCommandLine( fileSet.getBasedir(), startVersion, endVersion, true );
+
+        exitCode = GitCommandLineUtils.execute( clDiff2Head, consumer, stderr, getLogger() );
+        if ( exitCode != 0 )
+        {
+            return new DiffScmResult( clDiff2Head.toString(), "The git-diff command failed.", stderr.getOutput(), false );
+        }
+
+        return new DiffScmResult( clDiff2Index.toString(), consumer.getChangedFiles(), consumer.getDifferences(),
+                                  consumer.getPatch() );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    /**
+     * @param cached if <code>true</code> diff the index to the head, else diff the tree to the index
+     */
+    public static Commandline createCommandLine( File workingDirectory, ScmVersion startVersion, ScmVersion endVersion, boolean cached )
+    {
+        Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( workingDirectory, "diff" );
+
+        if ( cached ) {
+        	cl.createArgument().setValue( "--cached" );
+        }
+
+        if ( startVersion != null && StringUtils.isNotEmpty( startVersion.getName() ) )
+        {
+            cl.createArgument().setValue( startVersion.getName() );
+        }
+        if ( endVersion != null && StringUtils.isNotEmpty( endVersion.getName() ) )
+        {
+            cl.createArgument().setValue( endVersion.getName() );
+        }
+
+        return cl;
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/diff/GitDiffCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/diff/GitDiffCommand.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/list/GitListCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/list/GitListCommand.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/list/GitListCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/list/GitListCommand.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,85 @@
+package org.apache.maven.scm.provider.git.gitexe.command.list;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.ScmFileStatus;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.command.list.AbstractListCommand;
+import org.apache.maven.scm.command.list.ListScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.git.command.GitCommand;
+import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
+import org.apache.maven.scm.provider.git.gitexe.command.GitCommandLineUtils;
+import org.apache.maven.scm.provider.git.gitexe.command.list.GitListConsumer;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+
+/**
+ * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
+ */
+public class GitListCommand extends AbstractListCommand implements GitCommand
+{
+
+    protected ListScmResult executeListCommand( ScmProviderRepository repo, ScmFileSet fileSet,
+                                                boolean recursive, ScmVersion scmVersion )
+        throws ScmException
+    {
+        GitScmProviderRepository repository = (GitScmProviderRepository) repo;
+
+        if ( GitScmProviderRepository.PROTOCOL_FILE.equals( repository.getProtocol() ) &&
+             repository.getUrl().indexOf( fileSet.getBasedir().getPath() ) >= 0 ) 
+        {
+            throw new ScmException( "remote repository must not be the working directory" );
+        }
+
+        int exitCode;
+
+        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+        GitListConsumer consumer = new GitListConsumer( getLogger()
+        		                                      , fileSet.getBasedir().getParentFile()
+        		                                      , ScmFileStatus.CHECKED_IN );
+        
+        Commandline cl = createCommandLine( repository, fileSet.getBasedir() );
+
+        exitCode = GitCommandLineUtils.execute( cl, consumer, stderr, getLogger() );
+        if ( exitCode != 0 )
+        {
+            return new ListScmResult( cl.toString(), "The git-ls-files command failed.", stderr.getOutput(), false );
+        }
+
+        return new ListScmResult( cl.toString(), consumer.getListedFiles() );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public static Commandline createCommandLine( GitScmProviderRepository repository, File workingDirectory )
+    {
+        Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( workingDirectory, "ls-files" );
+        
+        return cl;
+    }
+    
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/list/GitListCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/list/GitListCommand.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/list/GitListConsumer.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/list/GitListConsumer.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/list/GitListConsumer.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/list/GitListConsumer.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,65 @@
+package org.apache.maven.scm.provider.git.gitexe.command.list;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.maven.scm.provider.git.gitexe.command.AbstractFileCheckingConsumer;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
+ */
+public class GitListConsumer
+    extends AbstractFileCheckingConsumer
+{
+	private ScmFileStatus fileStatus; 
+
+	/**
+	 * @param logger
+	 * @param workingDirectory
+	 * @param fileStatus will be used for each file found
+	 */
+    public GitListConsumer( ScmLogger logger, File workingDirectory, ScmFileStatus fileStatus )
+    {
+        super( logger, workingDirectory );
+        
+        this.fileStatus = fileStatus;
+    }
+
+    protected void parseLine( String line )
+    {
+        String file = line;
+
+        addFile( new ScmFile( file, fileStatus ) );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public List getListedFiles()
+    {
+        return getFiles();
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/list/GitListConsumer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/list/GitListConsumer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveCommand.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveCommand.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,79 @@
+package org.apache.maven.scm.provider.git.gitexe.command.remove;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.remove.AbstractRemoveCommand;
+import org.apache.maven.scm.command.remove.RemoveScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.git.command.GitCommand;
+import org.apache.maven.scm.provider.git.gitexe.command.GitCommandLineUtils;
+import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
+ */
+public class GitRemoveCommand extends AbstractRemoveCommand implements GitCommand
+{
+    protected ScmResult executeRemoveCommand( ScmProviderRepository repo, ScmFileSet fileSet, String message )
+        throws ScmException
+    {
+        GitScmProviderRepository repository = (GitScmProviderRepository) repo;
+
+        if ( fileSet.getFileList().isEmpty() )
+        {
+            throw new ScmException( "You must provide at least one file/directory to remove" );
+        }
+
+        Commandline cl = createCommandLine( fileSet.getBasedir(), fileSet.getFileList() );
+        
+        GitRemoveConsumer consumer = new GitRemoveConsumer( getLogger() );
+
+        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+
+        int exitCode;
+
+        exitCode = GitCommandLineUtils.execute( cl, consumer, stderr, getLogger() );
+        if ( exitCode != 0 )
+        {
+            return new RemoveScmResult( cl.toString(), "The git command failed.", stderr.getOutput(), false );
+        }
+
+        return new RemoveScmResult( cl.toString(), consumer.getRemovedFiles() );
+    }
+
+    public static Commandline createCommandLine( File workingDirectory, List/*File*/ files )
+    throws ScmException
+	{
+	    Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( workingDirectory, "rm" );
+	
+	    GitCommandLineUtils.addTarget( cl, files );
+	
+	    return cl;
+	}
+
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveCommand.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveConsumer.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveConsumer.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveConsumer.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveConsumer.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,99 @@
+package org.apache.maven.scm.provider.git.gitexe.command.remove;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.regexp.RE;
+import org.apache.regexp.RESyntaxException;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
+ */
+public class GitRemoveConsumer implements StreamConsumer
+{
+    /**
+     * The pattern used to match deleted file lines
+     */
+    private static final String REMOVED_PATTERN = "^rm\\s'(.*)'";
+
+    private ScmLogger logger;
+
+    private List removedFiles = new ArrayList();
+
+    /**
+     * @see #REMOVED_PATTERN
+     */
+    private RE removedRegexp;
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public GitRemoveConsumer( ScmLogger logger )
+    {
+        this.logger = logger;
+        try
+        {
+            removedRegexp = new RE( REMOVED_PATTERN );
+        }
+        catch ( RESyntaxException ex )
+        {
+            throw new RuntimeException(
+                "INTERNAL ERROR: Could not create regexp to parse git log file. This shouldn't happen. Something is probably wrong with the oro installation.",
+                ex );
+        }        
+    }
+
+    // ----------------------------------------------------------------------
+    // StreamConsumer Implementation
+    // ----------------------------------------------------------------------
+
+    public void consumeLine( String line )
+    {
+        if ( line.length() <= 2 )
+        {
+            return;
+        }
+
+        if ( removedRegexp.match( line ) ) 
+        {
+        	String file = removedRegexp.getParen( 1 );
+            removedFiles.add( new ScmFile( file, ScmFileStatus.DELETED ) );
+        }
+        else
+        {
+            logger.info( "could not parse line: " + line );
+
+            return;
+        }
+    }
+
+    public List getRemovedFiles()
+    {
+        return removedFiles;
+    }
+
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveConsumer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/remove/GitRemoveConsumer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusCommand.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusCommand.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,72 @@
+package org.apache.maven.scm.provider.git.gitexe.command.status;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.status.AbstractStatusCommand;
+import org.apache.maven.scm.command.status.StatusScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.git.command.GitCommand;
+import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
+import org.apache.maven.scm.provider.git.gitexe.command.GitCommandLineUtils;
+import org.codehaus.plexus.util.cli.CommandLineUtils;
+import org.codehaus.plexus.util.cli.Commandline;
+
+/**
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @version $Id$
+ */
+public class GitStatusCommand
+    extends AbstractStatusCommand
+    implements GitCommand
+{
+    protected StatusScmResult executeStatusCommand( ScmProviderRepository repo, ScmFileSet fileSet )
+        throws ScmException
+    {
+        Commandline cl = createCommandLine( (GitScmProviderRepository) repo, fileSet );
+
+        GitStatusConsumer consumer = new GitStatusConsumer( getLogger(), fileSet.getBasedir() );
+
+        CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+
+        int exitCode;
+
+        exitCode = GitCommandLineUtils.execute( cl, consumer, stderr, getLogger() );
+        if ( exitCode != 0 )
+        {
+            // git-status returns non-zero if nothing to do
+            getLogger().info( "nothing added to commit but untracked files present (use \"git add\" to track)" );
+        }
+
+        return new StatusScmResult( cl.toString(), consumer.getChangedFiles() );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public static Commandline createCommandLine( GitScmProviderRepository repository, ScmFileSet fileSet )
+    {
+        Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( fileSet.getBasedir(), "status" );
+
+        return cl;
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusCommand.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,149 @@
+package org.apache.maven.scm.provider.git.gitexe.command.status;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.apache.regexp.RE;
+import org.apache.regexp.RESyntaxException;
+import org.codehaus.plexus.util.StringUtils;
+import org.codehaus.plexus.util.cli.StreamConsumer;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
+ */
+public class GitStatusConsumer
+    implements StreamConsumer
+{
+    /**
+     * The pattern used to match added file lines
+     */
+    private static final String ADDED_PATTERN = "^#\\s*new file:\\s*(.*)";
+
+    /**
+     * The pattern used to match modified file lines
+     */
+    private static final String MODIFIED_PATTERN = "^#\\s*modified:\\s*(.*)";
+    
+    /**
+     * The pattern used to match deleted file lines
+     */
+    private static final String DELETED_PATTERN = "^#\\s*deleted:\\s*(.*)";
+    
+    /**
+     * @see #ADDED_PATTERN
+     */
+    private RE addedRegexp;
+
+    /**
+     * @see #MODIFIED_PATTERN
+     */
+    private RE modifiedRegexp;
+    
+    /**
+     * @see #DELETED_PATTERN
+     */
+    private RE deletedRegexp;
+    
+    private ScmLogger logger;
+
+    private File workingDirectory;
+
+    private List changedFiles = new ArrayList();
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public GitStatusConsumer( ScmLogger logger, File workingDirectory )
+    {
+        this.logger = logger;
+        this.workingDirectory = workingDirectory;
+        
+        try
+        {
+            addedRegexp    = new RE( ADDED_PATTERN    );
+            modifiedRegexp = new RE( MODIFIED_PATTERN );
+            deletedRegexp  = new RE( DELETED_PATTERN  );
+        }
+        catch ( RESyntaxException ex )
+        {
+            throw new RuntimeException(
+                "INTERNAL ERROR: Could not create regexp to parse git log file. This shouldn't happen. Something is probably wrong with the oro installation.",
+                ex );
+        }        
+    }
+
+    // ----------------------------------------------------------------------
+    // StreamConsumer Implementation
+    // ----------------------------------------------------------------------
+
+    public void consumeLine( String line )
+    {
+        logger.debug( line );
+        if ( StringUtils.isEmpty( line ) )
+        {
+            return;
+        }
+        
+        ScmFileStatus status = null;
+        
+        String file = null;
+
+        if ( addedRegexp.match( line ) ) 
+        {
+            status = ScmFileStatus.ADDED;
+            file = addedRegexp.getParen( 1 );
+        } 
+        else if ( modifiedRegexp.match( line ) ) 
+        {
+            status = ScmFileStatus.MODIFIED;
+            file = modifiedRegexp.getParen( 1 );
+        }
+        else if ( deletedRegexp.match( line ) ) 
+        {
+            status = ScmFileStatus.DELETED;
+            file = deletedRegexp.getParen( 1 );
+        }
+        
+        // If the file isn't a file; don't add it.
+        if ( file != null )
+        {
+            if ( workingDirectory != null && !new File( workingDirectory, file ).isFile() )
+            {
+                return;
+            }
+            
+            changedFiles.add( new ScmFile( file, status ) );
+        }
+
+        
+    }
+
+    public List getChangedFiles()
+    {
+        return changedFiles;
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/status/GitStatusConsumer.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,161 @@
+package org.apache.maven.scm.provider.git.gitexe.command.tag;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.ScmFileStatus;
+import org.apache.maven.scm.ScmResult;
+import org.apache.maven.scm.command.checkin.CheckInScmResult;
+import org.apache.maven.scm.command.checkout.CheckOutScmResult;
+import org.apache.maven.scm.command.tag.AbstractTagCommand;
+import org.apache.maven.scm.command.tag.TagScmResult;
+import org.apache.maven.scm.provider.ScmProviderRepository;
+import org.apache.maven.scm.provider.git.command.GitCommand;
+import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
+import org.apache.maven.scm.provider.git.gitexe.command.GitCommandLineUtils;
+import org.apache.maven.scm.provider.git.gitexe.command.list.GitListCommand;
+import org.apache.maven.scm.provider.git.gitexe.command.list.GitListConsumer;
+import org.codehaus.plexus.util.FileUtils;
+import org.codehaus.plexus.util.StringUtils;
+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:struberg@yahoo.de">Mark Struberg</a>
+ */
+public class GitTagCommand extends AbstractTagCommand implements GitCommand
+{
+    public ScmResult executeTagCommand( ScmProviderRepository repo, ScmFileSet fileSet, String tag, String message )
+        throws ScmException
+    {
+        if ( tag == null || StringUtils.isEmpty( tag.trim() ) )
+        {
+            throw new ScmException( "tag name must be specified" );
+        }
+
+        if ( !fileSet.getFileList().isEmpty() )
+        {
+            throw new ScmException( "This provider doesn't support tagging subsets of a directory" );
+        }
+
+        GitScmProviderRepository repository = (GitScmProviderRepository) repo;
+
+        File messageFile = FileUtils.createTempFile( "maven-scm-", ".commit", null );
+
+        try
+        {
+            FileUtils.fileWrite( messageFile.getAbsolutePath(), message );
+        }
+        catch ( IOException ex )
+        {
+            return new TagScmResult( null,
+                                     "Error while making a temporary file for the commit message: " + ex.getMessage(),
+                                     null, false );
+        }
+
+
+        try
+        {
+            CommandLineUtils.StringStreamConsumer stdout = new CommandLineUtils.StringStreamConsumer();
+            CommandLineUtils.StringStreamConsumer stderr = new CommandLineUtils.StringStreamConsumer();
+
+            int exitCode;
+
+            Commandline clTag = createCommandLine( repository, fileSet.getBasedir(), tag, messageFile );
+
+            exitCode = GitCommandLineUtils.execute( clTag, stdout, stderr, getLogger() );
+            if ( exitCode != 0 )
+            {
+                return new TagScmResult( clTag.toString(), "The git-tag command failed.", stderr.getOutput(), false );
+            }
+
+            // and now push the tag to the origin repository
+            Commandline clPush = createPushCommandLine( repository, fileSet, tag );
+            
+            exitCode = GitCommandLineUtils.execute( clPush, stdout, stderr, getLogger() );
+            if ( exitCode != 0 )
+            {
+                return new TagScmResult( clPush.toString(), "The git-push command failed.", stderr.getOutput(), false );
+            }
+
+            // plus search for the tagged files
+            GitListConsumer listConsumer = new GitListConsumer( getLogger()
+            		                                          , fileSet.getBasedir()
+            		                                          , ScmFileStatus.TAGGED );
+
+            Commandline clList = GitListCommand.createCommandLine( repository, fileSet.getBasedir() );
+            
+            exitCode = GitCommandLineUtils.execute( clList, listConsumer, stderr, getLogger() );
+            if ( exitCode != 0 )
+            {
+                return new CheckOutScmResult( clList.toString(), "The git-ls-files command failed.", stderr.getOutput(), false );
+            }
+
+            return new TagScmResult( clTag.toString(), listConsumer.getListedFiles() );
+        }
+        finally
+        {
+            try
+            {
+                FileUtils.forceDelete( messageFile );
+            }
+            catch ( IOException ex )
+            {
+                // ignore
+            }
+        }
+
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public static Commandline createCommandLine( GitScmProviderRepository repository, File workingDirectory, String tag,
+                                                 File messageFile )
+    {
+        Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( workingDirectory, "tag" );
+
+        cl.createArgument().setValue( "-F" );
+        cl.createArgument().setValue( messageFile.getAbsolutePath() );
+
+        // Note: this currently assumes you have the tag base checked out too
+        cl.createArgument().setValue( tag );
+
+        return cl;
+    }
+
+    public static Commandline createPushCommandLine( GitScmProviderRepository repository, ScmFileSet fileSet,
+                                                     String tag )
+          throws ScmException
+      {
+          Commandline cl = GitCommandLineUtils.getBaseGitCommandLine( fileSet.getBasedir(), "push");
+
+          cl.createArgument().setValue( "origin" );
+          cl.createArgument().setValue( tag );
+          
+          return cl;
+      }
+      
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/tag/GitTagCommand.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitExeBranchCommandTckTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitExeBranchCommandTckTest.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitExeBranchCommandTckTest.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitExeBranchCommandTckTest.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,30 @@
+package org.apache.maven.scm.provider.git.gitexe.command.branch;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.git.command.branch.GitBranchCommandTckTest;
+
+/**
+ * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
+ */
+public class GitExeBranchCommandTckTest
+    extends GitBranchCommandTckTest
+{
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitExeBranchCommandTckTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/branch/GitExeBranchCommandTckTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogCommandTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogCommandTest.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogCommandTest.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogCommandTest.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,149 @@
+package org.apache.maven.scm.provider.git.gitexe.command.changelog;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.ScmBranch;
+import org.apache.maven.scm.ScmTestCase;
+import org.apache.maven.scm.ScmVersion;
+import org.apache.maven.scm.ScmRevision;
+import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * @author <a href="mailto:evenisse@apache.org">Emmanuel Venisse</a>
+ * @version $Id$
+ */
+public class GitChangeLogCommandTest
+    extends ScmTestCase
+{
+    public void testCommandLineNoDates()
+        throws Exception
+    {
+        testCommandLine( "scm:git:http://foo.com/git", null, null, null,
+                         "git log" );
+    }
+
+    public void testCommandLineWithDates()
+        throws Exception
+    {
+        Date startDate = getDate( 2003, Calendar.SEPTEMBER, 10,  GMT_TIME_ZONE );
+        Date endDate = getDate( 2007, Calendar.OCTOBER, 10, GMT_TIME_ZONE );
+
+        testCommandLine( "scm:git:http://foo.com/git", null, startDate, endDate,
+                         "git log \"--since=2003-09-10 00:00:00 +0000\" \"--until=2007-10-10 00:00:00 +0000\"" );
+    }
+
+    public void testCommandLineStartDateOnly()
+        throws Exception
+    {
+        Date startDate = getDate( 2003, Calendar.SEPTEMBER, 10, 1, 1, 1, GMT_TIME_ZONE );
+
+        testCommandLine( "scm:git:http://foo.com/git", null, startDate, null,
+                         "git log \"--since=2003-09-10 01:01:01 +0000\"" );
+    }
+
+    public void testCommandLineDateFormat()
+        throws Exception
+    {
+        Date startDate = getDate( 2003, Calendar.SEPTEMBER, 10, 1, 1, 1, GMT_TIME_ZONE );
+        Date endDate = getDate( 2005, Calendar.NOVEMBER, 13, 23, 23, 23, GMT_TIME_ZONE );
+
+        testCommandLine( "scm:git:http://foo.com/git", null, startDate, endDate,
+                         "git log \"--since=2003-09-10 01:01:01 +0000\" \"--until=2005-11-13 23:23:23 +0000\"" );
+    }
+
+    public void testCommandLineEndDateOnly()
+        throws Exception
+    {
+        Date endDate = getDate( 2003, Calendar.NOVEMBER, 10, GMT_TIME_ZONE );
+
+        // Only specifying end date should print no dates at all
+        testCommandLine( "scm:git:http://foo.com/git", null, null, endDate,
+                         "git log \"--until=2003-11-10 00:00:00 +0000\"" );
+    }
+
+    public void testCommandLineWithBranchNoDates()
+        throws Exception
+    {
+        testCommandLine( "scm:git:http://foo.com/git", new ScmBranch( "my-test-branch" ), null, null,
+                         "git log" );
+    }
+
+
+    public void testCommandLineWithStartVersion()
+        throws Exception
+    {
+        testCommandLine( "scm:git:http://foo.com/git", new ScmRevision("1"), null,
+                         "git log --since=1" );
+    }
+
+    public void testCommandLineWithStartVersionAndEndVersion()
+        throws Exception
+    {
+        testCommandLine( "scm:git:http://foo.com/git", new ScmRevision("1"), new ScmRevision("10"),
+                         "git log --since=1 --until=10" );
+    }
+
+    public void testCommandLineWithStartVersionAndEndVersionEquals()
+        throws Exception
+    {
+        testCommandLine( "scm:git:http://foo.com/git", new ScmRevision("1"), new ScmRevision("1"),
+                         "git log --since=1 --until=1" );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    private void testCommandLine( String scmUrl, ScmBranch branch, Date startDate, Date endDate, String commandLine )
+        throws Exception
+    {
+        File workingDirectory = getTestFile( "target/git-update-command-test" );
+
+        ScmRepository repository = getScmManager().makeScmRepository( scmUrl );
+
+        GitScmProviderRepository gitRepository = (GitScmProviderRepository) repository.getProviderRepository();
+
+        Commandline cl = GitChangeLogCommand.createCommandLine( gitRepository, workingDirectory, branch, startDate,
+                                                                endDate, null, null );
+
+        assertEquals( commandLine, cl.toString() );
+    }
+
+    private void testCommandLine( String scmUrl, ScmVersion startVersion, ScmVersion endVersion, String commandLine )
+        throws Exception
+    {
+        File workingDirectory = getTestFile( "target/git-update-command-test" );
+
+        ScmRepository repository = getScmManager().makeScmRepository( scmUrl );
+
+        GitScmProviderRepository gitRepository = (GitScmProviderRepository) repository.getProviderRepository();
+
+        Commandline cl = GitChangeLogCommand.createCommandLine( gitRepository, workingDirectory, null, null, null,
+                                                                startVersion, endVersion );
+
+        assertEquals( commandLine, cl.toString() );
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogCommandTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogCommandTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogConsumerTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogConsumerTest.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogConsumerTest.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogConsumerTest.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,149 @@
+package org.apache.maven.scm.provider.git.gitexe.command.changelog;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.ChangeSet;
+import org.apache.maven.scm.log.DefaultLog;
+import org.codehaus.plexus.PlexusTestCase;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.text.SimpleDateFormat;
+import java.util.Iterator;
+import java.util.List;
+import java.util.TimeZone;
+
+/**
+ * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
+ */
+public class GitChangeLogConsumerTest
+    extends PlexusTestCase
+{
+    
+    public void testConsumer1()
+    throws Exception
+    {
+        GitChangeLogConsumer consumer = new GitChangeLogConsumer( new DefaultLog(), null );
+
+        File f = getTestFile( "/src/test/resources/git/changelog/gitwhatchanged.log" );
+
+        BufferedReader r = new BufferedReader( new FileReader( f ) );
+
+        String line;
+
+        while ( ( line = r.readLine() ) != null )
+        {
+            consumer.consumeLine( line );
+        }
+
+        List modifications = consumer.getModifications();
+        
+        assertEquals( 6, modifications.size() );
+
+        for ( Iterator i = modifications.iterator(); i.hasNext(); )
+        {
+            ChangeSet entry = (ChangeSet) i.next();
+            
+            assertEquals( "Mark Struberg <st...@yahoo.de>", entry.getAuthor() );
+
+            assertNotNull( entry.getDate() );
+            
+            assertTrue( entry.getComment() != null && entry.getComment().length() > 0 );
+            
+            assertNotNull( entry.getFiles() );
+            assertFalse( entry.getFiles().isEmpty() );
+        }    
+        
+        ChangeSet entry = (ChangeSet) modifications.get( 3 );
+        
+        assertEquals( "Mark Struberg <st...@yahoo.de>", entry.getAuthor() );
+
+        assertNotNull( entry.getDate() );
+        SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss Z" );
+        sdf.setTimeZone( TimeZone.getTimeZone( "GMT" ) );
+        
+        assertEquals( "2007-11-24 00:10:42 +0000", sdf.format( entry.getDate() ) );
+        
+        assertEquals( "/ added" , entry.getComment() );
+        
+        assertNotNull( entry.getFiles() );
+        ChangeFile cf = (ChangeFile) entry.getFiles().get( 0 );
+        assertEquals( "readme.txt", cf.getName()  );
+        assertTrue( cf.getRevision() != null && cf.getRevision().length() > 0 );
+    }
+ 
+    public void testConsumer2()
+    throws Exception
+    {
+        GitChangeLogConsumer consumer = new GitChangeLogConsumer( new DefaultLog(), null );
+
+        File f = getTestFile( "/src/test/resources/git/changelog/gitwhatchanged2.log" );
+
+        BufferedReader r = new BufferedReader( new FileReader( f ) );
+
+        String line;
+
+        while ( ( line = r.readLine() ) != null )
+        {
+            consumer.consumeLine( line );
+        }
+        
+        List modifications = consumer.getModifications();
+        
+        for ( Iterator i = modifications.iterator(); i.hasNext(); )
+        {
+            ChangeSet entry = (ChangeSet) i.next();
+            
+            assertEquals( "Mark Struberg <st...@yahoo.de>", entry.getAuthor() );
+
+            assertNotNull( entry.getDate() );
+            
+            assertTrue( entry.getComment() != null && entry.getComment().length() > 0 );
+            
+            assertNotNull( entry.getFiles() );
+            assertFalse( entry.getFiles().isEmpty() );
+        }    
+        
+        assertEquals( 8, modifications.size() );
+
+        ChangeSet entry = (ChangeSet) modifications.get( 4 );
+        
+        assertEquals( "Mark Struberg <st...@yahoo.de>", entry.getAuthor() );
+
+        assertNotNull( entry.getDate() );
+        SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss Z" );
+        sdf.setTimeZone( TimeZone.getTimeZone( "GMT" ) );
+        
+        assertEquals( "2007-11-27 13:05:36 +0000", sdf.format( entry.getDate() ) );
+
+        assertEquals( "fixed a GitCommandLineUtil and provice first version of the checkin command." , entry.getComment() );
+        
+        assertNotNull( entry.getFiles() );
+        
+        assertEquals( 10, entry.getFiles().size() );
+        
+        ChangeFile cf = (ChangeFile) entry.getFiles().get( 0 );
+        assertEquals( "maven-scm-provider-gitexe/src/main/java/org/apache/maven/scm/provider/git/gitexe/command/GitCommandLineUtils.java", cf.getName()  );
+        assertTrue( cf.getRevision() != null && cf.getRevision().length() > 0 );
+    }
+ 
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogConsumerTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/changelog/GitChangeLogConsumerTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,86 @@
+package org.apache.maven.scm.provider.git.gitexe.command.checkin;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.ScmFileSet;
+import org.apache.maven.scm.ScmTestCase;
+import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
+import org.apache.maven.scm.repository.ScmRepository;
+import org.codehaus.plexus.util.cli.Commandline;
+
+import java.io.File;
+
+/**
+ * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
+ */
+public class GitCheckInCommandTest
+    extends ScmTestCase
+{
+    private File messageFile;
+
+    private String messageFileString;
+
+    public void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        messageFile = new File( "commit-message" );
+
+        String path = messageFile.getAbsolutePath();
+        if ( path.indexOf( ' ' ) >= 0 )
+        {
+            path = "\"" + path + "\"";
+        }
+        messageFileString = "-F " + path;
+    }
+
+    public void testCommandLineWithoutTag()
+        throws Exception
+    {
+        testCommandLine( "scm:git:http://foo.com/git/trunk", "git commit --verbose " + messageFileString + " -a" );
+    }
+
+    public void testCommandLineWithUsername()
+        throws Exception
+    {
+        testCommandLine( "scm:git:http://anonymous@foo.com/git/trunk",
+                         "git commit --verbose " + messageFileString + " -a" );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    private void testCommandLine( String scmUrl, String commandLine )
+        throws Exception
+    {
+        File workingDirectory = getTestFile( "target/git-checkin-command-test" );
+
+        ScmRepository repository = getScmManager().makeScmRepository( scmUrl );
+
+        GitScmProviderRepository gitRepository = (GitScmProviderRepository) repository.getProviderRepository();
+
+        Commandline cl =
+            GitCheckInCommand.createCommitCommandLine( gitRepository, new ScmFileSet( workingDirectory ), messageFile );
+
+        assertEquals( commandLine, cl.toString() );
+    }
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitCheckInCommandTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitExeCheckInCommandTckTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitExeCheckInCommandTckTest.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitExeCheckInCommandTckTest.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitExeCheckInCommandTckTest.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,31 @@
+package org.apache.maven.scm.provider.git.gitexe.command.checkin;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.git.command.checkin.GitCheckInCommandTckTest;
+
+/**
+ * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @version $Id$
+ */
+public class GitExeCheckInCommandTckTest
+    extends GitCheckInCommandTckTest
+{
+}

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitExeCheckInCommandTckTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkin/GitExeCheckInCommandTckTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommandTest.java
URL: http://svn.apache.org/viewvc/maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommandTest.java?rev=645182&view=auto
==============================================================================
--- maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommandTest.java (added)
+++ maven/scm/trunk/maven-scm-providers/maven-scm-providers-git/maven-scm-provider-gitexe/src/test/java/org/apache/maven/scm/provider/git/gitexe/command/checkout/GitCheckOutCommandTest.java Sat Apr  5 14:58:41 2008
@@ -0,0 +1,79 @@
+package org.apache.maven.scm.provider.git.gitexe.command.checkout;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.ScmRevision;
+import org.apache.maven.scm.ScmTestCase;
+import org.apache.maven.scm.manager.ScmManager;
+import org.apache.maven.scm.provider.git.repository.GitScmProviderRepository;
+import org.apache.maven.scm.repository.ScmRepository;
+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 GitCheckOutCommandTest
+    extends ScmTestCase
+{
+    private File workingDirectory;
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public void setUp()
+        throws Exception
+    {
+        super.setUp();
+
+        workingDirectory = getTestFile( "target/git-checkout-command-test" );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    public void testCommandLineWithBranch()
+        throws Exception
+    {
+        testCommandLine( getScmManager(), "scm:git:http://foo.com/git", "mybranch",
+                         "git checkout mybranch" );
+    }
+
+    // ----------------------------------------------------------------------
+    //
+    // ----------------------------------------------------------------------
+
+    private void testCommandLine( ScmManager scmManager, String scmUrl, String revision, String commandLine )
+        throws Exception
+    {
+        ScmRepository repository = scmManager.makeScmRepository( scmUrl );
+
+        GitScmProviderRepository gitRepository = (GitScmProviderRepository) repository.getProviderRepository();
+
+        Commandline cl = GitCheckOutCommand.createCommandLine( gitRepository, workingDirectory,
+                                                               new ScmRevision( revision ) );
+
+        assertEquals( commandLine, cl.toString() );
+    }
+}