Skip to content

Commit 592cdba

Browse files
committed
Fix #501: add 'maybe_update_issue_milestone' step
1 parent 9bb1644 commit 592cdba

File tree

3 files changed

+87
-0
lines changed

3 files changed

+87
-0
lines changed

jbi/bugzilla/models.py

+1
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ class Bug(BaseModel, frozen=True):
7474
creator: Optional[str] = None
7575
assigned_to: Optional[str] = None
7676
comment: Optional[WebhookComment] = None
77+
milestone: Optional[str] = None
7778
# Custom field Firefox for story points
7879
cf_fx_points: Optional[str] = None
7980

jbi/steps.py

+51
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from __future__ import annotations
1212

1313
import logging
14+
import re
1415
from enum import Enum, auto
1516
from typing import TYPE_CHECKING, Iterable, Optional
1617

@@ -200,6 +201,56 @@ def maybe_assign_jira_user(
200201
return (StepStatus.NOOP, context)
201202

202203

204+
def maybe_update_issue_milestone(
205+
context: ActionContext, *, parameters: ActionParams, jira_service: JiraService
206+
) -> StepResult:
207+
"""
208+
Update the Jira issue 'Fix Version' field.
209+
"""
210+
# Do not bother update the field if empty on create or if another field is updated.
211+
if (context.operation == Operation.CREATE and not context.bug.milestone) or (
212+
context.operation == Operation.UPDATE
213+
and "milestone" not in context.event.changed_fields()
214+
):
215+
return (StepStatus.NOOP, context)
216+
217+
if context.bug.milestone:
218+
m = re.match(r"Branch (\d+)", context.bug.milestone)
219+
if m is None:
220+
# Milestone not supported (eg. "Future")
221+
return (StepStatus.NOOP, context)
222+
223+
milestone_version = m.group(1)
224+
jira_project_versions = {
225+
v["name"]
226+
for v in jira_service.client.get_project_versions(context.jira.project)
227+
}
228+
potential_fix_versions = {
229+
f"Fx{milestone_version}",
230+
f"Release {milestone_version}",
231+
}
232+
jira_fix_versions = list(
233+
jira_project_versions.intersection(potential_fix_versions)
234+
)
235+
if not jira_fix_versions:
236+
logger.info(
237+
"Bug %s milestone %r has no matching version in project.",
238+
context.bug.id,
239+
context.bug.milestone,
240+
extra=context.update(
241+
operation=Operation.IGNORE,
242+
).model_dump(),
243+
)
244+
return (StepStatus.INCOMPLETE, context)
245+
246+
else:
247+
jira_fix_versions = []
248+
249+
resp = jira_service.update_issue_field(context, "fixVersions", jira_fix_versions)
250+
context.append_responses(resp)
251+
return (StepStatus.SUCCESS, context)
252+
253+
203254
def _maybe_update_issue_mapped_field(
204255
source_field: str,
205256
context: ActionContext,

tests/unit/test_steps.py

+35
Original file line numberDiff line numberDiff line change
@@ -728,6 +728,41 @@ def test_change_to_unknown_resolution_with_resolution_map(
728728
]
729729

730730

731+
def test_maybe_update_issue_milestone_empty_create():
732+
# NOOP when not set on create event
733+
pass
734+
735+
736+
def test_maybe_update_issue_milestone_unsupported_milestone():
737+
# NOOP when milestone is "Future"
738+
pass
739+
740+
741+
def test_maybe_update_issue_milestone_unknown_create():
742+
# Test log message when milestone unknown in project
743+
pass
744+
745+
746+
def test_maybe_update_issue_milestone_set_create():
747+
# Test both fix versions are known.
748+
pass
749+
750+
751+
def test_maybe_update_issue_milestone_empty_update():
752+
# Test set to empty list when empty on update.
753+
pass
754+
755+
756+
def test_maybe_update_issue_milestone_unknown_update():
757+
# Test log message when milestone unknown in project
758+
pass
759+
760+
761+
def test_maybe_update_issue_milestone_set_update():
762+
# Test both fix versions are known.
763+
pass
764+
765+
731766
def test_update_issue_priority(
732767
action_context_factory,
733768
mocked_jira,

0 commit comments

Comments
 (0)