mirror of
https://gerrit.googlesource.com/git-repo
synced 2024-12-21 07:16:21 +00:00
bec4fe8aa3
Use multiprocessing to run in parallel. When operating on multiple projects, this can greatly speed things up. Across 1000 repos, it goes from ~10sec to ~4sec with the default -j8. This only does a simple conversion over to get an easy speedup. It is currently written to collect all results before displaying them. If we refactored this module more, we could have it display results as they came in. Change-Id: I5caf4ca51df0b7f078f0db104ae5232268482c1c Reviewed-on: https://gerrit-review.googlesource.com/c/git-repo/+/298643 Reviewed-by: Chris Mcdonald <cjmcdonald@google.com> Tested-by: Mike Frysinger <vapier@google.com>
86 lines
2.6 KiB
Python
86 lines
2.6 KiB
Python
# Copyright (C) 2008 The Android Open Source Project
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import itertools
|
|
import multiprocessing
|
|
|
|
from color import Coloring
|
|
from command import DEFAULT_LOCAL_JOBS, PagedCommand, WORKER_BATCH_SIZE
|
|
|
|
|
|
class Prune(PagedCommand):
|
|
common = True
|
|
helpSummary = "Prune (delete) already merged topics"
|
|
helpUsage = """
|
|
%prog [<project>...]
|
|
"""
|
|
PARALLEL_JOBS = DEFAULT_LOCAL_JOBS
|
|
|
|
def _ExecuteOne(self, project):
|
|
"""Process one project."""
|
|
return project.PruneHeads()
|
|
|
|
def Execute(self, opt, args):
|
|
projects = self.GetProjects(args)
|
|
|
|
# NB: Should be able to refactor this module to display summary as results
|
|
# come back from children.
|
|
def _ProcessResults(results):
|
|
return list(itertools.chain.from_iterable(results))
|
|
|
|
# NB: Multiprocessing is heavy, so don't spin it up for one job.
|
|
if len(projects) == 1 or opt.jobs == 1:
|
|
all_branches = _ProcessResults(self._ExecuteOne(x) for x in projects)
|
|
else:
|
|
with multiprocessing.Pool(opt.jobs) as pool:
|
|
results = pool.imap(
|
|
self._ExecuteOne, projects,
|
|
chunksize=WORKER_BATCH_SIZE)
|
|
all_branches = _ProcessResults(results)
|
|
|
|
if not all_branches:
|
|
return
|
|
|
|
class Report(Coloring):
|
|
def __init__(self, config):
|
|
Coloring.__init__(self, config, 'status')
|
|
self.project = self.printer('header', attr='bold')
|
|
|
|
out = Report(all_branches[0].project.config)
|
|
out.project('Pending Branches')
|
|
out.nl()
|
|
|
|
project = None
|
|
|
|
for branch in all_branches:
|
|
if project != branch.project:
|
|
project = branch.project
|
|
out.nl()
|
|
out.project('project %s/' % project.relpath)
|
|
out.nl()
|
|
|
|
print('%s %-33s ' % (
|
|
branch.name == project.CurrentBranch and '*' or ' ',
|
|
branch.name), end='')
|
|
|
|
if not branch.base_exists:
|
|
print('(ignoring: tracking branch is gone: %s)' % (branch.base,))
|
|
else:
|
|
commits = branch.commits
|
|
date = branch.date
|
|
print('(%2d commit%s, %s)' % (
|
|
len(commits),
|
|
len(commits) != 1 and 's' or ' ',
|
|
date))
|