summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorSimon Glass <sjg@chromium.org>2023-03-08 21:52:54 +0300
committerSimon Glass <sjg@chromium.org>2023-03-09 00:15:14 +0300
commit27409e35d5fa56f1b51b6e0704081133e3881058 (patch)
treec975df040d9a7c36fb76ab51f93aaa56c0cd6d0e /tools
parentc524cd61397f11f106ea1e43cb31f8ce2bae2ebb (diff)
downloadu-boot-27409e35d5fa56f1b51b6e0704081133e3881058.tar.xz
patman: Run get_maintainer.pl in parallel
This script can take ages on some series. Try to limit the time by using threads. If a few stubborn patches remain, show progress so the user has some idea what is going on. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Douglas Anderson <dianders@chromium.org>
Diffstat (limited to 'tools')
-rw-r--r--tools/patman/func_test.py2
-rw-r--r--tools/patman/series.py33
2 files changed, 32 insertions, 3 deletions
diff --git a/tools/patman/func_test.py b/tools/patman/func_test.py
index 8c2dfbe452..42ac4ed77b 100644
--- a/tools/patman/func_test.py
+++ b/tools/patman/func_test.py
@@ -240,6 +240,8 @@ class TestFunctional(unittest.TestCase):
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':
+ pass
self.assertIn('Dry run', next(lines))
self.assertEqual('', next(lines))
self.assertIn('Send a total of %d patches' % count, next(lines))
diff --git a/tools/patman/series.py b/tools/patman/series.py
index e6f61e1fe2..6866e1dbd0 100644
--- a/tools/patman/series.py
+++ b/tools/patman/series.py
@@ -5,8 +5,11 @@
from __future__ import print_function
import collections
+import concurrent.futures
import itertools
import os
+import sys
+import time
from patman import get_maintainer
from patman import gitutil
@@ -303,10 +306,34 @@ class Series(dict):
fd = open(fname, 'w', encoding='utf-8')
all_ccs = []
all_skips = set()
+ with concurrent.futures.ThreadPoolExecutor(max_workers=16) as executor:
+ for i, commit in enumerate(self.commits):
+ commit.seq = i
+ commit.future = executor.submit(
+ self.GetCcForCommit, commit, process_tags, warn_on_error,
+ add_maintainers, limit, get_maintainer_script, all_skips)
+
+ # Show progress any commits that are taking forever
+ lastlen = 0
+ while True:
+ left = [commit for commit in self.commits
+ if not commit.future.done()]
+ if not left:
+ break
+ names = ', '.join(f'{c.seq + 1}:{c.subject}'
+ for c in left[:2])
+ out = f'\r{len(left)} remaining: {names}'[:79]
+ spaces = ' ' * (lastlen - len(out))
+ if lastlen: # Don't print anything the first time
+ print(out, spaces, end='')
+ sys.stdout.flush()
+ lastlen = len(out)
+ time.sleep(.25)
+ print(f'\rdone{" " * lastlen}\r', end='')
+ print('Cc processing complete')
+
for commit in self.commits:
- cc = self.GetCcForCommit(commit, process_tags, warn_on_error,
- add_maintainers, limit,
- get_maintainer_script, all_skips)
+ cc = commit.future.result()
all_ccs += cc
print(commit.patch, '\0'.join(sorted(set(cc))), file=fd)
self._generated_cc[commit.patch] = cc