mirror of
https://github.com/saymrwulf/pytorch.git
synced 2026-05-15 21:00:47 +00:00
This upload a record to a new Rockset `merges` collection in `commons` workspace in the following format:
```
{
"id": comment_id,
"pr_num": pr_num,
"owner": owner,
"project": project,
"pending_checks": pending_checks, # At the time of the merge
"failed_checks": failed_checks, # At the time of the merge
"is_failed": is_failed, # This is set to True if the merge fails to get through for whatever reason
"dry_run": dry_run,
"skip_mandatory_checks": skip_mandatory_checks,
"ignore_current": ignore_current,
"error": error, # The same Exception message that will be shown on PR
}
```
To achieve this, I need to tweak `find_matching_merge_rule` a bit to return the list of pending and failed checks in addition to the matching merge rule. As this function is also used internally, I have confirmed that the internal call doesn't need the return values. Thus, the change is safe to land.
### Testing
* Unit testing
* Dry-run locally `python3 .github/scripts/trymerge.py --comment-id 1478678477 --dry-run 97293` using an older PR. The merge obviously failed, but the record was created successfully on Rockset
```
{
"_id": "52d3152b-ec35-4b5a-91fc-0e7298fc54b5-1",
"_event_time": "2023-03-23T21:10:32.754368Z",
"_meta": null,
"owner": "pytorch",
"is_failed": true,
"id": 1478678477,
"failed_checks": [],
"dry_run": true,
"error": "Command `git -C pytorch cherry-pick -x cc0d2e0fba648bb5deda34a9056f2c4192b22314` returned non-zero exit code 1...",
"ignore_current": false,
"project": "pytorch",
"pr_num": 97293,
"skip_mandatory_checks": false,
"pending_checks": []
}
```
* Dry-run locally with this PR `python3 .github/scripts/trymerge.py --comment-id 1481949104 --dry-run --force 97471` with `--force`
```
{
"_id": "dd7d2580-f6e5-47e7-9441-17df86056c14-1",
"_event_time": "2023-03-23T21:43:53.915911Z",
"_meta": null,
"owner": "pytorch",
"is_failed": true,
"id": 1481949104,
"failed_checks": [],
"dry_run": true,
"error": "PR #97471 has not been reviewed yet",
"ignore_current": false,
"project": "pytorch",
"pr_num": 97471,
"skip_mandatory_checks": true,
"pending_checks": []
}
```
* Dry-run locally with this PR `python3 .github/scripts/trymerge.py --comment-id 1481949104 --dry-run 97471` again with approval rule commented out
```
{
"_id": "5d7de4e3-1af1-4869-a3b7-d1a9dbced6ce-1",
"_event_time": "2023-03-24T00:10:41.914111Z",
"_meta": null,
"is_failed": false,
"id": 1481949104,
"failed_checks": [],
"error": "",
"last_commit_sha": "4657400513f0360a0a4f73d46e1aff0882221687",
"merge_commit_sha": "416bac5b813a181753afade781ae30f4f0843586",
"ignore_current": false,
"pending_checks": [
[
"pull / linux-focal-py3.8-gcc7 / test (default, 1, 3, linux.2xlarge)",
"https://github.com/pytorch/pytorch/actions/runs/4506464828/jobs/7933518379",
12239935788
],
...
[
"trunk / linux-bionic-cuda11.8-py3.10-gcc7 / test (default, 5, 5, linux.4xlarge.nvidia.gpu)",
"https://github.com/pytorch/pytorch/actions/runs/4506465633/jobs/7933621958",
12240067113
],
...
],
"owner": "pytorch",
"skip_mandatory_checks": true,
"author": "Huy Do <huydhn@gmail.com>",
"project": "pytorch",
"merge_base_sha": "a3b30c5025e3381022fa00b127b0d881f4ef66d4",
"pr_num": 97471
}
```
Pull Request resolved: https://github.com/pytorch/pytorch/pull/97471
Approved by: https://github.com/clee2000
97 lines
2.9 KiB
Python
97 lines
2.9 KiB
Python
import os
|
|
import re
|
|
from typing import List, Optional, Pattern, Tuple
|
|
|
|
|
|
BOT_COMMANDS_WIKI = "https://github.com/pytorch/pytorch/wiki/Bot-commands"
|
|
|
|
CIFLOW_LABEL = re.compile(r"^ciflow/.+")
|
|
CIFLOW_TRUNK_LABEL = re.compile(r"^ciflow/trunk")
|
|
|
|
OFFICE_HOURS_LINK = "https://github.com/pytorch/pytorch/wiki/Dev-Infra-Office-Hours"
|
|
CONTACT_US = f"Questions? Feedback? Please reach out to the [PyTorch DevX Team]({OFFICE_HOURS_LINK})"
|
|
ALTERNATIVES = f"Learn more about merging in the [wiki]({BOT_COMMANDS_WIKI})."
|
|
|
|
|
|
def has_label(labels: List[str], pattern: Pattern[str] = CIFLOW_LABEL) -> bool:
|
|
return len(list(filter(pattern.match, labels))) > 0
|
|
|
|
|
|
class TryMergeExplainer(object):
|
|
force: bool
|
|
labels: List[str]
|
|
pr_num: int
|
|
org: str
|
|
project: str
|
|
ignore_current: bool
|
|
|
|
has_trunk_label: bool
|
|
has_ciflow_label: bool
|
|
|
|
def __init__(
|
|
self,
|
|
force: bool,
|
|
labels: List[str],
|
|
pr_num: int,
|
|
org: str,
|
|
project: str,
|
|
ignore_current: bool,
|
|
):
|
|
self.force = force
|
|
self.labels = labels
|
|
self.pr_num = pr_num
|
|
self.org = org
|
|
self.project = project
|
|
self.ignore_current = ignore_current
|
|
|
|
def _get_flag_msg(
|
|
self,
|
|
ignore_current_checks: Optional[
|
|
List[Tuple[str, Optional[str], Optional[int]]]
|
|
] = None,
|
|
) -> str:
|
|
if self.force:
|
|
return (
|
|
"Your change will be merged immediately since you used the force (-f) flag, "
|
|
+ "**bypassing any CI checks** (ETA: 1-5 minutes)."
|
|
)
|
|
elif self.ignore_current and ignore_current_checks is not None:
|
|
msg = f"Your change will be merged while ignoring the following {len(ignore_current_checks)} checks: "
|
|
msg += ", ".join(f"[{x[0]}]({x[1]})" for x in ignore_current_checks)
|
|
return msg
|
|
else:
|
|
return "Your change will be merged once all checks pass (ETA 0-4 Hours)."
|
|
|
|
def get_merge_message(
|
|
self,
|
|
ignore_current_checks: Optional[
|
|
List[Tuple[str, Optional[str], Optional[int]]]
|
|
] = None,
|
|
) -> str:
|
|
title = "### Merge started"
|
|
main_message = self._get_flag_msg(ignore_current_checks)
|
|
|
|
advanced_debugging = "\n".join(
|
|
(
|
|
"<details><summary>Advanced Debugging</summary>",
|
|
"Check the merge workflow status ",
|
|
f"<a href=\"{os.getenv('GH_RUN_URL')}\">here</a>",
|
|
"</details>",
|
|
)
|
|
)
|
|
|
|
msg = title + "\n"
|
|
msg += main_message + "\n\n"
|
|
msg += ALTERNATIVES + "\n\n"
|
|
msg += CONTACT_US
|
|
msg += advanced_debugging
|
|
return msg
|
|
|
|
|
|
def get_revert_message(org: str, project: str, pr_num: int) -> str:
|
|
msg = (
|
|
"@pytorchbot successfully started a revert job."
|
|
+ f" Check the current status [here]({os.getenv('GH_RUN_URL')}).\n"
|
|
)
|
|
msg += CONTACT_US
|
|
return msg
|