From patchwork Sat Apr 4 21:29:06 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 2144 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1775338396; bh=4vCCrgYcDobRAtvTzvOIfYB1vFkYucyS2zIUDhBK7fA=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=IM/W2vTNHpJWXaM3byUfNfLeerIDgutzQBkW8VrRLi1xEfMjh5k98aq00QNHgBol/ 1bBJJ8QUU9yJNlivycdWdjTqff30eAraIdEUzXWffIGHWom+XmlVKJaMVlhnId/LBC I256N//dyWhKYlFdUAN8gBo+vlDS7dwAZ0LNDH8jdDGhXSrPtdrHOrTScB2tBG6JWI YCerYYKPdoleUsYyfxDOati8fx7EtbhcVi7W/eElRGnUR12NNc/ROcbphO7PvwZSkx juyazqCRqt1QtGFw52sD9Gztz4SglxKkmKj+7R/JjKa88Osz0uecIbtBZmYGXw1UnT CGqdhJo9Vu7yA== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 82F5768F53 for ; Sat, 4 Apr 2026 15:33:16 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id EVN-2yBJMZda for ; Sat, 4 Apr 2026 15:33:16 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1775338396; bh=4vCCrgYcDobRAtvTzvOIfYB1vFkYucyS2zIUDhBK7fA=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=IM/W2vTNHpJWXaM3byUfNfLeerIDgutzQBkW8VrRLi1xEfMjh5k98aq00QNHgBol/ 1bBJJ8QUU9yJNlivycdWdjTqff30eAraIdEUzXWffIGHWom+XmlVKJaMVlhnId/LBC I256N//dyWhKYlFdUAN8gBo+vlDS7dwAZ0LNDH8jdDGhXSrPtdrHOrTScB2tBG6JWI YCerYYKPdoleUsYyfxDOati8fx7EtbhcVi7W/eElRGnUR12NNc/ROcbphO7PvwZSkx juyazqCRqt1QtGFw52sD9Gztz4SglxKkmKj+7R/JjKa88Osz0uecIbtBZmYGXw1UnT CGqdhJo9Vu7yA== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 72E386833B for ; Sat, 4 Apr 2026 15:33:16 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1775338394; bh=mE0MNDLGIs+BTvO+0qVKXUWpkzkIaotKd2fACMYJUtQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WqUxtKjMQdBOP7qEHqhPCLPHxnKjFBtTudCfaIBnZEM0zbDsRgZ4yOWYZqOqOm2+k 0RkebU01KH1fQ1QIVTrT8+1xi76ApXkQdiQt2ndpzoFot32Bc4u5nIaNE41k3nJsH3 +JRozP98lpoo+5EPEwnlp5vMe6NknmSmsHQMVOb8TFNmYddAtJ4ZEx1MH02W9wuArN EmlEbWDw3eKv585B9T3avZB+uevpGT2a8gOfCCzd1M5bWsA9XmrblAR3gjjy+B231m YSmAIaB1h/9w2WMLlFLRVrgnYeX1DRG6TpqDzZhibAEf2+X6BUvHh+UttAmwAwDFYi m7QoHC6zVTDsA== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id CC98964DB2; Sat, 4 Apr 2026 15:33:14 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id hcHubisqYoKu; Sat, 4 Apr 2026 15:33:14 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1775338390; bh=3oLXQywGn1auiJhV4WkVeA6KyraOgRvgqJJnZqb1PeY=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=r238QPvQnyRI+q2Yz8E+9b3jiHZcIJHu5qAT15dbb1evqBIAtEryMRPkbmuHmpGYT hHZ0rg1dCDEYuGgFW+QiMZCYrHb029GahhB8ZkAP/R4tDpij5Ibr0x8ORfbcOe8lf1 rV3Zi4phBB+HGLNK/fZ5KsjHtmuhzOL0iy44+XDVE8JN0xd8yERWggCxIn4p7jJBCP p3V14yFXcp2LMIU3EEc5raMMO6u9dMz7f5S50jwSYzjeXwZr3B0BUmMhqWBtidTNzs FblKnnkhrW6IExmpeMylXSedWPnZiRL8Fju2eHU14RP2z+QbQJUJYWhE6bSYkDEnVG T4NvPrWEDs90g== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id 687CE5E7B4; Sat, 4 Apr 2026 15:33:10 -0600 (MDT) From: Simon Glass To: U-Boot Concept Date: Sat, 4 Apr 2026 15:29:06 -0600 Message-ID: <20260404213020.372253-31-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260404213020.372253-1-sjg@u-boot.org> References: <20260404213020.372253-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: CGENAFFWTWEYCLIQHKDG6PKKYEGVQVMP X-Message-ID-Hash: CGENAFFWTWEYCLIQHKDG6PKKYEGVQVMP X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Simon Glass X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 30/37] patman: Add save-notes/show-notes and review integration List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Add series subcommands for storing and displaying review-handling notes: - 'patman s save-notes' reads review-notes.txt and stores it against the current series version in the database - 'patman s show-notes' displays notes from all previous versions Also wire up the review command to handle --learn-voice and --sync modes, and use _setup_patchwork() for consistent patchwork resolution. Signed-off-by: Simon Glass --- tools/patman/control.py | 21 ++++++++++++++------- tools/patman/cseries.py | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/tools/patman/control.py b/tools/patman/control.py index 9ba9b6e0b8e..e664c93dafd 100644 --- a/tools/patman/control.py +++ b/tools/patman/control.py @@ -105,6 +105,7 @@ def patchwork_status(branch, count, start, end, dest_branch, force, single_thread) + def _setup_patchwork(cser, pwork, ups, pw_url): """Set up a Patchwork instance from upstream and project settings @@ -230,6 +231,10 @@ def do_series(args, test_db=None, pwork=None, cser=None): cser.remove(args.series, dry_run=args.dry_run) elif args.subcmd == 'rm-version': cser.version_remove(args.series, args.version, dry_run=args.dry_run) + elif args.subcmd == 'save-notes': + cser.save_notes(args.series, args.notes_file) + elif args.subcmd == 'show-notes': + cser.show_notes(args.series) elif args.subcmd == 'rename': cser.rename(args.series, args.new_name, dry_run=args.dry_run) elif args.subcmd == 'set-upstream': @@ -365,7 +370,7 @@ def patchwork(args, test_db=None, pwork=None): cser.db.patchwork_delete(args.remote) cser.commit() ups_str = f" for upstream '{args.remote}'" if args.remote else '' - tout.info(f'Deleted patchwork project{ups_str}') + tout.notice(f'Deleted patchwork project{ups_str}') elif args.subcmd == 'ls': cser.project_list() else: @@ -419,11 +424,13 @@ def do_review(args, test_db=None, pwork=None, cser=None): try: cser.open_database() - ups = args.upstream - if not ups: - ups = cser.db.upstream_get_default() - pwork = _setup_patchwork( - cser, pwork, ups, args.patchwork_url) + # Resolve patchwork URL + if not pwork and not args.learn_voice and not args.sync: + ups = args.upstream + if not ups: + ups = cser.db.upstream_get_default() + pwork = _setup_patchwork( + cser, pwork, ups, args.patchwork_url) return review_mod.do_review(args, pwork, cser) finally: @@ -480,7 +487,7 @@ def do_patman(args, test_db=None, pwork=None, cser=None): elif args.cmd == 'patchwork': patchwork(args, test_db, pwork) elif args.cmd == 'review': - do_review(args, test_db, pwork, cser) + ret_code = do_review(args, test_db, pwork, cser) or 0 elif args.cmd == 'workflow': do_workflow(args, test_db) except Exception as exc: # pylint: disable=W0718 diff --git a/tools/patman/cseries.py b/tools/patman/cseries.py index e272a5839fc..3af9ef19eab 100644 --- a/tools/patman/cseries.py +++ b/tools/patman/cseries.py @@ -7,11 +7,13 @@ import asyncio from collections import OrderedDict, defaultdict +import os import pygit2 from u_boot_pylib import cros_subprocess from u_boot_pylib import gitutil from u_boot_pylib import terminal +from u_boot_pylib import tools from u_boot_pylib import tout from patman import patchstream @@ -861,6 +863,40 @@ class Cseries(cser_helper.CseriesHelper): if dry_run: tout.info('Dry run completed') + def save_notes(self, series, notes_file='review-notes.txt'): + """Save review-handling notes for the current series version + + Args: + series (str): Series name, or None for current branch + notes_file (str): Path to the notes file + """ + if not os.path.exists(notes_file): + raise FileNotFoundError(f"Notes file not found: {notes_file}") + + notes = tools.read_file(notes_file, binary=False).strip() + ser, version = self._parse_series_and_version(series, None) + svid = self.get_series_svid(ser.idnum, version) + self.db.ser_ver_set_notes(svid, notes) + self.commit() + tout.notice(f"Saved notes for '{ser.name}' v{version}") + + def show_notes(self, series): + """Show review-handling notes from all versions of a series + + Args: + series (str): Series name, or None for current branch + """ + ser, _ = self._parse_series_and_version(series, None) + all_notes = self.db.ser_ver_get_all_notes(ser.idnum) + if not all_notes: + tout.notice(f"No review notes for '{ser.name}'") + return + for version, notes in all_notes: + terminal.tprint(f'\n--- v{version} ---', + colour=terminal.Color.YELLOW) + print(notes) + print() + def show_info(self, series): """Show detailed information about a series and all its versions