##

# Copyright © 2016 by David Alger. All rights reserved
#
# Licensed under the Open Software License 3.0 (OSL-3.0)
# See included LICENSE file for full text of OSL-3.0
#
# http://davidalger.com/contact/
##

include Capistrano::Magento2::Pending

before 'deploy:check', 'deploy:pending:warn'

namespace :deploy do

desc "Displays a summary of commits pending deployment"
task :pending => 'deploy:pending:log'

namespace :pending do
  task :warn => :log do
    if fetch(:magento_deploy_pending_warn)
      need_warning = true

      on roles fetch(:magento_deploy_pending_role) do |host|
        has_revision = ensure_revision do
          # if any host has a change in revision, do not warn user
          need_warning = false if from_rev != to_rev
        end

        # if a host does not have a revision, do not warn user
        need_warning = false if not has_revision
      end

      # if there is nothing to deploy on any host, prompt user for confirmation
      if need_warning
        print "      Are you sure you want to continue? [y/n] \e[0m"

        proceed = STDIN.gets[0..0] rescue nil
        exit unless proceed == 'y' || proceed == 'Y'
      end
    end
  end

  task :log do
    on roles fetch(:magento_deploy_pending_role) do |host|
      ensure_revision true do
        # update local repository to ensure accuracy of report
        run_locally do
          execute :git, :fetch, :origin
        end

        # fetch current revision and revision to be deployed
        from = from_rev
        to = to_rev

        # if there is nothing to deploy on this host, inform the user
        if from == to
          info "\e[0;31mNo changes to deploy on #{host} (from and to are the same: #{from} -> #{to})\e[0m"
        else
          run_locally do
            header = "\e[0;90mChanges pending deployment on #{host} (#{from} -> #{to}):\e[0m\n"

            # capture log of commits between current revision and revision for deploy
            output = capture :git, :log, "#{from}..#{to}", fetch(:magento_deploy_pending_format)

            # if we get no results, flip refs to look at reverse log in case of rollback deployments
            if output.to_s.strip.empty?
              output = capture :git, :log, "#{to}..#{from}", fetch(:magento_deploy_pending_format)
              if not output.to_s.strip.empty?
                header += "\e[0;31mWarning: It appears you may be going backwards in time on #{host} with this deployment!\e[0m\n"
              end
            end

            # write pending changes log
            (header + output).each_line do |line|
              info line
            end
          end
        end
      end
    end
  end
end

end