[Concept,19/32] patman: Allow setting the upstream when adding a series

Message ID 20260226200106.1727176-20-sjg@u-boot.org
State New
Headers
Series patman: Add multi-upstream support |

Commit Message

Simon Glass Feb. 26, 2026, 8 p.m. UTC
  From: Simon Glass <simon.glass@canonical.com>

Adding a series always creates it with no upstream, requiring a separate
'set-upstream' command afterwards. Add a -S/--set-upstream option to
'series add' so the upstream can be specified in one step.

If the series already exists (e.g. when adding a new version), the
upstream is also updated.

Signed-off-by: Simon Glass <simon.glass@canonical.com>
---

 tools/patman/cmdline.py      |  2 ++
 tools/patman/control.py      |  3 ++-
 tools/patman/cseries.py      | 17 ++++++++++-------
 tools/patman/test_cseries.py | 17 +++++++++++++++++
 4 files changed, 31 insertions(+), 8 deletions(-)
  

Patch

diff --git a/tools/patman/cmdline.py b/tools/patman/cmdline.py
index f24d0aacdff..57c56b099e1 100644
--- a/tools/patman/cmdline.py
+++ b/tools/patman/cmdline.py
@@ -242,6 +242,8 @@  def add_series_subparser(subparsers):
     add.add_argument(
         '-f', '--force-version', action='store_true',
         help='Change the Series-version on a series to match its branch')
+    add.add_argument('-S', '--set-upstream',
+                     help='Set the upstream for this series')
     _add_mark(add)
     _add_allow_unmarked(add)
     _upstream_add(add)
diff --git a/tools/patman/control.py b/tools/patman/control.py
index e1f52300a17..7f162b4aadb 100644
--- a/tools/patman/control.py
+++ b/tools/patman/control.py
@@ -161,7 +161,8 @@  def do_series(args, test_db=None, pwork=None, cser=None):
         if args.subcmd == 'add':
             cser.add(args.series, args.desc, mark=args.mark,
                      allow_unmarked=args.allow_unmarked, end=args.upstream,
-                     use_commit=args.use_first_commit, dry_run=args.dry_run)
+                     use_commit=args.use_first_commit,
+                     ups=args.set_upstream, dry_run=args.dry_run)
         elif args.subcmd == 'archive':
             cser.archive(args.series)
         elif args.subcmd == 'autolink':
diff --git a/tools/patman/cseries.py b/tools/patman/cseries.py
index 612ccfda7dc..6369b626035 100644
--- a/tools/patman/cseries.py
+++ b/tools/patman/cseries.py
@@ -39,7 +39,8 @@  class Cseries(cser_helper.CseriesHelper):
         super().__init__(topdir, colour)
 
     def add(self, branch_name, desc=None, mark=False, allow_unmarked=False,
-            end=None, use_commit=False, force_version=False, dry_run=False):
+            end=None, use_commit=False, force_version=False, ups=None,
+            dry_run=False):
         """Add a series (or new version of a series) to the database
 
         Args:
@@ -47,13 +48,13 @@  class Cseries(cser_helper.CseriesHelper):
             desc (str): Description to use, or None to use the series subject
             mark (str): True to mark each commit with a change ID
             allow_unmarked (str): True to not require each commit to be marked
-            end (str): Add only commits up to but exclu
-            use_commit (bool)): True to use the first commit's subject as the
+            end (str): Add only commits up to but excluding this commit
+            use_commit (bool): True to use the first commit's subject as the
                 series description, if none is available in the series or
-                provided in 'desc')
-
+                provided in 'desc'
             force_version (bool): True if ignore a Series-version tag that
                 doesn't match its branch name
+            ups (str or None): Name of the upstream for this series
             dry_run (bool): True to do a dry run
         """
         name, ser, version, msg = self.prep_series(branch_name, end)
@@ -70,7 +71,7 @@  class Cseries(cser_helper.CseriesHelper):
                     raise ValueError(f"Branch '{name}' has no cover letter - "
                                     'please provide description')
             if not desc:
-                desc = ser['cover'][0]
+                desc = ser.cover[0]  # pylint: disable=E1136
 
         ser = self._handle_mark(name, ser, version, mark, allow_unmarked,
                                 force_version, dry_run)
@@ -80,9 +81,11 @@  class Cseries(cser_helper.CseriesHelper):
         added = False
         series_id = self.db.series_find_by_name(ser.name)
         if not series_id:
-            series_id = self.db.series_add(ser.name, desc)
+            series_id = self.db.series_add(ser.name, desc, ups=ups)
             added = True
             msg += f" series '{ser.name}'"
+        elif ups:
+            self.db.series_set_upstream(series_id, ups)
 
         if version not in self._get_version_list(series_id):
             svid = self.db.ser_ver_add(series_id, version, link)
diff --git a/tools/patman/test_cseries.py b/tools/patman/test_cseries.py
index b14c6c22ddc..98acc1de184 100644
--- a/tools/patman/test_cseries.py
+++ b/tools/patman/test_cseries.py
@@ -799,6 +799,7 @@  Tested-by: Mary Smith <msmith@wibble.com>   # yak
         self.make_git_tree()
         args = Namespace(subcmd='add', desc='my-description', series='first',
                          mark=False, allow_unmarked=True, upstream=None,
+                         set_upstream=None,
                          use_first_commit=False, dry_run=False)
         with terminal.capture() as (out, _):
             control.do_series(args, test_db=self.tmpdir, pwork=True)
@@ -823,6 +824,21 @@  Tested-by: Mary Smith <msmith@wibble.com>   # yak
             'first            my-description                                 '
             '-/2      1', lines[2])
 
+    def test_do_series_add_upstream(self):
+        """Test that series add can set the upstream"""
+        self.make_git_tree()
+        args = Namespace(subcmd='add', desc='my-description', series='first',
+                         mark=False, allow_unmarked=True, upstream=None,
+                         set_upstream='origin',
+                         use_first_commit=False, dry_run=False)
+        with terminal.capture():
+            control.do_series(args, test_db=self.tmpdir, pwork=True)
+
+        cser = self.get_database()
+        slist = cser.db.series_get_dict()
+        ser = slist.get('first')
+        self.assertEqual('origin', ser.upstream)
+
     def test_do_series_add_cmdline(self):
         """Add a new cseries using the cmdline"""
         self.make_git_tree()
@@ -847,6 +863,7 @@  Tested-by: Mary Smith <msmith@wibble.com>   # yak
                          force=True)
         args = Namespace(subcmd='add', series=None, mark=False,
                          allow_unmarked=True, upstream=None, dry_run=False,
+                         set_upstream=None,
                          desc=None, use_first_commit=False)
         with terminal.capture():
             control.do_series(args, test_db=self.tmpdir, pwork=True)