From patchwork Thu Feb 26 20:00:19 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1950 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=1772136145; bh=4mxzNqk7LgBnZCE0sehPYYiw0NvprVbcJxDJGs0faQQ=; 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=gZGE6qtcQCyidKpAxZRc+vhmDvlzut/7htz5DjRegnwXDkppjN9uUeEJdmwwlxtX1 Jo1lbqL9mYIrrMaTkCjyw8bbxwyQ1Bdjj0NESfzS1MZ3UhNSksQ01hZEt+nigwfpk/ xY1PqChczbJ1n5L37CLQncDzScD+51NcjnCTUTz7AGjVn7Is7//zUjUsQuaQf8XSBS sdPpIJsRlVrEr8Pcwo/D8L2DLVZtfrD60gMZC0L9xaFrGF7SMwllohHZ4H70SnRlwQ yDBHP4+O73Np3W/xEnrUQP/65TvP9hv6o2ZbJiLb7NLGF7zVSt13Ju/KAgZ+T9idKj rbp55YDMx/B6Q== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id CBAE269E39 for ; Thu, 26 Feb 2026 13:02:25 -0700 (MST) 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 WNz_j8WOHf-B for ; Thu, 26 Feb 2026 13:02:25 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1772136145; bh=4mxzNqk7LgBnZCE0sehPYYiw0NvprVbcJxDJGs0faQQ=; 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=gZGE6qtcQCyidKpAxZRc+vhmDvlzut/7htz5DjRegnwXDkppjN9uUeEJdmwwlxtX1 Jo1lbqL9mYIrrMaTkCjyw8bbxwyQ1Bdjj0NESfzS1MZ3UhNSksQ01hZEt+nigwfpk/ xY1PqChczbJ1n5L37CLQncDzScD+51NcjnCTUTz7AGjVn7Is7//zUjUsQuaQf8XSBS sdPpIJsRlVrEr8Pcwo/D8L2DLVZtfrD60gMZC0L9xaFrGF7SMwllohHZ4H70SnRlwQ yDBHP4+O73Np3W/xEnrUQP/65TvP9hv6o2ZbJiLb7NLGF7zVSt13Ju/KAgZ+T9idKj rbp55YDMx/B6Q== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id B9F0C69DAB for ; Thu, 26 Feb 2026 13:02:25 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1772136143; bh=zeHOo4n1H14vlP9XxCm10Py1GxjSdgcL0jTYKIuUZBQ=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=N2Cz4tgGydg00y39ToiBeox54h3ZPyLi3dyPLaUEfXqn1OFfPeOVweMwlj4DedDWf S5KW/dd//acohvSQ01SuVjeNZwP6SSB/uFevORs9EqSj00OFQc6LacH+PUoLJYkmpS NeTXRMZMuBIwMYqAy5IzINe1qRCLLySdx0jONPqnGZtdf4s9v3XHrzn/gyLx9gn+rP rmPMGKebk39EGEt2RVHPWltze1FkPNa86h3I7TKkfW6aRNjrzhlaV65ZpuGnXhB/VO 75XgIov2fNM1PTQ+p3Ou8R2W9ETH1AUkqfLIFt+paQEcoF8tvR00fFZI7islfFnJCu xeU1QOHSdOuXA== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 7A23D69E39; Thu, 26 Feb 2026 13:02:23 -0700 (MST) 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 nh1xHLBHM0l8; Thu, 26 Feb 2026 13:02:23 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1772136137; bh=zpNqiWUsaFwrrLHDv9iJGKeAUixuDYE9Jth1BvECTJE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ThJtbWGzZnH0pw3TxG/DVJACb6/aU6G+ElxzDUjhLlwqA6U0RIcMHklLy2B0il+Yl uVKR731Mtli3JnIBmmSnuD9vDOcDWtJvRy6M39QXyYPATnXmfMvkyDVhxQxtr24vpQ WzSCE1tVDn2HHzdOMnqxytbCgV4rwJ8hyDgjmmoSAbIzceREQDcyp5y2u0JAztnoLJ CgtvD/DINWtpZhAJ/JYQKhJ+naveiNYrCf41cDLIT35dJa8fUtZXYmsugj0QaxLqD9 T8+6z7B9xgvVfPGyQzJmgmSSUtTnFS6iU+5d0yz1a8VnS+kXS4eeAzh5BTgjTpaqr+ YMBEvO7CLeXDQ== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id 7ADFF69E35; Thu, 26 Feb 2026 13:02:17 -0700 (MST) From: Simon Glass To: U-Boot Concept Date: Thu, 26 Feb 2026 13:00:19 -0700 Message-ID: <20260226200106.1727176-14-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260226200106.1727176-1-sjg@u-boot.org> References: <20260226200106.1727176-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: HNEYQ5P576JJBFOMETTB6RJWB545LPY3 X-Message-ID-Hash: HNEYQ5P576JJBFOMETTB6RJWB545LPY3 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 13/32] patman: Add patchwork list command 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 a 'patchwork list' (or 'pw list') command to show all configured patchwork projects and which upstream each is associated with. Signed-off-by: Simon Glass --- tools/patman/cmdline.py | 1 + tools/patman/control.py | 2 ++ tools/patman/cseries.py | 13 +++++++++++++ tools/patman/database.py | 15 +++++++++++++++ tools/patman/test_cseries.py | 26 ++++++++++++++++++++++++++ 5 files changed, 57 insertions(+) diff --git a/tools/patman/cmdline.py b/tools/patman/cmdline.py index 74571fd7220..f08287641dd 100644 --- a/tools/patman/cmdline.py +++ b/tools/patman/cmdline.py @@ -169,6 +169,7 @@ def add_patchwork_subparser(subparsers): uset.add_argument( '-u', '--upstream-name', help='Upstream to associate this project with') + patchwork_subparsers.add_parser('list') return patchwork diff --git a/tools/patman/control.py b/tools/patman/control.py index 191cfc134d3..bd9e0f8b9bd 100644 --- a/tools/patman/control.py +++ b/tools/patman/control.py @@ -289,6 +289,8 @@ def patchwork(args, test_db=None, pwork=None): if ups: msg += f" upstream '{ups}'" print(msg) + elif args.subcmd == 'list': + cser.project_list() else: raise ValueError(f"Unknown patchwork subcommand '{args.subcmd}'") finally: diff --git a/tools/patman/cseries.py b/tools/patman/cseries.py index 56adcc5b4cd..fdf48a4eabd 100644 --- a/tools/patman/cseries.py +++ b/tools/patman/cseries.py @@ -683,6 +683,19 @@ class Cseries(cser_helper.CseriesHelper): """ return self.db.patchwork_get(ups) + def project_list(self): + """List all patchwork project configurations""" + settings = self.db.patchwork_get_list() + if not settings: + print('No patchwork projects configured') + return + print(f"{'Project':20} {'ID':>4} {'Link name':15} Upstream") + border = f"{'-' * 20} {'-' * 4} {'-' * 15} {'-' * 15}" + print(border) + for name, proj_id, link_name, ups in settings: + print(f'{name:20} {proj_id:4} {link_name:15} {ups or ""}') + print(border) + def remove(self, name, dry_run=False): """Remove a series from the database diff --git a/tools/patman/database.py b/tools/patman/database.py index 22f21ce715f..396cf52aa48 100644 --- a/tools/patman/database.py +++ b/tools/patman/database.py @@ -884,6 +884,21 @@ class Database: # pylint:disable=R0904 'INSERT INTO patchwork (name, proj_id, link_name, upstream) ' 'VALUES (?, ?, ?, ?)', (name, proj_id, link_name, ups)) + def patchwork_get_list(self): + """Get all patchwork project configurations + + Returns: + list of tuple: + name (str): Project name, e.g. 'U-Boot' + proj_id (int): Patchworks project ID for this project + link_name (str): Patchwork's link-name for the project + upstream (str or None): Upstream name + """ + res = self.execute( + 'SELECT name, proj_id, link_name, upstream FROM patchwork ' + 'ORDER BY upstream') + return res.fetchall() + def patchwork_get(self, ups=None): """Get the patchwork project details for an upstream diff --git a/tools/patman/test_cseries.py b/tools/patman/test_cseries.py index 0922c3e57f5..f21fda8d2fa 100644 --- a/tools/patman/test_cseries.py +++ b/tools/patman/test_cseries.py @@ -2502,6 +2502,32 @@ Tested-by: Mary Smith # yak f"Project 'U-Boot' patchwork-ID {self.PROJ_ID} link-name 'uboot'", out.getvalue().strip()) + def test_patchwork_list(self): + """Test listing patchwork project configurations""" + cser = self.get_cser() + + # No projects configured + with terminal.capture() as (out, _): + cser.project_list() + self.assertEqual('No patchwork projects configured', + out.getvalue().strip()) + + # Add projects for two upstreams + cser.db.upstream_add('us', 'https://us.example.com') + cser.db.upstream_add('ci', 'https://ci.example.com') + cser.db.patchwork_update('U-Boot', 6, 'uboot', 'us') + cser.db.patchwork_update('Linux', 10, 'linux', 'ci') + cser.db.commit() + + with terminal.capture() as (out, _): + cser.project_list() + lines = out.getvalue().splitlines() + self.assertEqual(5, len(lines)) + self.assertIn('Linux', lines[2]) + self.assertIn('ci', lines[2]) + self.assertIn('U-Boot', lines[3]) + self.assertIn('us', lines[3]) + def test_patchwork_upstream(self): """Test patchwork project with upstream association""" cser = self.get_cser()