|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
""" |
|
|
This should help you prepare a patch, automatically extracting the commits to cherry-pick |
|
|
in chronological order to avoid merge conflicts. An equivalent way to do this is to use |
|
|
`git log --pretty=oneline HEAD...v4.41.0` and grep. |
|
|
|
|
|
Potential TODO: automatically cherry-picks them. |
|
|
|
|
|
Pass in a list of PR: |
|
|
`python utils/patch_helper.py --prs 31108 31054 31008 31010 31004` |
|
|
will produce the following: |
|
|
```bash |
|
|
Skipping invalid version tag: list |
|
|
Skipping invalid version tag: localattn1 |
|
|
Git cherry-pick commands to run: |
|
|
git cherry-pick 03935d300d60110bb86edb49d2315089cfb19789 #2024-05-24 11:00:59+02:00 |
|
|
git cherry-pick bdb9106f247fca48a71eb384be25dbbd29b065a8 #2024-05-24 19:02:55+02:00 |
|
|
git cherry-pick 84c4b72ee99e8e65a8a5754a5f9d6265b45cf67e #2024-05-27 10:34:14+02:00 |
|
|
git cherry-pick 936ab7bae5e040ec58994cb722dd587b9ab26581 #2024-05-28 11:56:05+02:00 |
|
|
git cherry-pick 0bef4a273825d2cfc52ddfe62ba486ee61cc116f #2024-05-29 13:33:26+01:00 |
|
|
``` |
|
|
""" |
|
|
|
|
|
import argparse |
|
|
|
|
|
from git import GitCommandError, Repo |
|
|
from packaging import version |
|
|
|
|
|
|
|
|
def get_merge_commit(repo, pr_number, since_tag): |
|
|
try: |
|
|
|
|
|
merge_commit = next(repo.iter_commits(f"v{since_tag}...origin/main", grep=f"#{pr_number}")) |
|
|
return merge_commit |
|
|
except StopIteration: |
|
|
print(f"No merge commit found for PR #{pr_number} between tags {since_tag} and {main}") |
|
|
return None |
|
|
except GitCommandError as e: |
|
|
print(f"Error finding merge commit for PR #{pr_number}: {str(e)}") |
|
|
return None |
|
|
|
|
|
|
|
|
def main(pr_numbers): |
|
|
repo = Repo(".") |
|
|
merge_commits = [] |
|
|
|
|
|
tags = {} |
|
|
for tag in repo.tags: |
|
|
try: |
|
|
|
|
|
tag_ver = version.parse(tag.name) |
|
|
tags[tag_ver] = tag |
|
|
except Exception: |
|
|
print(f"Skipping invalid version tag: {tag.name}") |
|
|
|
|
|
last_tag = sorted(tags)[-1] |
|
|
major_minor = f"{last_tag.major}.{last_tag.minor}.0" |
|
|
|
|
|
for pr in pr_numbers: |
|
|
pr = pr.split("https://github.com/huggingface/transformers/pull/")[-1] |
|
|
commit = get_merge_commit(repo, pr, major_minor) |
|
|
if commit: |
|
|
merge_commits.append(commit) |
|
|
|
|
|
|
|
|
merge_commits.sort(key=lambda commit: commit.committed_datetime) |
|
|
|
|
|
|
|
|
print("Git cherry-pick commands to run:") |
|
|
for commit in merge_commits: |
|
|
print(f"git cherry-pick {commit.hexsha} #{commit.committed_datetime}") |
|
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
|
parser = argparse.ArgumentParser(description="Find and sort merge commits for specified PRs.") |
|
|
parser.add_argument("--prs", nargs="+", required=False, type=str, help="PR numbers to find merge commits for") |
|
|
|
|
|
args = parser.parse_args() |
|
|
if args.prs is None: |
|
|
args.prs = "https://github.com/huggingface/transformers/pull/33753 https://github.com/huggingface/transformers/pull/33861 https://github.com/huggingface/transformers/pull/33906 https://github.com/huggingface/transformers/pull/33761 https://github.com/huggingface/transformers/pull/33586 https://github.com/huggingface/transformers/pull/33766 https://github.com/huggingface/transformers/pull/33958 https://github.com/huggingface/transformers/pull/33965".split() |
|
|
main(args.prs) |
|
|
|