Move command base class to a plugin component
This commit is contained in:
parent
55528e051c
commit
b23dda54b8
|
@ -86,8 +86,9 @@ module Vagrant
|
|||
# These are the various plugin versions and their components in
|
||||
# a lazy loaded Hash-like structure.
|
||||
c = PLUGIN_COMPONENTS = Registry.new
|
||||
c.register(:"1") { Plugin::V1::Plugin }
|
||||
c.register([:"1", :config]) { Plugin::V1::Config }
|
||||
c.register(:"1") { Plugin::V1::Plugin }
|
||||
c.register([:"1", :command]) { Plugin::V1::Command }
|
||||
c.register([:"1", :config]) { Plugin::V1::Config }
|
||||
c.register([:"1", :provisioner]) { Plugin::V1::Provisioner }
|
||||
|
||||
# Returns a `Vagrant::Registry` object that contains all the built-in
|
||||
|
|
|
@ -3,7 +3,7 @@ require 'optparse'
|
|||
|
||||
module Vagrant
|
||||
# Manages the command line interface to Vagrant.
|
||||
class CLI < Command::Base
|
||||
class CLI < Vagrant.plugin("1", :command)
|
||||
def initialize(argv, env)
|
||||
super
|
||||
|
||||
|
|
|
@ -1,169 +0,0 @@
|
|||
require 'log4r'
|
||||
|
||||
require "vagrant/util/safe_puts"
|
||||
|
||||
module Vagrant
|
||||
module Command
|
||||
# Base class for any CLI commands.
|
||||
#
|
||||
# This class provides documentation on the interface as well as helper
|
||||
# functions that a command has.
|
||||
class Base
|
||||
include Util::SafePuts
|
||||
|
||||
def initialize(argv, env)
|
||||
@argv = argv
|
||||
@env = env
|
||||
@logger = Log4r::Logger.new("vagrant::command::#{self.class.to_s.downcase}")
|
||||
end
|
||||
|
||||
# This is what is called on the class to actually execute it. Any
|
||||
# subclasses should implement this method and do any option parsing
|
||||
# and validation here.
|
||||
def execute; end
|
||||
|
||||
protected
|
||||
|
||||
# Parses the options given an OptionParser instance.
|
||||
#
|
||||
# This is a convenience method that properly handles duping the
|
||||
# originally argv array so that it is not destroyed.
|
||||
#
|
||||
# This method will also automatically detect "-h" and "--help"
|
||||
# and print help. And if any invalid options are detected, the help
|
||||
# will be printed, as well.
|
||||
#
|
||||
# If this method returns `nil`, then you should assume that help
|
||||
# was printed and parsing failed.
|
||||
def parse_options(opts=nil)
|
||||
# Creating a shallow copy of the arguments so the OptionParser
|
||||
# doesn't destroy the originals.
|
||||
argv = @argv.dup
|
||||
|
||||
# Default opts to a blank optionparser if none is given
|
||||
opts ||= OptionParser.new
|
||||
|
||||
# Add the help option, which must be on every command.
|
||||
opts.on_tail("-h", "--help", "Print this help") do
|
||||
safe_puts(opts.help)
|
||||
return nil
|
||||
end
|
||||
|
||||
opts.parse!(argv)
|
||||
return argv
|
||||
rescue OptionParser::InvalidOption
|
||||
raise Errors::CLIInvalidOptions, :help => opts.help.chomp
|
||||
end
|
||||
|
||||
# Yields a VM for each target VM for the command.
|
||||
#
|
||||
# This is a convenience method for easily implementing methods that
|
||||
# take a target VM (in the case of multi-VM) or every VM if no
|
||||
# specific VM name is specified.
|
||||
#
|
||||
# @param [String] name The name of the VM. Nil if every VM.
|
||||
# @param [Boolean] single_target If true, then an exception will be
|
||||
# raised if more than one target is found.
|
||||
def with_target_vms(names=nil, options=nil)
|
||||
# Using VMs requires a Vagrant environment to be properly setup
|
||||
raise Errors::NoEnvironmentError if !@env.root_path
|
||||
|
||||
# Setup the options hash
|
||||
options ||= {}
|
||||
|
||||
# Require that names be an array
|
||||
names ||= []
|
||||
names = [names] if !names.is_a?(Array)
|
||||
|
||||
# First determine the proper array of VMs.
|
||||
vms = []
|
||||
if names.length > 0
|
||||
names.each do |name|
|
||||
if pattern = name[/^\/(.+?)\/$/, 1]
|
||||
# This is a regular expression name, so we convert to a regular
|
||||
# expression and allow that sort of matching.
|
||||
regex = Regexp.new(pattern)
|
||||
|
||||
@env.vms.each do |name, vm|
|
||||
vms << vm if name =~ regex
|
||||
end
|
||||
|
||||
raise Errors::VMNoMatchError if vms.empty?
|
||||
else
|
||||
# String name, just look for a specific VM
|
||||
vms << @env.vms[name.to_sym]
|
||||
raise Errors::VMNotFoundError, :name => name if !vms[0]
|
||||
end
|
||||
end
|
||||
else
|
||||
vms = @env.vms_ordered
|
||||
end
|
||||
|
||||
# Make sure we're only working with one VM if single target
|
||||
if options[:single_target] && vms.length != 1
|
||||
vm = @env.primary_vm
|
||||
raise Errors::MultiVMTargetRequired if !vm
|
||||
vms = [vm]
|
||||
end
|
||||
|
||||
# If we asked for reversed ordering, then reverse it
|
||||
vms.reverse! if options[:reverse]
|
||||
|
||||
# Go through each VM and yield it!
|
||||
vms.each do |old_vm|
|
||||
# We get a new VM from the environment here to avoid potentially
|
||||
# stale VMs (if there was a config reload on the environment
|
||||
# or something).
|
||||
vm = @env.vms[old_vm.name]
|
||||
yield vm
|
||||
end
|
||||
end
|
||||
|
||||
# This method will split the argv given into three parts: the
|
||||
# flags to this command, the subcommand, and the flags to the
|
||||
# subcommand. For example:
|
||||
#
|
||||
# -v status -h -v
|
||||
#
|
||||
# The above would yield 3 parts:
|
||||
#
|
||||
# ["-v"]
|
||||
# "status"
|
||||
# ["-h", "-v"]
|
||||
#
|
||||
# These parts are useful because the first is a list of arguments
|
||||
# given to the current command, the second is a subcommand, and the
|
||||
# third are the commands given to the subcommand.
|
||||
#
|
||||
# @return [Array] The three parts.
|
||||
def split_main_and_subcommand(argv)
|
||||
# Initialize return variables
|
||||
main_args = nil
|
||||
sub_command = nil
|
||||
sub_args = []
|
||||
|
||||
# We split the arguments into two: One set containing any
|
||||
# flags before a word, and then the rest. The rest are what
|
||||
# get actually sent on to the subcommand.
|
||||
argv.each_index do |i|
|
||||
if !argv[i].start_with?("-")
|
||||
# We found the beginning of the sub command. Split the
|
||||
# args up.
|
||||
main_args = argv[0, i]
|
||||
sub_command = argv[i]
|
||||
sub_args = argv[i + 1, argv.length - i + 1]
|
||||
|
||||
# Break so we don't find the next non flag and shift our
|
||||
# main args.
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
# Handle the case that argv was empty or didn't contain any subcommand
|
||||
main_args = argv.dup if main_args.nil?
|
||||
|
||||
return [main_args, sub_command, sub_args]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -4,7 +4,7 @@ module Vagrant
|
|||
module Easy
|
||||
# Base class for all easy commands. This contains the basic code
|
||||
# that knows how to run the easy commands.
|
||||
class CommandBase < Vagrant::Command::Base
|
||||
class CommandBase < Vagrant.plugin("1", :command)
|
||||
# This is the command that this easy command responds to
|
||||
attr_reader :command
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@ require "vagrant/plugin/v1/errors"
|
|||
module Vagrant
|
||||
module Plugin
|
||||
module V1
|
||||
autoload :Command, "vagrant/plugin/v1/command"
|
||||
autoload :Config, "vagrant/plugin/v1/config"
|
||||
autoload :Plugin, "vagrant/plugin/v1/plugin"
|
||||
autoload :Provisioner, "vagrant/plugin/v1/provisioner"
|
||||
|
|
|
@ -0,0 +1,169 @@
|
|||
require 'log4r'
|
||||
|
||||
require "vagrant/util/safe_puts"
|
||||
|
||||
module Vagrant
|
||||
module Plugin
|
||||
module V1
|
||||
# This is the base class for a CLI command.
|
||||
class Command
|
||||
include Util::SafePuts
|
||||
|
||||
def initialize(argv, env)
|
||||
@argv = argv
|
||||
@env = env
|
||||
@logger = Log4r::Logger.new("vagrant::command::#{self.class.to_s.downcase}")
|
||||
end
|
||||
|
||||
# This is what is called on the class to actually execute it. Any
|
||||
# subclasses should implement this method and do any option parsing
|
||||
# and validation here.
|
||||
def execute
|
||||
end
|
||||
|
||||
protected
|
||||
|
||||
# Parses the options given an OptionParser instance.
|
||||
#
|
||||
# This is a convenience method that properly handles duping the
|
||||
# originally argv array so that it is not destroyed.
|
||||
#
|
||||
# This method will also automatically detect "-h" and "--help"
|
||||
# and print help. And if any invalid options are detected, the help
|
||||
# will be printed, as well.
|
||||
#
|
||||
# If this method returns `nil`, then you should assume that help
|
||||
# was printed and parsing failed.
|
||||
def parse_options(opts=nil)
|
||||
# Creating a shallow copy of the arguments so the OptionParser
|
||||
# doesn't destroy the originals.
|
||||
argv = @argv.dup
|
||||
|
||||
# Default opts to a blank optionparser if none is given
|
||||
opts ||= OptionParser.new
|
||||
|
||||
# Add the help option, which must be on every command.
|
||||
opts.on_tail("-h", "--help", "Print this help") do
|
||||
safe_puts(opts.help)
|
||||
return nil
|
||||
end
|
||||
|
||||
opts.parse!(argv)
|
||||
return argv
|
||||
rescue OptionParser::InvalidOption
|
||||
raise Errors::CLIInvalidOptions, :help => opts.help.chomp
|
||||
end
|
||||
|
||||
# Yields a VM for each target VM for the command.
|
||||
#
|
||||
# This is a convenience method for easily implementing methods that
|
||||
# take a target VM (in the case of multi-VM) or every VM if no
|
||||
# specific VM name is specified.
|
||||
#
|
||||
# @param [String] name The name of the VM. Nil if every VM.
|
||||
# @param [Boolean] single_target If true, then an exception will be
|
||||
# raised if more than one target is found.
|
||||
def with_target_vms(names=nil, options=nil)
|
||||
# Using VMs requires a Vagrant environment to be properly setup
|
||||
raise Errors::NoEnvironmentError if !@env.root_path
|
||||
|
||||
# Setup the options hash
|
||||
options ||= {}
|
||||
|
||||
# Require that names be an array
|
||||
names ||= []
|
||||
names = [names] if !names.is_a?(Array)
|
||||
|
||||
# First determine the proper array of VMs.
|
||||
vms = []
|
||||
if names.length > 0
|
||||
names.each do |name|
|
||||
if pattern = name[/^\/(.+?)\/$/, 1]
|
||||
# This is a regular expression name, so we convert to a regular
|
||||
# expression and allow that sort of matching.
|
||||
regex = Regexp.new(pattern)
|
||||
|
||||
@env.vms.each do |name, vm|
|
||||
vms << vm if name =~ regex
|
||||
end
|
||||
|
||||
raise Errors::VMNoMatchError if vms.empty?
|
||||
else
|
||||
# String name, just look for a specific VM
|
||||
vms << @env.vms[name.to_sym]
|
||||
raise Errors::VMNotFoundError, :name => name if !vms[0]
|
||||
end
|
||||
end
|
||||
else
|
||||
vms = @env.vms_ordered
|
||||
end
|
||||
|
||||
# Make sure we're only working with one VM if single target
|
||||
if options[:single_target] && vms.length != 1
|
||||
vm = @env.primary_vm
|
||||
raise Errors::MultiVMTargetRequired if !vm
|
||||
vms = [vm]
|
||||
end
|
||||
|
||||
# If we asked for reversed ordering, then reverse it
|
||||
vms.reverse! if options[:reverse]
|
||||
|
||||
# Go through each VM and yield it!
|
||||
vms.each do |old_vm|
|
||||
# We get a new VM from the environment here to avoid potentially
|
||||
# stale VMs (if there was a config reload on the environment
|
||||
# or something).
|
||||
vm = @env.vms[old_vm.name]
|
||||
yield vm
|
||||
end
|
||||
end
|
||||
|
||||
# This method will split the argv given into three parts: the
|
||||
# flags to this command, the subcommand, and the flags to the
|
||||
# subcommand. For example:
|
||||
#
|
||||
# -v status -h -v
|
||||
#
|
||||
# The above would yield 3 parts:
|
||||
#
|
||||
# ["-v"]
|
||||
# "status"
|
||||
# ["-h", "-v"]
|
||||
#
|
||||
# These parts are useful because the first is a list of arguments
|
||||
# given to the current command, the second is a subcommand, and the
|
||||
# third are the commands given to the subcommand.
|
||||
#
|
||||
# @return [Array] The three parts.
|
||||
def split_main_and_subcommand(argv)
|
||||
# Initialize return variables
|
||||
main_args = nil
|
||||
sub_command = nil
|
||||
sub_args = []
|
||||
|
||||
# We split the arguments into two: One set containing any
|
||||
# flags before a word, and then the rest. The rest are what
|
||||
# get actually sent on to the subcommand.
|
||||
argv.each_index do |i|
|
||||
if !argv[i].start_with?("-")
|
||||
# We found the beginning of the sub command. Split the
|
||||
# args up.
|
||||
main_args = argv[0, i]
|
||||
sub_command = argv[i]
|
||||
sub_args = argv[i + 1, argv.length - i + 1]
|
||||
|
||||
# Break so we don't find the next non flag and shift our
|
||||
# main args.
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
# Handle the case that argv was empty or didn't contain any subcommand
|
||||
main_args = argv.dup if main_args.nil?
|
||||
|
||||
return [main_args, sub_command, sub_args]
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
|
@ -3,7 +3,7 @@ require 'optparse'
|
|||
module VagrantPlugins
|
||||
module CommandBox
|
||||
module Command
|
||||
class Add < Vagrant::Command::Base
|
||||
class Add < Vagrant.plugin("1", :command)
|
||||
def execute
|
||||
options = {}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ require 'optparse'
|
|||
module VagrantPlugins
|
||||
module CommandBox
|
||||
module Command
|
||||
class List < Vagrant::Command::Base
|
||||
class List < Vagrant.plugin("1", :command)
|
||||
def execute
|
||||
options = {}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ require 'optparse'
|
|||
module VagrantPlugins
|
||||
module CommandBox
|
||||
module Command
|
||||
class Remove < Vagrant::Command::Base
|
||||
class Remove < Vagrant.plugin("1", :command)
|
||||
def execute
|
||||
options = {}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ require 'optparse'
|
|||
module VagrantPlugins
|
||||
module CommandBox
|
||||
module Command
|
||||
class Repackage < Vagrant::Command::Base
|
||||
class Repackage < Vagrant.plugin("1", :command)
|
||||
def execute
|
||||
options = {}
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@ require 'optparse'
|
|||
module VagrantPlugins
|
||||
module CommandBox
|
||||
module Command
|
||||
class Root < Vagrant::Command::Base
|
||||
class Root < Vagrant.plugin("1", :command)
|
||||
def initialize(argv, env)
|
||||
super
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
module VagrantPlugins
|
||||
module CommandDestroy
|
||||
class Command < Vagrant::Command::Base
|
||||
class Command < Vagrant.plugin("1", :command)
|
||||
def execute
|
||||
options = {}
|
||||
|
||||
|
|
|
@ -5,7 +5,7 @@ require "vagrant/util/safe_puts"
|
|||
|
||||
module VagrantPlugins
|
||||
module CommandGem
|
||||
class Command < Vagrant::Command::Base
|
||||
class Command < Vagrant.plugin("1", :command)
|
||||
include Vagrant::Util::SafePuts
|
||||
|
||||
def execute
|
||||
|
|
|
@ -2,7 +2,7 @@ require 'optparse'
|
|||
|
||||
module VagrantPlugins
|
||||
module CommandHalt
|
||||
class Command < Vagrant::Command::Base
|
||||
class Command < Vagrant.plugin("1", :command)
|
||||
def execute
|
||||
options = {}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ require 'vagrant/util/template_renderer'
|
|||
|
||||
module VagrantPlugins
|
||||
module CommandInit
|
||||
class Command < Vagrant::Command::Base
|
||||
class Command < Vagrant.plugin("1", :command)
|
||||
def execute
|
||||
options = {}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ require 'optparse'
|
|||
|
||||
module VagrantPlugins
|
||||
module CommandPackage
|
||||
class Command < Vagrant::Command::Base
|
||||
class Command < Vagrant.plugin("1", :command)
|
||||
def execute
|
||||
options = {}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ require 'optparse'
|
|||
|
||||
module VagrantPlugins
|
||||
module CommandProvision
|
||||
class Command < Vagrant::Command::Base
|
||||
class Command < Vagrant.plugin("1", :command)
|
||||
def execute
|
||||
options = {}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ require Vagrant.source_root.join("plugins/commands/up/start_mixins")
|
|||
|
||||
module VagrantPlugins
|
||||
module CommandReload
|
||||
class Command < Vagrant::Command::Base
|
||||
class Command < Vagrant.plugin("1", :command)
|
||||
# We assume that the `up` plugin exists and that we'll have access
|
||||
# to this.
|
||||
include VagrantPlugins::CommandUp::StartMixins
|
||||
|
|
|
@ -2,7 +2,7 @@ require 'optparse'
|
|||
|
||||
module VagrantPlugins
|
||||
module CommandResume
|
||||
class Command < Vagrant::Command::Base
|
||||
class Command < Vagrant.plugin("1", :command)
|
||||
def execute
|
||||
options = {}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ require 'optparse'
|
|||
|
||||
module VagrantPlugins
|
||||
module CommandSSH
|
||||
class Command < Vagrant::Command::Base
|
||||
class Command < Vagrant.plugin("1", :command)
|
||||
def execute
|
||||
options = {}
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ require "vagrant/util/safe_puts"
|
|||
|
||||
module VagrantPlugins
|
||||
module CommandSSHConfig
|
||||
class Command < Vagrant::Command::Base
|
||||
class Command < Vagrant.plugin("1", :command)
|
||||
include Vagrant::Util::SafePuts
|
||||
|
||||
def execute
|
||||
|
|
|
@ -2,7 +2,7 @@ require 'optparse'
|
|||
|
||||
module VagrantPlugins
|
||||
module CommandStatus
|
||||
class Command < Vagrant::Command::Base
|
||||
class Command < Vagrant.plugin("1", :command)
|
||||
def execute
|
||||
options = {}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@ require 'optparse'
|
|||
|
||||
module VagrantPlugins
|
||||
module CommandSuspend
|
||||
class Command < Vagrant::Command::Base
|
||||
class Command < Vagrant.plugin("1", :command)
|
||||
def execute
|
||||
options = {}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@ require File.expand_path("../start_mixins", __FILE__)
|
|||
|
||||
module VagrantPlugins
|
||||
module CommandUp
|
||||
class Command < Vagrant::Command::Base
|
||||
class Command < Vagrant.plugin("1", :command)
|
||||
include StartMixins
|
||||
|
||||
def execute
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
require File.expand_path("../../../base", __FILE__)
|
||||
require File.expand_path("../../../../base", __FILE__)
|
||||
require 'optparse'
|
||||
|
||||
describe Vagrant::Command::Base do
|
||||
describe Vagrant::Plugin::V1::Command do
|
||||
describe "parsing options" do
|
||||
let(:klass) do
|
||||
Class.new(described_class) do
|
|
@ -12,6 +12,7 @@ describe Vagrant do
|
|||
end
|
||||
|
||||
it "returns the proper components for version 1" do
|
||||
described_class.plugin("1", :command).should == Vagrant::Plugin::V1::Command
|
||||
described_class.plugin("1", :config).should == Vagrant::Plugin::V1::Config
|
||||
described_class.plugin("1", :provisioner).should == Vagrant::Plugin::V1::Provisioner
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue