From e8d3587119bbac0d55b7bec0ba5b140c3765d342 Mon Sep 17 00:00:00 2001 From: Steve Dignam Date: Fri, 11 Dec 2020 23:27:31 -0500 Subject: [PATCH] add(bot): cut_body_after option for merge message `cut_body_before` was added via https://github.com/chdsbd/kodiak/pull/589 Add the second option, also handle the case where the match isn't found. rel: https://github.com/chdsbd/kodiak/issues/550 --- bot/kodiak/config.py | 1 + bot/kodiak/evaluation.py | 18 ++- .../test/fixtures/config/config-schema.json | 11 +- bot/kodiak/test_evaluation.py | 126 ++++++++++++++++++ 4 files changed, 149 insertions(+), 7 deletions(-) diff --git a/bot/kodiak/config.py b/bot/kodiak/config.py index 5c70a0be4..4c0379ec2 100644 --- a/bot/kodiak/config.py +++ b/bot/kodiak/config.py @@ -44,6 +44,7 @@ class MergeMessage(BaseModel): include_coauthors: bool = False include_pull_request_url: bool = False cut_body_before: str = "" + cut_body_after: str = "" # this pattern indicates that the user has the field unset. diff --git a/bot/kodiak/evaluation.py b/bot/kodiak/evaluation.py index 4ee379a66..2d886859c 100644 --- a/bot/kodiak/evaluation.py +++ b/bot/kodiak/evaluation.py @@ -64,16 +64,23 @@ def get_body_content( + *, body_type: BodyText, strip_html_comments: bool, cut_body_before: str, + cut_body_after: str, pull_request: PullRequest, ) -> str: if body_type == BodyText.markdown: body = pull_request.body if cut_body_before != "": start_index = body.find(cut_body_before) - body = body[start_index:] + if start_index != -1: + body = body[start_index:] + if cut_body_after != "": + end_index = body.find(cut_body_after) + if end_index != -1: + body = body[: end_index + len(cut_body_after)] if strip_html_comments: return strip_html_comments_from_markdown(body) return body @@ -168,10 +175,11 @@ def get_merge_body( merge_body = MergeBody(merge_method=merge_method) if config.merge.message.body == MergeBodyStyle.pull_request_body: body = get_body_content( - config.merge.message.body_type, - config.merge.message.strip_html_comments, - config.merge.message.cut_body_before, - pull_request, + body_type=config.merge.message.body_type, + strip_html_comments=config.merge.message.strip_html_comments, + cut_body_before=config.merge.message.cut_body_before, + cut_body_after=config.merge.message.cut_body_after, + pull_request=pull_request, ) merge_body.commit_message = body if config.merge.message.body == MergeBodyStyle.empty: diff --git a/bot/kodiak/test/fixtures/config/config-schema.json b/bot/kodiak/test/fixtures/config/config-schema.json index 66252c569..fe10b0625 100644 --- a/bot/kodiak/test/fixtures/config/config-schema.json +++ b/bot/kodiak/test/fixtures/config/config-schema.json @@ -33,7 +33,8 @@ "include_pull_request_author": false, "include_coauthors": false, "include_pull_request_url": false, - "cut_body_before": "" + "cut_body_before": "", + "cut_body_after": "" }, "dont_wait_on_status_checks": [], "update_branch_immediately": false, @@ -143,6 +144,11 @@ "title": "Cut Body Before", "default": "", "type": "string" + }, + "cut_body_after": { + "title": "Cut Body After", + "default": "", + "type": "string" } } }, @@ -236,7 +242,8 @@ "include_pull_request_author": false, "include_coauthors": false, "include_pull_request_url": false, - "cut_body_before": "" + "cut_body_before": "", + "cut_body_after": "" }, "allOf": [ { diff --git a/bot/kodiak/test_evaluation.py b/bot/kodiak/test_evaluation.py index 968381231..f6117a07a 100644 --- a/bot/kodiak/test_evaluation.py +++ b/bot/kodiak/test_evaluation.py @@ -3048,6 +3048,132 @@ def test_get_merge_body_strip_html_comments() -> None: assert actual == expected +def test_get_merge_body_cut_body_after() -> None: + """ + Basic check of cut_body_after removing content. + """ + pull_request = create_pull_request() + pull_request.body = "hello world" + actual = get_merge_body( + config=V1( + version=1, + merge=Merge( + message=MergeMessage( + body=MergeBodyStyle.pull_request_body, + cut_body_after="", + ) + ), + ), + pull_request=pull_request, + merge_method=MergeMethod.squash, + commits=[], + ) + expected = MergeBody(merge_method="squash", commit_message="hello ") + assert actual == expected + + +def test_get_merge_body_cut_body_after_strip_html() -> None: + """ + We should be able to use strip_html_comments with cut_body_after. + """ + pull_request = create_pull_request() + pull_request.body = "hello world" + actual = get_merge_body( + config=V1( + version=1, + merge=Merge( + message=MergeMessage( + body=MergeBodyStyle.pull_request_body, + cut_body_after="", + strip_html_comments=True, + ) + ), + ), + pull_request=pull_request, + merge_method=MergeMethod.squash, + commits=[], + ) + expected = MergeBody(merge_method="squash", commit_message="hello ") + assert actual == expected + + +def test_get_merge_body_cut_body_after_multiple_markers() -> None: + """ + We should choose the first substring matching cut_body_after. + """ + pull_request = create_pull_request() + pull_request.body = "hello world 123" + actual = get_merge_body( + config=V1( + version=1, + merge=Merge( + message=MergeMessage( + body=MergeBodyStyle.pull_request_body, + cut_body_after="", + strip_html_comments=True, + ) + ), + ), + pull_request=pull_request, + merge_method=MergeMethod.squash, + commits=[], + ) + expected = MergeBody(merge_method="squash", commit_message="hello ") + assert actual == expected + + +def test_get_merge_body_cut_body_after_no_match_found() -> None: + """ + Ensure we don't edit the message if there isn't any match found with + cut_body_after. + """ + pull_request = create_pull_request() + pr_body = "hello world 123" + pull_request.body = pr_body + actual = get_merge_body( + config=V1( + version=1, + merge=Merge( + message=MergeMessage( + body=MergeBodyStyle.pull_request_body, + cut_body_after="", + ) + ), + ), + pull_request=pull_request, + merge_method=MergeMethod.squash, + commits=[], + ) + expected = MergeBody(merge_method="squash", commit_message=pr_body) + assert actual == expected + + +def test_get_merge_body_cut_body_before_no_match_found() -> None: + """ + Ensure we don't edit the message if there isn't any match found with + cut_body_before. + """ + pull_request = create_pull_request() + pr_body = "hello world 123" + pull_request.body = pr_body + actual = get_merge_body( + config=V1( + version=1, + merge=Merge( + message=MergeMessage( + body=MergeBodyStyle.pull_request_body, + cut_body_before="", + ) + ), + ), + pull_request=pull_request, + merge_method=MergeMethod.squash, + commits=[], + ) + expected = MergeBody(merge_method="squash", commit_message=pr_body) + assert actual == expected + + def test_get_merge_body_cut_body_before() -> None: pull_request = create_pull_request() pull_request.body = "hello world"