From 882a019ce26a045d445c38bdc0f348588a30f465 Mon Sep 17 00:00:00 2001 From: elijah Date: Fri, 8 Feb 2013 23:09:47 -0800 Subject: changed `leap init` to `leap new`, made more foolproof. --- lib/leap_cli/commands/new.rb | 133 +++++++++++++++++++++++++++++++++++++++ lib/leap_cli/commands/project.rb | 109 -------------------------------- lib/leap_cli/path.rb | 8 ++- 3 files changed, 139 insertions(+), 111 deletions(-) create mode 100644 lib/leap_cli/commands/new.rb delete mode 100644 lib/leap_cli/commands/project.rb diff --git a/lib/leap_cli/commands/new.rb b/lib/leap_cli/commands/new.rb new file mode 100644 index 0000000..c4a067e --- /dev/null +++ b/lib/leap_cli/commands/new.rb @@ -0,0 +1,133 @@ +require 'fileutils' + +module LeapCli; module Commands + + desc 'Creates a new provider instance in the specified directory, creating it if necessary.' + arg_name 'DIRECTORY' + skips_pre + command :new do |c| + c.flag 'name', :desc => "The name of the provider" #, :default_value => 'Example' + c.flag 'domain', :desc => "The primary domain of the provider" #, :default_value => 'example.org' + c.flag 'platform', :desc => "File path of the leap_platform directory" #, :default_value => '../leap_platform' + c.flag 'contacts', :desc => "Default email address contacts" #, :default_value => 'root' + + c.action do |global, options, args| + directory = File.expand_path(args.first) + create_provider_directory(global, directory) + options[:domain] ||= ask("The primary domain of the provider: ") {|q| q.default = 'example.org'} + options[:name] ||= ask("The name of the provider: ") {|q| q.default = 'Example'} + options[:platform] ||= ask("File path of the leap_platform directory: ") {|q| q.default = File.expand_path('../leap_platform', directory)} + options[:contacts] ||= ask("Default email address contacts: ") {|q| q.default = 'root@' + options[:domain]} + options[:platform] = relative_path(options[:platform]) + create_initial_provider_files(directory, global, options) + end + end + + private + + DEFAULT_REPO = 'git://leap.se/leap_platform' # TODO: use https + + # + # creates a new provider directory + # + def create_provider_directory(global, directory) + unless directory && directory.any? + help! "Directory name is required." + end + unless File.exists?(directory) + if global[:yes] || agree("Create directory #{directory}? ") + ensure_dir directory + else + bail! { log :missing, "directory #{directory}" } + end + end + Path.set_provider_path(directory) + end + + # + # see provider with initial files + # + def create_initial_provider_files(directory, global, options) + Dir.chdir(directory) do + assert_files_missing! 'provider.json', 'common.json', 'Leapfile', :base => directory + + platform_dir = File.expand_path(options[:platform], "./") + unless File.symlink?(platform_dir) || File.directory?(platform_dir) + if global[:yes] || agree("The platform directory \"#{platform_dir}\" does not exist.\nDo you want me to create it by cloning from the\ngit repository #{DEFAULT_REPO}? ") + assert_bin! 'git' + ensure_dir platform_dir + Dir.chdir(platform_dir) do + log :cloning, "leap_platform into #{platform_dir}" + pty_run "git clone --branch master #{DEFAULT_REPO} ." + pty_run 'git submodule update --init' + end + else + bail! + end + end + write_file! '.gitignore', GITIGNORE_CONTENT + write_file! 'provider.json', provider_content(options) + write_file! 'common.json', COMMON_CONTENT + write_file! 'Leapfile', leapfile_content(options) + ["nodes", "services", "tags"].each do |dir| + ensure_dir dir + end + log :completed, 'initialization' + end + end + + def relative_path(path) + Pathname.new(path).relative_path_from(Pathname.new(Path.provider)).to_s + end + + def leapfile_content(options) + # @leap_version = "#{LeapCli::VERSION}" + %[## Required: +@platform_directory_path = "#{options[:platform]}" + +## Optional: +# @custom_vagrant_vm_line = "config.vm.boot_mode = :gui" +# @log = "/tmp/leap.log" +] + end + + GITIGNORE_CONTENT = < "The name of the provider", :default_value => 'Example' - c.flag 'domain', :desc => "The primary domain of the provider", :default_value => 'example.org' - c.flag 'platform', :desc => "File path of the leap_platform directory", :default_value => '../leap_platform' - c.action do |global, options, args| - directory = args.first - unless directory && directory.any? - help! "Directory name is required." - end - directory = File.expand_path(directory) - unless File.exists?(directory) - bail! { log :missing, "directory #{directory}" } - end - create_initial_provider_files(directory, global, options) - end - end - - private - - DEFAULT_REPO = 'git://leap.se/leap_platform' # TODO: use https - - # - # creates new provider directory - # - def create_initial_provider_files(directory, global, options) - Path.set_provider_path(directory) - Dir.chdir(directory) do - assert_files_missing! 'provider.json', 'common.json', 'Leapfile', :base => directory - - platform_dir = File.expand_path(options[:platform]) - - unless File.symlink?(platform_dir) || File.directory?(platform_dir) - if global[:yes] || agree("The platform directory \"#{options[:platform]}\" does not exist.\nDo you want me to create it by cloning from the\ngit repository #{DEFAULT_REPO}? ") - assert_bin! 'git' - ensure_dir platform_dir - Dir.chdir(platform_dir) do - log :cloning, "leap_platform into #{platform_dir}" - pty_run "git clone --branch develop #{DEFAULT_REPO} ." - pty_run 'git submodule update --init' - end - else - bail! - end - end - write_file! '.gitignore', GITIGNORE_CONTENT - write_file! 'provider.json', provider_content(options) - write_file! 'common.json', COMMON_CONTENT - write_file! 'Leapfile', leapfile_content(options) - ["nodes", "services", "tags"].each do |dir| - ensure_dir dir - end - log :completed, 'initialization' - end - end - - def leapfile_content(options) - %[## Required: -@platform_directory_path = "#{options[:platform]}" -@leap_version = "#{LeapCli::VERSION}" - -## Optional: -# @custom_vagrant_vm_line = "config.vm.boot_mode = :gui" -] - end - - GITIGNORE_CONTENT = <