Let run and grep take arbitrary arguments
This commit is contained in:
parent
820caf5555
commit
0e15691158
|
@ -10,17 +10,14 @@ from aeromancer.cli.run import ProjectShellCommandBase
|
||||||
|
|
||||||
|
|
||||||
class Grep(ProjectShellCommandBase):
|
class Grep(ProjectShellCommandBase):
|
||||||
"""Search the contents of files"""
|
"""Search the contents of files
|
||||||
|
|
||||||
|
Accepts most of the arguments of git-grep, unless they conflict
|
||||||
|
with other arguments to this command.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
|
||||||
parser = super(Grep, self).get_parser(prog_name)
|
|
||||||
parser.add_argument('pattern',
|
|
||||||
action='store',
|
|
||||||
help='regular expression',
|
|
||||||
)
|
|
||||||
return parser
|
|
||||||
|
|
||||||
def _get_command(self, parsed_args):
|
def _get_command(self, parsed_args):
|
||||||
return ['git', 'grep', parsed_args.pattern]
|
return ['git', 'grep'] + self._extra
|
||||||
|
|
|
@ -10,6 +10,23 @@ from aeromancer import project_filter
|
||||||
from cliff.command import Command
|
from cliff.command import Command
|
||||||
|
|
||||||
|
|
||||||
|
class ArgumentParserWrapper(object):
|
||||||
|
"""Wrap a regular argument parser to replace
|
||||||
|
parse_args with parse_known_args.
|
||||||
|
|
||||||
|
Cliff calls parse_args() for subcommands, but we want
|
||||||
|
parse_known_args() so any extra values that look like command
|
||||||
|
switches will be ignored.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, parser):
|
||||||
|
self._parser = parser
|
||||||
|
|
||||||
|
def parse_args(self, argv):
|
||||||
|
return self._parser.parse_known_args(argv)
|
||||||
|
|
||||||
|
|
||||||
class ProjectShellCommandBase(Command):
|
class ProjectShellCommandBase(Command):
|
||||||
"""Run a command for each project"""
|
"""Run a command for each project"""
|
||||||
|
|
||||||
|
@ -27,7 +44,7 @@ class ProjectShellCommandBase(Command):
|
||||||
help=('separator between project name and command output, '
|
help=('separator between project name and command output, '
|
||||||
'defaults to %(default)r'),
|
'defaults to %(default)r'),
|
||||||
)
|
)
|
||||||
return parser
|
return ArgumentParserWrapper(parser)
|
||||||
|
|
||||||
def _show_text_output(self, parsed_args, project, out):
|
def _show_text_output(self, parsed_args, project, out):
|
||||||
for line in out.decode('utf-8').splitlines():
|
for line in out.decode('utf-8').splitlines():
|
||||||
|
@ -39,7 +56,10 @@ class ProjectShellCommandBase(Command):
|
||||||
def _show_output(self, parsed_args, proj_obj, out, err):
|
def _show_output(self, parsed_args, proj_obj, out, err):
|
||||||
self._show_text_output(parsed_args, proj_obj, err or out)
|
self._show_text_output(parsed_args, proj_obj, err or out)
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args_tuple):
|
||||||
|
# Handle the tuple we'll get from the parser wrapper.
|
||||||
|
parsed_args, extra = parsed_args_tuple
|
||||||
|
self._extra = extra
|
||||||
session = self.app.get_db_session()
|
session = self.app.get_db_session()
|
||||||
pm = project.ProjectManager(session)
|
pm = project.ProjectManager(session)
|
||||||
prj_filt = project_filter.ProjectFilter.from_parsed_args(parsed_args)
|
prj_filt = project_filter.ProjectFilter.from_parsed_args(parsed_args)
|
||||||
|
@ -58,11 +78,7 @@ class Run(ProjectShellCommandBase):
|
||||||
|
|
||||||
def get_parser(self, prog_name):
|
def get_parser(self, prog_name):
|
||||||
parser = super(Run, self).get_parser(prog_name)
|
parser = super(Run, self).get_parser(prog_name)
|
||||||
parser.add_argument('command',
|
|
||||||
action='store',
|
|
||||||
help='the command to run, probably quoted',
|
|
||||||
)
|
|
||||||
return parser
|
return parser
|
||||||
|
|
||||||
def _get_command(self, parsed_args):
|
def _get_command(self, parsed_args):
|
||||||
return shlex.shlex(parsed_args.command)
|
return self._extra
|
||||||
|
|
Loading…
Reference in New Issue