Skip to content

Commit 9197f07

Browse files
committed
Simplify PR triage script output
1 parent 24c9df1 commit 9197f07

4 files changed

Lines changed: 32 additions & 19 deletions

File tree

.github/scripts/pr-triage/common.py

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class WorkflowError(RuntimeError):
3232
@dataclass
3333
class Summary:
3434
pr: int
35+
pr_url: str | None = None
36+
review_url: str | None = None
3537
original_branch: str = ""
3638
pr_branch: str = ""
3739
restored_branch: str | None = None
@@ -76,6 +78,12 @@ def print_text(self) -> None:
7678
print("Notes:")
7779
for note in self.notes:
7880
print(f"- {note}")
81+
if self.pr_url or self.review_url:
82+
print("Links:")
83+
if self.pr_url:
84+
print(f"- PR: {self.pr_url}")
85+
if self.review_url:
86+
print(f"- Review: {self.review_url}")
7987

8088

8189
def format_cmd(cmd: list[str]) -> str:
@@ -190,10 +198,16 @@ def detect_repo(summary: Summary | None = None) -> str:
190198

191199

192200
def pr_view(pr: int, summary: Summary) -> dict[str, Any]:
193-
fields = "headRepositoryOwner,headRepository,headRefName,isCrossRepository,maintainerCanModify"
201+
fields = "headRepositoryOwner,headRepository,headRefName,isCrossRepository,maintainerCanModify,url"
194202
return gh_json(["pr", "view", str(pr), "--json", fields], summary)
195203

196204

205+
def remember_pr_url(metadata: dict[str, Any], summary: Summary) -> None:
206+
url = metadata.get("url")
207+
if isinstance(url, str) and url:
208+
summary.pr_url = url
209+
210+
197211
def authed_login(summary: Summary) -> str:
198212
return gh(["api", "user", "--jq", ".login"], summary).stdout.strip()
199213

@@ -214,13 +228,16 @@ def checkout_pr(pr: int, summary: Summary) -> dict[str, Any]:
214228
progress(f"Checking out PR #{pr}")
215229
gh(["pr", "checkout", str(pr)], summary)
216230
summary.pr_branch = current_branch(summary)
217-
return ensure_pr_push_allowed(pr, summary)
231+
metadata = ensure_pr_push_allowed(pr, summary)
232+
remember_pr_url(metadata, summary)
233+
return metadata
218234

219235

220236
def checkout_pr_no_push_check(pr: int, summary: Summary) -> None:
221237
progress(f"Checking out PR #{pr}")
222238
gh(["pr", "checkout", str(pr)], summary)
223239
summary.pr_branch = current_branch(summary)
240+
remember_pr_url(pr_view(pr, summary), summary)
224241

225242

226243
def run_pr_workflow(pr: int, body: Callable[[Summary], int], *, push_required: bool = True) -> int:

.github/scripts/pr-triage/fix_ci.py

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@
3535
def parse_args() -> argparse.Namespace:
3636
parser = argparse.ArgumentParser(description=__doc__)
3737
parser.add_argument("pr", type=int, help="pull request number")
38-
parser.add_argument("--no-push", action="store_true", help="commit but do not push")
38+
parser.add_argument("--no-push", action="store_true", help="commit locally but do not push to the PR")
3939
parser.add_argument("--keep-temp", action="store_true", help="reuse and retain the temp bundle directory")
40-
parser.add_argument("--skip-copilot", action="store_true", help="download logs and stop before invoking Copilot")
4140
return parser.parse_args()
4241

4342

@@ -181,10 +180,6 @@ def body(summary: Summary) -> int:
181180
bundle_dir = make_temp_dir("otel-ci-fix", args.pr, args.keep_temp)
182181
bundle_checks = write_ci_bundle(args.pr, checks, bundle_dir, summary)
183182

184-
if args.skip_copilot:
185-
summary.outcome = "downloaded CI logs; skipped Copilot handoff"
186-
return 0
187-
188183
commit_message_path = bundle_dir / "commit-message.txt"
189184
prompt_improvement_path = bundle_dir / "prompt-improvement.md"
190185
response = invoke_copilot(copilot_prompt(args.pr, bundle_checks, commit_message_path, prompt_improvement_path), summary)
@@ -208,7 +203,7 @@ def body(summary: Summary) -> int:
208203
summary.outcome = "CI fix committed"
209204
return 0
210205

211-
return run_pr_workflow(args.pr, body)
206+
return run_pr_workflow(args.pr, body, push_required=not args.no_push)
212207

213208

214209
if __name__ == "__main__":

.github/scripts/pr-triage/resolve_conflicts.py

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,8 @@ def parse_args() -> argparse.Namespace:
2525
parser = argparse.ArgumentParser(description=__doc__)
2626
parser.add_argument("pr", type=int, help="pull request number")
2727
parser.add_argument("--upstream", default="upstream", help="upstream remote name")
28-
parser.add_argument("--no-push", action="store_true", help="commit but do not push")
28+
parser.add_argument("--no-push", action="store_true", help="commit locally but do not push to the PR")
2929
parser.add_argument("--keep-temp", action="store_true", help="reuse and retain the temp bundle directory")
30-
parser.add_argument("--skip-copilot", action="store_true", help="stop after collecting conflict context")
3130
return parser.parse_args()
3231

3332

@@ -100,9 +99,6 @@ def workflow(summary: Summary) -> int:
10099
summary.changed_files = conflicts
101100
bundle_dir = make_temp_dir("otel-conflicts", args.pr, args.keep_temp)
102101
plan_path = write_conflict_bundle(bundle_dir, summary)
103-
if args.skip_copilot:
104-
summary.outcome = "collected conflict context; skipped Copilot handoff"
105-
return 1
106102

107103
response = invoke_copilot(copilot_prompt(plan_path), summary)
108104
(bundle_dir / "copilot-response.txt").write_text(response + "\n", encoding="utf-8")
@@ -121,7 +117,7 @@ def workflow(summary: Summary) -> int:
121117
summary.outcome = "resolved conflicts and merged upstream/main"
122118
return 0
123119

124-
return run_pr_workflow(args.pr, workflow)
120+
return run_pr_workflow(args.pr, workflow, push_required=not args.no_push)
125121

126122

127123
if __name__ == "__main__":

.github/scripts/pr-triage/review.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -251,27 +251,32 @@ def validate_comments(findings: dict[str, Any], diff_scope: dict[str, dict[str,
251251

252252

253253
def post_review(repo: str, pr: int, payload_path: Path, summary: Summary) -> str:
254-
result = gh(
254+
review = gh_json(
255255
[
256256
"api",
257257
f"repos/{repo}/pulls/{pr}/reviews",
258258
"--method",
259259
"POST",
260260
"--input",
261261
str(payload_path),
262-
"--jq",
263-
".id",
264262
],
265263
summary,
266264
)
267-
return result.stdout.strip()
265+
review_id = str(review.get("id") or "")
266+
review_url = review.get("html_url")
267+
if isinstance(review_url, str) and review_url:
268+
summary.review_url = review_url
269+
elif review_id and summary.pr_url:
270+
summary.review_url = f"{summary.pr_url}#pullrequestreview-{review_id}"
271+
return review_id
268272

269273

270274
def main() -> int:
271275
args = parse_args()
272276

273277
def workflow(summary: Summary) -> int:
274278
metadata = pr_metadata(args.pr, summary)
279+
summary.pr_url = metadata.get("url")
275280
progress("Collecting PR diff")
276281
diff_names = gh(["pr", "diff", str(args.pr), "--name-only"], summary).stdout.splitlines()
277282
diff_text = gh(["pr", "diff", str(args.pr), "--color", "never"], summary).stdout

0 commit comments

Comments
 (0)