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 <muzili@gmail.com>
diff --git a/command.py b/command.py
index 959805a..66a9e74 100644
--- a/command.py
+++ b/command.py
@@ -186,6 +186,17 @@
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 4c1c9ff..7d5f779 100644
--- a/subcmds/forall.py
+++ b/subcmds/forall.py
@@ -42,10 +42,14 @@
helpSummary = "Run a shell command in each project"
helpUsage = """
%prog [<project>...] -c <command> [<arg>...]
+%prog -r str1 [str2] ... -c <command> [<arg>...]"
"""
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 @@
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 @@
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 8eb06cd..a335824 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 @@
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