Class: Overcommit::CommandSplitter
- Inherits:
-
Object
- Object
- Overcommit::CommandSplitter
- Defined in:
- lib/overcommit/command_splitter.rb
Overview
Distributes a list of arguments over multiple invocations of a command.
This accomplishes the same functionality provided by ‘xargs` but in a cross-platform way that does not require any pre-existing tools.
One of the tradeoffs with this approach is that we no longer deal with a single exit status from a command, but multiple (one for each invocation).
This will return a struct similar to ‘Subprocess::Result` but with additional `statuses`, `stdouts`, and `stderrs` fields so hook authors can actually see the results of each invocation. If they don’t care, the standard ‘status`, `stdout`, and `stderr` will still work but be a aggregation/concatenation of all statuses/outputs.
Defined Under Namespace
Classes: Result
Class Method Summary collapse
Class Method Details
.execute(initial_args, options) ⇒ Object
56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
# File 'lib/overcommit/command_splitter.rb', line 56 def execute(initial_args, ) = .dup if (splittable_args = (.delete(:args) { [] })).empty? raise Overcommit::Exceptions::InvalidCommandArgs, 'Must specify list of arguments to split on' end # Execute each chunk of arguments in serial. We don't parallelize (yet) # since in theory we want to support parallelization at the hook level # and not within individual hooks. results = extract_argument_lists(initial_args, splittable_args).map do |arg_list| Overcommit::Subprocess.spawn(arg_list, ) end Result.new(results.map(&:status), results.map(&:stdout), results.map(&:stderr)) end |