Skip to content

Commit 844eb42

Browse files
authored
Merge pull request #699 from THEAbhishekjoshi/fix/draft-pr-lead-time
fix(analytics): include draft PR duration in commit to open segment
2 parents a31c4da + d065c80 commit 844eb42

3 files changed

Lines changed: 31 additions & 1 deletion

File tree

backend/analytics_server/mhq/service/code/sync/etl_code_analytics.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,10 @@ def create_pr_metrics(
5050
if pr_commits:
5151
pr.rework_cycles = self.get_rework_cycles(pr, non_bot_pr_events, pr_commits)
5252
pr_commits.sort(key=lambda x: x.created_at)
53-
first_commit_to_open = pr.created_at - pr_commits[0].created_at
53+
first_commit_to_open = (
54+
pr_performance.pull_request_ready_for_review_time
55+
- pr_commits[0].created_at
56+
)
5457
if isinstance(first_commit_to_open, timedelta):
5558
pr.first_commit_to_open = first_commit_to_open.total_seconds()
5659

@@ -134,6 +137,7 @@ def get_pr_performance(pr: PullRequest, pr_events: [PullRequestEvent]):
134137
if first_response_end_time
135138
else -1
136139
),
140+
pull_request_ready_for_review_time=pull_request_ready_for_review_time,
137141
rework_time=rework_time,
138142
merge_time=merge_time,
139143
cycle_time=cycle_time if pr.state == PullRequestState.MERGED else -1,

backend/analytics_server/mhq/service/code/sync/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
class PRPerformance:
66
first_commit_to_open: int = -1
77
first_review_time: int = -1
8+
pull_request_ready_for_review_time: int = -1
89
rework_time: int = -1
910
merge_time: int = -1
1011
merge_to_deploy: int = -1

backend/analytics_server/tests/service/code/sync/test_etl_code_analytics.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,3 +751,28 @@ def test_cycle_time_ready_for_review_with_draft_pr_workflow():
751751

752752
assert performance.cycle_time == 86400
753753
assert performance.first_review_time == 14400
754+
755+
756+
def test_create_pr_metrics_calculates_first_commit_to_open_using_ready_for_review():
757+
"""Test that first_commit_to_open correctly accounts for the draft PR window."""
758+
pr_service = CodeETLAnalyticsService()
759+
t1 = time_now() # commit time
760+
t2 = t1 + timedelta(hours=20) # pr created
761+
t3 = t2 + timedelta(
762+
hours=2
763+
) # sat in draft for 2 hours (ready_for_review event time)
764+
765+
pr = get_pull_request(state=PullRequestState.MERGED, created_at=t2, updated_at=t3)
766+
commit = get_pull_request_commit(pr_id=pr.id, created_at=t1)
767+
768+
ready_for_review_event = get_pull_request_event(
769+
pull_request_id=pr.id,
770+
type=PullRequestEventType.READY_FOR_REVIEW.value,
771+
created_at=t3,
772+
)
773+
774+
updated_pr = pr_service.create_pr_metrics(pr, [ready_for_review_event], [commit])
775+
776+
expected_seconds = (t3 - t1).total_seconds()
777+
778+
assert updated_pr.first_commit_to_open == expected_seconds

0 commit comments

Comments
 (0)