Add --inverse-regex option to forall subcommand

Make it possible to exclude projects using regex/wildcard.

The syntax is similar to that of the -r option, e.g.:

  repo forall -i ^platform/ ^device/ -c 'echo $REPO_PROJECT'

Change-Id: Id250de5665152228c044c79337d3ac15b5696484
This commit is contained in:
Takeshi Kanemoto 2016-01-26 14:11:35 +09:00 committed by David Pursehouse
parent 936d6185eb
commit 1f0564406b
2 changed files with 16 additions and 5 deletions

View File

@ -193,14 +193,20 @@ class Command(object):
result.sort(key=_getpath) result.sort(key=_getpath)
return result return result
def FindProjects(self, args): def FindProjects(self, args, inverse=False):
result = [] result = []
patterns = [re.compile(r'%s' % a, re.IGNORECASE) for a in args] patterns = [re.compile(r'%s' % a, re.IGNORECASE) for a in args]
for project in self.GetProjects(''): for project in self.GetProjects(''):
for pattern in patterns: for pattern in patterns:
if pattern.search(project.name) or pattern.search(project.relpath): match = pattern.search(project.name) or pattern.search(project.relpath)
if not inverse and match:
result.append(project) result.append(project)
break break
if inverse and match:
break
else:
if inverse:
result.append(project)
result.sort(key=lambda project: project.relpath) result.sort(key=lambda project: project.relpath)
return result return result

View File

@ -120,6 +120,9 @@ without iterating through the remaining projects.
p.add_option('-r', '--regex', p.add_option('-r', '--regex',
dest='regex', action='store_true', dest='regex', action='store_true',
help="Execute the command only on projects matching regex or wildcard expression") help="Execute the command only on projects matching regex or wildcard expression")
p.add_option('-i', '--inverse-regex',
dest='inverse_regex', action='store_true',
help="Execute the command only on projects not matching regex or wildcard expression")
p.add_option('-g', '--groups', p.add_option('-g', '--groups',
dest='groups', dest='groups',
help="Execute the command only on projects matching the specified groups") help="Execute the command only on projects matching the specified groups")
@ -215,10 +218,12 @@ without iterating through the remaining projects.
if os.path.isfile(smart_sync_manifest_path): if os.path.isfile(smart_sync_manifest_path):
self.manifest.Override(smart_sync_manifest_path) self.manifest.Override(smart_sync_manifest_path)
if not opt.regex: if opt.regex:
projects = self.GetProjects(args, groups=opt.groups)
else:
projects = self.FindProjects(args) projects = self.FindProjects(args)
elif opt.inverse_regex:
projects = self.FindProjects(args, inverse=True)
else:
projects = self.GetProjects(args, groups=opt.groups)
os.environ['REPO_COUNT'] = str(len(projects)) os.environ['REPO_COUNT'] = str(len(projects))