mirror of
https://github.com/pytorch/pytorch.git
synced 2025-10-21 05:34:18 +08:00
Fix mergeability check for ghstack PRs (#118258)
# Changes * introduce `--check-mergeability` trymerge flag that attempts to merge PR locally, using the same merge logic as the mergebot, but requires just a read-only `GITHUB_TOKEN` and git repo. * change mergeability workflow to utilize the new --check-mergeability logic # Alternatives considered 1. > Rewrite `https://github.com/pytorch/test-infra/actions/workflows/pr-dependencies-check.yml` to correctly support partially merged ghstacks. That would be a slightly better approach, but ROI is lower, as it requires reimplementing trymerge logic and additional effort to consolidate the codebase (trymerge lives in pytorch repo). `pr-dependencies-check.yml` still produces human-readable results for partially merged ghstack prs (even if it falsely reports them as non-mergeable). 2. > Instead of introducing new trymerge flag, use existing flags, including `--dry-run`. That didn't work, as no combination of existing flags skips the rule checks and ROCKSET lookups. # Testing 1. Manual testing `trymerge.py --check-mergeability` on the regular and ghstack PRs: ``` export GITHUB_TOKEN= export GIT_REPO_DIR=`pwd` export GITHUB_REPOSITORY=pytorch/pytorch export GIT_REMOTE_URL=https://github.com/pytorch/pytorch # Test 1 (2 prs, 1 is closed) python3 ../pytorch/.github/scripts/trymerge.py --check-mergeability 117862 Skipping 1 of 2 PR (#117859) as its already been merged echo $? 0 # Test 2 (3 prs, 1 is closed) python3 ../pytorch/.github/scripts/trymerge.py --check-mergeability 118125 Skipping 1 of 3 PR (#117859) as its already been merged echo $? 0 # Test 3 (3 prs, intentional conflicts introduced into `main`): python3 ../pytorch/.github/scripts/trymerge.py --check-mergeability 118125 Skipping 1 of 3 PR (#117859) as its already been merged stdout: Auto-merging torch/_inductor/ir.py Auto-merging torch/_inductor/lowering.py CONFLICT (content): Merge conflict in torch/_inductor/lowering.py error: could not apply 66ba5b8792f... Realize inputs to DynamicScalar before unwrapping ... RuntimeError: Command `git -C /Users/ivanzaitsev/pytorch2 cherry-pick -x 66ba5b8792fa076c4e512d920651e5b6b7e466f4` returned non-zero exit code 1 ``` 2. Workflow run: https://github.com/pytorch/pytorch/actions/runs/7660736172/job/20878651852?pr=118258 <img width="516" alt="image" src="https://github.com/pytorch/pytorch/assets/108101595/28fbf0d2-ac2a-4518-b41d-b32b41373747"> <img width="621" alt="image" src="https://github.com/pytorch/pytorch/assets/108101595/ddbf8566-a417-43ec-9d0e-f623f4a71313"> Pull Request resolved: https://github.com/pytorch/pytorch/pull/118258 Approved by: https://github.com/PaliC, https://github.com/huydhn
This commit is contained in:
committed by
PyTorch MergeBot
parent
4e456fd95b
commit
b599f5608c
9
.github/scripts/gitutils.py
vendored
9
.github/scripts/gitutils.py
vendored
@ -155,8 +155,12 @@ class GitRepo:
|
||||
)
|
||||
return [x.strip() for x in rc.split("\n") if x.strip()] if len(rc) > 0 else []
|
||||
|
||||
def current_branch(self) -> str:
|
||||
return self._run_git("symbolic-ref", "--short", "HEAD").strip()
|
||||
def current_branch(self) -> Optional[str]:
|
||||
try:
|
||||
return self._run_git("symbolic-ref", "--short", "HEAD").strip()
|
||||
except RuntimeError:
|
||||
# we are in detached HEAD state
|
||||
return None
|
||||
|
||||
def checkout(self, branch: str) -> None:
|
||||
self._run_git("checkout", branch)
|
||||
@ -273,6 +277,7 @@ class GitRepo:
|
||||
|
||||
def cherry_pick_commits(self, from_branch: str, to_branch: str) -> None:
|
||||
orig_branch = self.current_branch()
|
||||
assert orig_branch is not None, "Must be on a branch"
|
||||
self.checkout(to_branch)
|
||||
from_commits, to_commits = self.compute_branch_diffs(from_branch, to_branch)
|
||||
if len(from_commits) == 0:
|
||||
|
Reference in New Issue
Block a user