You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ac...@apache.org on 2015/07/18 11:09:22 UTC

[05/23] camel git commit: CAMEL-7982: camel-git - A generic git component, add commit operation

CAMEL-7982: camel-git - A generic git component, add commit operation


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/288d3bde
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/288d3bde
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/288d3bde

Branch: refs/heads/master
Commit: 288d3bded33dd180af5c7c7390bbbc2515b89ec5
Parents: 13b7373
Author: Andrea Cosentino <an...@gmail.com>
Authored: Sat Jul 18 11:05:59 2015 +0200
Committer: Andrea Cosentino <an...@gmail.com>
Committed: Sat Jul 18 11:08:14 2015 +0200

----------------------------------------------------------------------
 .../camel/component/git/GitConstants.java       |   1 +
 .../camel/component/git/GitOperation.java       |   1 +
 .../apache/camel/component/git/GitProducer.java |  64 +++++++++--
 .../github/producer/GitProducerTest.java        | 108 ++++++++++++++++++-
 4 files changed, 162 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/288d3bde/components/camel-git/src/main/java/org/apache/camel/component/git/GitConstants.java
----------------------------------------------------------------------
diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/GitConstants.java b/components/camel-git/src/main/java/org/apache/camel/component/git/GitConstants.java
index c96959b..0ec6856 100644
--- a/components/camel-git/src/main/java/org/apache/camel/component/git/GitConstants.java
+++ b/components/camel-git/src/main/java/org/apache/camel/component/git/GitConstants.java
@@ -19,4 +19,5 @@ package org.apache.camel.component.git;
 public interface GitConstants {
 	public static final String GIT_OPERATION = "CamelGitOperation";
 	public static final String GIT_FILE_NAME = "CamelGitFilename";
+	public static final String GIT_COMMIT_MESSAGE = "CamelGitCommitMessage";
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/288d3bde/components/camel-git/src/main/java/org/apache/camel/component/git/GitOperation.java
----------------------------------------------------------------------
diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/GitOperation.java b/components/camel-git/src/main/java/org/apache/camel/component/git/GitOperation.java
index 62b19a4..49109c6 100644
--- a/components/camel-git/src/main/java/org/apache/camel/component/git/GitOperation.java
+++ b/components/camel-git/src/main/java/org/apache/camel/component/git/GitOperation.java
@@ -21,4 +21,5 @@ public interface GitOperation {
     public final static String CLONE_OPERATION = "clone";
     public final static String INIT_OPERATION = "init";
     public final static String ADD_OPERATION = "add";
+    public final static String COMMIT_OPERATION = "commit";
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/288d3bde/components/camel-git/src/main/java/org/apache/camel/component/git/GitProducer.java
----------------------------------------------------------------------
diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/GitProducer.java b/components/camel-git/src/main/java/org/apache/camel/component/git/GitProducer.java
index 1ccbac7..5ee7ee3 100644
--- a/components/camel-git/src/main/java/org/apache/camel/component/git/GitProducer.java
+++ b/components/camel-git/src/main/java/org/apache/camel/component/git/GitProducer.java
@@ -1,12 +1,14 @@
 package org.apache.camel.component.git;
 
 import java.io.File;
+import java.io.IOException;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.impl.DefaultProducer;
 import org.apache.camel.util.ObjectHelper;
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -22,12 +24,17 @@ public class GitProducer extends DefaultProducer{
 
 	@Override
 	public void process(Exchange exchange) throws Exception {
-        String operation;		
+        String operation;	
+        Repository repo;
 	    if (ObjectHelper.isEmpty(endpoint.getOperation())) {
 	        operation = exchange.getIn().getHeader(GitConstants.GIT_OPERATION, String.class);
 	    } else {
 	    	operation = endpoint.getOperation();
 	    }
+    	if (ObjectHelper.isEmpty(endpoint.getLocalPath())) {
+    		throw new IllegalArgumentException("Local path must specified to execute " + operation);
+    	}
+    	repo = getLocalRepository();
 	    
 	    switch (operation) {
 	    case GitOperation.CLONE_OPERATION:
@@ -39,9 +46,14 @@ public class GitProducer extends DefaultProducer{
 	    	break;
 
 	    case GitOperation.ADD_OPERATION:
-	    	doAdd(exchange, operation);
-	    	break;	    	
+	    	doAdd(exchange, operation, repo);
+	    	break;
+	    	
+	    case GitOperation.COMMIT_OPERATION:
+	    	doCommit(exchange, operation, repo);
+	    	break;	
 	    }
+	    repo.close();
 	}
 	
     protected void doClone(Exchange exchange, String operation) {
@@ -70,7 +82,7 @@ public class GitProducer extends DefaultProducer{
     		throw new IllegalArgumentException("Local path must specified to execute " + operation);
     	}
     	try {
-			result = Git.init().setDirectory(new File(endpoint.getLocalPath(),"")).call();
+			result = Git.init().setDirectory(new File(endpoint.getLocalPath(),"")).setBare(false).call();
 		} catch (Exception e) {
 			LOG.error("There was an error in Git " + operation + " operation");
 			e.printStackTrace();
@@ -79,21 +91,55 @@ public class GitProducer extends DefaultProducer{
 		}
     }
     
-    protected void doAdd(Exchange exchange, String operation) {
+    protected void doAdd(Exchange exchange, String operation, Repository repo) {
+    	Git git = null;
     	String fileName = null;
-    	if (ObjectHelper.isEmpty(endpoint.getLocalPath())) {
-    		throw new IllegalArgumentException("Local path must specified to execute " + operation);
-    	}
     	if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(GitConstants.GIT_FILE_NAME))) {
     		fileName = exchange.getIn().getHeader(GitConstants.GIT_FILE_NAME, String.class);
     	} else {
     		throw new IllegalArgumentException("File name must be specified to execute " + operation);
     	}
     	try {
-			Git.open(new File(endpoint.getLocalPath())).add().addFilepattern(fileName).call();
+    		git = new Git(repo);
+			git.add().addFilepattern(fileName).call();
 		} catch (Exception e) {
 			LOG.error("There was an error in Git " + operation + " operation");
 			e.printStackTrace();
 		}
     }
+    
+    protected void doCommit(Exchange exchange, String operation, Repository repo) {
+    	Git git = null;
+    	String commitMessage = null;
+    	if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(GitConstants.GIT_COMMIT_MESSAGE))) {
+    		commitMessage = exchange.getIn().getHeader(GitConstants.GIT_COMMIT_MESSAGE, String.class);
+    	} else {
+    		throw new IllegalArgumentException("Commit message must be specified to execute " + operation);
+    	}
+    	try {
+            git = new Git(repo);
+            if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) {
+                git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call();
+            }
+    		git.commit().setMessage(commitMessage).call();
+		} catch (Exception e) {
+			LOG.error("There was an error in Git " + operation + " operation");
+			e.printStackTrace();
+		}
+    }
+    
+    private Repository getLocalRepository(){
+        FileRepositoryBuilder builder = new FileRepositoryBuilder();
+        Repository repo = null;
+		try {
+			repo = builder.setGitDir(new File(endpoint.getLocalPath(), ".git"))
+			        .readEnvironment() // scan environment GIT_* variables
+			        .findGitDir() // scan up the file system tree
+			        .build();
+		} catch (IOException e) {
+			LOG.error("There was an error, cannot open " + endpoint.getLocalPath() + " repository");
+			e.printStackTrace();
+		}
+		return repo;
+    }
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/288d3bde/components/camel-git/src/test/java/org/apache/camel/component/github/producer/GitProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-git/src/test/java/org/apache/camel/component/github/producer/GitProducerTest.java b/components/camel-git/src/test/java/org/apache/camel/component/github/producer/GitProducerTest.java
index 18965c8..f911648 100755
--- a/components/camel-git/src/test/java/org/apache/camel/component/github/producer/GitProducerTest.java
+++ b/components/camel-git/src/test/java/org/apache/camel/component/github/producer/GitProducerTest.java
@@ -24,17 +24,22 @@ import org.apache.camel.Processor;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.git.GitConstants;
 import org.apache.camel.test.junit4.CamelTestSupport;
+import org.eclipse.jgit.api.CreateBranchCommand.SetupUpstreamMode;
 import org.eclipse.jgit.api.Git;
 import org.eclipse.jgit.api.Status;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
 import org.junit.Test;
 
-public class GitProducerTest extends CamelTestSupport{
+public class GitProducerTest extends CamelTestSupport {
 
-	private final static String GIT_LOCAL_REPO = "pippo";
+	private final static String GIT_LOCAL_REPO = "testRepo";
 	private final static String FILENAME_TO_ADD = "filetest.txt";
+	private final static String COMMIT_MESSAGE = "Test commit";
+	private final static String COMMIT_MESSAGE_BRANCH = "Test commit on a branch";
+	private final static String BRANCH_TEST = "testBranch";
 	
     @Override
     public void setUp() throws Exception {
@@ -88,6 +93,99 @@ public class GitProducerTest extends CamelTestSupport{
         repository.close();
     }
     
+    @Test
+    public void commitTest() throws Exception {
+
+    	Repository repository = getTestRepository();
+        
+        File fileToAdd = new File(GIT_LOCAL_REPO, FILENAME_TO_ADD);
+        fileToAdd.createNewFile();
+        
+        template.send("direct:add", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(GitConstants.GIT_FILE_NAME, FILENAME_TO_ADD);
+            }
+        });
+        File gitDir = new File(GIT_LOCAL_REPO, ".git");
+        assertEquals(gitDir.exists(), true);
+        
+        Status status = new Git(repository).status().call();
+        assertTrue(status.getAdded().contains(FILENAME_TO_ADD));
+        
+        template.send("direct:commit", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(GitConstants.GIT_COMMIT_MESSAGE, COMMIT_MESSAGE);
+            }
+        });
+        Iterable<RevCommit> logs = new Git(repository).log()
+                .call();
+        int count = 0;
+        for (RevCommit rev : logs) {
+            assertEquals(rev.getShortMessage(), COMMIT_MESSAGE);
+            count++;
+        }
+        assertEquals(count, 1);
+        repository.close();
+    }
+    
+    @Test
+    public void commitBranchTest() throws Exception {
+
+    	Repository repository = getTestRepository();
+        
+        File fileToAdd = new File(GIT_LOCAL_REPO, FILENAME_TO_ADD);
+        fileToAdd.createNewFile();
+        
+        template.send("direct:add", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(GitConstants.GIT_FILE_NAME, FILENAME_TO_ADD);
+            }
+        });
+        File gitDir = new File(GIT_LOCAL_REPO, ".git");
+        assertEquals(gitDir.exists(), true);
+        
+        Status status = new Git(repository).status().call();
+        assertTrue(status.getAdded().contains(FILENAME_TO_ADD));
+        
+        template.send("direct:commit", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(GitConstants.GIT_COMMIT_MESSAGE, COMMIT_MESSAGE);
+            }
+        });
+        Iterable<RevCommit> logs = new Git(repository).log()
+                .call();
+        int count = 0;
+        for (RevCommit rev : logs) {
+            assertEquals(rev.getShortMessage(), COMMIT_MESSAGE);
+            count++;
+        }
+        assertEquals(count, 1);
+        
+        Git git = new Git(repository);
+        git.checkout().setCreateBranch(true).setName(BRANCH_TEST).
+        setUpstreamMode(SetupUpstreamMode.SET_UPSTREAM).call();
+        
+        template.send("direct:commit-branch", new Processor() {
+            @Override
+            public void process(Exchange exchange) throws Exception {
+                exchange.getIn().setHeader(GitConstants.GIT_COMMIT_MESSAGE, COMMIT_MESSAGE_BRANCH);
+            }
+        });
+        logs = git.log().call();
+        count = 0;
+        for (RevCommit rev : logs) {
+        	if (count == 0) assertEquals(rev.getShortMessage(), COMMIT_MESSAGE_BRANCH);
+        	if (count == 1) assertEquals(rev.getShortMessage(), COMMIT_MESSAGE);
+            count++;
+        }
+        assertEquals(count, 2);
+        repository.close();
+    }
+    
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {
         return new RouteBuilder() {            
@@ -99,13 +197,17 @@ public class GitProducerTest extends CamelTestSupport{
                         .to("git://https://github.com/oscerd/json-webserver-example.git?localPath=" + GIT_LOCAL_REPO + "&operation=init");
                 from("direct:add")
                         .to("git://https://github.com/oscerd/json-webserver-example.git?localPath=" + GIT_LOCAL_REPO + "&operation=add");
+                from("direct:commit")
+                        .to("git://https://github.com/oscerd/json-webserver-example.git?localPath=" + GIT_LOCAL_REPO + "&operation=commit");
+                from("direct:commit-branch")
+                        .to("git://https://github.com/oscerd/json-webserver-example.git?localPath=" + GIT_LOCAL_REPO + "&operation=commit&branchName=" + BRANCH_TEST);
             } 
         };
     }
     
     private Repository getTestRepository() throws IOException, IllegalStateException, GitAPIException {
         File gitRepo = new File(GIT_LOCAL_REPO, ".git");
-        Git.init().setDirectory(new File(GIT_LOCAL_REPO,"")).call();
+        Git.init().setDirectory(new File(GIT_LOCAL_REPO,"")).setBare(false).call();
         // now open the resulting repository with a FileRepositoryBuilder
         FileRepositoryBuilder builder = new FileRepositoryBuilder();
         Repository repo = builder.setGitDir(gitRepo)