From d75c669fac50f5224b567127291976fd36b31546 Mon Sep 17 00:00:00 2001 From: Olof Johansson <olof.johansson@sonymobile.com> Date: Tue, 9 Oct 2012 08:25:55 +0200 Subject: [PATCH] Add regex matching to repo list command The repo list -r command will execute a regex search for every argument provided on both the project name and the project worktree path. Useful for finding rarely used gits. Change-Id: Iaff90dd36c240b3d5d74817d11469be22d77ae03 --- subcmds/list.py | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/subcmds/list.py b/subcmds/list.py index 2be82570..6058a755 100644 --- a/subcmds/list.py +++ b/subcmds/list.py @@ -13,13 +13,16 @@ # See the License for the specific language governing permissions and # limitations under the License. +import re + from command import Command, MirrorSafeCommand class List(Command, MirrorSafeCommand): common = True helpSummary = "List projects and their associated directories" helpUsage = """ -%prog [<project>...] +%prog [-f] [<project>...] +%prog [-f] -r str1 [str2]..." """ helpDescription = """ List all projects; pass '.' to list the project for the cwd. @@ -27,6 +30,14 @@ List all projects; pass '.' to list the project for the cwd. This is similar to running: repo forall -c 'echo "$REPO_PATH : $REPO_PROJECT"'. """ + def _Options(self, p, show_smart=True): + p.add_option('-r', '--regex', + dest='regex', action='store_true', + help="Filter the project list based on regex or wildcard matching of strings") + p.add_option('-f', '--fullpath', + dest='fullpath', action='store_true', + help="Display the full work tree path instead of the relative path") + def Execute(self, opt, args): """List all projects and the associated directories. @@ -35,14 +46,33 @@ This is similar to running: repo forall -c 'echo "$REPO_PATH : $REPO_PROJECT"'. discoverable. Args: - opt: The options. We don't take any. + opt: The options. args: Positional args. Can be a list of projects to list, or empty. """ - projects = self.GetProjects(args) + if not opt.regex: + projects = self.GetProjects(args) + else: + projects = self.FindProjects(args) + + def _getpath(x): + if opt.fullpath: + return x.worktree + return x.relpath lines = [] for project in projects: - lines.append("%s : %s" % (project.relpath, project.name)) + lines.append("%s : %s" % (_getpath(project), project.name)) 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