From db6be7e8c1fc966d31fc7cba9dd728cf6d65739f Mon Sep 17 00:00:00 2001
From: elijah <elijah@riseup.net>
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')

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