Skip to content

Commit 495c384

Browse files
authored
Clone the repo on demand, instead of at startup. (#44)
1 parent 38827d2 commit 495c384

File tree

5 files changed

+50
-42
lines changed

5 files changed

+50
-42
lines changed

Procfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
web: python3 -m black_out
2-
worker: celery worker --app=black_out.tasks.app
2+
worker: celery worker --app=black_out.tasks.app --concurrency=1

black_out/black_out.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@ async def issue_opened(event, gh, *args, **kwargs):
2121

2222
issue_number = event.data["issue"]["number"]
2323
issue_creator = event.data["issue"]["user"]["login"]
24-
25-
tasks.initiate_black_task.delay(issue_number, issue_creator)
24+
repo_full_name = event.data["repository"]["full_name"]
25+
repo_name = event.data["repository"]["name"]
26+
tasks.initiate_black_task.delay(
27+
repo_name, repo_full_name, issue_number, issue_creator
28+
)
2629

2730

2831
@router.register("pull_request", action="labeled")

black_out/tasks.py

+37-27
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import base64
22
import celery
33
import os
4+
import shutil
45
import subprocess
56

6-
from celery import bootsteps
77

88
from . import util, exceptions
99

@@ -14,11 +14,9 @@
1414
)
1515

1616

17-
@app.task(rate_limit="1/m")
18-
def setup_repo():
17+
@app.task()
18+
def setup_repo(repo_name, repo_full_name):
1919

20-
repo_name = os.environ.get("GH_REPO_NAME")
21-
repo_full_name = os.environ.get("GH_REPO_FULL_NAME")
2220
os.mkdir("repo_checkout")
2321
os.chdir("repo_checkout")
2422
print(f"Setting up {repo_name} repository, cloning from {repo_full_name}")
@@ -45,8 +43,14 @@ def setup_repo():
4543
print(f"{repo_name} directory already exists")
4644

4745

48-
@app.task(rate_limit="1/m")
49-
def initiate_black_task(issue_number, issue_creator):
46+
@app.task()
47+
def cleanup_repo():
48+
os.chdir("../..")
49+
shutil.rmtree("repo_checkout")
50+
51+
52+
@app.task()
53+
def initiate_black_task(repo_name, repo_full_name, issue_number, issue_creator):
5054
"""Execute black
5155
5256
1. git fetch origin
@@ -58,10 +62,11 @@ def initiate_black_task(issue_number, issue_creator):
5862
7. git checkout master
5963
7. git branch -D issue-NNNN-initialize-black
6064
"""
65+
setup_repo(repo_name, repo_full_name)
6166
# cd to the checked out repo, if not already there
6267
if "repo_checkout" in os.listdir("."):
6368
os.chdir("repo_checkout")
64-
os.chdir(f"./{os.environ.get('GH_REPO_NAME')}")
69+
os.chdir(f"./{repo_name}")
6570

6671
branch_name = f"issue-{issue_number}-initialize-black"
6772

@@ -75,15 +80,21 @@ def initiate_black_task(issue_number, issue_creator):
7580
to create the pull request. Perhaps a pull request has been made, or
7681
black has been initiated? (I'm a bot 🤖)
7782
"""
78-
util.comment_on_pr(issue_number, message)
83+
util.comment_on_pr(repo_full_name, issue_number, message)
7984
raise e
8085

8186
needs_black = util.check_black(".")
8287
if needs_black:
8388
util.exec_command(["black", "."])
8489
commit_title, commit_body = util.commit_changes(issue_number)
8590
util.exec_command(["git", "push", "origin", branch_name])
86-
util.create_gh_pr("master", branch_name, title=commit_title, body=commit_body)
91+
util.create_gh_pr(
92+
"master",
93+
branch_name,
94+
title=commit_title,
95+
body=commit_body,
96+
repo_full_name=repo_full_name,
97+
)
8798
util.exec_command(["git", "checkout", "master"])
8899
util.delete_branch(branch_name)
89100
else:
@@ -93,11 +104,13 @@ def initiate_black_task(issue_number, issue_creator):
93104
(I'm a bot 🤖)
94105
"""
95106

96-
util.comment_on_pr(issue_number, message)
97-
util.close_issue(issue_number)
107+
util.comment_on_pr(repo_full_name, issue_number, message)
108+
util.close_issue(repo_full_name, issue_number)
109+
110+
cleanup_repo()
98111

99112

100-
@app.task(rate_limit="1/m")
113+
@app.task()
101114
def black_pr_task(event_data):
102115
"""Execute black on a PR
103116
@@ -111,10 +124,15 @@ def black_pr_task(event_data):
111124
8. git checkout master
112125
9. git branch -D pr_{pr_number}
113126
"""
127+
repo_name = event_data["repository"]["name"]
128+
repo_full_name = event_data["repository"]["full_name"]
129+
130+
setup_repo(repo_name, repo_full_name)
131+
114132
# cd to the checked out repo, if not already there
115133
if "repo_checkout" in os.listdir("."):
116134
os.chdir("repo_checkout")
117-
os.chdir(f"./{os.environ.get('GH_REPO_NAME')}")
135+
os.chdir(f"./{repo_name}")
118136

119137
pr_author = event_data["pull_request"]["user"]["login"]
120138

@@ -146,23 +164,15 @@ def black_pr_task(event_data):
146164
for b in blackened_files:
147165
message = message + f"\n - {b}"
148166
message = message + "\n (I'm a bot 🤖)"
149-
util.comment_on_pr(pr_number, message)
150-
util.remove_label(pr_number, "black out")
167+
util.comment_on_pr(repo_full_name, pr_number, message)
168+
util.remove_label(repo_full_name, pr_number, "black out")
151169

152170
else:
153171
message = "🐍🌚🤖 PR is already black! Good job!"
154-
util.comment_on_pr(pr_number, message)
155-
util.remove_label(pr_number, "black out")
172+
util.comment_on_pr(repo_full_name, pr_number, message)
173+
util.remove_label(repo_full_name, pr_number, "black out")
156174

157175
util.exec_command(["git", "stash"])
158176
util.exec_command(["git", "checkout", "master"])
159177
util.delete_branch(f"pr_{pr_number}")
160-
161-
162-
class InitRepoStep(bootsteps.StartStopStep):
163-
def start(self, c):
164-
print("Initialize the repository.")
165-
setup_repo()
166-
167-
168-
app.steps["worker"].add(InitRepoStep)
178+
cleanup_repo()

black_out/util.py

+7-8
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,16 @@ def commit_changes(issue_number=None):
4545
return title, body
4646

4747

48-
def comment_on_pr(issue_number, message):
48+
def comment_on_pr(repo_full_name, issue_number, message):
4949
"""
5050
Leave a comment on a PR/Issue
5151
"""
5252
request_headers = sansio.create_headers(
5353
os.environ.get("GH_USERNAME"), oauth_token=os.getenv("GH_AUTH")
5454
)
55-
issue_comment_url = f"https://api.github.com/repos/{os.environ.get('GH_REPO_FULL_NAME')}/issues/{issue_number}/comments"
55+
issue_comment_url = (
56+
f"https://api.github.com/repos/{repo_full_name}/issues/{issue_number}/comments"
57+
)
5658
data = {"body": message}
5759
response = requests.post(issue_comment_url, headers=request_headers, json=data)
5860
if response.status_code == requests.codes.created:
@@ -62,11 +64,10 @@ def comment_on_pr(issue_number, message):
6264
print(response.text)
6365

6466

65-
def create_gh_pr(base_branch, head_branch, *, title, body):
67+
def create_gh_pr(base_branch, head_branch, *, title, body, repo_full_name):
6668
"""
6769
Create PR in GitHub
6870
"""
69-
repo_full_name = os.environ.get("GH_REPO_FULL_NAME")
7071

7172
request_headers = get_request_headers()
7273

@@ -140,10 +141,9 @@ def delete_branch(branch_name):
140141
subprocess.check_output(cmd)
141142

142143

143-
def close_issue(issue_number):
144+
def close_issue(repo_full_name, issue_number):
144145
username = os.environ.get("GH_USERNAME")
145146
gh_auth = os.environ.get("GH_AUTH")
146-
repo_full_name = os.environ.get("GH_REPO_FULL_NAME")
147147

148148
request_headers = sansio.create_headers(username, oauth_token=gh_auth)
149149

@@ -170,11 +170,10 @@ def get_pr_diff_files(diff_url):
170170
return result
171171

172172

173-
def remove_label(pr_number, label):
173+
def remove_label(repo_full_name, pr_number, label):
174174
"""Remove a label from the PR"""
175175
username = os.environ.get("GH_USERNAME")
176176
gh_auth = os.environ.get("GH_AUTH")
177-
repo_full_name = os.environ.get("GH_REPO_FULL_NAME")
178177

179178
request_headers = sansio.create_headers(username, oauth_token=gh_auth)
180179

readme.rst

-4
Original file line numberDiff line numberDiff line change
@@ -95,10 +95,6 @@ Heroku settings
9595

9696
In Heroku, set the environment variables:
9797

98-
- ``GH_REPO_NAME``: The repository name. For example, for `https://github.com/ambv/black`,
99-
the repo name is ``black``.
100-
- ``GH_REPO_FULL_NAME``: The repository full name (organization and name). For example,
101-
for `https://github.com/ambv/black`, the repo full name is ``ambv/black``.
10298
- ``GH_USERNAME``: The GitHub username for the bot user. The bot user must have
10399
write access to the repo being blackened.
104100
- ``GH_EMAIL``: The email address for the bot user. The bot user must have write

0 commit comments

Comments
 (0)