From fbc60e40544dcab5885e273415d5f825380d4791 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 05:09:20 +0000 Subject: [PATCH 1/2] Bump the quarkus group with 2 updates Bumps the quarkus group with 2 updates: [io.quarkus.platform:quarkus-bom](https://github.com/quarkusio/quarkus-platform) and [io.quarkus.platform:quarkus-maven-plugin](https://github.com/quarkusio/quarkus-platform). Updates `io.quarkus.platform:quarkus-bom` from 3.16.1 to 3.16.2 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.16.1...3.16.2) Updates `io.quarkus.platform:quarkus-maven-plugin` from 3.16.1 to 3.16.2 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.16.1...3.16.2) Updates `io.quarkus.platform:quarkus-maven-plugin` from 3.16.1 to 3.16.2 - [Commits](https://github.com/quarkusio/quarkus-platform/compare/3.16.1...3.16.2) --- updated-dependencies: - dependency-name: io.quarkus.platform:quarkus-bom dependency-type: direct:production update-type: version-update:semver-patch dependency-group: quarkus - dependency-name: io.quarkus.platform:quarkus-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: quarkus - dependency-name: io.quarkus.platform:quarkus-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch dependency-group: quarkus ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 22a0324..30790b1 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ UTF-8 quarkus-bom io.quarkus.platform - 3.16.1 + 3.16.2 1.12.0 3.26.0 true From d68c393ab0cc5cb1ae615b3cd889bab2bcdaa146 Mon Sep 17 00:00:00 2001 From: marko-bekhta Date: Wed, 13 Nov 2024 21:59:18 +0100 Subject: [PATCH 2/2] Add "ignore transitions" rules --- .../infra/replicate/jira/JiraConfig.java | 19 +++++++++++++++++++ .../JiraIssueAbstractEventHandler.java | 17 +++++++++++++++++ .../handler/JiraIssueUpsertEventHandler.java | 6 ++++-- 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/hibernate/infra/replicate/jira/JiraConfig.java b/src/main/java/org/hibernate/infra/replicate/jira/JiraConfig.java index 67064e7..1bda3a9 100644 --- a/src/main/java/org/hibernate/infra/replicate/jira/JiraConfig.java +++ b/src/main/java/org/hibernate/infra/replicate/jira/JiraConfig.java @@ -4,6 +4,7 @@ import java.util.Base64; import java.util.Map; import java.util.Optional; +import java.util.Set; import io.smallrye.config.ConfigMapping; import io.smallrye.config.WithDefault; @@ -293,6 +294,7 @@ interface IssueTypeValueMapping extends ValueMapping { * epic-short-label in the upstream (source) Jira instance. */ Optional epicLinkSourceLabelCustomFieldName(); + /** * @return The name of a custom field that represents the "epic name" i.e. * epic-short-label in the downstream (destination) Jira instance. @@ -312,6 +314,23 @@ interface StatusesValueMapping extends ValueMapping { * closing the issue deleted upstream before archiving it. */ Optional deletedTransition(); + + /** + * @return A map where the {@code key} is the upstream status name, and the + * corresponding {@code value} contains the names of the downstream + * status names. If the downstream issue is currently in one of the + * statuses present in the value set then the transition for status + * ({@code key}) should not be applied. + *

+ * This allows both skipping unnecessary transitions + * {@code "status a" -> "status a" } as well as to keep the downstream + * issue in the status modified downstream if it is within the "group" + * of statuses "mapped" to the upstream one. This can be useful when + * e.g. downstream workflow has both {@code New} and {@code Ready} + * statuses, and users move new issues to the {@code Ready} status + * issues downstream, without an override from an upstream updates. + */ + Map> ignoreTransitionCondition(); } interface UserValueMapping extends ValueMapping { diff --git a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueAbstractEventHandler.java b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueAbstractEventHandler.java index 52e7ec7..4ee0069 100644 --- a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueAbstractEventHandler.java +++ b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueAbstractEventHandler.java @@ -3,8 +3,10 @@ import java.net.URI; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Objects; import java.util.Optional; +import java.util.Set; import java.util.regex.Pattern; import org.hibernate.infra.replicate.jira.JiraConfig; @@ -28,12 +30,27 @@ public JiraIssueAbstractEventHandler(ReportingConfig reportingConfig, HandlerPro } protected void applyTransition(JiraIssue sourceIssue, String destinationKey) { + JiraIssue destIssue = context.destinationJiraClient().getIssue(destinationKey); + applyTransition(sourceIssue, destIssue, destinationKey); + } + + protected void applyTransition(JiraIssue sourceIssue, JiraIssue destIssue, String destinationKey) { + Set statusesToIgnore = context.projectGroup().statuses().ignoreTransitionCondition() + .getOrDefault(sourceIssue.fields.status.name.toLowerCase(Locale.ROOT).replace(' ', '-'), Set.of()); + if (statusesToIgnore.contains(destIssue.fields.status.name.toLowerCase(Locale.ROOT))) { + // no need to apply the transition :) + return; + } prepareTransition(sourceIssue).ifPresent( jiraTransition -> context.destinationJiraClient().transition(destinationKey, jiraTransition)); } protected void updateIssueBody(JiraIssue sourceIssue, String destinationKey) { JiraIssue destIssue = context.destinationJiraClient().getIssue(destinationKey); + updateIssueBody(sourceIssue, destIssue, destinationKey); + } + + protected void updateIssueBody(JiraIssue sourceIssue, JiraIssue destIssue, String destinationKey) { JiraIssue issue = issueToCreate(sourceIssue, destIssue); updateIssue(destinationKey, issue, sourceIssue, context.notMappedAssignee()); diff --git a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueUpsertEventHandler.java b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueUpsertEventHandler.java index d0f6877..05cba52 100644 --- a/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueUpsertEventHandler.java +++ b/src/main/java/org/hibernate/infra/replicate/jira/service/jira/handler/JiraIssueUpsertEventHandler.java @@ -29,14 +29,16 @@ protected void doRun() { context.createNextPlaceholderBatch(destinationKey); try { - updateIssueBody(sourceIssue, destinationKey); + JiraIssue destIssue = context.destinationJiraClient().getIssue(destinationKey); + + updateIssueBody(sourceIssue, destIssue, destinationKey); // remote "aka web" links cannot be added in the same request and are also not // returned as part of the issue API. // We "upsert" the remote link pointing to the "original/source" issue that // triggered the sync with an additional call: context.destinationJiraClient().upsertRemoteLink(destinationKey, remoteSelfLink(sourceIssue)); // issue status can be updated only through transition: - applyTransition(sourceIssue, destinationKey); + applyTransition(sourceIssue, destIssue, destinationKey); // and then we want to add a link to a parent, if the issue was actually a // sub-task which we've created as a task: prepareParentLink(destinationKey, sourceIssue).ifPresent(context.destinationJiraClient()::upsertIssueLink);