From patchwork Sun Feb 22 15:42:46 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 1927 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=1771775032; bh=z77RT0Y1kx2ujYx3EfnWn8usrQEhiGSRlwdVGv1YnGc=; 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=vq03uGhCNG7YVApx8Q3qsmX6to1OO3qtMEWc5U2M9veIf8ms6xby2Fc/MzORxwoVd rhkfGBDADuijqcodPvfjUSKu1xBoK433IESoW2yPLFWuIBMrjHg/3ckafCdsUwP5r4 pfaIPZ9TL6CBGmhRuHLG3wTS572ZaoTyk13B+8I92eMoBcZon2xjx+ML07wVcxHCDU +jmNHzghsGIAB42XzQnA6bvu35cX35qNhLkmwG5HkcKnjpsnEPAi+mz1CwA16Suj3n yYiimKde/koSSb1eiYAebix+zx2dTRXRYEmlwjBvqSxL1XUiUPgdEWI/H4/JSEk3CF ZlcAiOUPMgpyA== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 9238669D42 for ; Sun, 22 Feb 2026 08:43:52 -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 Fjopv4FugGXR for ; Sun, 22 Feb 2026 08:43:52 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1771775032; bh=z77RT0Y1kx2ujYx3EfnWn8usrQEhiGSRlwdVGv1YnGc=; 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=vq03uGhCNG7YVApx8Q3qsmX6to1OO3qtMEWc5U2M9veIf8ms6xby2Fc/MzORxwoVd rhkfGBDADuijqcodPvfjUSKu1xBoK433IESoW2yPLFWuIBMrjHg/3ckafCdsUwP5r4 pfaIPZ9TL6CBGmhRuHLG3wTS572ZaoTyk13B+8I92eMoBcZon2xjx+ML07wVcxHCDU +jmNHzghsGIAB42XzQnA6bvu35cX35qNhLkmwG5HkcKnjpsnEPAi+mz1CwA16Suj3n yYiimKde/koSSb1eiYAebix+zx2dTRXRYEmlwjBvqSxL1XUiUPgdEWI/H4/JSEk3CF ZlcAiOUPMgpyA== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 5E62B69D36 for ; Sun, 22 Feb 2026 08:43:52 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1771775030; bh=yPK4QofDWby54AfsLSwsolkb3Hg4+HPo8bBUqL5N/c4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DN5jjMxi1p5xlqryKyk4w/kzZkkkmydWOVddfYpswRf6selEcclkQ65IakQP5zrbz /bSPPJGQnVGtAfg/V83WYytaGKFiVjipLfQmRseOTD5HmXZ00La9pPFUEZ9XJkB/nf +MJuSMnPdC8aJPFgzaGVQRJ6X4n8OLxNd+IC1KTK/VteRLflBF7wE8JGHnIzkaIT8Q 5F/ICt/AHqO2KixbvmXzI1gT4mr5JYswgxZhATftGMB9HVWBdfKAiAZ+7L5kcnk79R i82HHNluMV5VI2LDZlxrqzuFX2kfLj4qF9JQ+RmL8YyIo15dCg/4SV8QW0/8j0XB2G fwWIpJiROBwHQ== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 800A369C5E; Sun, 22 Feb 2026 08:43:50 -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 cj9W2wWn6ufG; Sun, 22 Feb 2026 08:43:50 -0700 (MST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1771775026; bh=POiqqLTpVIXHwN2JJnLe/uW68YEnuZM/duTOuydtIt8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=tvvN3HZUKc8aPeEMhekVU2B1oIm/oYOJLhvkBYZWx7R0127yLLJQS8Yf5a4Tv3KYQ 0hLwyfVqM3SVGffNQQ3QDw69nNVj9ndKa3XaLTnwxnGAFDp0M3xBHmTiBmYriy1C1l 6fRbHf/3DtjHIAQO1DEcUs2ZLyEWes8K1enTPcXCjv+bT92pGktLZu1pFj4eQV1PWS 4CawJFyFo1VYYvCMi6nVrJPbz9e2O7jiSpFrh4W20lxXctOeckM4lJiVVXxytgM9eR cScZvA775COx1jKuNm7KVlt9gz37CJQE5MfUwF/SzCOS8myZSg/sx8T/6GY146vFh3 ViJIZzX7Eychw== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id EFE9B69C5C; Sun, 22 Feb 2026 08:43:45 -0700 (MST) From: Simon Glass To: U-Boot Concept Date: Sun, 22 Feb 2026 08:42:46 -0700 Message-ID: <20260222154303.2851319-7-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260222154303.2851319-1-sjg@u-boot.org> References: <20260222154303.2851319-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: ROMFOG3JOOPU3PBUDMFBYUUEC2OSOAWJ X-Message-ID-Hash: ROMFOG3JOOPU3PBUDMFBYUUEC2OSOAWJ 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 , "Claude Opus 4 . 6" X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 06/16] pickman: Add tests for prepare_apply() 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 test coverage for the remaining paths in prepare_apply(): - Existing branch deletion when the target branch already exists - The merge_found=True message and advance_to passthrough - The no-merge-found message for trailing commits Also initialise tout in setUp() so the output-checking tests can capture tout.info() messages. Co-developed-by: Claude Opus 4.6 Signed-off-by: Simon Glass --- tools/pickman/ftest.py | 99 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) diff --git a/tools/pickman/ftest.py b/tools/pickman/ftest.py index f07e4ecb0db..a2c19a1159e 100644 --- a/tools/pickman/ftest.py +++ b/tools/pickman/ftest.py @@ -2677,6 +2677,105 @@ class TestPrepareApply(unittest.TestCase): self.assertEqual(info.branch_name, 'my-branch') dbs.close() + def test_prepare_apply_deletes_existing_branch(self): + """Test prepare_apply deletes a branch that already exists.""" + git_cmds = [] + + with terminal.capture(): + dbs = database.Database(self.db_path) + dbs.start() + dbs.source_set('us/next', 'abc123') + dbs.commit() + + log_output = 'aaa111|aaa111a|Author 1|First commit|abc123\n' + + def mock_git(pipe_list): + cmd = pipe_list[0] if pipe_list else [] + git_cmds.append(cmd) + if 'log' in cmd: + return command.CommandResult(stdout=log_output) + if 'rev-parse' in cmd: + return command.CommandResult(stdout='master') + if 'branch' in cmd and '--list' in cmd: + return command.CommandResult(stdout='cherry-aaa111a\n') + return command.CommandResult(stdout='') + + command.TEST_RESULT = mock_git + + info, ret = control.prepare_apply(dbs, 'us/next', None) + + self.assertIsNotNone(info) + self.assertEqual(ret, 0) + self.assertTrue( + any('branch' in c and '-D' in c for c in git_cmds)) + dbs.close() + + def test_prepare_apply_merge_found(self): + """Test prepare_apply sets merge_found and advance_to.""" + with terminal.capture(): + dbs = database.Database(self.db_path) + dbs.start() + dbs.source_set('us/next', 'abc123') + dbs.commit() + + merge_hash = 'ccc333ccc333ccc333' + + merge_info = control.NextCommitsInfo( + commits=[ + control.CommitInfo('aaa111', 'aaa111a', 'First commit', + 'Author 1'), + control.CommitInfo('bbb222', 'bbb222b', 'Second commit', + 'Author 2'), + ], + merge_found=True, + advance_to=merge_hash, + ) + + def mock_git(pipe_list): + cmd = pipe_list[0] if pipe_list else [] + if 'rev-parse' in cmd: + return command.CommandResult(stdout='master') + return command.CommandResult(stdout='') + + with mock.patch.object(control, 'get_next_commits', + return_value=(merge_info, None)): + command.TEST_RESULT = mock_git + info, ret = control.prepare_apply(dbs, 'us/next', None) + + self.assertIsNotNone(info) + self.assertEqual(ret, 0) + self.assertTrue(info.merge_found) + self.assertEqual(info.advance_to, merge_hash) + self.assertEqual(len(info.commits), 2) + dbs.close() + + def test_prepare_apply_no_merge(self): + """Test prepare_apply reports no merge found.""" + with terminal.capture(): + dbs = database.Database(self.db_path) + dbs.start() + dbs.source_set('us/next', 'abc123') + dbs.commit() + + log_output = 'aaa111|aaa111a|Author 1|First commit|abc123\n' + + def mock_git(pipe_list): + cmd = pipe_list[0] if pipe_list else [] + if 'log' in cmd: + return command.CommandResult(stdout=log_output) + if 'rev-parse' in cmd: + return command.CommandResult(stdout='master') + return command.CommandResult(stdout='') + + command.TEST_RESULT = mock_git + + info, ret = control.prepare_apply(dbs, 'us/next', None) + + self.assertIsNotNone(info) + self.assertEqual(ret, 0) + self.assertFalse(info.merge_found) + dbs.close() + class TestExecuteApply(unittest.TestCase): """Tests for execute_apply function."""