From ae3695f691c6325f1a504ee3df7f22d75c7a0c96 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 29 Apr 2025 07:21:59 -0600 Subject: patman: Move capture_sys_output() into terminal and rename This function is sometimes useful outside tests. Also it can affect how terminal output is done, e.g. whether ANSI characters should be emitted or not. Move it out of the test_util package and into terminal. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 720746e21f5..a31c950051b 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -25,7 +25,6 @@ from patman import settings from u_boot_pylib import gitutil from u_boot_pylib import terminal from u_boot_pylib import tools -from u_boot_pylib.test_util import capture_sys_output import pygit2 from patman import status @@ -221,7 +220,7 @@ class TestFunctional(unittest.TestCase): cover_fname, args = self._create_patches_for_test(series) get_maintainer_script = str(pathlib.Path(__file__).parent.parent.parent / 'get_maintainer.pl') + ' --norolestats' - with capture_sys_output() as out: + with terminal.capture() as out: patchstream.fix_patches(series, args) if cover_fname and series.get('cover'): patchstream.insert_cover_letter(cover_fname, series, count) @@ -367,7 +366,7 @@ Changes in v2: series.branch = 'mybranch' cover_fname, args = self._create_patches_for_test(series) self.assertFalse(cover_fname) - with capture_sys_output() as out: + with terminal.capture() as out: patchstream.fix_patches(series, args, insert_base_commit=True) self.assertEqual('Cleaned 1 patch\n', out[0].getvalue()) lines = tools.read_file(args[0], binary=False).splitlines() @@ -530,7 +529,7 @@ complicated as possible''') # Check that it can detect the current branch self.assertEqual(2, gitutil.count_commits_to_branch(None)) col = terminal.Color() - with capture_sys_output() as _: + with terminal.capture() as _: _, cover_fname, patch_files = control.prepare_patches( col, branch=None, count=-1, start=0, end=0, ignore_binary=False, signoff=True) @@ -539,7 +538,7 @@ complicated as possible''') # Check that it can detect a different branch self.assertEqual(3, gitutil.count_commits_to_branch('second')) - with capture_sys_output() as _: + with terminal.capture() as _: series, cover_fname, patch_files = control.prepare_patches( col, branch='second', count=-1, start=0, end=0, ignore_binary=False, signoff=True) @@ -558,7 +557,7 @@ complicated as possible''') self.assertNotIn(b'base-commit:', tools.read_file(fname)) # Check that it can skip patches at the end - with capture_sys_output() as _: + with terminal.capture() as _: _, cover_fname, patch_files = control.prepare_patches( col, branch='second', count=-1, start=0, end=1, ignore_binary=False, signoff=True) @@ -600,7 +599,7 @@ complicated as possible''') os.chmod('dummy-script.sh', 0x555) # Finally, do the test - with capture_sys_output(): + with terminal.capture(): output = tools.run(PATMAN_DIR / 'patman', '--dry-run') # Assert the email address is part of the dry-run # output. @@ -766,7 +765,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c """Test Patchwork patches not matching the series""" series = Series() - with capture_sys_output() as (_, err): + with terminal.capture() as (_, err): status.collect_patches(series, 1234, None, self._fake_patchwork) self.assertIn('Warning: Patchwork reports 1 patches, series has 0', err.getvalue()) -- cgit v1.2.3 From 5053549532dbdb5fff398e5dfd1d63740948125c Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 29 Apr 2025 07:22:07 -0600 Subject: patman: Correct a stray quote A quote character was added a few years ago, but was not intended. Drop it. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index a31c950051b..161b5ad4288 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -152,7 +152,7 @@ class TestFunctional(unittest.TestCase): Commit-changes: 2 - Changes only for this commit -' Cover-changes: 4 + Cover-changes: 4 - Some notes for the cover letter Cover-letter: -- cgit v1.2.3 From eca46538358a6e75f1d82bff81720a09050c09f9 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 29 Apr 2025 07:22:10 -0600 Subject: patman: Support extra test features Provide support for the -X flag, which preserves the working directory used by tests. Also support -N which shows captured output for tests. Finally, allow selection of a particular test to run. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 161b5ad4288..85e7b475d90 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -53,6 +53,25 @@ class TestFunctional(unittest.TestCase): mary = 'Mary Bloggs ' commits = None patches = None + verbosity = False + preserve_outdirs = False + + @classmethod + def setup_test_args(cls, preserve_indir=False, preserve_outdirs=False, + toolpath=None, verbosity=None, no_capture=False): + """Accept arguments controlling test execution + + Args: + preserve_indir: not used + preserve_outdir: Preserve the output directories used by tests. + Each test has its own, so this is normally only useful when + running a single test. + toolpath: not used + """ + cls.preserve_outdirs = preserve_outdirs + cls.toolpath = toolpath + cls.verbosity = verbosity + cls.no_capture = no_capture def setUp(self): self.tmpdir = tempfile.mkdtemp(prefix='patman.') @@ -60,7 +79,10 @@ class TestFunctional(unittest.TestCase): self.repo = None def tearDown(self): - shutil.rmtree(self.tmpdir) + if self.preserve_outdirs: + print(f'Output dir: {self.tmpdir}') + else: + shutil.rmtree(self.tmpdir) terminal.set_print_test_mode(False) @staticmethod -- cgit v1.2.3 From 770602195cde73c39a21687b5c53185ab9ca449f Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 29 Apr 2025 07:22:11 -0600 Subject: patman: Move code for sending into its own module The control module includes much of the implementation of patman's 'send' feature. As a first step to separating this out, move the sending code into its own file. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 85e7b475d90..b3145612f9f 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -20,6 +20,7 @@ from patman.commit import Commit from patman import control from patman import patchstream from patman.patchstream import PatchStream +from patman import send from patman.series import Series from patman import settings from u_boot_pylib import gitutil @@ -552,7 +553,7 @@ complicated as possible''') self.assertEqual(2, gitutil.count_commits_to_branch(None)) col = terminal.Color() with terminal.capture() as _: - _, cover_fname, patch_files = control.prepare_patches( + _, cover_fname, patch_files = send.prepare_patches( col, branch=None, count=-1, start=0, end=0, ignore_binary=False, signoff=True) self.assertIsNone(cover_fname) @@ -561,7 +562,7 @@ complicated as possible''') # Check that it can detect a different branch self.assertEqual(3, gitutil.count_commits_to_branch('second')) with terminal.capture() as _: - series, cover_fname, patch_files = control.prepare_patches( + series, cover_fname, patch_files = send.prepare_patches( col, branch='second', count=-1, start=0, end=0, ignore_binary=False, signoff=True) self.assertIsNotNone(cover_fname) @@ -580,7 +581,7 @@ complicated as possible''') # Check that it can skip patches at the end with terminal.capture() as _: - _, cover_fname, patch_files = control.prepare_patches( + _, cover_fname, patch_files = send.prepare_patches( col, branch='second', count=-1, start=0, end=1, ignore_binary=False, signoff=True) self.assertIsNotNone(cover_fname) -- cgit v1.2.3 From 24776ab2766787d9629e7250486a0a662871b070 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 29 Apr 2025 07:22:14 -0600 Subject: patman: Move Patch and Review to patchwork module These relate to information obtained from the patchwork server, so move their definition into the new patchwork module. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index b3145612f9f..50fb53787d8 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -20,6 +20,7 @@ from patman.commit import Commit from patman import control from patman import patchstream from patman.patchstream import PatchStream +from patman import patchwork from patman import send from patman.series import Series from patman import settings @@ -807,7 +808,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c def test_parse_subject(self): """Test parsing of the patch subject""" - patch = status.Patch('1') + patch = patchwork.Patch('1') # Simple patch not in a series patch.parse_subject('Testing') @@ -876,11 +877,11 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c commit3 = Commit('3456') commit3.subject = 'Subject 2' - patch1 = status.Patch('1') + patch1 = patchwork.Patch('1') patch1.subject = 'Subject 1' - patch2 = status.Patch('2') + patch2 = patchwork.Patch('2') patch2.subject = 'Subject 2' - patch3 = status.Patch('3') + patch3 = patchwork.Patch('3') patch3.subject = 'Subject 2' series = Series() @@ -976,7 +977,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c commit2 = Commit('ef12') commit2.subject = 'Subject 2' - patch1 = status.Patch('1') + patch1 = patchwork.Patch('1') patch1.parse_subject('[1/2] Subject 1') patch1.name = patch1.raw_subject patch1.content = 'This is my patch content' @@ -984,7 +985,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c patch1.comments = [comment1a] - patch2 = status.Patch('2') + patch2 = patchwork.Patch('2') patch2.parse_subject('[2/2] Subject 2') patch2.name = patch2.raw_subject patch2.content = 'Some other patch content' @@ -1120,7 +1121,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c series = patchstream.get_metadata_for_list(branch, gitdir, count) self.assertEqual(2, len(series.commits)) - patch1 = status.Patch('1') + patch1 = patchwork.Patch('1') patch1.parse_subject('[1/2] %s' % series.commits[0].subject) patch1.name = patch1.raw_subject patch1.content = 'This is my patch content' @@ -1128,7 +1129,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c patch1.comments = [comment1a] - patch2 = status.Patch('2') + patch2 = patchwork.Patch('2') patch2.parse_subject('[2/2] %s' % series.commits[1].subject) patch2.name = patch2.raw_subject patch2.content = 'Some other patch content' @@ -1291,7 +1292,7 @@ line8 commit2 = Commit('ef12') commit2.subject = 'Subject 2' - patch1 = status.Patch('1') + patch1 = patchwork.Patch('1') patch1.parse_subject('[1/2] Subject 1') patch1.name = patch1.raw_subject patch1.content = 'This is my patch content' @@ -1312,7 +1313,7 @@ Reviewed-by: %s patch1.comments = [comment1a] - patch2 = status.Patch('2') + patch2 = patchwork.Patch('2') patch2.parse_subject('[2/2] Subject 2') patch2.name = patch2.raw_subject patch2.content = 'Some other patch content' -- cgit v1.2.3 From e2a991398db44ab433d2e926575ca873c5a0739a Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 29 Apr 2025 07:22:16 -0600 Subject: patman: Rename check_patchwork_status() This function actually shows the status and does some other things. Rename it to better reflect its purpose. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 50fb53787d8..31ba708ab87 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -1045,8 +1045,8 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c series = Series() series.commits = [commit1, commit2] terminal.set_print_test_mode() - status.check_patchwork_status(series, '1234', None, None, False, False, - None, self._fake_patchwork2) + status.check_and_show_status(series, '1234', None, None, False, False, + None, self._fake_patchwork2) lines = iter(terminal.get_print_test_lines()) col = terminal.Color() self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.BLUE), @@ -1159,9 +1159,9 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c # terminal.set_print_test_mode() - status.check_patchwork_status(series, '1234', branch, dest_branch, - False, False, None, self._fake_patchwork3, - repo) + status.check_and_show_status(series, '1234', branch, dest_branch, + False, False, None, self._fake_patchwork3, + repo) lines = terminal.get_print_test_lines() self.assertEqual(12, len(lines)) self.assertEqual( @@ -1361,8 +1361,8 @@ Reviewed-by: %s series = Series() series.commits = [commit1, commit2] terminal.set_print_test_mode() - status.check_patchwork_status(series, '1234', None, None, False, True, - None, self._fake_patchwork2) + status.check_and_show_status(series, '1234', None, None, False, True, + None, self._fake_patchwork2) lines = iter(terminal.get_print_test_lines()) col = terminal.Color() self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.BLUE), -- cgit v1.2.3 From d63b0750621cb1833c9d263c49476dff6dc88ffe Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 29 Apr 2025 07:22:17 -0600 Subject: patman: Split up check_and_show_status() This function has three phases: - collecting things from patchwork - doing some processing - showing the results to the user / creating a branch Refactor into two functions so we can eventually have the patchwork part fully separated out. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 31ba708ab87..ea96c508fa2 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -790,7 +790,8 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c series = Series() with terminal.capture() as (_, err): - status.collect_patches(series, 1234, None, self._fake_patchwork) + patches = status.collect_patches(1234, None, self._fake_patchwork) + status.check_patch_count(0, len(patches)) self.assertIn('Warning: Patchwork reports 1 patches, series has 0', err.getvalue()) @@ -799,7 +800,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c series = Series() series.commits = [Commit('abcd')] - patches = status.collect_patches(series, 1234, None, + patches = status.collect_patches(1234, None, self._fake_patchwork) self.assertEqual(1, len(patches)) patch = patches[0] -- cgit v1.2.3 From 3fd99e2177c17539f4101151cb061e8f7700d6a1 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 29 Apr 2025 07:22:19 -0600 Subject: patman: Adjust how the fake request() function is provided Instead of passing the URL and function to each call, put the fake into the Patchwork object instead. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 41 +++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 22 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index ea96c508fa2..9c5e7d7dd51 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -6,6 +6,7 @@ """Functional tests for checking that patman behaves correctly""" +import asyncio import contextlib import os import pathlib @@ -767,14 +768,13 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c os.chdir(orig_dir) @staticmethod - def _fake_patchwork(url, subpath): + def _fake_patchwork(subpath): """Fake Patchwork server for the function below This handles accessing a series, providing a list consisting of a single patch Args: - url (str): URL of patchwork server subpath (str): URL subpath to use """ re_series = re.match(r'series/(\d*)/$', subpath) @@ -787,21 +787,17 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c def test_status_mismatch(self): """Test Patchwork patches not matching the series""" - series = Series() - + pwork = patchwork.Patchwork.for_testing(self._fake_patchwork) with terminal.capture() as (_, err): - patches = status.collect_patches(1234, None, self._fake_patchwork) + patches = status.collect_patches(1234, pwork) status.check_patch_count(0, len(patches)) self.assertIn('Warning: Patchwork reports 1 patches, series has 0', err.getvalue()) def test_status_read_patch(self): """Test handling a single patch in Patchwork""" - series = Series() - series.commits = [Commit('abcd')] - - patches = status.collect_patches(1234, None, - self._fake_patchwork) + pwork = patchwork.Patchwork.for_testing(self._fake_patchwork) + patches = status.collect_patches(1234, pwork) self.assertEqual(1, len(patches)) patch = patches[0] self.assertEqual('1', patch.id) @@ -944,14 +940,13 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c "Cannot find commit for patch 3 ('Subject 2')"], warnings) - def _fake_patchwork2(self, url, subpath): + def _fake_patchwork2(self, subpath): """Fake Patchwork server for the function below This handles accessing series, patches and comments, providing the data in self.patches to the caller Args: - url (str): URL of patchwork server subpath (str): URL subpath to use """ re_series = re.match(r'series/(\d*)/$', subpath) @@ -1007,13 +1002,14 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c review_list = [None, None] # Check that the tags are picked up on the first patch + pwork = patchwork.Patchwork.for_testing(self._fake_patchwork2) status.find_new_responses(new_rtag_list, review_list, 0, commit1, - patch1, None, self._fake_patchwork2) + patch1, pwork) self.assertEqual(new_rtag_list[0], {'Reviewed-by': {self.joe}}) # Now the second patch status.find_new_responses(new_rtag_list, review_list, 1, commit2, - patch2, None, self._fake_patchwork2) + patch2, pwork) self.assertEqual(new_rtag_list[1], { 'Reviewed-by': {self.mary, self.fred}, 'Tested-by': {self.leb}}) @@ -1023,7 +1019,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c new_rtag_list = [None] * count commit1.rtags = {'Reviewed-by': {self.joe}} status.find_new_responses(new_rtag_list, review_list, 0, commit1, - patch1, None, self._fake_patchwork2) + patch1, pwork) self.assertEqual(new_rtag_list[0], {}) # For the second commit, add Ed and Fred, so only Mary should be left @@ -1031,7 +1027,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c 'Tested-by': {self.leb}, 'Reviewed-by': {self.fred}} status.find_new_responses(new_rtag_list, review_list, 1, commit2, - patch2, None, self._fake_patchwork2) + patch2, pwork) self.assertEqual(new_rtag_list[1], {'Reviewed-by': {self.mary}}) # Check that the output patches expectations: @@ -1046,8 +1042,9 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c series = Series() series.commits = [commit1, commit2] terminal.set_print_test_mode() + pwork = patchwork.Patchwork.for_testing(self._fake_patchwork2) status.check_and_show_status(series, '1234', None, None, False, False, - None, self._fake_patchwork2) + pwork) lines = iter(terminal.get_print_test_lines()) col = terminal.Color() self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.BLUE), @@ -1082,14 +1079,13 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c '1 new response available in patchwork (use -d to write them to a new branch)', None), next(lines)) - def _fake_patchwork3(self, url, subpath): + def _fake_patchwork3(self, subpath): """Fake Patchwork server for the function below This handles accessing series, patches and comments, providing the data in self.patches to the caller Args: - url (str): URL of patchwork server subpath (str): URL subpath to use """ re_series = re.match(r'series/(\d*)/$', subpath) @@ -1160,9 +1156,9 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c # terminal.set_print_test_mode() + pwork = patchwork.Patchwork.for_testing(self._fake_patchwork3) status.check_and_show_status(series, '1234', branch, dest_branch, - False, False, None, self._fake_patchwork3, - repo) + False, False, pwork, repo) lines = terminal.get_print_test_lines() self.assertEqual(12, len(lines)) self.assertEqual( @@ -1362,8 +1358,9 @@ Reviewed-by: %s series = Series() series.commits = [commit1, commit2] terminal.set_print_test_mode() + pwork = patchwork.Patchwork.for_testing(self._fake_patchwork2) status.check_and_show_status(series, '1234', None, None, False, True, - None, self._fake_patchwork2) + pwork) lines = iter(terminal.get_print_test_lines()) col = terminal.Color() self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.BLUE), -- cgit v1.2.3 From 289f4242c5d1290b3b474ff971131136dd7cbb7f Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 29 Apr 2025 07:22:20 -0600 Subject: patman: Simplify test_find_new_responses() This test uses the find_new_responses() function which combines accessing patchwork and processing the results. Since the test is aimed at testing processing, adjust it to call process_reviews() instead. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 9c5e7d7dd51..3f7573a41a8 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -998,37 +998,33 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c self.commits = [commit1, commit2] self.patches = [patch1, patch2] count = 2 - new_rtag_list = [None] * count - review_list = [None, None] # Check that the tags are picked up on the first patch - pwork = patchwork.Patchwork.for_testing(self._fake_patchwork2) - status.find_new_responses(new_rtag_list, review_list, 0, commit1, - patch1, pwork) - self.assertEqual(new_rtag_list[0], {'Reviewed-by': {self.joe}}) + new_rtags, _ = status.process_reviews(patch1.content, patch1.comments, + commit1.rtags) + self.assertEqual(new_rtags, {'Reviewed-by': {self.joe}}) # Now the second patch - status.find_new_responses(new_rtag_list, review_list, 1, commit2, - patch2, pwork) - self.assertEqual(new_rtag_list[1], { + new_rtags, _ = status.process_reviews(patch2.content, patch2.comments, + commit2.rtags) + self.assertEqual(new_rtags, { 'Reviewed-by': {self.mary, self.fred}, 'Tested-by': {self.leb}}) # Now add some tags to the commit, which means they should not appear as # 'new' tags when scanning comments - new_rtag_list = [None] * count commit1.rtags = {'Reviewed-by': {self.joe}} - status.find_new_responses(new_rtag_list, review_list, 0, commit1, - patch1, pwork) - self.assertEqual(new_rtag_list[0], {}) + new_rtags, _ = status.process_reviews(patch1.content, patch1.comments, + commit1.rtags) + self.assertEqual(new_rtags, {}) # For the second commit, add Ed and Fred, so only Mary should be left commit2.rtags = { 'Tested-by': {self.leb}, 'Reviewed-by': {self.fred}} - status.find_new_responses(new_rtag_list, review_list, 1, commit2, - patch2, pwork) - self.assertEqual(new_rtag_list[1], {'Reviewed-by': {self.mary}}) + new_rtags, _ = status.process_reviews(patch2.content, patch2.comments, + commit2.rtags) + self.assertEqual(new_rtags, {'Reviewed-by': {self.mary}}) # Check that the output patches expectations: # 1 Subject 1 -- cgit v1.2.3 From 7052173faeedc8d2530893d586b0c1b633a46d39 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 29 Apr 2025 07:22:21 -0600 Subject: patman: Show patches in yellow When comments are shown below patches it can be hard to see the patch subject. Use yellow instead of blue, since it stands out better. Pass the colour object into show_responses() rather than creating a new one, since that is tidier. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 3f7573a41a8..47fbbe0cc3f 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -1043,7 +1043,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c pwork) lines = iter(terminal.get_print_test_lines()) col = terminal.Color() - self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.BLUE), + self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.YELLOW), next(lines)) self.assertEqual( terminal.PrintLine(' Reviewed-by: ', col.GREEN, newline=False, @@ -1052,7 +1052,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c self.assertEqual(terminal.PrintLine(self.joe, col.WHITE, bright=False), next(lines)) - self.assertEqual(terminal.PrintLine(' 2 Subject 2', col.BLUE), + self.assertEqual(terminal.PrintLine(' 2 Subject 2', col.YELLOW), next(lines)) self.assertEqual( terminal.PrintLine(' Reviewed-by: ', col.GREEN, newline=False, @@ -1359,7 +1359,7 @@ Reviewed-by: %s pwork) lines = iter(terminal.get_print_test_lines()) col = terminal.Color() - self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.BLUE), + self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.YELLOW), next(lines)) self.assertEqual( terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), @@ -1380,7 +1380,7 @@ Reviewed-by: %s ' Here is my comment above the above...', None), next(lines)) self.assertEqual(terminal.PrintLine('', None), next(lines)) - self.assertEqual(terminal.PrintLine(' 2 Subject 2', col.BLUE), + self.assertEqual(terminal.PrintLine(' 2 Subject 2', col.YELLOW), next(lines)) self.assertEqual( terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), -- cgit v1.2.3 From 45f4f6219182927c34d2dc0359f4bf044d3ed432 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Tue, 29 Apr 2025 07:22:24 -0600 Subject: patman: Switch over to asyncio Now that all the pieces are in place, switch over from using an executor to using asyncio. While we are here, import defaultdict to avoid needing to specify its module. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 47fbbe0cc3f..eee20b9b155 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -789,7 +789,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c """Test Patchwork patches not matching the series""" pwork = patchwork.Patchwork.for_testing(self._fake_patchwork) with terminal.capture() as (_, err): - patches = status.collect_patches(1234, pwork) + patches = asyncio.run(status.check_status(1234, pwork)) status.check_patch_count(0, len(patches)) self.assertIn('Warning: Patchwork reports 1 patches, series has 0', err.getvalue()) @@ -797,7 +797,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c def test_status_read_patch(self): """Test handling a single patch in Patchwork""" pwork = patchwork.Patchwork.for_testing(self._fake_patchwork) - patches = status.collect_patches(1234, pwork) + patches = asyncio.run(status.check_status(1234, pwork)) self.assertEqual(1, len(patches)) patch = patches[0] self.assertEqual('1', patch.id) -- cgit v1.2.3 From e10201aa8ccb1fb681cafab4225399f4fdb8497d Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 7 Apr 2025 22:51:45 +1200 Subject: patman: Pass the alias dict into gitutil.email_patches() Rather than accessing the settings module in this function, require the alias dict to be passed in. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index eee20b9b155..b96bf7bd917 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -230,13 +230,14 @@ class TestFunctional(unittest.TestCase): dry_run = True in_reply_to = mel count = 2 - settings.alias = { + alias = { 'fdt': ['simon'], 'u-boot': ['u-boot@lists.denx.de'], 'simon': [self.leb], 'fred': [self.fred], 'joe': [self.joe], } + settings.alias = alias text = self._get_text('test01.txt') series = patchstream.get_metadata_for_test(text) @@ -255,7 +256,7 @@ class TestFunctional(unittest.TestCase): None, get_maintainer_script) cmd = gitutil.email_patches( series, cover_fname, args, dry_run, not ignore_bad_tags, - cc_file, in_reply_to=in_reply_to, thread=None) + cc_file, alias, in_reply_to=in_reply_to, thread=None) series.ShowActions(args, cmd, process_tags) cc_lines = open(cc_file, encoding='utf-8').read().splitlines() os.remove(cc_file) -- cgit v1.2.3 From abfd67cccf8e1a4330ab9601813dd6675c84a9c5 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 7 Apr 2025 22:51:46 +1200 Subject: patman: Pass aliases to Series.MakeCcFile() Rather than accessing settings directly, pass the aliases in, so that we can do the same from tests. With further work this will allow the tests to work without using settings.alias Signed-off-by: Simon Glass --- tools/patman/func_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index b96bf7bd917..2a1731aeec9 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -253,7 +253,7 @@ class TestFunctional(unittest.TestCase): series.DoChecks() cc_file = series.MakeCcFile(process_tags, cover_fname, not ignore_bad_tags, add_maintainers, - None, get_maintainer_script) + None, get_maintainer_script, alias) cmd = gitutil.email_patches( series, cover_fname, args, dry_run, not ignore_bad_tags, cc_file, alias, in_reply_to=in_reply_to, thread=None) -- cgit v1.2.3 From 75ae217194ad680bac8d3f2b0e2bcd0976c91735 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Mon, 7 Apr 2025 22:51:47 +1200 Subject: patman: Update Series.ShowActions() to pass alias Instead of using settings.alias pass this value in. This allows tests to work without using settings.alias Signed-off-by: Simon Glass --- tools/patman/func_test.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 2a1731aeec9..3a34302fc57 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -237,7 +237,6 @@ class TestFunctional(unittest.TestCase): 'fred': [self.fred], 'joe': [self.joe], } - settings.alias = alias text = self._get_text('test01.txt') series = patchstream.get_metadata_for_test(text) @@ -257,7 +256,7 @@ class TestFunctional(unittest.TestCase): cmd = gitutil.email_patches( series, cover_fname, args, dry_run, not ignore_bad_tags, cc_file, alias, in_reply_to=in_reply_to, thread=None) - series.ShowActions(args, cmd, process_tags) + series.ShowActions(args, cmd, process_tags, alias) cc_lines = open(cc_file, encoding='utf-8').read().splitlines() os.remove(cc_file) -- cgit v1.2.3 From 0664a956e674027a1383c8c114377dcdf5b86e41 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 8 May 2025 04:38:30 +0200 Subject: u_boot_pylib: Tidy up quoting of cc and to The current approach to calling 'git send-email' puts double quotes around each email address to ensure that it will pass the shell correctly. This is a bit cumbersome and requires using a shell to sort it all out. Drop the quotes and use command.run() instead, to simplify things. This will also make it possible to (later) set the current directory. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 3a34302fc57..7f9175ea44f 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -292,7 +292,7 @@ class TestFunctional(unittest.TestCase): self.assertEqual(' Cc: %s' % mel, next(lines)) self.assertEqual(' Cc: %s' % rick, next(lines)) expected = ('Git command: git send-email --annotate ' - '--in-reply-to="%s" --to "u-boot@lists.denx.de" ' + '--in-reply-to="%s" --to u-boot@lists.denx.de ' '--cc "%s" --cc-cmd "%s send --cc-cmd %s" %s %s' % (in_reply_to, stefan, sys.argv[0], cc_file, cover_fname, ' '.join(args))) -- cgit v1.2.3 From 8e737d41c00b04bd3b1c9f56b8cea8bdbaf87012 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 8 May 2025 04:58:49 +0200 Subject: patman: Use itr instead of lines for iterator The variables 'lines' is used to hold a list of output lines within a test, but also to hold an iterator through those lines. Use 'itr' for the latter, to avoid confusion. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 161 +++++++++++++++++++++++----------------------- 1 file changed, 82 insertions(+), 79 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 7f9175ea44f..624f388966e 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -223,7 +223,8 @@ class TestFunctional(unittest.TestCase): """ process_tags = True ignore_bad_tags = False - stefan = b'Stefan Br\xc3\xbcns '.decode('utf-8') + stefan = (b'Stefan Br\xc3\xbcns ' + .decode('utf-8')) rick = 'Richard III ' mel = b'Lord M\xc3\xablchett '.decode('utf-8') add_maintainers = [stefan, rick] @@ -260,43 +261,43 @@ class TestFunctional(unittest.TestCase): cc_lines = open(cc_file, encoding='utf-8').read().splitlines() os.remove(cc_file) - lines = iter(out[0].getvalue().splitlines()) + itr = iter(out[0].getvalue().splitlines()) self.assertEqual('Cleaned %s patches' % len(series.commits), - next(lines)) - self.assertEqual('Change log missing for v2', next(lines)) - self.assertEqual('Change log missing for v3', next(lines)) - self.assertEqual('Change log for unknown version v4', next(lines)) - self.assertEqual("Alias 'pci' not found", next(lines)) - while next(lines) != 'Cc processing complete': + next(itr)) + self.assertEqual('Change log missing for v2', next(itr)) + self.assertEqual('Change log missing for v3', next(itr)) + self.assertEqual('Change log for unknown version v4', next(itr)) + self.assertEqual("Alias 'pci' not found", next(itr)) + while next(itr) != 'Cc processing complete': pass - self.assertIn('Dry run', next(lines)) - self.assertEqual('', next(lines)) - self.assertIn('Send a total of %d patches' % count, next(lines)) - prev = next(lines) + self.assertIn('Dry run', next(itr)) + self.assertEqual('', next(itr)) + self.assertIn('Send a total of %d patches' % count, next(itr)) + prev = next(itr) for i, commit in enumerate(series.commits): self.assertEqual(' %s' % args[i], prev) while True: - prev = next(lines) + prev = next(itr) if 'Cc:' not in prev: break self.assertEqual('To: u-boot@lists.denx.de', prev) - self.assertEqual('Cc: %s' % stefan, next(lines)) - self.assertEqual('Version: 3', next(lines)) - self.assertEqual('Prefix:\t RFC', next(lines)) - self.assertEqual('Postfix:\t some-branch', next(lines)) - self.assertEqual('Cover: 4 lines', next(lines)) - self.assertEqual(' Cc: %s' % self.fred, next(lines)) - self.assertEqual(' Cc: %s' % self.joe, next(lines)) + self.assertEqual('Cc: %s' % stefan, next(itr)) + self.assertEqual('Version: 3', next(itr)) + self.assertEqual('Prefix:\t RFC', next(itr)) + self.assertEqual('Postfix:\t some-branch', next(itr)) + self.assertEqual('Cover: 4 lines', next(itr)) + self.assertEqual(' Cc: %s' % self.fred, next(itr)) + self.assertEqual(' Cc: %s' % self.joe, next(itr)) self.assertEqual(' Cc: %s' % self.leb, - next(lines)) - self.assertEqual(' Cc: %s' % mel, next(lines)) - self.assertEqual(' Cc: %s' % rick, next(lines)) + next(itr)) + self.assertEqual(' Cc: %s' % mel, next(itr)) + self.assertEqual(' Cc: %s' % rick, next(itr)) expected = ('Git command: git send-email --annotate ' '--in-reply-to="%s" --to u-boot@lists.denx.de ' '--cc "%s" --cc-cmd "%s send --cc-cmd %s" %s %s' % (in_reply_to, stefan, sys.argv[0], cc_file, cover_fname, ' '.join(args))) - self.assertEqual(expected, next(lines)) + self.assertEqual(expected, next(itr)) self.assertEqual(('%s %s\0%s' % (args[0], rick, stefan)), cc_lines[0]) self.assertEqual( @@ -1041,39 +1042,39 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c pwork = patchwork.Patchwork.for_testing(self._fake_patchwork2) status.check_and_show_status(series, '1234', None, None, False, False, pwork) - lines = iter(terminal.get_print_test_lines()) + itr = iter(terminal.get_print_test_lines()) col = terminal.Color() self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.YELLOW), - next(lines)) + next(itr)) self.assertEqual( terminal.PrintLine(' Reviewed-by: ', col.GREEN, newline=False, bright=False), - next(lines)) + next(itr)) self.assertEqual(terminal.PrintLine(self.joe, col.WHITE, bright=False), - next(lines)) + next(itr)) self.assertEqual(terminal.PrintLine(' 2 Subject 2', col.YELLOW), - next(lines)) + next(itr)) self.assertEqual( terminal.PrintLine(' Reviewed-by: ', col.GREEN, newline=False, bright=False), - next(lines)) - self.assertEqual(terminal.PrintLine(self.fred, col.WHITE, bright=False), - next(lines)) + next(itr)) + self.assertEqual(terminal.PrintLine(self.fred, col.WHITE, + bright=False), next(itr)) self.assertEqual( terminal.PrintLine(' Tested-by: ', col.GREEN, newline=False, bright=False), - next(lines)) + next(itr)) self.assertEqual(terminal.PrintLine(self.leb, col.WHITE, bright=False), - next(lines)) + next(itr)) self.assertEqual( terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), - next(lines)) + next(itr)) self.assertEqual(terminal.PrintLine(self.mary, col.WHITE), - next(lines)) + next(itr)) self.assertEqual(terminal.PrintLine( '1 new response available in patchwork (use -d to write them to a new branch)', - None), next(lines)) + None), next(itr)) def _fake_patchwork3(self, subpath): """Fake Patchwork server for the function below @@ -1175,18 +1176,18 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c # Now check the actual test of the first commit message. We expect to # see the new tags immediately below the old ones. stdout = patchstream.get_list(dest_branch, count=count, git_dir=gitdir) - lines = iter([line.strip() for line in stdout.splitlines() - if '-by:' in line]) + itr = iter([line.strip() for line in stdout.splitlines() + if '-by:' in line]) # First patch should have the review tag - self.assertEqual('Reviewed-by: %s' % self.joe, next(lines)) + self.assertEqual('Reviewed-by: %s' % self.joe, next(itr)) # Second patch should have the sign-off then the tested-by and two # reviewed-by tags - self.assertEqual('Signed-off-by: %s' % self.leb, next(lines)) - self.assertEqual('Reviewed-by: %s' % self.fred, next(lines)) - self.assertEqual('Reviewed-by: %s' % self.mary, next(lines)) - self.assertEqual('Tested-by: %s' % self.leb, next(lines)) + self.assertEqual('Signed-off-by: %s' % self.leb, next(itr)) + self.assertEqual('Reviewed-by: %s' % self.fred, next(itr)) + self.assertEqual('Reviewed-by: %s' % self.mary, next(itr)) + self.assertEqual('Tested-by: %s' % self.leb, next(itr)) def test_parse_snippets(self): """Test parsing of review snippets""" @@ -1357,75 +1358,77 @@ Reviewed-by: %s pwork = patchwork.Patchwork.for_testing(self._fake_patchwork2) status.check_and_show_status(series, '1234', None, None, False, True, pwork) - lines = iter(terminal.get_print_test_lines()) + itr = iter(terminal.get_print_test_lines()) col = terminal.Color() self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.YELLOW), - next(lines)) + next(itr)) self.assertEqual( terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), - next(lines)) - self.assertEqual(terminal.PrintLine(self.joe, col.WHITE), next(lines)) + next(itr)) + self.assertEqual(terminal.PrintLine(self.joe, col.WHITE), next(itr)) self.assertEqual(terminal.PrintLine('Review: %s' % self.joe, col.RED), - next(lines)) - self.assertEqual(terminal.PrintLine(' Hi Fred,', None), next(lines)) - self.assertEqual(terminal.PrintLine('', None), next(lines)) + next(itr)) + self.assertEqual(terminal.PrintLine(' Hi Fred,', None), next(itr)) + self.assertEqual(terminal.PrintLine('', None), next(itr)) self.assertEqual(terminal.PrintLine(' > File: file.c', col.MAGENTA), - next(lines)) + next(itr)) self.assertEqual(terminal.PrintLine(' > Some code', col.MAGENTA), - next(lines)) - self.assertEqual(terminal.PrintLine(' > and more code', col.MAGENTA), - next(lines)) + next(itr)) + self.assertEqual(terminal.PrintLine(' > and more code', + col.MAGENTA), + next(itr)) self.assertEqual(terminal.PrintLine( - ' Here is my comment above the above...', None), next(lines)) - self.assertEqual(terminal.PrintLine('', None), next(lines)) + ' Here is my comment above the above...', None), next(itr)) + self.assertEqual(terminal.PrintLine('', None), next(itr)) self.assertEqual(terminal.PrintLine(' 2 Subject 2', col.YELLOW), - next(lines)) + next(itr)) self.assertEqual( terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), - next(lines)) + next(itr)) self.assertEqual(terminal.PrintLine(self.fred, col.WHITE), - next(lines)) + next(itr)) self.assertEqual( terminal.PrintLine(' + Reviewed-by: ', col.GREEN, newline=False), - next(lines)) + next(itr)) self.assertEqual(terminal.PrintLine(self.mary, col.WHITE), - next(lines)) + next(itr)) self.assertEqual( terminal.PrintLine(' + Tested-by: ', col.GREEN, newline=False), - next(lines)) + next(itr)) self.assertEqual(terminal.PrintLine(self.leb, col.WHITE), - next(lines)) + next(itr)) self.assertEqual(terminal.PrintLine('Review: %s' % self.fred, col.RED), - next(lines)) - self.assertEqual(terminal.PrintLine(' Hi Fred,', None), next(lines)) - self.assertEqual(terminal.PrintLine('', None), next(lines)) + next(itr)) + self.assertEqual(terminal.PrintLine(' Hi Fred,', None), next(itr)) + self.assertEqual(terminal.PrintLine('', None), next(itr)) self.assertEqual(terminal.PrintLine( - ' > File: tools/patman/commit.py', col.MAGENTA), next(lines)) + ' > File: tools/patman/commit.py', col.MAGENTA), next(itr)) self.assertEqual(terminal.PrintLine( - ' > Line: 41 / 41: class Commit:', col.MAGENTA), next(lines)) + ' > Line: 41 / 41: class Commit:', col.MAGENTA), next(itr)) self.assertEqual(terminal.PrintLine( - ' > + return self.subject', col.MAGENTA), next(lines)) + ' > + return self.subject', col.MAGENTA), next(itr)) self.assertEqual(terminal.PrintLine( - ' > +', col.MAGENTA), next(lines)) + ' > +', col.MAGENTA), next(itr)) self.assertEqual( - terminal.PrintLine(' > def add_change(self, version, info):', - col.MAGENTA), - next(lines)) + terminal.PrintLine( + ' > def add_change(self, version, info):', + col.MAGENTA), + next(itr)) self.assertEqual(terminal.PrintLine( ' > """Add a new change line to the change list for a version.', - col.MAGENTA), next(lines)) + col.MAGENTA), next(itr)) self.assertEqual(terminal.PrintLine( - ' >', col.MAGENTA), next(lines)) + ' >', col.MAGENTA), next(itr)) self.assertEqual(terminal.PrintLine( - ' A comment', None), next(lines)) - self.assertEqual(terminal.PrintLine('', None), next(lines)) + ' A comment', None), next(itr)) + self.assertEqual(terminal.PrintLine('', None), next(itr)) self.assertEqual(terminal.PrintLine( '4 new responses available in patchwork (use -d to write them to a new branch)', - None), next(lines)) + None), next(itr)) def test_insert_tags(self): """Test inserting of review tags""" -- cgit v1.2.3 From 6961eb7e5b251fc9d936eb87dde2f6ce8cdfd631 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 8 May 2025 05:13:35 +0200 Subject: patman: Use .git as the git directory In tests, the 'git' directory is a subdirectory of the temporary directory. Rename it to '.git' so that git will automatically find it when git operations are done in the temporary directory. Set up the config before the first git operation, so that this works correctly. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 624f388966e..5ddefc3a9b1 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -78,7 +78,7 @@ class TestFunctional(unittest.TestCase): def setUp(self): self.tmpdir = tempfile.mkdtemp(prefix='patman.') - self.gitdir = os.path.join(self.tmpdir, 'git') + self.gitdir = os.path.join(self.tmpdir, '.git') self.repo = None def tearDown(self): @@ -416,7 +416,7 @@ Changes in v2: fname (str): Filename of file to create text (str): Text to put into the file """ - path = os.path.join(self.gitdir, fname) + path = os.path.join(self.tmpdir, fname) tools.write_file(path, text, binary=False) index = self.repo.index index.add(fname) @@ -550,7 +550,7 @@ complicated as possible''') control.setup() orig_dir = os.getcwd() try: - os.chdir(self.gitdir) + os.chdir(self.tmpdir) # Check that it can detect the current branch self.assertEqual(2, gitutil.count_commits_to_branch(None)) @@ -602,7 +602,7 @@ complicated as possible''') def test_custom_get_maintainer_script(self): """Validate that a custom get_maintainer script gets used.""" self.make_git_tree() - with directory_excursion(self.gitdir): + with directory_excursion(self.tmpdir): # Setup git. os.environ['GIT_CONFIG_GLOBAL'] = '/dev/null' os.environ['GIT_CONFIG_SYSTEM'] = '/dev/null' @@ -610,8 +610,6 @@ complicated as possible''') tools.run('git', 'config', 'user.email', 'dumdum@dummy.com') tools.run('git', 'branch', 'upstream') tools.run('git', 'branch', '--set-upstream-to=upstream') - tools.run('git', 'add', '.') - tools.run('git', 'commit', '-m', 'new commit') # Setup patman configuration. with open('.patman', 'w', buffering=1) as f: @@ -623,6 +621,8 @@ complicated as possible''') f.write('#!/usr/bin/env python\n' 'print("hello@there.com")\n') os.chmod('dummy-script.sh', 0x555) + tools.run('git', 'add', '.') + tools.run('git', 'commit', '-m', 'new commit') # Finally, do the test with terminal.capture(): @@ -1108,7 +1108,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c branch = 'first' dest_branch = 'first2' count = 2 - gitdir = os.path.join(self.gitdir, '.git') + gitdir = self.gitdir # Set up the test git tree. We use branch 'first' which has two commits # in it -- cgit v1.2.3 From 9302d672a5e63cdb56371eb55dc560fef97c059f Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 8 May 2025 05:26:16 +0200 Subject: patman: Use variables for series ID and title Rather than hard-coding these values in the sample patches, use variables so that we can refer to these in tests. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 5ddefc3a9b1..9c7d5d8c381 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -59,6 +59,10 @@ class TestFunctional(unittest.TestCase): verbosity = False preserve_outdirs = False + # Fake patchwork info for testing + SERIES_ID_SECOND_V1 = 456 + TITLE_SECOND = 'Series for my board' + @classmethod def setup_test_args(cls, preserve_indir=False, preserve_outdirs=False, toolpath=None, verbosity=None, no_capture=False): @@ -508,16 +512,17 @@ a very nice colour. Purple and purple Even more purple Could not be any more purple''') - self.make_commit_with_file('serial: Add a serial driver', ''' + self.make_commit_with_file('serial: Add a serial driver', f''' Here is the serial driver for my chip. Cover-letter: -Series for my board +{self.TITLE_SECOND} This series implements support for my glorious board. END -Series-links: 183237 +Series-to: u-boot +Series-links: {self.SERIES_ID_SECOND_V1} ''', 'serial.c', '''The code for the serial driver is here''') self.make_commit_with_file('bootm: Make it boot', ''' -- cgit v1.2.3 From 3724cbade41a1dd0ec94cd9b511afe005ebf4804 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 8 May 2025 05:23:41 +0200 Subject: patman: Clean up creation of the git tree The test starts with the HEAD pointing to the wrong place, so that the created files appear to be deleted. Fix this by resetting the tree before tests start. Add a check that the tree is clean. Update pygit2 so that the enums are available. --- tools/patman/func_test.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 9c7d5d8c381..61df82312ba 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -503,7 +503,7 @@ better than before''') target = repo.revparse_single('HEAD~2') # pylint doesn't seem to find this # pylint: disable=E1101 - repo.reset(target.oid, pygit2.GIT_CHECKOUT_FORCE) + repo.reset(target.oid, pygit2.enums.ResetMode.HARD) self.make_commit_with_file('video: Some video improvements', ''' Fix up the video so that it looks more purple. Purple is @@ -543,6 +543,13 @@ complicated as possible''') repo.config.set_multivar('branch.second.merge', '', 'refs/heads/base') repo.branches.local.create('base', base_target) + + target = repo.lookup_reference('refs/heads/first') + repo.checkout(target, strategy=pygit2.GIT_CHECKOUT_FORCE) + target = repo.revparse_single('HEAD') + repo.reset(target.oid, pygit2.enums.ResetMode.HARD) + + self.assertFalse(gitutil.check_dirty(self.gitdir, self.tmpdir)) return repo def test_branch(self): -- cgit v1.2.3 From 8465b44cb517571cbf3c2ffb552d5c8c93f0e885 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 8 May 2025 05:02:07 +0200 Subject: patman: Use git to set up the test config At present the branch information is dropped when writing the configuration. It is easier to get git to set up the config anyway, so update the test to do this. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 61df82312ba..d055a7e5952 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -448,6 +448,11 @@ Changes in v2: self.repo = repo new_tree = repo.TreeBuilder().write() + common = ['git', f'--git-dir={self.gitdir}', 'config'] + tools.run(*(common + ['user.name', 'Dummy']), cwd=self.gitdir) + tools.run(*(common + ['user.email', 'dumdum@dummy.com']), + cwd=self.gitdir) + # pylint doesn't seem to find this # pylint: disable=E1101 author = pygit2.Signature('Test user', 'test@email.com') -- cgit v1.2.3 From a52e80aee7cca7437869fd9cc74fd491d4e94442 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 8 May 2025 05:36:20 +0200 Subject: patman: Correct some pylint and asyncio issues Correct some pylint warnings in this file. Make use of the existing asyncio event loop, instead of creating a new one, since this also destroys it afterwards, making it unavailable for tests which want to share an event loop. Use tools.write_file() to avoid a warning about encoding. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 51 ++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 25 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index d055a7e5952..9f3ab50fa4e 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -16,6 +16,11 @@ import sys import tempfile import unittest +import pygit2 + +from u_boot_pylib import gitutil +from u_boot_pylib import terminal +from u_boot_pylib import tools from patman.commit import Commit from patman import control @@ -24,12 +29,6 @@ from patman.patchstream import PatchStream from patman import patchwork from patman import send from patman.series import Series -from patman import settings -from u_boot_pylib import gitutil -from u_boot_pylib import terminal -from u_boot_pylib import tools - -import pygit2 from patman import status PATMAN_DIR = pathlib.Path(__file__).parent @@ -278,7 +277,7 @@ class TestFunctional(unittest.TestCase): self.assertEqual('', next(itr)) self.assertIn('Send a total of %d patches' % count, next(itr)) prev = next(itr) - for i, commit in enumerate(series.commits): + for i in range(len(series.commits)): self.assertEqual(' %s' % args[i], prev) while True: prev = next(itr) @@ -389,7 +388,8 @@ Changes in v2: def test_base_commit(self): """Test adding a base commit with no cover letter""" orig_text = self._get_text('test01.txt') - pos = orig_text.index('commit 5ab48490f03051875ab13d288a4bf32b507d76fd') + pos = orig_text.index( + 'commit 5ab48490f03051875ab13d288a4bf32b507d76fd') text = orig_text[:pos] series = patchstream.get_metadata_for_test(text) series.base_commit = Commit('1a44532') @@ -582,7 +582,7 @@ complicated as possible''') # Check that it can detect a different branch self.assertEqual(3, gitutil.count_commits_to_branch('second')) with terminal.capture() as _: - series, cover_fname, patch_files = send.prepare_patches( + _, cover_fname, patch_files = send.prepare_patches( col, branch='second', count=-1, start=0, end=0, ignore_binary=False, signoff=True) self.assertIsNotNone(cover_fname) @@ -629,14 +629,13 @@ complicated as possible''') tools.run('git', 'branch', '--set-upstream-to=upstream') # Setup patman configuration. - with open('.patman', 'w', buffering=1) as f: - f.write('[settings]\n' - 'get_maintainer_script: dummy-script.sh\n' - 'check_patch: False\n' - 'add_maintainers: True\n') - with open('dummy-script.sh', 'w', buffering=1) as f: - f.write('#!/usr/bin/env python\n' - 'print("hello@there.com")\n') + tools.write_file('.patman', '[settings]\n' + 'get_maintainer_script: dummy-script.sh\n' + 'check_patch: False\n' + 'add_maintainers: True\n', binary=False) + tools.write_file('dummy-script.sh', + '#!/usr/bin/env python\n' + 'print("hello@there.com")\n', binary=False) os.chmod('dummy-script.sh', 0x555) tools.run('git', 'add', '.') tools.run('git', 'commit', '-m', 'new commit') @@ -669,7 +668,7 @@ Tested-by: %s Serie-version: 2 ''' with self.assertRaises(ValueError) as exc: - pstrm = PatchStream.process_text(text) + PatchStream.process_text(text) self.assertEqual("Line 3: Invalid tag = 'Serie-version: 2'", str(exc.exception)) @@ -747,9 +746,9 @@ index c072e54..942244f 100644 --- a/lib/fdtdec.c +++ b/lib/fdtdec.c @@ -1200,7 +1200,8 @@ int fdtdec_setup_mem_size_base(void) - } + \t} - gd->ram_size = (phys_size_t)(res.end - res.start + 1); + \tgd->ram_size = (phys_size_t)(res.end - res.start + 1); - debug("%s: Initial DRAM size %llx\n", __func__, (u64)gd->ram_size); + debug("%s: Initial DRAM size %llx\n", __func__, + (unsigned long long)gd->ram_size); @@ -807,7 +806,8 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c """Test Patchwork patches not matching the series""" pwork = patchwork.Patchwork.for_testing(self._fake_patchwork) with terminal.capture() as (_, err): - patches = asyncio.run(status.check_status(1234, pwork)) + loop = asyncio.get_event_loop() + patches = loop.run_until_complete(status.check_status(1234, pwork)) status.check_patch_count(0, len(patches)) self.assertIn('Warning: Patchwork reports 1 patches, series has 0', err.getvalue()) @@ -815,7 +815,8 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c def test_status_read_patch(self): """Test handling a single patch in Patchwork""" pwork = patchwork.Patchwork.for_testing(self._fake_patchwork) - patches = asyncio.run(status.check_status(1234, pwork)) + loop = asyncio.get_event_loop() + patches = loop.run_until_complete(status.check_status(1234, pwork)) self.assertEqual(1, len(patches)) patch = patches[0] self.assertEqual('1', patch.id) @@ -1015,7 +1016,6 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c # things behaves as expected self.commits = [commit1, commit2] self.patches = [patch1, patch2] - count = 2 # Check that the tags are picked up on the first patch new_rtags, _ = status.process_reviews(patch1.content, patch1.comments, @@ -1280,8 +1280,9 @@ line8 'And another comment'], ['> File: file.c', '> Line: 153 / 143: def check_patch(fname, show_types=False):', - '> and more code', '> +Addition here', '> +Another addition here', - '> codey', '> more codey', 'and another thing in same file'], + '> and more code', '> +Addition here', + '> +Another addition here', '> codey', '> more codey', + 'and another thing in same file'], ['> File: file.c', '> Line: 253 / 243', '> with no function context', 'one more thing'], ['> File: tools/patman/main.py', '> +line of code', -- cgit v1.2.3 From b77a42bc75cef75b2ba6a494c167105f7d191817 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Thu, 8 May 2025 06:01:28 +0200 Subject: patman: Add tests for help Add a few tests to make sure that help is provided when requested. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 9f3ab50fa4e..00aed8786e8 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -18,6 +18,7 @@ import unittest import pygit2 +from u_boot_pylib import command from u_boot_pylib import gitutil from u_boot_pylib import terminal from u_boot_pylib import tools @@ -83,6 +84,8 @@ class TestFunctional(unittest.TestCase): self.tmpdir = tempfile.mkdtemp(prefix='patman.') self.gitdir = os.path.join(self.tmpdir, '.git') self.repo = None + self._patman_pathname = sys.argv[0] + self._patman_dir = os.path.dirname(os.path.realpath(sys.argv[0])) def tearDown(self): if self.preserve_outdirs: @@ -784,6 +787,28 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c finally: os.chdir(orig_dir) + def _RunPatman(self, *args): + all_args = [self._patman_pathname] + list(args) + return command.run_one(*all_args, capture=True, capture_stderr=True) + + def testFullHelp(self): + command.TEST_RESULT = None + result = self._RunPatman('-H') + help_file = os.path.join(self._patman_dir, 'README.rst') + # Remove possible extraneous strings + extra = '::::::::::::::\n' + help_file + '\n::::::::::::::\n' + gothelp = result.stdout.replace(extra, '') + self.assertEqual(len(gothelp), os.path.getsize(help_file)) + self.assertEqual(0, len(result.stderr)) + self.assertEqual(0, result.return_code) + + def testHelp(self): + command.TEST_RESULT = None + result = self._RunPatman('-h') + self.assertTrue(len(result.stdout) > 1000) + self.assertEqual(0, len(result.stderr)) + self.assertEqual(0, result.return_code) + @staticmethod def _fake_patchwork(subpath): """Fake Patchwork server for the function below -- cgit v1.2.3 From 77177ba82f12e8b4422c23414d7a68ba9a3f6e20 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Sat, 10 May 2025 13:04:57 +0200 Subject: patman: Use python3 with /usr/bin/env If python2 is available then we must specify python3 here. Update the test to handle this. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 00aed8786e8..da81101ea93 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -637,7 +637,7 @@ complicated as possible''') 'check_patch: False\n' 'add_maintainers: True\n', binary=False) tools.write_file('dummy-script.sh', - '#!/usr/bin/env python\n' + '#!/usr/bin/env python3\n' 'print("hello@there.com")\n', binary=False) os.chmod('dummy-script.sh', 0x555) tools.run('git', 'add', '.') -- cgit v1.2.3 From d5675b84c4365050a58e8f8e2783f25c5ea4f572 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Sat, 10 May 2025 13:04:58 +0200 Subject: patman: Add a test for collecting a PATCH prefix Add one more test for completeness, since this occurs commonly. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index da81101ea93..55abf52bdb5 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -877,6 +877,14 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c self.assertEqual(None, patch.prefix) self.assertEqual(None, patch.version) + # With PATCH prefix + patch.parse_subject('[PATCH,2/5] Testing') + self.assertEqual('Testing', patch.subject) + self.assertEqual(2, patch.seq) + self.assertEqual(5, patch.count) + self.assertEqual('PATCH', patch.prefix) + self.assertEqual(None, patch.version) + # RFC patch patch.parse_subject('[RFC,3/7] Testing') self.assertEqual('Testing', patch.subject) -- cgit v1.2.3 From 1be26d78cf2b7743d504c83ecac5a7a3d7ce8222 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Sat, 10 May 2025 13:04:59 +0200 Subject: patman: Move common test code into a new module The func_test file is quite large. In order to allow new tests to be added to a separate file, move the common test code into a separate class, to be inherited by other classes. Drop unnecessary imports in func_test Signed-off-by: Simon Glass --- tools/patman/func_test.py | 213 ++++++---------------------------------------- 1 file changed, 25 insertions(+), 188 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 55abf52bdb5..2faff8019f6 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -13,7 +13,6 @@ import pathlib import re import shutil import sys -import tempfile import unittest import pygit2 @@ -31,6 +30,7 @@ from patman import patchwork from patman import send from patman.series import Series from patman import status +from patman.test_common import TestCommon PATMAN_DIR = pathlib.Path(__file__).parent TEST_DATA_DIR = PATMAN_DIR / 'test/' @@ -47,52 +47,22 @@ def directory_excursion(directory): os.chdir(current) -class TestFunctional(unittest.TestCase): +class TestFunctional(unittest.TestCase, TestCommon): """Functional tests for checking that patman behaves correctly""" - leb = (b'Lord Edmund Blackadd\xc3\xabr '. - decode('utf-8')) fred = 'Fred Bloggs ' joe = 'Joe Bloggs ' mary = 'Mary Bloggs ' commits = None patches = None - verbosity = False - preserve_outdirs = False - - # Fake patchwork info for testing - SERIES_ID_SECOND_V1 = 456 - TITLE_SECOND = 'Series for my board' - - @classmethod - def setup_test_args(cls, preserve_indir=False, preserve_outdirs=False, - toolpath=None, verbosity=None, no_capture=False): - """Accept arguments controlling test execution - - Args: - preserve_indir: not used - preserve_outdir: Preserve the output directories used by tests. - Each test has its own, so this is normally only useful when - running a single test. - toolpath: not used - """ - cls.preserve_outdirs = preserve_outdirs - cls.toolpath = toolpath - cls.verbosity = verbosity - cls.no_capture = no_capture def setUp(self): - self.tmpdir = tempfile.mkdtemp(prefix='patman.') - self.gitdir = os.path.join(self.tmpdir, '.git') + TestCommon.setUp(self) self.repo = None self._patman_pathname = sys.argv[0] self._patman_dir = os.path.dirname(os.path.realpath(sys.argv[0])) def tearDown(self): - if self.preserve_outdirs: - print(f'Output dir: {self.tmpdir}') - else: - shutil.rmtree(self.tmpdir) - terminal.set_print_test_mode(False) + TestCommon.tearDown(self) @staticmethod def _get_path(fname): @@ -264,7 +234,7 @@ class TestFunctional(unittest.TestCase): series, cover_fname, args, dry_run, not ignore_bad_tags, cc_file, alias, in_reply_to=in_reply_to, thread=None) series.ShowActions(args, cmd, process_tags, alias) - cc_lines = open(cc_file, encoding='utf-8').read().splitlines() + cc_lines = tools.read_file(cc_file, binary=False).splitlines() os.remove(cc_file) itr = iter(out[0].getvalue().splitlines()) @@ -344,14 +314,14 @@ Simon Glass (2): base-commit: 1a44532 branch: mybranch ''' - lines = open(cover_fname, encoding='utf-8').read().splitlines() + lines = tools.read_file(cover_fname, binary=False).splitlines() self.assertEqual( 'Subject: [RFC PATCH some-branch v3 0/2] test: A test patch series', lines[3]) self.assertEqual(expected.splitlines(), lines[7:]) for i, fname in enumerate(args): - lines = open(fname, encoding='utf-8').read().splitlines() + lines = tools.read_file(fname, binary=False).splitlines() subject = [line for line in lines if line.startswith('Subject')] self.assertEqual('Subject: [RFC %d/%d]' % (i + 1, count), subject[0][:18]) @@ -414,152 +384,6 @@ Changes in v2: self.assertEqual('base-commit: 1a44532', lines[pos + 3]) self.assertEqual('branch: mybranch', lines[pos + 4]) - def make_commit_with_file(self, subject, body, fname, text): - """Create a file and add it to the git repo with a new commit - - Args: - subject (str): Subject for the commit - body (str): Body text of the commit - fname (str): Filename of file to create - text (str): Text to put into the file - """ - path = os.path.join(self.tmpdir, fname) - tools.write_file(path, text, binary=False) - index = self.repo.index - index.add(fname) - # pylint doesn't seem to find this - # pylint: disable=E1101 - author = pygit2.Signature('Test user', 'test@email.com') - committer = author - tree = index.write_tree() - message = subject + '\n' + body - self.repo.create_commit('HEAD', author, committer, message, tree, - [self.repo.head.target]) - - def make_git_tree(self): - """Make a simple git tree suitable for testing - - It has three branches: - 'base' has two commits: PCI, main - 'first' has base as upstream and two more commits: I2C, SPI - 'second' has base as upstream and three more: video, serial, bootm - - Returns: - pygit2.Repository: repository - """ - repo = pygit2.init_repository(self.gitdir) - self.repo = repo - new_tree = repo.TreeBuilder().write() - - common = ['git', f'--git-dir={self.gitdir}', 'config'] - tools.run(*(common + ['user.name', 'Dummy']), cwd=self.gitdir) - tools.run(*(common + ['user.email', 'dumdum@dummy.com']), - cwd=self.gitdir) - - # pylint doesn't seem to find this - # pylint: disable=E1101 - author = pygit2.Signature('Test user', 'test@email.com') - committer = author - _ = repo.create_commit('HEAD', author, committer, 'Created master', - new_tree, []) - - self.make_commit_with_file('Initial commit', ''' -Add a README - -''', 'README', '''This is the README file -describing this project -in very little detail''') - - self.make_commit_with_file('pci: PCI implementation', ''' -Here is a basic PCI implementation - -''', 'pci.c', '''This is a file -it has some contents -and some more things''') - self.make_commit_with_file('main: Main program', ''' -Hello here is the second commit. -''', 'main.c', '''This is the main file -there is very little here -but we can always add more later -if we want to - -Series-to: u-boot -Series-cc: Barry Crump -''') - base_target = repo.revparse_single('HEAD') - self.make_commit_with_file('i2c: I2C things', ''' -This has some stuff to do with I2C -''', 'i2c.c', '''And this is the file contents -with some I2C-related things in it''') - self.make_commit_with_file('spi: SPI fixes', ''' -SPI needs some fixes -and here they are - -Signed-off-by: %s - -Series-to: u-boot -Commit-notes: -title of the series -This is the cover letter for the series -with various details -END -''' % self.leb, 'spi.c', '''Some fixes for SPI in this -file to make SPI work -better than before''') - first_target = repo.revparse_single('HEAD') - - target = repo.revparse_single('HEAD~2') - # pylint doesn't seem to find this - # pylint: disable=E1101 - repo.reset(target.oid, pygit2.enums.ResetMode.HARD) - self.make_commit_with_file('video: Some video improvements', ''' -Fix up the video so that -it looks more purple. Purple is -a very nice colour. -''', 'video.c', '''More purple here -Purple and purple -Even more purple -Could not be any more purple''') - self.make_commit_with_file('serial: Add a serial driver', f''' -Here is the serial driver -for my chip. - -Cover-letter: -{self.TITLE_SECOND} -This series implements support -for my glorious board. -END -Series-to: u-boot -Series-links: {self.SERIES_ID_SECOND_V1} -''', 'serial.c', '''The code for the -serial driver is here''') - self.make_commit_with_file('bootm: Make it boot', ''' -This makes my board boot -with a fix to the bootm -command -''', 'bootm.c', '''Fix up the bootm -command to make the code as -complicated as possible''') - second_target = repo.revparse_single('HEAD') - - repo.branches.local.create('first', first_target) - repo.config.set_multivar('branch.first.remote', '', '.') - repo.config.set_multivar('branch.first.merge', '', 'refs/heads/base') - - repo.branches.local.create('second', second_target) - repo.config.set_multivar('branch.second.remote', '', '.') - repo.config.set_multivar('branch.second.merge', '', 'refs/heads/base') - - repo.branches.local.create('base', base_target) - - target = repo.lookup_reference('refs/heads/first') - repo.checkout(target, strategy=pygit2.GIT_CHECKOUT_FORCE) - target = repo.revparse_single('HEAD') - repo.reset(target.oid, pygit2.enums.ResetMode.HARD) - - self.assertFalse(gitutil.check_dirty(self.gitdir, self.tmpdir)) - return repo - def test_branch(self): """Test creating patches from a branch""" repo = self.make_git_tree() @@ -787,13 +611,25 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c finally: os.chdir(orig_dir) - def _RunPatman(self, *args): + def run_patman(self, *args): + """Run patman using the provided arguments + + This runs the patman executable from scratch, as opposed to calling + the control.do_patman() function. + + Args: + args (list of str): Arguments to pass (excluding argv[0]) + + Return: + CommandResult: Result of execution + """ all_args = [self._patman_pathname] + list(args) return command.run_one(*all_args, capture=True, capture_stderr=True) - def testFullHelp(self): + def test_full_help(self): + """Test getting full help""" command.TEST_RESULT = None - result = self._RunPatman('-H') + result = self.run_patman('-H') help_file = os.path.join(self._patman_dir, 'README.rst') # Remove possible extraneous strings extra = '::::::::::::::\n' + help_file + '\n::::::::::::::\n' @@ -802,9 +638,10 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c self.assertEqual(0, len(result.stderr)) self.assertEqual(0, result.return_code) - def testHelp(self): + def test_help(self): + """Test getting help with commands and arguments""" command.TEST_RESULT = None - result = self._RunPatman('-h') + result = self.run_patman('-h') self.assertTrue(len(result.stdout) > 1000) self.assertEqual(0, len(result.stderr)) self.assertEqual(0, result.return_code) -- cgit v1.2.3 From 2610699420052f4f5fb21577c8181e79475a9086 Mon Sep 17 00:00:00 2001 From: Simon Glass Date: Sat, 10 May 2025 13:05:05 +0200 Subject: patman: Update status command support cover-letter info Add support to the status module for reading and supporting cover letters, including comments. Plumb this through to the patchwork module. The actual support in the latter is not yet integrated. Signed-off-by: Simon Glass --- tools/patman/func_test.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) (limited to 'tools/patman/func_test.py') diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py index 2faff8019f6..d029181765c 100644 --- a/tools/patman/func_test.py +++ b/tools/patman/func_test.py @@ -669,7 +669,8 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c pwork = patchwork.Patchwork.for_testing(self._fake_patchwork) with terminal.capture() as (_, err): loop = asyncio.get_event_loop() - patches = loop.run_until_complete(status.check_status(1234, pwork)) + _, patches = loop.run_until_complete(status.check_status(1234, + pwork)) status.check_patch_count(0, len(patches)) self.assertIn('Warning: Patchwork reports 1 patches, series has 0', err.getvalue()) @@ -678,7 +679,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c """Test handling a single patch in Patchwork""" pwork = patchwork.Patchwork.for_testing(self._fake_patchwork) loop = asyncio.get_event_loop() - patches = loop.run_until_complete(status.check_status(1234, pwork)) + _, patches = loop.run_until_complete(status.check_status(1234, pwork)) self.assertEqual(1, len(patches)) patch = patches[0] self.assertEqual('1', patch.id) @@ -928,7 +929,7 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c terminal.set_print_test_mode() pwork = patchwork.Patchwork.for_testing(self._fake_patchwork2) status.check_and_show_status(series, '1234', None, None, False, False, - pwork) + False, pwork) itr = iter(terminal.get_print_test_lines()) col = terminal.Color() self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.YELLOW), @@ -1041,8 +1042,9 @@ diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c terminal.set_print_test_mode() pwork = patchwork.Patchwork.for_testing(self._fake_patchwork3) - status.check_and_show_status(series, '1234', branch, dest_branch, - False, False, pwork, repo) + status.check_and_show_status( + series, '1234', branch, dest_branch, False, False, False, pwork, + repo) lines = terminal.get_print_test_lines() self.assertEqual(12, len(lines)) self.assertEqual( @@ -1244,8 +1246,8 @@ Reviewed-by: %s series.commits = [commit1, commit2] terminal.set_print_test_mode() pwork = patchwork.Patchwork.for_testing(self._fake_patchwork2) - status.check_and_show_status(series, '1234', None, None, False, True, - pwork) + status.check_and_show_status( + series, '1234', None, None, False, True, False, pwork) itr = iter(terminal.get_print_test_lines()) col = terminal.Color() self.assertEqual(terminal.PrintLine(' 1 Subject 1', col.YELLOW), -- cgit v1.2.3