From db6be7e8c1fc966d31fc7cba9dd728cf6d65739f Mon Sep 17 00:00:00 2001 From: elijah Date: Thu, 28 Feb 2013 22:41:25 -0800 Subject: added @allow_production_deploy and @platform_branch to Leapfile --- lib/leap_cli/commands/deploy.rb | 14 +++++++++++++- lib/leap_cli/commands/pre.rb | 7 +++++++ lib/leap_cli/commands/vagrant.rb | 2 +- lib/leap_cli/config/manager.rb | 2 +- lib/leap_cli/leapfile.rb | 11 +++++++++-- lib/leap_cli/util.rb | 24 +++++++++++++++++++++++- 6 files changed, 54 insertions(+), 6 deletions(-) (limited to 'lib/leap_cli') diff --git a/lib/leap_cli/commands/deploy.rb b/lib/leap_cli/commands/deploy.rb index 4cfefd7..065a111 100644 --- a/lib/leap_cli/commands/deploy.rb +++ b/lib/leap_cli/commands/deploy.rb @@ -20,7 +20,7 @@ module LeapCli c.action do |global,options,args| init_submodules - nodes = manager.filter!(args) + nodes = filter_deploy_nodes(args) if nodes.size > 1 say "Deploying to these nodes: #{nodes.keys.join(', ')}" if !global[:yes] && !agree("Continue? ") @@ -141,5 +141,17 @@ module LeapCli return includes end + # + # for safety, we allow production deploys to be turned off in the Leapfile. + # + def filter_deploy_nodes(filter) + nodes = manager.filter!(filter) + if !leapfile.allow_production_deploy + nodes = nodes[:production => false] + assert! nodes.any?, "Skipping deploy because @allow_production_deploy is disabled." + end + nodes + end + end end diff --git a/lib/leap_cli/commands/pre.rb b/lib/leap_cli/commands/pre.rb index 03355bb..cb92fe2 100644 --- a/lib/leap_cli/commands/pre.rb +++ b/lib/leap_cli/commands/pre.rb @@ -47,6 +47,13 @@ module LeapCli bail! { log :missing, "platform directory '#{Path.platform}'" } end + if LeapCli.leapfile.platform_branch && LeapCli::Util.is_git_directory?(Path.platform) + branch = LeapCli::Util.current_git_branch(Path.platform) + if branch != LeapCli.leapfile.platform_branch + bail! "Wrong branch for #{Path.platform}. Was '#{branch}', should be '#{LeapCli.leapfile.platform_branch}'. Edit Leapfile to disable this check." + end + end + # # set log file # diff --git a/lib/leap_cli/commands/vagrant.rb b/lib/leap_cli/commands/vagrant.rb index 56e887a..3526d23 100644 --- a/lib/leap_cli/commands/vagrant.rb +++ b/lib/leap_cli/commands/vagrant.rb @@ -105,7 +105,7 @@ module LeapCli; module Commands def vagrant_setup assert_bin! 'vagrant', 'Vagrant is required for running local virtual machines. Run "sudo apt-get install vagrant".' - unless `vagrant gem which sahara`.chars.any? + unless assert_run!('vagrant gem which sahara').chars.any? log :installing, "vagrant plugin 'sahara'" assert_run! 'vagrant gem install sahara' end diff --git a/lib/leap_cli/config/manager.rb b/lib/leap_cli/config/manager.rb index b5ce092..cf4d127 100644 --- a/lib/leap_cli/config/manager.rb +++ b/lib/leap_cli/config/manager.rb @@ -140,7 +140,7 @@ module LeapCli # def filter!(filters) node_list = filter(filters) - Util::assert! node_list.any?, "Could not match any nodes from '#{filters}'" + Util::assert! node_list.any?, "Could not match any nodes from '#{filters.join ' '}'" return node_list end diff --git a/lib/leap_cli/leapfile.rb b/lib/leap_cli/leapfile.rb index c24f939..06db3b4 100644 --- a/lib/leap_cli/leapfile.rb +++ b/lib/leap_cli/leapfile.rb @@ -16,6 +16,8 @@ module LeapCli attr_accessor :leap_version attr_accessor :log attr_accessor :vagrant_network + attr_accessor :platform_branch + attr_accessor :allow_production_deploy def initialize @vagrant_network = '10.5.5.0/24' @@ -26,10 +28,15 @@ module LeapCli if directory == '/' return nil else - self.provider_directory_path = directory + @provider_directory_path = directory read_settings(directory + '/Leapfile') read_settings(ENV['HOME'] + '/.leaprc') - self.platform_directory_path = File.expand_path(self.platform_directory_path || '../leap_platform', self.provider_directory_path) + @platform_directory_path = File.expand_path(@platform_directory_path || '../leap_platform', @provider_directory_path) + if @allow_production_deploy.nil? + # by default, only allow production deploys from 'master' or if not a git repo + @allow_production_deploy = !LeapCli::Util.is_git_directory?(@provider_directory_path) || + LeapCli::Util.current_git_branch(@provider_directory_path) == 'master' + end return true end end diff --git a/lib/leap_cli/util.rb b/lib/leap_cli/util.rb index 5bab424..155796f 100644 --- a/lib/leap_cli/util.rb +++ b/lib/leap_cli/util.rb @@ -74,7 +74,7 @@ module LeapCli # def assert_run!(cmd, message=nil) cmd = cmd + " 2>&1" - output = `#{cmd}` + output = `#{cmd}`.strip unless $?.success? exit_status($?.exitstatus) bail! do @@ -363,6 +363,28 @@ module LeapCli ERB.new(string, nil, '%<>-').result(binding) end + ## + ## GIT + ## + + def is_git_directory?(dir) + Dir.chdir(dir) do + `which git && git rev-parse 2>/dev/null` + return $? == 0 + end + end + + def current_git_branch(dir) + Dir.chdir(dir) do + branch = `git symbolic-ref HEAD 2>/dev/null`.strip + if branch.chars.any? + branch.sub /^refs\/heads\//, '' + else + nil + end + end + end + end end -- cgit v1.2.3