Files
paperclip-harness/bin/review

71 lines
2.3 KiB
Python
Executable File

#!/usr/bin/env python3
"""Review one task's diff and print the verdict. Merge nothing.
bin/review AUD-164 # review and print
bin/review AUD-164 --post # also write the verdict on the task
This is the same review `bin/merge` runs, on its own, so a person can look
before the merge is attempted. Exit 0 means nothing blocking was found; exit 5
means the review refused; exit 7 means there is no worktree to look at.
"""
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "lib"))
import harness as h # noqa: E402
def main():
args = [a for a in sys.argv[1:] if not a.startswith("--")]
post = "--post" in sys.argv
if len(args) != 1:
h.say("usage: bin/review <task> [--post]")
return 2
issue = h.find_issue(args[0])
ref = issue["identifier"]
worktree, branch, base = h.worktree_of(issue)
h.say("%s %s" % (ref, issue["title"]))
h.say(" worktree %s" % worktree)
h.say(" range %s...HEAD (%s)" % (base, branch))
report = h.ocr_review(worktree, base, "HEAD")
status = report.get("status")
reviewed = (report.get("summary") or {}).get("files_reviewed", 0)
comments = report.get("comments") or []
if status == "skipped" and reviewed == 0:
h.say(" nothing reviewable in the change (0 files)")
if post:
h.verdict(issue, "## Review: nothing to review\n\nocr selected 0 files "
"from the change, so nothing was checked.")
return 0
if status != "complete":
h.say(" review could not complete: %s" % (report.get("message") or status))
if post:
h.verdict(issue, "## Review could not run\n\nocr returned `%s` — %s"
% (status, report.get("message") or "no reason given"))
return 5
blocking = h.blocking_findings(report)
for c in comments:
marker = "BLOCKS" if c in blocking else "note "
h.say(" %s %s" % (marker, h.describe(c)))
verdict = ("%d comment(s); %d blocking" % (len(comments), len(blocking)))
h.say(" %s" % verdict)
if post:
body = "## Review\n\n%s" % (verdict)
if blocking:
body += "\n\nBlocking:\n" + "\n".join(h.describe(c) for c in blocking)
h.verdict(issue, body)
return 5 if blocking else 0
if __name__ == "__main__":
h.main_guard(main)