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:28 UTC
[11/23] camel git commit: CAMEL-7982: camel-git - A generic git
component, add Push and Pull operations
CAMEL-7982: camel-git - A generic git component, add Push and Pull operations
Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/f3731ed4
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/f3731ed4
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/f3731ed4
Branch: refs/heads/master
Commit: f3731ed4c1058c97f6471114715e737d5b1d1028
Parents: e224e8e
Author: Andrea Cosentino <an...@gmail.com>
Authored: Sat Jul 18 11:06:38 2015 +0200
Committer: Andrea Cosentino <an...@gmail.com>
Committed: Sat Jul 18 11:08:15 2015 +0200
----------------------------------------------------------------------
.../camel/component/git/GitOperation.java | 2 +
.../apache/camel/component/git/GitProducer.java | 60 +++++++++++++
.../github/producer/GitProducerTest.java | 56 +-----------
.../github/producer/GitRemoteProducerTest.java | 91 ++++++++++++++++++++
.../github/producer/GitTestSupport.java | 86 ++++++++++++++++++
5 files changed, 243 insertions(+), 52 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/camel/blob/f3731ed4/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 df7bb0f..8d7b69a 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
@@ -28,4 +28,6 @@ public interface GitOperation {
public final static String DELETE_BRANCH_OPERATION = "deleteBranch";
public final static String STATUS_OPERATION = "status";
public final static String LOG_OPERATION = "log";
+ public final static String PUSH_OPERATION = "push";
+ public final static String PULL_OPERATION = "pull";
}
http://git-wip-us.apache.org/repos/asf/camel/blob/f3731ed4/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 e931d54..42a55e6 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
@@ -7,10 +7,14 @@ 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.api.PullResult;
import org.eclipse.jgit.api.Status;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.RefSpec;
+import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -78,6 +82,14 @@ public class GitProducer extends DefaultProducer{
case GitOperation.LOG_OPERATION:
doLog(exchange, operation, repo);
break;
+
+ case GitOperation.PUSH_OPERATION:
+ doPush(exchange, operation, repo);
+ break;
+
+ case GitOperation.PULL_OPERATION:
+ doPull(exchange, operation, repo);
+ break;
}
repo.close();
}
@@ -257,6 +269,54 @@ public class GitProducer extends DefaultProducer{
exchange.getOut().setBody(revCommit);
}
+ protected void doPush(Exchange exchange, String operation, Repository repo) {
+ Git git = null;
+ Iterable<PushResult> result = null;
+ try {
+ git = new Git(repo);
+ if (ObjectHelper.isEmpty(endpoint.getRemotePath())) {
+ throw new IllegalArgumentException("Remote path must be specified to execute " + operation);
+ }
+ if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) {
+ git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call();
+ }
+ if (ObjectHelper.isNotEmpty(endpoint.getUsername()) && ObjectHelper.isNotEmpty(endpoint.getPassword())) {
+ UsernamePasswordCredentialsProvider credentials = new UsernamePasswordCredentialsProvider(endpoint.getUsername(), endpoint.getPassword());
+ result = git.push().setCredentialsProvider(credentials).setRemote(endpoint.getRemotePath()).call();
+ } else {
+ result = git.push().setRemote(endpoint.getRemotePath()).call();
+ }
+ } catch (Exception e) {
+ LOG.error("There was an error in Git " + operation + " operation");
+ e.printStackTrace();
+ }
+ exchange.getOut().setBody(result);
+ }
+
+ protected void doPull(Exchange exchange, String operation, Repository repo) {
+ Git git = null;
+ PullResult result = null;
+ try {
+ git = new Git(repo);
+ if (ObjectHelper.isEmpty(endpoint.getRemotePath())) {
+ throw new IllegalArgumentException("Remote path must be specified to execute " + operation);
+ }
+ if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) {
+ git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call();
+ }
+ if (ObjectHelper.isNotEmpty(endpoint.getUsername()) && ObjectHelper.isNotEmpty(endpoint.getPassword())) {
+ UsernamePasswordCredentialsProvider credentials = new UsernamePasswordCredentialsProvider(endpoint.getUsername(), endpoint.getPassword());
+ result = git.pull().setCredentialsProvider(credentials).setRemote(endpoint.getRemotePath()).call();
+ } else {
+ result = git.pull().setRemote(endpoint.getRemotePath()).call();
+ }
+ } catch (Exception e) {
+ LOG.error("There was an error in Git " + operation + " operation");
+ e.printStackTrace();
+ }
+ exchange.getOut().setBody(result);
+ }
+
private Repository getLocalRepository(){
FileRepositoryBuilder builder = new FileRepositoryBuilder();
Repository repo = null;
http://git-wip-us.apache.org/repos/asf/camel/blob/f3731ed4/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 8ad0cb6..cee4011 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
@@ -33,33 +33,11 @@ import org.eclipse.jgit.lib.Ref;
import org.eclipse.jgit.lib.Repository;
import org.eclipse.jgit.revwalk.RevCommit;
import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
+import org.eclipse.jgit.transport.PushResult;
+import org.junit.Ignore;
import org.junit.Test;
-public class GitProducerTest extends CamelTestSupport {
-
- private final static String GIT_LOCAL_REPO = "testRepo";
- private final static String FILENAME_TO_ADD = "filetest.txt";
- private final static String FILENAME_BRANCH_TO_ADD = "filetest1.txt";
- private final static String COMMIT_MESSAGE = "Test commit";
- private final static String COMMIT_MESSAGE_ALL = "Test commit all";
- 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 {
- super.setUp();
- File localPath = File.createTempFile(GIT_LOCAL_REPO, "");
- localPath.delete();
- File path = new File(GIT_LOCAL_REPO);
- path.deleteOnExit();
- }
-
- @Override
- public void tearDown() throws Exception {
- super.tearDown();
- File path = new File(GIT_LOCAL_REPO);
- deleteDirectory(path);
- }
+public class GitProducerTest extends GitTestSupport {
@Test
public void cloneTest() throws Exception {
@@ -742,31 +720,5 @@ public class GitProducerTest extends CamelTestSupport {
}
};
}
-
- private Repository getTestRepository() throws IOException, IllegalStateException, GitAPIException {
- File gitRepo = new File(GIT_LOCAL_REPO, ".git");
- 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)
- .readEnvironment() // scan environment GIT_* variables
- .findGitDir() // scan up the file system tree
- .build();
- return repo;
- }
-
- static public boolean deleteDirectory(File path) {
- if( path.exists() ) {
- File[] files = path.listFiles();
- for(int i=0; i<files.length; i++) {
- if(files[i].isDirectory()) {
- deleteDirectory(files[i]);
- }
- else {
- files[i].delete();
- }
- }
- }
- return( path.delete() );
- }
+
}
http://git-wip-us.apache.org/repos/asf/camel/blob/f3731ed4/components/camel-git/src/test/java/org/apache/camel/component/github/producer/GitRemoteProducerTest.java
----------------------------------------------------------------------
diff --git a/components/camel-git/src/test/java/org/apache/camel/component/github/producer/GitRemoteProducerTest.java b/components/camel-git/src/test/java/org/apache/camel/component/github/producer/GitRemoteProducerTest.java
new file mode 100644
index 0000000..085fa1c
--- /dev/null
+++ b/components/camel-git/src/test/java/org/apache/camel/component/github/producer/GitRemoteProducerTest.java
@@ -0,0 +1,91 @@
+/**
+ * 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.
+ */
+package org.apache.camel.component.github.producer;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.camel.Exchange;
+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.PullResult;
+import org.eclipse.jgit.api.Status;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
+import org.eclipse.jgit.transport.PushResult;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class GitRemoteProducerTest extends GitTestSupport {
+
+ @Ignore("Require a remote git repository")
+ @Test
+ public void pushTest() 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<PushResult> result = template.requestBody("direct:push", "", Iterable.class);
+
+ repository.close();
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ from("direct:add")
+ .to("git://" + GIT_LOCAL_REPO + "?operation=add");
+ from("direct:commit")
+ .to("git://" + GIT_LOCAL_REPO + "?operation=commit");
+ from("direct:push")
+ .to("git://" + GIT_LOCAL_REPO + "?operation=push&remotePath=remoteURL&username=xxx&password=xxx" );
+ }
+ };
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/f3731ed4/components/camel-git/src/test/java/org/apache/camel/component/github/producer/GitTestSupport.java
----------------------------------------------------------------------
diff --git a/components/camel-git/src/test/java/org/apache/camel/component/github/producer/GitTestSupport.java b/components/camel-git/src/test/java/org/apache/camel/component/github/producer/GitTestSupport.java
new file mode 100644
index 0000000..0aa3946
--- /dev/null
+++ b/components/camel-git/src/test/java/org/apache/camel/component/github/producer/GitTestSupport.java
@@ -0,0 +1,86 @@
+/**
+ * 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.
+ */
+package org.apache.camel.component.github.producer;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.eclipse.jgit.api.Git;
+import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.storage.file.FileRepositoryBuilder;
+
+public class GitTestSupport extends CamelTestSupport {
+
+ public final static String GIT_LOCAL_REPO = "testRepo";
+
+ public final static String FILENAME_TO_ADD = "filetest.txt";
+
+ public final static String FILENAME_BRANCH_TO_ADD = "filetest1.txt";
+
+ public final static String COMMIT_MESSAGE = "Test commit";
+
+ public final static String COMMIT_MESSAGE_ALL = "Test commit all";
+
+ public final static String COMMIT_MESSAGE_BRANCH = "Test commit on a branch";
+
+ public final static String BRANCH_TEST = "testBranch";
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ File localPath = File.createTempFile(GIT_LOCAL_REPO, "");
+ localPath.delete();
+ File path = new File(GIT_LOCAL_REPO);
+ path.deleteOnExit();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ File path = new File(GIT_LOCAL_REPO);
+ deleteDirectory(path);
+ }
+
+ protected Repository getTestRepository() throws IOException, IllegalStateException, GitAPIException {
+ File gitRepo = new File(GIT_LOCAL_REPO, ".git");
+ 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)
+ .readEnvironment() // scan environment GIT_* variables
+ .findGitDir() // scan up the file system tree
+ .build();
+ return repo;
+ }
+
+ static public boolean deleteDirectory(File path) {
+ if( path.exists() ) {
+ File[] files = path.listFiles();
+ for(int i=0; i<files.length; i++) {
+ if(files[i].isDirectory()) {
+ deleteDirectory(files[i]);
+ }
+ else {
+ files[i].delete();
+ }
+ }
+ }
+ return( path.delete() );
+ }
+}