Skip to content

Commit 359c134

Browse files
committed
air: support feedback about reviews
We need some way of knowing whether reviews were correct or not. Add CLI for marking the reviews as "emailed" (presumably correct-ish) "false-positive" and "false-negative". Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 2d20ebc commit 359c134

2 files changed

Lines changed: 73 additions & 0 deletions

File tree

air-email-review.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,17 @@ def get_review(self, review_id: str, fmt: str = 'inline') -> Dict:
6868
response.raise_for_status()
6969
return response.json()
7070

71+
def set_feedback(self, review_id: str, feedback: str) -> bool:
72+
"""Set feedback for a review"""
73+
data = {'id': review_id, 'feedback': feedback}
74+
if self.token:
75+
data['token'] = self.token
76+
77+
response = self.session.post(f"{self.air_url}/api/review/feedback",
78+
json=data, timeout=30)
79+
response.raise_for_status()
80+
return response.json().get('success', False)
81+
7182
def get_patchwork_series(self, series_id: int) -> Dict:
7283
"""Fetch series info from Patchwork API"""
7384
response = self.session.get(
@@ -440,6 +451,8 @@ def main():
440451
help='Only send replies for specific patch numbers (1-based, can be repeated)')
441452
parser.add_argument('--pw-bot', dest='pw_bot', metavar='STRING',
442453
help='Add "pw-bot: STRING" footer to the first review email')
454+
parser.add_argument('--no-feedback', dest='no_feedback', action='store_true',
455+
help='Do not set feedback on the review (default: sets "emailed")')
443456

444457
args = parser.parse_args()
445458

@@ -523,6 +536,17 @@ def main():
523536

524537
reviews = review.get('review', [])
525538

539+
# Set feedback to "emailed" unless --no-feedback is set
540+
if args.no_feedback:
541+
print("Skipping feedback (--no-feedback)")
542+
else:
543+
print("Setting feedback to 'emailed'...")
544+
try:
545+
client.set_feedback(args.review_id, 'emailed')
546+
print(colorize("Feedback set: emailed", Colors.GREEN))
547+
except requests.exceptions.RequestException as e:
548+
print(f"Warning: Failed to set feedback: {e}", file=sys.stderr)
549+
526550
# Extract recipients from patches
527551
to_addrs, cc_addrs = extract_recipients(patch_info_list)
528552

air-submit.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,39 @@ def delete_review(url: str, token: str, review_id: str) -> bool:
202202
sys.exit(1)
203203

204204

205+
def set_feedback(url: str, token: Optional[str], review_id: str, feedback: str) -> bool:
206+
"""Set feedback for a review
207+
208+
Args:
209+
url: AIR service URL
210+
token: API token (optional for public reviews)
211+
review_id: Review ID
212+
feedback: Feedback value (emailed, false-positive, false-negative)
213+
214+
Returns:
215+
True if successful
216+
"""
217+
api_url = f"{url}/api/review/feedback"
218+
data = {
219+
'id': review_id,
220+
'feedback': feedback,
221+
}
222+
223+
if token:
224+
data['token'] = token
225+
226+
try:
227+
response = requests.post(api_url, json=data, timeout=30)
228+
response.raise_for_status()
229+
return response.json().get('success', False)
230+
except requests.exceptions.RequestException as e:
231+
print(f"Error setting feedback: {e}", file=sys.stderr)
232+
sys.exit(1)
233+
except json.JSONDecodeError as e:
234+
print(f"Error parsing response: {e}", file=sys.stderr)
235+
sys.exit(1)
236+
237+
205238
def format_status_line(status: dict) -> str:
206239
"""Format one-line status summary with color
207240
@@ -331,6 +364,8 @@ def main():
331364
help='Existing review ID to check (skip submission)')
332365
parser.add_argument('--delete', action='store_true',
333366
help='Delete the specified review (requires --review-id and superuser token)')
367+
parser.add_argument('--feedback', choices=['emailed', 'false-positive', 'false-negative'],
368+
help='Set feedback for a review (requires --review-id)')
334369
parser.add_argument('patches', nargs='*', metavar='PATCH_FILE',
335370
help='Patch files to submit')
336371

@@ -380,6 +415,20 @@ def main():
380415
sys.exit(1)
381416
return
382417

418+
# Handle --feedback operation
419+
if args.feedback:
420+
if not args.review_id:
421+
parser.error('--feedback requires --review-id')
422+
423+
print(f"Setting feedback to '{args.feedback}' for review {args.review_id}...")
424+
success = set_feedback(args.url, args.token, args.review_id, args.feedback)
425+
if success:
426+
print(colorize(f"Feedback set: {args.feedback}", Colors.GREEN))
427+
else:
428+
print(colorize("Failed to set feedback", Colors.RED), file=sys.stderr)
429+
sys.exit(1)
430+
return
431+
383432
# Validate arguments
384433
if args.review_id:
385434
review_id = args.review_id

0 commit comments

Comments
 (0)