141 lines
4.1 KiB
Lua
141 lines
4.1 KiB
Lua
local matchers = require('matchers')
|
|
local path = require('path')
|
|
local parser = clink.arg.new_parser
|
|
|
|
local boxes = matchers.create_dirs_matcher(clink.get_env("userprofile") .. "/.vagrant.d/boxes/*")
|
|
|
|
local function is_empty(s)
|
|
return s == nil or s == ''
|
|
end
|
|
|
|
local function find_vagrantfile(start_dir)
|
|
local vagrantfile_name = clink.get_env("VAGRANT_VAGRANTFILE")
|
|
if is_empty(vagrantfile_name) then vagrantfile_name = "Vagrantfile" end
|
|
|
|
local function has_vagrantfile(dir)
|
|
return #clink.find_files(dir .. "./" .. vagrantfile_name .. "*") > 0
|
|
end
|
|
|
|
if not start_dir or start_dir == '.' then start_dir = clink.get_cwd() end
|
|
|
|
if has_vagrantfile(start_dir) then return io.open(start_dir.."\\"..vagrantfile_name) end
|
|
|
|
local parent_path = path.pathname(start_dir)
|
|
if parent_path ~= start_dir then return find_vagrantfile(parent_path) end
|
|
end
|
|
|
|
local function get_vagrantfile()
|
|
local vagrant_cwd = clink.get_env("VAGRANT_CWD")
|
|
if not is_empty(vagrant_cwd) then
|
|
return find_vagrantfile(vagrant_cwd)
|
|
else
|
|
return find_vagrantfile()
|
|
end
|
|
end
|
|
|
|
local function delete_ruby_comment(line)
|
|
if line == nil then return nil end
|
|
local index = string.find(line, '#')
|
|
if (not (index == nil) and index > 0) then
|
|
return string.sub(line, 0, index-1)
|
|
end
|
|
return line
|
|
end
|
|
|
|
local get_provisions = function ()
|
|
local vagrant_file = get_vagrantfile()
|
|
if vagrant_file == nil then return {} end
|
|
|
|
local provisions = {}
|
|
for line in vagrant_file:lines() do
|
|
line = delete_ruby_comment(line)
|
|
if not is_empty(line) then
|
|
local provision_name = line:match('.vm.provision[ \r\t]+[\"|\']([A-z]+[A-z0-9|-]*)[\"|\']')
|
|
|
|
if not is_empty(provision_name) then
|
|
table.insert(provisions, provision_name)
|
|
end
|
|
end
|
|
end
|
|
vagrant_file:close()
|
|
return provisions
|
|
end
|
|
|
|
local vagrant_parser = parser({
|
|
"box" .. parser({
|
|
"add" .. parser(
|
|
"--checksum",
|
|
"--checksum-type" .. parser({"md5", "sha1", "sha256"}),
|
|
"-c", "--clean",
|
|
"-f", "--force",
|
|
"--insecure",
|
|
"--cacert",
|
|
"--cert",
|
|
"--provider"
|
|
),
|
|
"list" .. parser("-i", "--box-info"),
|
|
"outdated"..parser("--global", "-h", "--help"),
|
|
"remove" .. parser({boxes}),
|
|
"repackage" .. parser({boxes}),
|
|
"update"
|
|
}),
|
|
"connect",
|
|
"destroy" .. parser("-f", "--force"),
|
|
"global-status",
|
|
"halt" .. parser("-f", "--force"),
|
|
"init" .. parser({boxes}, {}, "--output"),
|
|
"package" .. parser("--base", "--output", "--include", "--vagrantfile"),
|
|
"plugin" .. parser({
|
|
"install" .. parser(
|
|
"--entry-point",
|
|
"--plugin-prerelease",
|
|
"--plugin-source",
|
|
"--plugin-version"
|
|
),
|
|
"license",
|
|
"list",
|
|
"uninstall",
|
|
"update" .. parser(
|
|
"--entry-point",
|
|
"--plugin-prerelease",
|
|
"--plugin-source",
|
|
"--plugin-version"
|
|
)
|
|
}),
|
|
"provision" .. parser("--provision-with" .. parser({get_provisions}), "--no-parallel", "--parallel"),
|
|
"reload" .. parser("--provision-with" .. parser({get_provisions}), "--no-parallel", "--parallel"),
|
|
"resume",
|
|
"ssh" .. parser("-c", "--command", "-p", "--plain") ,
|
|
"ssh-config",
|
|
"snapshot" .. parser({
|
|
"push",
|
|
"pop" .. parser(
|
|
"--provision",
|
|
"--no-provision",
|
|
"--no-delete"),
|
|
"save",
|
|
"restore" .. parser(
|
|
"--provision",
|
|
"--no-provision"),
|
|
"list",
|
|
"delete"}),
|
|
"status",
|
|
"suspend",
|
|
"up" .. parser(
|
|
"--provision",
|
|
"--no-provision",
|
|
"--provision-with" .. parser({get_provisions}),
|
|
"--destroy-on-error",
|
|
"--no-destroy-on-error",
|
|
"--parallel",
|
|
"--no-parallel",
|
|
"--provider"
|
|
)
|
|
}, "-h", "--help", "-v", "--version")
|
|
|
|
local help_parser = parser({
|
|
"help" .. parser(vagrant_parser:flatten_argument(1))
|
|
})
|
|
|
|
clink.arg.register_parser("vagrant", vagrant_parser)
|
|
clink.arg.register_parser("vagrant", help_parser) |