Skip to content

Commit 48b21bc

Browse files
committed
api.views: update pr description on landing triggers (bug 2031664)
1 parent c194b3e commit 48b21bc

5 files changed

Lines changed: 82 additions & 28 deletions

File tree

src/lando/api/legacy/api/landing_jobs.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,11 @@
77
from django.utils.decorators import method_decorator
88
from django.views import View
99

10+
from lando.api.views import generate_enhanced_pr_description
1011
from lando.main.auth import require_authenticated_user
1112
from lando.main.models import JobAction, JobStatus, LandingJob
1213
from lando.utils.exceptions import NotFoundProblemException
14+
from lando.utils.github import GitHubAPIClient
1315

1416
logger = logging.getLogger(__name__)
1517

@@ -99,6 +101,18 @@ def put(self, request: WSGIRequest, job_id: int) -> JsonResponse:
99101
if landing_job.status in (JobStatus.SUBMITTED, JobStatus.DEFERRED):
100102
landing_job.transition_status(JobAction.CANCEL)
101103
landing_job.save()
104+
if landing_job.is_pull_request_job:
105+
client = GitHubAPIClient(landing_job.target_repo.url)
106+
for revision in landing_job.revisions:
107+
pull_request = client.build_pull_request(revision.pull_number)
108+
description = generate_enhanced_pr_description(
109+
pull_request,
110+
landing_job.target_repo,
111+
template="pr_description_landing.md",
112+
)
113+
client.update_pull_request_body(
114+
revision.pull_number, description
115+
)
102116
return JsonResponse({"id": landing_job.id})
103117
else:
104118
data = {

src/lando/api/legacy/workers/landing_worker.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,8 @@ def run_job(self, job: LandingJob) -> bool:
9797
True: The job finished processing and is in a permanent state.
9898
False: The job encountered a temporary failure and should be tried again.
9999
"""
100+
from lando.api.views import generate_enhanced_pr_description
101+
100102
repo: Repo = job.target_repo
101103
scm = repo.scm
102104

@@ -139,6 +141,13 @@ def run_job(self, job: LandingJob) -> bool:
139141
pull_number = job.revisions.first().pull_number
140142
message = f"Pull request closed by commit {commit_id}"
141143
client = GitHubAPIClient(job.target_repo.url)
144+
pull_request = client.build_pull_request(pull_number)
145+
description = generate_enhanced_pr_description(
146+
pull_request,
147+
job.target_repo,
148+
template="pr_description_landing.md",
149+
)
150+
client.update_pull_request_body(pull_number, description)
142151
client.add_comment_to_pull_request(pull_number, message)
143152
client.close_pull_request(pull_number)
144153

src/lando/api/views.py

Lines changed: 54 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,45 @@ def generate_warnings_and_blockers(
8989
return {"warnings": warnings, "blockers": blockers}
9090

9191

92+
def generate_enhanced_pr_description(
93+
pull_request: PullRequest,
94+
target_repo: Repo,
95+
request: WSGIRequest = None,
96+
template: str = "pr_description.md",
97+
) -> str:
98+
context = {}
99+
if request:
100+
context.update(
101+
generate_warnings_and_blockers(target_repo, pull_request, request)
102+
)
103+
104+
context["landing_status"] = str(
105+
get_pull_request_last_landing_job_status(target_repo.name, pull_request.number)
106+
).lower()
107+
108+
path = reverse(
109+
"pull-request",
110+
kwargs={
111+
"repo_name": target_repo.name,
112+
"number": pull_request.number,
113+
},
114+
)
115+
116+
context["lando_url"] = f"{settings.SITE_URL}{path}"
117+
context["special_delimiter"] = SPECIAL_DELIMITER
118+
bugs = parse_bugs(pull_request.title)
119+
context["bugs"] = []
120+
121+
for bug in bugs:
122+
context["bugs"].append((bug, f"{settings.BUGZILLA_URL}/{bug}"))
123+
124+
context["title"] = pull_request.title
125+
context["body"] = pull_request.parsed_body
126+
127+
rendered = render_to_string(template, context)
128+
return rendered
129+
130+
92131
@method_decorator(csrf_exempt, name="dispatch")
93132
class LegacyDiffWarningView(View):
94133
"""
@@ -223,10 +262,10 @@ def get(
223262
self, request: WSGIRequest, repo_name: int, pull_number: int
224263
) -> JsonResponse:
225264
"""Return the status of a pull request based on landing job counts."""
226-
status = str(
265+
landing_status = str(
227266
get_pull_request_last_landing_job_status(repo_name, pull_number)
228267
).lower()
229-
return JsonResponse({"status": status}, status=200)
268+
return JsonResponse({"status": landing_status}, status=200)
230269

231270
@method_decorator(require_authenticated_user)
232271
def post(
@@ -292,6 +331,14 @@ class Form(forms.Form):
292331
job.status = JobStatus.SUBMITTED
293332
job.save()
294333

334+
description = generate_enhanced_pr_description(
335+
self.pull_request,
336+
self.target_repo,
337+
request,
338+
template="pr_description_landing.md",
339+
)
340+
self.client.update_pull_request_body(pull_number, description)
341+
295342
return JsonResponse({"id": job.id}, status=201)
296343

297344

@@ -368,30 +415,10 @@ def get(
368415
if not request.user.has_perm("main.can_change_landing_job"):
369416
raise PermissionError()
370417

371-
context = {}
372-
context.update(
373-
generate_warnings_and_blockers(self.target_repo, self.pull_request, request)
418+
description = generate_enhanced_pr_description(
419+
self.pull_request, self.target_repo, request
374420
)
375-
376-
path = reverse(
377-
"pull-request",
378-
kwargs={
379-
"repo_name": self.target_repo.name,
380-
"number": self.pull_request.number,
381-
},
421+
self.client.update_pull_request_body(pull_number, description)
422+
return JsonResponse(
423+
{"status": f"Pull request {pull_number} description updated."}
382424
)
383-
384-
context["lando_url"] = f"{settings.SITE_URL}{path}"
385-
context["special_delimiter"] = SPECIAL_DELIMITER
386-
bugs = parse_bugs(self.pull_request.title)
387-
context["bugs"] = []
388-
389-
for bug in bugs:
390-
context["bugs"].append((bug, f"{settings.BUGZILLA_URL}/{bug}"))
391-
392-
context["title"] = self.pull_request.title
393-
context["body"] = self.pull_request.parsed_body
394-
395-
rendered = render_to_string("pr_description.md", context)
396-
self.client.update_pull_request_body(pull_number, rendered)
397-
return JsonResponse({"context": context, "md": rendered})

src/lando/ui/jinja2/pr_description.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
{% endfor %}
1212
{% endmacro %}
1313

14-
{% block upper %}
1514
Lando: [link]({{ lando_url }})
1615
{% if bugs %}Bugzilla: {% for bug in bugs %}[bug {{ bug.0 }}]({{ bug.1 }}){% endfor %}{% endif %}
1716

17+
{% block upper %}
1818
{% if not warnings and not blockers %}
1919
:white_check_mark: All Lando checks passed
2020
{% endif %}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{% extends "pr_description.md" %}
2+
{% block upper %}
3+
**Landing request {{ landing_status }}**
4+
{% endblock %}

0 commit comments

Comments
 (0)