Repository: camel Updated Branches: refs/heads/master d72bfe1ea -> f76dc69c2
CAMEL-9453: Camel-Git: Add support for cherry-pick operation Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/b8dbbf40 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/b8dbbf40 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/b8dbbf40 Branch: refs/heads/master Commit: b8dbbf400c1ebf3ad5fe7bec73e4061e769e67ad Parents: d72bfe1 Author: Andrea Cosentino <anco...@gmail.com> Authored: Sun Dec 27 09:50:18 2015 +0100 Committer: Andrea Cosentino <anco...@gmail.com> Committed: Sun Dec 27 09:50:18 2015 +0100 ---------------------------------------------------------------------- .../camel/component/git/GitConstants.java | 2 + .../component/git/producer/GitOperation.java | 1 + .../component/git/producer/GitProducer.java | 32 +++ .../component/git/producer/GitProducerTest.java | 213 +++++++++++++++++++ 4 files changed, 248 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/b8dbbf40/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 0d4f518..5e575ce 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 @@ -26,4 +26,6 @@ public interface GitConstants { String GIT_COMMIT_USERNAME = "CamelGitCommitUsername"; String GIT_COMMIT_EMAIL = "CamelGitCommitEmail"; + + String GIT_COMMIT_ID = "CamelGitCommitId"; } http://git-wip-us.apache.org/repos/asf/camel/blob/b8dbbf40/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitOperation.java ---------------------------------------------------------------------- diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitOperation.java b/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitOperation.java index 884b154..ce6ae25 100644 --- a/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitOperation.java +++ b/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitOperation.java @@ -33,4 +33,5 @@ public interface GitOperation { String PUSH_OPERATION = "push"; String PULL_OPERATION = "pull"; String SHOW_BRANCHES = "showBranches"; + String CHERRYPICK_OPERATION = "cherryPick"; } http://git-wip-us.apache.org/repos/asf/camel/blob/b8dbbf40/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitProducer.java ---------------------------------------------------------------------- diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitProducer.java b/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitProducer.java index 0f10f29..9f38d17 100644 --- a/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitProducer.java +++ b/components/camel-git/src/main/java/org/apache/camel/component/git/producer/GitProducer.java @@ -25,14 +25,18 @@ import org.apache.camel.component.git.GitConstants; import org.apache.camel.component.git.GitEndpoint; import org.apache.camel.impl.DefaultProducer; import org.apache.camel.util.ObjectHelper; +import org.eclipse.jgit.api.CherryPickCommand; +import org.eclipse.jgit.api.CherryPickResult; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.ListBranchCommand.ListMode; import org.eclipse.jgit.api.PullResult; import org.eclipse.jgit.api.Status; +import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.lib.PersonIdent; import org.eclipse.jgit.lib.Ref; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; +import org.eclipse.jgit.revwalk.RevWalk; import org.eclipse.jgit.storage.file.FileRepositoryBuilder; import org.eclipse.jgit.transport.PushResult; import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; @@ -94,6 +98,10 @@ public class GitProducer extends DefaultProducer { doAdd(exchange, operation); break; + case GitOperation.CHERRYPICK_OPERATION: + doCherryPick(exchange, operation); + break; + case GitOperation.REMOVE_OPERATION: doRemove(exchange, operation); break; @@ -411,6 +419,30 @@ public class GitProducer extends DefaultProducer { } exchange.getOut().setBody(result); } + + protected void doCherryPick(Exchange exchange, String operation) throws Exception { + CherryPickResult result = null; + String commitId = null; + try { + if (ObjectHelper.isNotEmpty(exchange.getIn().getHeader(GitConstants.GIT_COMMIT_ID))) { + commitId = exchange.getIn().getHeader(GitConstants.GIT_COMMIT_ID, String.class); + } else { + throw new IllegalArgumentException("Commit id must be specified to execute " + operation); + } + RevWalk walk = new RevWalk(repo); + ObjectId id = repo.resolve(commitId); + RevCommit commit = walk.parseCommit(id); + walk.dispose(); + if (ObjectHelper.isNotEmpty(endpoint.getBranchName())) { + git.checkout().setCreateBranch(false).setName(endpoint.getBranchName()).call(); + } + result = git.cherryPick().include(commit).call(); + } catch (Exception e) { + LOG.error("There was an error in Git " + operation + " operation"); + throw e; + } + exchange.getOut().setBody(result); + } private Repository getLocalRepository() throws IOException { FileRepositoryBuilder builder = new FileRepositoryBuilder(); http://git-wip-us.apache.org/repos/asf/camel/blob/b8dbbf40/components/camel-git/src/test/java/org/apache/camel/component/git/producer/GitProducerTest.java ---------------------------------------------------------------------- diff --git a/components/camel-git/src/test/java/org/apache/camel/component/git/producer/GitProducerTest.java b/components/camel-git/src/test/java/org/apache/camel/component/git/producer/GitProducerTest.java index 1a4fc2d..00a234e 100755 --- a/components/camel-git/src/test/java/org/apache/camel/component/git/producer/GitProducerTest.java +++ b/components/camel-git/src/test/java/org/apache/camel/component/git/producer/GitProducerTest.java @@ -831,6 +831,215 @@ public class GitProducerTest extends GitTestSupport { repository.close(); } + @Test + public void cherryPickTest() throws Exception { + + Repository repository = getTestRepository(); + + File fileToAdd = new File(gitLocalRepo, filenameToAdd); + fileToAdd.createNewFile(); + + template.send("direct:add", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(GitConstants.GIT_FILE_NAME, filenameToAdd); + } + }); + File gitDir = new File(gitLocalRepo, ".git"); + assertEquals(gitDir.exists(), true); + + Status status = new Git(repository).status().call(); + assertTrue(status.getAdded().contains(filenameToAdd)); + + template.send("direct:commit", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(GitConstants.GIT_COMMIT_MESSAGE, commitMessage); + } + }); + Iterable<RevCommit> logs = new Git(repository).log() + .call(); + int count = 0; + + for (RevCommit rev : logs) { + assertEquals(rev.getShortMessage(), commitMessage); + count++; + } + assertEquals(count, 1); + + template.sendBody("direct:create-branch", ""); + + List<Ref> branches = template.requestBody("direct:show-branches", "", List.class); + + Boolean branchExists = false; + + for (Ref reference : branches) { + if (("refs/heads/" + branchTest).equals(reference.getName())) { + branchExists = true; + } + } + assertTrue(branchExists); + + File fileToAdd1 = new File(gitLocalRepo, "filetest1test.txt"); + fileToAdd1.createNewFile(); + + template.send("direct:add", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(GitConstants.GIT_FILE_NAME, "filetest1test.txt"); + } + }); + + status = new Git(repository).status().call(); + assertTrue(status.getAdded().contains("filetest1test.txt")); + + template.send("direct:commit", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(GitConstants.GIT_COMMIT_MESSAGE, "Test second commit"); + } + }); + logs = new Git(repository).log() + .call(); + count = 0; + String id = ""; + for (RevCommit rev : logs) { + if (count == 0) { + id = rev.getName(); + assertEquals(rev.getShortMessage(), "Test second commit"); + } + count++; + } + assertEquals(count, 2); + + final String str = id; + template.send("direct:cherrypick", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(GitConstants.GIT_COMMIT_ID, str); + } + }); + + Git git = new Git(repository); + git.checkout().setCreateBranch(false).setName(branchTest).call(); + logs = git.log() + .call(); + count = 0; + for (RevCommit rev : logs) { + if (count == 0) { + assertEquals(rev.getShortMessage(), "Test second commit"); + } + count++; + } + assertEquals(count, 2); + repository.close(); + } + + @Test + public void cherryPickBranchToMasterTest() throws Exception { + + Repository repository = getTestRepository(); + + File fileToAdd = new File(gitLocalRepo, filenameToAdd); + fileToAdd.createNewFile(); + + template.send("direct:add", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(GitConstants.GIT_FILE_NAME, filenameToAdd); + } + }); + File gitDir = new File(gitLocalRepo, ".git"); + assertEquals(gitDir.exists(), true); + + Status status = new Git(repository).status().call(); + assertTrue(status.getAdded().contains(filenameToAdd)); + + template.send("direct:commit", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(GitConstants.GIT_COMMIT_MESSAGE, commitMessage); + } + }); + Iterable<RevCommit> logs = new Git(repository).log() + .call(); + int count = 0; + + for (RevCommit rev : logs) { + assertEquals(rev.getShortMessage(), commitMessage); + count++; + } + assertEquals(count, 1); + + template.sendBody("direct:create-branch", ""); + + List<Ref> branches = template.requestBody("direct:show-branches", "", List.class); + + Boolean branchExists = false; + + for (Ref reference : branches) { + if (("refs/heads/" + branchTest).equals(reference.getName())) { + branchExists = true; + } + } + assertTrue(branchExists); + + File fileToAdd1 = new File(gitLocalRepo, "filetest1test.txt"); + fileToAdd1.createNewFile(); + + template.send("direct:add-on-branch", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(GitConstants.GIT_FILE_NAME, "filetest1test.txt"); + } + }); + Git git = new Git(repository); + git.checkout().setCreateBranch(false).setName(branchTest).call(); + status = git.status().call(); + assertTrue(status.getAdded().contains("filetest1test.txt")); + + template.send("direct:commit-branch", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(GitConstants.GIT_COMMIT_MESSAGE, "Test second commit"); + } + }); + logs = git.log() + .call(); + count = 0; + String id = ""; + for (RevCommit rev : logs) { + if (count == 0) { + id = rev.getName(); + assertEquals(rev.getShortMessage(), "Test second commit"); + } + count++; + } + assertEquals(count, 2); + + final String str = id; + template.send("direct:cherrypick-master", new Processor() { + @Override + public void process(Exchange exchange) throws Exception { + exchange.getIn().setHeader(GitConstants.GIT_COMMIT_ID, str); + } + }); + + git = new Git(repository); + git.checkout().setCreateBranch(false).setName("refs/heads/master").call(); + logs = git.log() + .call(); + count = 0; + for (RevCommit rev : logs) { + if (count == 0) { + assertEquals(rev.getShortMessage(), "Test second commit"); + } + count++; + } + assertEquals(count, 2); + repository.close(); + } + @Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @@ -874,6 +1083,10 @@ public class GitProducerTest extends GitTestSupport { .to("git://" + gitLocalRepo + "?operation=deleteTag&tagName=" + tagTest); from("direct:show-branches") .to("git://" + gitLocalRepo + "?operation=showBranches"); + from("direct:cherrypick") + .to("git://" + gitLocalRepo + "?operation=cherryPick&branchName=" + branchTest); + from("direct:cherrypick-master") + .to("git://" + gitLocalRepo + "?operation=cherryPick&branchName=refs/heads/master"); } }; }