You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2022/10/27 16:55:30 UTC

[camel] branch camel-3.18.x updated: (backport) [Camel 18656] Fix camel-git always merge at master branch (#8641)

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch camel-3.18.x
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/camel-3.18.x by this push:
     new 2e99c5e0fe2 (backport) [Camel 18656] Fix camel-git always merge at master branch (#8641)
2e99c5e0fe2 is described below

commit 2e99c5e0fe28b4db5cb0c9939bd61badef328544
Author: Gilvan Filho <gi...@gmail.com>
AuthorDate: Thu Oct 27 13:55:23 2022 -0300

    (backport) [Camel 18656] Fix camel-git always merge at master branch (#8641)
---
 .../camel/component/git/GitEndpointConfigurer.java |  6 ++++
 .../camel/component/git/GitEndpointUriFactory.java |  3 +-
 .../org/apache/camel/component/git/git.json        |  1 +
 .../apache/camel/component/git/GitEndpoint.java    | 16 ++++++++++
 .../camel/component/git/producer/GitProducer.java  | 20 ++++++++++--
 .../apache/camel/component/git/GitTestSupport.java |  4 +++
 .../component/git/producer/GitProducerTest.java    | 36 ++++++++++++++++++++++
 7 files changed, 82 insertions(+), 4 deletions(-)

diff --git a/components/camel-git/src/generated/java/org/apache/camel/component/git/GitEndpointConfigurer.java b/components/camel-git/src/generated/java/org/apache/camel/component/git/GitEndpointConfigurer.java
index 0eba38b2049..422aa5674bc 100644
--- a/components/camel-git/src/generated/java/org/apache/camel/component/git/GitEndpointConfigurer.java
+++ b/components/camel-git/src/generated/java/org/apache/camel/component/git/GitEndpointConfigurer.java
@@ -41,6 +41,8 @@ public class GitEndpointConfigurer extends PropertyConfigurerSupport implements
         case "remotePath": target.setRemotePath(property(camelContext, java.lang.String.class, value)); return true;
         case "tagname":
         case "tagName": target.setTagName(property(camelContext, java.lang.String.class, value)); return true;
+        case "targetbranchname":
+        case "targetBranchName": target.setTargetBranchName(property(camelContext, java.lang.String.class, value)); return true;
         case "type": target.setType(property(camelContext, org.apache.camel.component.git.consumer.GitType.class, value)); return true;
         case "username": target.setUsername(property(camelContext, java.lang.String.class, value)); return true;
         default: return false;
@@ -70,6 +72,8 @@ public class GitEndpointConfigurer extends PropertyConfigurerSupport implements
         case "remotePath": return java.lang.String.class;
         case "tagname":
         case "tagName": return java.lang.String.class;
+        case "targetbranchname":
+        case "targetBranchName": return java.lang.String.class;
         case "type": return org.apache.camel.component.git.consumer.GitType.class;
         case "username": return java.lang.String.class;
         default: return null;
@@ -100,6 +104,8 @@ public class GitEndpointConfigurer extends PropertyConfigurerSupport implements
         case "remotePath": return target.getRemotePath();
         case "tagname":
         case "tagName": return target.getTagName();
+        case "targetbranchname":
+        case "targetBranchName": return target.getTargetBranchName();
         case "type": return target.getType();
         case "username": return target.getUsername();
         default: return null;
diff --git a/components/camel-git/src/generated/java/org/apache/camel/component/git/GitEndpointUriFactory.java b/components/camel-git/src/generated/java/org/apache/camel/component/git/GitEndpointUriFactory.java
index a07ecd08a48..0dd639fff86 100644
--- a/components/camel-git/src/generated/java/org/apache/camel/component/git/GitEndpointUriFactory.java
+++ b/components/camel-git/src/generated/java/org/apache/camel/component/git/GitEndpointUriFactory.java
@@ -21,7 +21,7 @@ public class GitEndpointUriFactory extends org.apache.camel.support.component.En
     private static final Set<String> SECRET_PROPERTY_NAMES;
     private static final Set<String> MULTI_VALUE_PREFIXES;
     static {
-        Set<String> props = new HashSet<>(14);
+        Set<String> props = new HashSet<>(15);
         props.add("allowEmpty");
         props.add("branchName");
         props.add("bridgeErrorHandler");
@@ -34,6 +34,7 @@ public class GitEndpointUriFactory extends org.apache.camel.support.component.En
         props.add("remoteName");
         props.add("remotePath");
         props.add("tagName");
+        props.add("targetBranchName");
         props.add("type");
         props.add("username");
         PROPERTY_NAMES = Collections.unmodifiableSet(props);
diff --git a/components/camel-git/src/generated/resources/org/apache/camel/component/git/git.json b/components/camel-git/src/generated/resources/org/apache/camel/component/git/git.json
index 86de2716292..5f67d8faa73 100644
--- a/components/camel-git/src/generated/resources/org/apache/camel/component/git/git.json
+++ b/components/camel-git/src/generated/resources/org/apache/camel/component/git/git.json
@@ -53,6 +53,7 @@
     "remoteName": { "kind": "parameter", "displayName": "Remote Name", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The remote repository name to use in particular operation like pull" },
     "remotePath": { "kind": "parameter", "displayName": "Remote Path", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The remote repository path" },
     "tagName": { "kind": "parameter", "displayName": "Tag Name", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "The tag name to work on" },
+    "targetBranchName": { "kind": "parameter", "displayName": "Target Branch Name", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "defaultValue": "master", "description": "Name of target branch in merge operation. If not supplied will try to use init.defaultBranch git configs. If not configured will use default value" },
     "username": { "kind": "parameter", "displayName": "Username", "group": "producer", "label": "producer", "required": false, "type": "string", "javaType": "java.lang.String", "deprecated": false, "autowired": false, "secret": false, "description": "Remote repository username" },
     "lazyStartProducer": { "kind": "parameter", "displayName": "Lazy Start Producer", "group": "producer (advanced)", "label": "producer,advanced", "required": false, "type": "boolean", "javaType": "boolean", "deprecated": false, "autowired": false, "secret": false, "defaultValue": false, "description": "Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may other [...]
   }
diff --git a/components/camel-git/src/main/java/org/apache/camel/component/git/GitEndpoint.java b/components/camel-git/src/main/java/org/apache/camel/component/git/GitEndpoint.java
index bccd4ce1fd4..8537f2f3071 100644
--- a/components/camel-git/src/main/java/org/apache/camel/component/git/GitEndpoint.java
+++ b/components/camel-git/src/main/java/org/apache/camel/component/git/GitEndpoint.java
@@ -45,6 +45,11 @@ public class GitEndpoint extends DefaultEndpoint {
     @UriParam
     private String branchName;
 
+    @UriParam(label = "producer",
+              description = "Name of target branch in merge operation. If not supplied will try to use init.defaultBranch git configs. If not configured will use default value",
+              defaultValue = "master")
+    private String targetBranchName;
+
     @UriParam(label = "producer")
     private String tagName;
 
@@ -203,4 +208,15 @@ public class GitEndpoint extends DefaultEndpoint {
     public void setAllowEmpty(boolean allowEmpty) {
         this.allowEmpty = allowEmpty;
     }
+
+    /**
+     * The branch name to merge
+     */
+    public String getTargetBranchName() {
+        return this.targetBranchName;
+    }
+
+    public void setTargetBranchName(String targetBranchName) {
+        this.targetBranchName = targetBranchName;
+    }
 }
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 1f02d9ae0b5..4d5d4ea1a86 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
@@ -38,6 +38,8 @@ import org.eclipse.jgit.api.PullResult;
 import org.eclipse.jgit.api.RemoteAddCommand;
 import org.eclipse.jgit.api.Status;
 import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
+import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
@@ -49,6 +51,7 @@ import org.eclipse.jgit.transport.PushResult;
 import org.eclipse.jgit.transport.RemoteConfig;
 import org.eclipse.jgit.transport.URIish;
 import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
+import org.eclipse.jgit.util.SystemReader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -500,7 +503,7 @@ public class GitProducer extends DefaultProducer {
         updateExchange(exchange, result);
     }
 
-    protected void doMerge(Exchange exchange, String operation) throws GitAPIException, IOException {
+    protected void doMerge(Exchange exchange, String operation) throws ConfigInvalidException, GitAPIException, IOException {
         MergeResult result = null;
         ObjectId mergeBase;
         try {
@@ -508,15 +511,26 @@ public class GitProducer extends DefaultProducer {
                 throw new IllegalArgumentException("Branch name must be specified to execute " + operation);
             }
             mergeBase = git.getRepository().resolve(endpoint.getBranchName());
-            git.checkout().setName("master").call();
+            git.checkout().setName(defineTargetBranchName()).call();
             result = git.merge().include(mergeBase).setFastForward(FastForwardMode.FF).setCommit(true).call();
-        } catch (GitAPIException | IOException e) {
+        } catch (ConfigInvalidException | GitAPIException | IOException e) {
             LOG.error("There was an error in Git {} operation", operation);
             throw e;
         }
         updateExchange(exchange, result);
     }
 
+    private String defineTargetBranchName() throws ConfigInvalidException, IOException {
+        if (ObjectHelper.isNotEmpty(endpoint.getTargetBranchName())) {
+            return endpoint.getTargetBranchName();
+        }
+
+        String defaultBranch = SystemReader.getInstance().getUserConfig().getString(ConfigConstants.CONFIG_INIT_SECTION, null,
+                ConfigConstants.CONFIG_KEY_DEFAULT_BRANCH);
+
+        return ObjectHelper.isNotEmpty(defaultBranch) ? defaultBranch : "master";
+    }
+
     protected void doCreateTag(String operation) throws GitAPIException {
         if (ObjectHelper.isEmpty(endpoint.getTagName())) {
             throw new IllegalArgumentException("Tag Name must be specified to execute " + operation);
diff --git a/components/camel-git/src/test/java/org/apache/camel/component/git/GitTestSupport.java b/components/camel-git/src/test/java/org/apache/camel/component/git/GitTestSupport.java
index 3dd1f95d28a..7a3ed7a1792 100644
--- a/components/camel-git/src/test/java/org/apache/camel/component/git/GitTestSupport.java
+++ b/components/camel-git/src/test/java/org/apache/camel/component/git/GitTestSupport.java
@@ -45,8 +45,12 @@ public class GitTestSupport extends CamelTestSupport {
 
     public final String commitMessageBranch = "Test commit on a branch";
 
+    public final String commitMessageMergeBranch = "Test merge on a target branch";
+
     public final String branchTest = "testBranch";
 
+    public final String targetBranchTest = "targetTestBranch";
+
     public final String tagTest = "testTag";
 
     public final String remoteUriTest = "https://github.com/oscerd/json-webserver-example.git";
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 5f9bc6c1356..50af2b91f20 100644
--- 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
@@ -17,6 +17,7 @@
 package org.apache.camel.component.git.producer;
 
 import java.io.File;
+import java.nio.file.Files;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -885,6 +886,37 @@ public class GitProducerTest extends GitTestSupport {
         git.close();
     }
 
+    @Test
+    public void mergeTargetBranchTest() throws Exception {
+        // Init
+        Git git = getGitTestRepository();
+        File gitDir = new File(gitLocalRepo, ".git");
+        assertEquals(true, gitDir.exists());
+        File fileToAdd = new File(gitLocalRepo, filenameToAdd);
+        fileToAdd.createNewFile();
+        git.add().addFilepattern(filenameToAdd).call();
+        Status status = git.status().call();
+        assertTrue(status.getAdded().contains(filenameToAdd));
+        git.commit().setMessage(commitMessage).call();
+
+        template.sendBody("direct:create-targetBranch", ""); //create target branch
+        template.sendBody("direct:checkout", ""); //checkout test branch
+
+        //add file to test branch and commit
+        fileToAdd = new File(gitLocalRepo, filenameBranchToAdd);
+        fileToAdd.createNewFile();
+        git.add().addFilepattern(filenameBranchToAdd).call();
+        status = git.status().call();
+        assertTrue(status.getAdded().contains(filenameBranchToAdd));
+        git.commit().setMessage(commitMessageMergeBranch).call();
+
+        //merge test branch into target branch
+        MergeResult result = template.requestBody("direct:merge-targetBranch", "", MergeResult.class);
+        assertEquals("Fast-forward", result.getMergeStatus().toString());
+        assertTrue(Files.exists(fileToAdd.toPath())); //file exists in target branch, so merge was successful
+        git.close();
+    }
+
     @Override
     protected RouteBuilder createRouteBuilder() {
         return new RouteBuilder() {
@@ -934,6 +966,10 @@ public class GitProducerTest extends GitTestSupport {
                 from("direct:remoteList").to("git://" + gitLocalRepo + "?operation=remoteList");
                 from("direct:merge").to("git://" + gitLocalRepo + "?operation=merge&branchName=" + branchTest);
                 from("direct:show-tags").to("git://" + gitLocalRepo + "?operation=showTags");
+                from("direct:create-targetBranch")
+                        .to("git://" + gitLocalRepo + "?operation=createBranch&branchName=" + targetBranchTest);
+                from("direct:merge-targetBranch").to("git://" + gitLocalRepo + "?operation=merge&targetBranchName="
+                                                     + targetBranchTest + "&branchName=" + branchTest);
             }
         };
     }