Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion bedevere/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ async def main(request):
cache=cache)
# Give GitHub some time to reach internal consistency.
await asyncio.sleep(1)
await router.dispatch(event, gh)
await router.dispatch(event, gh, session=session)
try:
print('GH requests remaining:', gh.rate_limit.remaining)
except AttributeError:
Expand Down
62 changes: 42 additions & 20 deletions bedevere/bpo.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,35 +21,33 @@
SKIP_ISSUE_LABEL = util.skip_label("issue")
STATUS_CONTEXT = "bedevere/issue-number"
# Try to keep descriptions at or below 50 characters, else GitHub's CSS will truncate it.
_FAILURE_DESCRIPTION = 'No issue # in title or "skip issue" label found'
_FAILURE_URL = "https://devguide.python.org/pullrequest/#submitting"
FAILURE_STATUS = util.create_status(STATUS_CONTEXT, util.StatusState.FAILURE,
description=_FAILURE_DESCRIPTION,
target_url=_FAILURE_URL)
del _FAILURE_DESCRIPTION
del _FAILURE_URL
SKIP_ISSUE_STATUS = util.create_status(STATUS_CONTEXT, util.StatusState.SUCCESS,
description="Issue report skipped")


@router.register("pull_request", action="opened")
@router.register("pull_request", action="synchronize")
@router.register("pull_request", action="reopened")
async def set_status(event, gh, *args, **kwargs):
async def set_status(event, gh, session=None, *args, **kwargs):
"""Set the issue number status on the pull request."""
issue_number_found = ISSUE_RE.search(event.data["pull_request"]["title"])
if not issue_number_found:
issue = await util.issue_for_PR(gh, event.data["pull_request"])
status = SKIP_ISSUE_STATUS if util.skip("issue", issue) else FAILURE_STATUS
status = (SKIP_ISSUE_STATUS if util.skip("issue", issue)
else create_failure_status_no_issue())
else:
if "body" in event.data["pull_request"]:
body = event.data["pull_request"]["body"] or ""
if not body or CLOSING_TAG not in body:
issue_number = issue_number_found.group("issue")
new_body = BODY.format(body=body, issue_number=issue_number)
body_data = {"body": new_body}
await gh.patch(event.data["pull_request"]["url"], data=body_data)
status = create_success_status(issue_number_found)
issue_number = issue_number_found.group("issue")
issue_number_on_bpo = await _validate_issue_number(issue_number, session=session)
if issue_number_on_bpo:
if "body" in event.data["pull_request"]:
body = event.data["pull_request"]["body"] or ""
if not body or CLOSING_TAG not in body:
new_body = BODY.format(body=body, issue_number=issue_number)
body_data = {"body": new_body}
await gh.patch(event.data["pull_request"]["url"], data=body_data)
status = create_success_status(issue_number)
else:
status = create_failure_status_issue_not_on_bpo(issue_number)
await util.post_status(gh, event, status)


Expand All @@ -68,7 +66,7 @@ async def new_label(event, gh, *args, **kwargs):
issue_number_found = ISSUE_RE.search(
event.data["pull_request"]["title"])
if issue_number_found:
status = create_success_status(issue_number_found)
status = create_success_status(issue_number_found.group("issue"))
else:
status = SKIP_ISSUE_STATUS
await util.post_status(gh, event, status)
Expand Down Expand Up @@ -104,15 +102,32 @@ async def hyperlink_bpo_text(event, gh, *args, **kwargs):
await gh.patch(event.data[event_name][body_location], data=body_data)


def create_success_status(found_issue):
def create_success_status(issue_number):
"""Create a success status for when an issue number was found in the title."""
issue_number = found_issue.group("issue")
url = f"https://bugs.python.org/issue{issue_number}"
return util.create_status(STATUS_CONTEXT, util.StatusState.SUCCESS,
description=f"Issue number {issue_number} found",
target_url=url)


def create_failure_status_issue_not_on_bpo(issue_number):
"""Create a failure status for when an issue does not exist on the bug tracker."""
description = f"Issue #{issue_number} not found on bugs.python.org"
url = f"https://bugs.python.org/issue{issue_number}"
return util.create_status(STATUS_CONTEXT, util.StatusState.FAILURE,
description=description,
target_url=url)


def create_failure_status_no_issue():
"""Create a failure status for when no issue number was found in the title."""
description = 'No issue # in title or "skip issue" label found'
url = "https://devguide.python.org/pullrequest/#submitting"
return util.create_status(STATUS_CONTEXT, util.StatusState.FAILURE,
description=description,
target_url=url)


def check_hyperlink(match):
"""The span checking of regex matches takes care of cases like bpo-123 [bpo-123]…"""
issue = match.group("issue")
Expand Down Expand Up @@ -155,3 +170,10 @@ def create_hyperlink_in_comment_body(body):
leftover_body = leftover_body[presence:]
new_body = new_body + leftover_body
return new_body


async def _validate_issue_number(issue_number, session):
"""Make sure the issue number exists on bugs.python.org."""
url = f"https://bugs.python.org/issue{issue_number}"
async with session.head(url) as res:
return res.status != 404
1 change: 1 addition & 0 deletions dev-requirements.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
-r requirements.txt
asynctest==0.13.0
pytest==5.0.1
pytest-asyncio==0.10.0
pytest-aiohttp==0.3.0
Loading