[PATCH 05/20] patman: Allow setting the current directory when sending
Simon Glass
sjg at chromium.org
Thu May 8 09:28:29 CEST 2025
Plumb a current-working-directory (cwd) through from send all the way to
the command gitutil libraries. This will allow better testing of this
functionality, since we can use a test directory.
Signed-off-by: Simon Glass <sjg at chromium.org>
---
tools/patman/checkpatch.py | 12 ++++++++----
tools/patman/patchstream.py | 14 ++++++++++----
tools/patman/send.py | 33 +++++++++++++++++++--------------
tools/patman/series.py | 13 ++++++++-----
4 files changed, 45 insertions(+), 27 deletions(-)
diff --git a/tools/patman/checkpatch.py b/tools/patman/checkpatch.py
index 2975881705c..5df06b1095a 100644
--- a/tools/patman/checkpatch.py
+++ b/tools/patman/checkpatch.py
@@ -187,7 +187,8 @@ def check_patch_parse(checkpatch_output, verbose=False):
return result
-def check_patch(fname, verbose=False, show_types=False, use_tree=False):
+def check_patch(fname, verbose=False, show_types=False, use_tree=False,
+ cwd=None):
"""Run checkpatch.pl on a file and parse the results.
Args:
@@ -196,6 +197,7 @@ def check_patch(fname, verbose=False, show_types=False, use_tree=False):
parsed
show_types: Tell checkpatch to show the type (number) of each message
use_tree (bool): If False we'll pass '--no-tree' to checkpatch.
+ cwd (str): Path to use for patch files (None to use current dir)
Returns:
namedtuple containing:
@@ -217,7 +219,8 @@ def check_patch(fname, verbose=False, show_types=False, use_tree=False):
args.append('--no-tree')
if show_types:
args.append('--show-types')
- output = command.output(*args, fname, raise_on_error=False)
+ output = command.output(*args, os.path.join(cwd or '', fname),
+ raise_on_error=False)
return check_patch_parse(output, verbose)
@@ -240,7 +243,7 @@ def get_warning_msg(col, msg_type, fname, line, msg):
line_str = '' if line is None else '%d' % line
return '%s:%s: %s: %s\n' % (fname, line_str, msg_type, msg)
-def check_patches(verbose, args, use_tree):
+def check_patches(verbose, args, use_tree, cwd):
'''Run the checkpatch.pl script on each patch'''
error_count, warning_count, check_count = 0, 0, 0
col = terminal.Color()
@@ -248,7 +251,8 @@ def check_patches(verbose, args, use_tree):
with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor:
futures = []
for fname in args:
- f = executor.submit(check_patch, fname, verbose, use_tree=use_tree)
+ f = executor.submit(check_patch, fname, verbose, use_tree=use_tree,
+ cwd=cwd)
futures.append(f)
for fname, f in zip(args, futures):
diff --git a/tools/patman/patchstream.py b/tools/patman/patchstream.py
index 7a695c37c27..3ec06a6b5f5 100644
--- a/tools/patman/patchstream.py
+++ b/tools/patman/patchstream.py
@@ -792,7 +792,7 @@ def get_metadata_for_test(text):
return series
def fix_patch(backup_dir, fname, series, cmt, keep_change_id=False,
- insert_base_commit=False):
+ insert_base_commit=False, cwd=None):
"""Fix up a patch file, by adding/removing as required.
We remove our tags from the patch file, insert changes lists, etc.
@@ -807,10 +807,12 @@ def fix_patch(backup_dir, fname, series, cmt, keep_change_id=False,
cmt (Commit): Commit object for this patch file
keep_change_id (bool): Keep the Change-Id tag.
insert_base_commit (bool): True to add the base commit to the end
+ cwd (str): Directory containing filename, or None for current
Return:
list: A list of errors, each str, or [] if all ok.
"""
+ fname = os.path.join(cwd or '', fname)
handle, tmpname = tempfile.mkstemp()
outfd = os.fdopen(handle, 'w', encoding='utf-8')
infd = open(fname, 'r', encoding='utf-8')
@@ -827,7 +829,8 @@ def fix_patch(backup_dir, fname, series, cmt, keep_change_id=False,
shutil.move(tmpname, fname)
return cmt.warn
-def fix_patches(series, fnames, keep_change_id=False, insert_base_commit=False):
+def fix_patches(series, fnames, keep_change_id=False, insert_base_commit=False,
+ cwd=None):
"""Fix up a list of patches identified by filenames
The patch files are processed in place, and overwritten.
@@ -837,6 +840,7 @@ def fix_patches(series, fnames, keep_change_id=False, insert_base_commit=False):
fnames (:type: list of str): List of patch files to process
keep_change_id (bool): Keep the Change-Id tag.
insert_base_commit (bool): True to add the base commit to the end
+ cwd (str): Directory containing the patch files, or None for current
"""
# Current workflow creates patches, so we shouldn't need a backup
backup_dir = None #tempfile.mkdtemp('clean-patch')
@@ -847,7 +851,7 @@ def fix_patches(series, fnames, keep_change_id=False, insert_base_commit=False):
cmt.count = count
result = fix_patch(backup_dir, fname, series, cmt,
keep_change_id=keep_change_id,
- insert_base_commit=insert_base_commit)
+ insert_base_commit=insert_base_commit, cwd=cwd)
if result:
print('%d warning%s for %s:' %
(len(result), 's' if len(result) > 1 else '', fname))
@@ -857,14 +861,16 @@ def fix_patches(series, fnames, keep_change_id=False, insert_base_commit=False):
count += 1
print('Cleaned %d patch%s' % (count, 'es' if count > 1 else ''))
-def insert_cover_letter(fname, series, count):
+def insert_cover_letter(fname, series, count, cwd=None):
"""Inserts a cover letter with the required info into patch 0
Args:
fname (str): Input / output filename of the cover letter file
series (Series): Series object
count (int): Number of patches in the series
+ cwd (str): Directory containing filename, or None for current
"""
+ fname = os.path.join(cwd or '', fname)
fil = open(fname, 'r')
lines = fil.readlines()
fil.close()
diff --git a/tools/patman/send.py b/tools/patman/send.py
index d9ef445a4f5..a2db3cff07f 100644
--- a/tools/patman/send.py
+++ b/tools/patman/send.py
@@ -15,7 +15,7 @@ from u_boot_pylib import gitutil
from u_boot_pylib import terminal
-def check_patches(series, patch_files, run_checkpatch, verbose, use_tree):
+def check_patches(series, patch_files, run_checkpatch, verbose, use_tree, cwd):
"""Run some checks on a set of patches
This santiy-checks the patman tags like Series-version and runs the patches
@@ -29,6 +29,7 @@ def check_patches(series, patch_files, run_checkpatch, verbose, use_tree):
verbose (bool): True to print out every line of the checkpatch output as
it is parsed
use_tree (bool): If False we'll pass '--no-tree' to checkpatch.
+ cwd (str): Path to use for patch files (None to use current dir)
Returns:
bool: True if the patches had no errors, False if they did
@@ -38,7 +39,7 @@ def check_patches(series, patch_files, run_checkpatch, verbose, use_tree):
# Check the patches
if run_checkpatch:
- ok = checkpatch.check_patches(verbose, patch_files, use_tree)
+ ok = checkpatch.check_patches(verbose, patch_files, use_tree, cwd)
else:
ok = True
return ok
@@ -46,7 +47,7 @@ def check_patches(series, patch_files, run_checkpatch, verbose, use_tree):
def email_patches(col, series, cover_fname, patch_files, process_tags, its_a_go,
ignore_bad_tags, add_maintainers, get_maintainer_script, limit,
- dry_run, in_reply_to, thread, smtp_server):
+ dry_run, in_reply_to, thread, smtp_server, cwd=None):
"""Email patches to the recipients
This emails out the patches and cover letter using 'git send-email'. Each
@@ -85,18 +86,19 @@ def email_patches(col, series, cover_fname, patch_files, process_tags, its_a_go,
thread (bool): True to add --thread to git send-email (make all patches
reply to cover-letter or first patch in series)
smtp_server (str): SMTP server to use to send patches (None for default)
+ cwd (str): Path to use for patch files (None to use current dir)
"""
cc_file = series.MakeCcFile(process_tags, cover_fname, not ignore_bad_tags,
add_maintainers, limit, get_maintainer_script,
- settings.alias)
+ settings.alias, cwd)
# Email the patches out (giving the user time to check / cancel)
cmd = ''
if its_a_go:
cmd = gitutil.email_patches(
series, cover_fname, patch_files, dry_run, not ignore_bad_tags,
- cc_file, settings.alias, in_reply_to=in_reply_to, thread=thread,
- smtp_server=smtp_server)
+ cc_file, alias=settings.alias, in_reply_to=in_reply_to,
+ thread=thread, smtp_server=smtp_server, cwd=cwd)
else:
print(col.build(col.RED, "Not sending emails due to errors/warnings"))
@@ -110,7 +112,7 @@ def email_patches(col, series, cover_fname, patch_files, process_tags, its_a_go,
def prepare_patches(col, branch, count, start, end, ignore_binary, signoff,
- keep_change_id=False):
+ keep_change_id=False, cwd=None):
"""Figure out what patches to generate, then generate them
The patch files are written to the current directory, e.g. 0001_xxx.patch
@@ -126,6 +128,7 @@ def prepare_patches(col, branch, count, start, end, ignore_binary, signoff,
etc.)
ignore_binary (bool): Don't generate patches for binary files
keep_change_id (bool): Preserve the Change-Id tag.
+ cwd (str): Path to use for git operations (None to use current dir)
Returns:
Tuple:
@@ -147,29 +150,31 @@ def prepare_patches(col, branch, count, start, end, ignore_binary, signoff,
to_do = count - end
series = patchstream.get_metadata(branch, start, to_do)
cover_fname, patch_files = gitutil.create_patches(
- branch, start, to_do, ignore_binary, series, signoff)
+ branch, start, to_do, ignore_binary, series, signoff,
+ cwd=cwd)
# Fix up the patch files to our liking, and insert the cover letter
patchstream.fix_patches(series, patch_files, keep_change_id,
- insert_base_commit=not cover_fname)
+ insert_base_commit=not cover_fname, cwd=cwd)
if cover_fname and series.get('cover'):
- patchstream.insert_cover_letter(cover_fname, series, to_do)
+ patchstream.insert_cover_letter(cover_fname, series, to_do, cwd=cwd)
return series, cover_fname, patch_files
-def send(args):
+def send(args, cwd=None):
"""Create, check and send patches by email
Args:
args (argparse.Namespace): Arguments to patman
+ cwd (str): Path to use for git operations
"""
col = terminal.Color()
series, cover_fname, patch_files = prepare_patches(
col, args.branch, args.count, args.start, args.end,
args.ignore_binary, args.add_signoff,
- keep_change_id=args.keep_change_id)
+ keep_change_id=args.keep_change_id, cwd=cwd)
ok = check_patches(series, patch_files, args.check_patch,
- args.verbose, args.check_patch_use_tree)
+ args.verbose, args.check_patch_use_tree, cwd)
ok = ok and gitutil.check_suppress_cc_config()
@@ -178,4 +183,4 @@ def send(args):
col, series, cover_fname, patch_files, args.process_tags,
its_a_go, args.ignore_bad_tags, args.add_maintainers,
args.get_maintainer_script, args.limit, args.dry_run,
- args.in_reply_to, args.thread, args.smtp_server)
+ args.in_reply_to, args.thread, args.smtp_server, cwd=cwd)
diff --git a/tools/patman/series.py b/tools/patman/series.py
index 3ec33e022d0..66839a3dbea 100644
--- a/tools/patman/series.py
+++ b/tools/patman/series.py
@@ -245,7 +245,7 @@ class Series(dict):
def GetCcForCommit(self, commit, process_tags, warn_on_error,
add_maintainers, limit, get_maintainer_script,
- all_skips, alias):
+ all_skips, alias, cwd):
"""Get the email CCs to use with a particular commit
Uses subject tags and get_maintainers.pl script to find people to cc
@@ -268,6 +268,7 @@ class Series(dict):
alias (dict): Alias dictionary
key: alias
value: list of aliases or email addresses
+ cwd (str): Path to use for patch filenames (None to use current dir)
Returns:
list of str: List of email addresses to cc
@@ -281,8 +282,8 @@ class Series(dict):
if type(add_maintainers) == type(cc):
cc += add_maintainers
elif add_maintainers:
- cc += get_maintainer.get_maintainer(get_maintainer_script,
- commit.patch)
+ fname = os.path.join(cwd or '', commit.patch)
+ cc += get_maintainer.get_maintainer(get_maintainer_script, fname)
all_skips |= set(cc) & set(settings.bounces)
cc = list(set(cc) - set(settings.bounces))
if limit is not None:
@@ -290,7 +291,8 @@ class Series(dict):
return cc
def MakeCcFile(self, process_tags, cover_fname, warn_on_error,
- add_maintainers, limit, get_maintainer_script, alias):
+ add_maintainers, limit, get_maintainer_script, alias,
+ cwd=None):
"""Make a cc file for us to use for per-commit Cc automation
Also stores in self._generated_cc to make ShowActions() faster.
@@ -309,6 +311,7 @@ class Series(dict):
alias (dict): Alias dictionary
key: alias
value: list of aliases or email addresses
+ cwd (str): Path to use for patch filenames (None to use current dir)
Return:
Filename of temp file created
"""
@@ -324,7 +327,7 @@ class Series(dict):
commit.future = executor.submit(
self.GetCcForCommit, commit, process_tags, warn_on_error,
add_maintainers, limit, get_maintainer_script, all_skips,
- alias)
+ alias, cwd)
# Show progress any commits that are taking forever
lastlen = 0
--
2.43.0
More information about the U-Boot
mailing list