aboutsummaryrefslogtreecommitdiff
path: root/scripts/squash_typos.py
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/squash_typos.py')
-rw-r--r--scripts/squash_typos.py94
1 files changed, 67 insertions, 27 deletions
diff --git a/scripts/squash_typos.py b/scripts/squash_typos.py
index 26be6010a2..b403a9b7c8 100644
--- a/scripts/squash_typos.py
+++ b/scripts/squash_typos.py
@@ -22,24 +22,40 @@ def get_authors_and_emails_from_pr():
# Get a list of all authors involved in the pull request (including co-authors).
authors = subprocess.check_output(
- ["gh", "pr", "view", "--json", "commits", "--jq", ".[][].authors.[].name"],
+ [
+ "gh",
+ "pr",
+ "view",
+ os.environ["PR_NUMBER"],
+ "--json",
+ "commits",
+ "--jq",
+ ".[][].authors.[].name",
+ ],
text=True,
).splitlines()
# Get a list of emails of the aforementioned authors.
emails = subprocess.check_output(
- ["gh", "pr", "view", "--json", "commits", "--jq", ".[][].authors.[].email"],
+ [
+ "gh",
+ "pr",
+ "view",
+ os.environ["PR_NUMBER"],
+ "--json",
+ "commits",
+ "--jq",
+ ".[][].authors.[].email",
+ ],
text=True,
).splitlines()
- authors_and_emails_unique = {
- (author, mail) for author, mail in zip(authors, emails)
- }
+ authors_and_emails = [(author, mail) for author, mail in zip(authors, emails)]
- return sorted(authors_and_emails_unique)
+ return authors_and_emails
-def rebase_squash_branch_onto_pr():
+def rebase_onto_pr():
"""
Rebase current branch onto the PR.
@@ -49,9 +65,7 @@ def rebase_squash_branch_onto_pr():
# Check out the pull request.
subprocess.call(["gh", "pr", "checkout", os.environ["PR_NUMBER"]])
- # Rebase onto master
- default_branch = f"{os.environ['GITHUB_BASE_REF']}"
- subprocess.check_call(["git", "rebase", default_branch])
+ rebase_onto_master()
# Change back to the original branch.
subprocess.call(["git", "switch", "-"])
@@ -87,7 +101,7 @@ def rebase_squash_branch_onto_pr():
)
-def rebase_squash_branch_onto_master():
+def rebase_onto_master():
"""
Rebase current branch onto the master i.e. make sure current branch is up
@@ -99,7 +113,7 @@ def rebase_squash_branch_onto_master():
subprocess.check_call(["git", "rebase", default_branch])
-def squash_all_commits():
+def squash_all_commits(message_body_before):
"""
Squash all commits on the PR into a single commit. Credit all authors by
@@ -111,8 +125,11 @@ def squash_all_commits():
subprocess.call(["git", "reset", "--soft", default_branch])
authors_and_emails = get_authors_and_emails_from_pr()
- commit_message_coauthors = "\n" + "\n".join(
- [f"Co-authored-by: {i[0]} <{i[1]}>" for i in authors_and_emails]
+ commit_message_coauthors = (
+ "\n"
+ + "\n".join([f"Co-authored-by: {i[0]} <{i[1]}>" for i in authors_and_emails])
+ + "\n"
+ + message_body_before
)
subprocess.call(
["git", "commit", "-m", "chore: typo fixes", "-m", commit_message_coauthors]
@@ -164,7 +181,7 @@ def checkout_branch(branch):
return False
-def get_all_pr_urls(squash_branch_exists):
+def get_all_pr_urls(pr_branch_exists):
"""
Return a list of URLs for the pull requests with the typo fixes. If a
@@ -173,7 +190,7 @@ def get_all_pr_urls(squash_branch_exists):
"""
all_pr_urls = ""
- if squash_branch_exists:
+ if pr_branch_exists:
all_pr_urls += subprocess.check_output(
["gh", "pr", "view", "--json", "body", "--jq", ".body"], text=True
)
@@ -187,15 +204,21 @@ def get_all_pr_urls(squash_branch_exists):
def main():
- squash_branch = "marvim/squash-typos"
+ pr_branch = "marvim/squash-typos"
- squash_branch_exists = checkout_branch(squash_branch)
+ pr_branch_exists = checkout_branch(pr_branch)
- rebase_squash_branch_onto_master()
- force_push(squash_branch)
+ rebase_onto_master()
+ force_push(pr_branch)
+
+ message_body_before = "\n".join(
+ subprocess.check_output(
+ ["git", "log", "--format=%B", "-n1", pr_branch], text=True
+ ).splitlines()[2:]
+ )
- rebase_squash_branch_onto_pr()
- force_push(squash_branch)
+ rebase_onto_pr()
+ force_push(pr_branch)
subprocess.call(
[
@@ -204,20 +227,37 @@ def main():
"create",
"--fill",
"--head",
- squash_branch,
+ pr_branch,
"--title",
"chore: typo fixes (automated)",
- ]
+ ],
+ text=True,
)
- squash_all_commits()
- force_push(squash_branch)
+ squash_all_commits(message_body_before)
+ force_push(pr_branch)
- all_pr_urls = get_all_pr_urls(squash_branch_exists)
+ all_pr_urls = get_all_pr_urls(pr_branch_exists)
subprocess.call(["gh", "pr", "edit", "--add-label", "typo", "--body", all_pr_urls])
subprocess.call(["gh", "pr", "close", os.environ["PR_NUMBER"]])
+ squash_url = subprocess.check_output(
+ ["gh", "pr", "view", "--json", "url", "--jq", ".url"], text=True
+ ).strip()
+ subprocess.call(
+ [
+ "gh",
+ "pr",
+ "comment",
+ os.environ["PR_NUMBER"],
+ "--body",
+ f"Thank you for your contribution! We collect all typo fixes \
+ into a single pull request and merge it once it gets big enough: \
+ {squash_url}",
+ ]
+ )
+
if __name__ == "__main__":
main()