patman: Improve Series support for patchwork links

Update Series with a way to better manage the Series-links lines in
patches. Use this in the 'status' subcommand instead of the existing
primitive method of expecting a link without a version prefix.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2025-05-10 13:05:11 +02:00
parent dcf630b3be
commit e8b64cfdbb
2 changed files with 71 additions and 9 deletions

View File

@ -20,8 +20,11 @@ except ImportError:
from u_boot_pylib import gitutil
from u_boot_pylib import terminal
from u_boot_pylib import tools
from u_boot_pylib import tout
from patman import cseries
from patman import cser_helper
from patman import patchstream
from patman import patchwork
from patman.patchwork import Patchwork
from patman import send
from patman import settings
@ -70,9 +73,11 @@ def patchwork_status(branch, count, start, end, dest_branch, force,
Raises:
ValueError: if the branch has no Series-link value
"""
if not branch:
branch = gitutil.get_branch()
if count == -1:
# Work out how many patches to send if we can
count = (gitutil.count_commits_to_branch(branch) - start)
count = gitutil.count_commits_to_branch(branch) - start
series = patchstream.get_metadata(branch, start, count - end)
warnings = 0
@ -89,21 +94,23 @@ def patchwork_status(branch, count, start, end, dest_branch, force,
if not links:
raise ValueError("Branch has no Series-links value")
# Find the link without a version number (we don't support versions yet)
found = [link for link in links.split() if not ':' in link]
if not found:
raise ValueError('Series-links has no current version (without :)')
_, version = cser_helper.split_name_version(branch)
link = series.get_link_for_version(version, links)
if not link:
raise ValueError('Series-links has no link for v{version}')
tout.debug(f"Link '{link}")
# Allow the series to override the URL
if 'patchwork_url' in series:
url = series.patchwork_url
pwork = patchwork.Patchwork(url, single_thread=single_thread)
pwork = Patchwork(url, single_thread=single_thread)
# Import this here to avoid failing on other commands if the dependencies
# are not present
from patman import status
status.check_and_show_status(series, found[0], branch, dest_branch, force,
show_comments, pwork)
pwork = Patchwork(url)
status.check_and_show_status(series, link, branch, dest_branch, force,
show_comments, False, pwork)
def do_patman(args):

View File

@ -430,3 +430,58 @@ class Series(dict):
if self.get('postfix'):
postfix = ' %s' % self['postfix']
return '%s%sPATCH%s%s' % (git_prefix, prefix, postfix, version)
def get_links(self, links_str=None, cur_version=None):
"""Look up the patchwork links for each version
Args:
links_str (str): Links string to parse, or None to use self.links
cur_version (int): Default version to assume for un-versioned links,
or None to use self.version
Return:
dict:
key (int): Version number
value (str): Link string
"""
if links_str is None:
links_str = self.links if 'links' in self else ''
if cur_version is None:
cur_version = int(self.version) if 'version' in self else 1
assert isinstance(cur_version, int)
links = {}
for item in links_str.split():
if ':' in item:
version, link = item.split(':')
links[int(version)] = link
else:
links[cur_version] = item
return links
def build_links(self, links):
"""Build a string containing the links
Args:
links (dict):
key (int): Version number
value (str): Link string
Return:
str: Link string, e.g. '2:4433 1:2872'
"""
out = ''
for vers in sorted(links.keys(), reverse=True):
out += f' {vers}:{links[vers]}'
return out[1:]
def get_link_for_version(self, find_vers, links_str=None):
"""Look up the patchwork link for a particular version
Args:
find_vers (int): Version to find
links_str (str): Links string to parse, or None to use self.links
Return:
str: Series-links entry for that version, or None if not found
"""
return self.get_links(links_str).get(find_vers)