From a8864fba9fd21f412cd0e2c6e072deeb204049bb Mon Sep 17 00:00:00 2001 From: Zhiguang Li Date: Fri, 15 Mar 2013 10:32:10 +0800 Subject: [PATCH] Add regex support for subcommand forall Filter the project list based on regex or wildcard matching of strings, then we can handle subset of all projects. Change-Id: Ib6c23aec79e7d981f7b6a5eb0ae93c44effec467 Signed-off-by: Zhiguang Li --- command.py | 11 +++++++++++ subcmds/forall.py | 14 +++++++++++++- subcmds/list.py | 12 ------------ 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/command.py b/command.py index 959805a2..66a9e74d 100644 --- a/command.py +++ b/command.py @@ -186,6 +186,17 @@ class Command(object): result.sort(key=_getpath) return result + def FindProjects(self, args): + result = [] + for project in self.GetProjects(''): + for arg in args: + pattern = re.compile(r'%s' % arg, re.IGNORECASE) + if pattern.search(project.name) or pattern.search(project.relpath): + result.append(project) + break + result.sort(key=lambda project: project.relpath) + return result + # pylint: disable=W0223 # Pylint warns that the `InteractiveCommand` and `PagedCommand` classes do not # override method `Execute` which is abstract in `Command`. Since that method diff --git a/subcmds/forall.py b/subcmds/forall.py index 4c1c9ff8..7d5f7794 100644 --- a/subcmds/forall.py +++ b/subcmds/forall.py @@ -42,10 +42,14 @@ class Forall(Command, MirrorSafeCommand): helpSummary = "Run a shell command in each project" helpUsage = """ %prog [...] -c [...] +%prog -r str1 [str2] ... -c [...]" """ helpDescription = """ Executes the same shell command in each project. +The -r option allows running the command only on projects matching +regex or wildcard expression. + Output Formatting ----------------- @@ -103,6 +107,9 @@ without iterating through the remaining projects. setattr(parser.values, option.dest, list(parser.rargs)) while parser.rargs: del parser.rargs[0] + p.add_option('-r', '--regex', + dest='regex', action='store_true', + help="Execute the command only on projects matching regex or wildcard expression") p.add_option('-c', '--command', help='Command (and arguments) to execute', dest='command', @@ -166,7 +173,12 @@ without iterating through the remaining projects. rc = 0 first = True - for project in self.GetProjects(args): + if not opt.regex: + projects = self.GetProjects(args) + else: + projects = self.FindProjects(args) + + for project in projects: env = os.environ.copy() def setenv(name, val): if val is None: diff --git a/subcmds/list.py b/subcmds/list.py index 8eb06cdd..a3358245 100644 --- a/subcmds/list.py +++ b/subcmds/list.py @@ -14,7 +14,6 @@ # limitations under the License. from __future__ import print_function -import re import sys from command import Command, MirrorSafeCommand @@ -83,14 +82,3 @@ This is similar to running: repo forall -c 'echo "$REPO_PATH : $REPO_PROJECT"'. lines.sort() print('\n'.join(lines)) - - def FindProjects(self, args): - result = [] - for project in self.GetProjects(''): - for arg in args: - pattern = re.compile(r'%s' % arg, re.IGNORECASE) - if pattern.search(project.name) or pattern.search(project.relpath): - result.append(project) - break - result.sort(key=lambda project: project.relpath) - return result