From patchwork Sat Apr 4 21:28:53 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 2132 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=1775338326; bh=FYfZNwBGhC8uApGs8HSOY0rZ0kcIKd+oC0OZSITL1gQ=; 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=Mvt/TX43wO1n7+BnNpVe7jRNlz+/mayss5zvGMIAKrlVnJXhmSLz/y34pNwcXpIiH IETzd2Qg4p8juoEG7uBCcDz4OeXh1sdUtfCMr/A4RZS21mYofxqmoctZM/fxPMDNIm ZVyuvDunUNjQ65VFD8xodieYGTWgT9M+PS40gT0Sn9SvAyJlW9AK0LpO/VrGli9hX5 W9blhy9+3BFFMSKYSU/g71AckgF/KJHUZ9Hf/dDNRG5Z0E0oCsMlcdUUlZocxXB2ul n+/DBgOF8cTYe84178vZZNmJwpCVHc5FeMw2hN2BuDvU2RwqQDmh9t4nTt7PSwmiel qLYnplESbx2xw== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 2FACD6A386 for ; Sat, 4 Apr 2026 15:32:06 -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 L-IpRfJF0oGd for ; Sat, 4 Apr 2026 15:32:06 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1775338326; bh=FYfZNwBGhC8uApGs8HSOY0rZ0kcIKd+oC0OZSITL1gQ=; 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=Mvt/TX43wO1n7+BnNpVe7jRNlz+/mayss5zvGMIAKrlVnJXhmSLz/y34pNwcXpIiH IETzd2Qg4p8juoEG7uBCcDz4OeXh1sdUtfCMr/A4RZS21mYofxqmoctZM/fxPMDNIm ZVyuvDunUNjQ65VFD8xodieYGTWgT9M+PS40gT0Sn9SvAyJlW9AK0LpO/VrGli9hX5 W9blhy9+3BFFMSKYSU/g71AckgF/KJHUZ9Hf/dDNRG5Z0E0oCsMlcdUUlZocxXB2ul n+/DBgOF8cTYe84178vZZNmJwpCVHc5FeMw2hN2BuDvU2RwqQDmh9t4nTt7PSwmiel qLYnplESbx2xw== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 1A0516A375 for ; Sat, 4 Apr 2026 15:32:06 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1775338323; bh=Z+4BreHgcnAt94pL7cxKFQVHnhokDDJLz38Sn29f8kc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tEIyzXKSvf83jEwc+0xLiCNI87fUvlw45WlQUQNxWSx2nufB3afD9tJTj+v08imiH BmBKc1IwZsy5W8TlDS7uSiPSexMf9+IwVFnd6vbgWQLdxy1ZEP7hs4kkdsxyVYkFfT Dv2aGS2qpkXlkWCdRUlGq4IIwmedr1BjEwpy+wJ5VCySbyNTde9uN+smH4GSL/Iy5Z UVtuwBodAhcxjrXhzW+b5Ci4VZEFVkxK2e6LZYV9CHD1PzOtY/V3gAFW3H1Bc8H0hR lvgDoK4PZMDmVUiYUOgDJWQH/onhGC7LMPbHus/RIrT7iwvxAy35yA+vVx42kfVBey Nnrtv6dZ7nOxA== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 978BE6A375; Sat, 4 Apr 2026 15:32:03 -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 uQ4V6_B1WuAR; Sat, 4 Apr 2026 15:32:03 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1775338319; bh=vxEExp8fMHPWUI371ffdOqS6p86ix+XrcyUQGHoL2ig=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jFTkcyDqweG6UHuF6YTZUAe6Ad0bYDkCmXvEJeFuMuByWk7TZnGgTc5Aoopwz3ErF NhUpnzMaa0Am5llgIgvYCPKRlWJJkcQb9TR7NFfmmGTTAB3chzfa2e4XAGcbzixjqZ 4+2hfz305D0zHs3crwyOLitHF9kuRp8OjJJgT5KwB0RaV49Vt85QnOpHvthPMfaDNR th/JH/SXfWmAOQTh0XVwQBTDFqH0jCEqAKqS+MT0sI54se+kfJlrl7tsj+rO6k32iz cZSwf30mGejxkfMq36OVkYw96g7xtA4Z7kpw8Uwt3Ihj1vYJ1+toFeiIGrcllaxaaE engSdiTN1teKg== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id 363ED6869D; Sat, 4 Apr 2026 15:31:59 -0600 (MDT) From: Simon Glass To: U-Boot Concept Date: Sat, 4 Apr 2026 15:28:53 -0600 Message-ID: <20260404213020.372253-18-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: U3RGFQPX3FVJC7FVCS34F6KEPXHOPMMK X-Message-ID-Hash: U3RGFQPX3FVJC7FVCS34F6KEPXHOPMMK 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 17/37] patman: Add 'patchwork rm' subcommand to delete a project 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 There is no way to remove a patchwork project configuration once it is added. Add a 'patchwork rm' subcommand that deletes the project entry for a given upstream, or the default entry if no upstream is specified. Signed-off-by: Simon Glass --- tools/patman/cmdline.py | 4 ++++ tools/patman/control.py | 5 +++++ tools/patman/database.py | 20 ++++++++++++++++++++ tools/patman/test_cseries.py | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+) diff --git a/tools/patman/cmdline.py b/tools/patman/cmdline.py index 26626f5b441..3843811729e 100644 --- a/tools/patman/cmdline.py +++ b/tools/patman/cmdline.py @@ -173,6 +173,10 @@ def add_patchwork_subparser(subparsers): uset.add_argument( 'remote', nargs='?', help='Remote to associate with this project') + pdel = patchwork_subparsers.add_parser('rm') + pdel.add_argument( + 'remote', nargs='?', + help='Remote to delete the project for, or omit for the default') patchwork_subparsers.add_parser('ls', aliases=['list']) return patchwork diff --git a/tools/patman/control.py b/tools/patman/control.py index 61379cc108e..f1e52d7944a 100644 --- a/tools/patman/control.py +++ b/tools/patman/control.py @@ -367,6 +367,11 @@ def patchwork(args, test_db=None, pwork=None): if ups: msg += f" remote '{ups}'" print(msg) + elif args.subcmd == 'rm': + 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}') elif args.subcmd == 'ls': cser.project_list() else: diff --git a/tools/patman/database.py b/tools/patman/database.py index 437a05b3de0..725d13253d5 100644 --- a/tools/patman/database.py +++ b/tools/patman/database.py @@ -1041,6 +1041,26 @@ class Database: # pylint:disable=R0904 'INSERT INTO patchwork (name, proj_id, link_name, upstream) ' 'VALUES (?, ?, ?, ?)', (name, proj_id, link_name, ups)) + def patchwork_delete(self, ups): + """Delete a patchwork project configuration + + Args: + ups (str or None): Upstream name to delete, or None for the + entry with no upstream + + Raises: + ValueError: if no matching entry exists + """ + if ups is not None: + self.execute( + 'DELETE FROM patchwork WHERE upstream = ?', (ups,)) + else: + self.execute( + 'DELETE FROM patchwork WHERE upstream IS NULL') + if not self.rowcount(): + raise ValueError( + f"No patchwork project found for upstream '{ups}'") + def patchwork_get_list(self): """Get all patchwork project configurations diff --git a/tools/patman/test_cseries.py b/tools/patman/test_cseries.py index 0b6e6ec9e32..96c1d62486c 100644 --- a/tools/patman/test_cseries.py +++ b/tools/patman/test_cseries.py @@ -2667,6 +2667,38 @@ Tested-by: Mary Smith # yak self.assertEqual(('Linux', 10, 'linux'), cser.db.patchwork_get('ci')) self.assertEqual(('U-Boot', 6, 'uboot'), cser.db.patchwork_get('us')) + def test_patchwork_rm(self): + """Test deleting a patchwork project configuration""" + cser = self.get_cser() + + 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() + + # Delete by upstream name + cser.db.patchwork_delete('us') + cser.db.commit() + self.assertIsNone(cser.db.patchwork_get('us')) + self.assertEqual(('Linux', 10, 'linux'), cser.db.patchwork_get('ci')) + + # Delete non-existent raises ValueError + with self.assertRaises(ValueError): + cser.db.patchwork_delete('us') + + def test_patchwork_rm_default(self): + """Test deleting the default (no upstream) patchwork project""" + cser = self.get_cser() + + cser.db.patchwork_update('U-Boot', 6, 'uboot') + cser.db.commit() + self.assertIsNotNone(cser.db.patchwork_get()) + + cser.db.patchwork_delete(None) + cser.db.commit() + self.assertIsNone(cser.db.patchwork_get()) + def test_migrate_patchwork_upstream(self): """Test that migrating to v5 renames settings to patchwork""" db = database.Database(f'{self.tmpdir}/.patman3.db')