# frozen_string_literal: true

# These tasks exist because capistrano-bundler does not yet have a built-in # mechanism for configuring bundler 2 without deprecation warnings. We can dump # this if/when github.com/capistrano/bundler/issues/115 is resolved.

def default_bundle_path

Pathname.new("#{shared_path}/bundle")

end

namespace :load do

task :defaults do
  # This provides opt-in behavior. Do nothing if not requested.
  set :bundler2_config_use_hook, fetch(:bundler2_config_use_hook, false)
  set :bundler2_config_roles, fetch(:bundler2_config_roles, [:app])
  set :bundler2_config_deployment, fetch(:bundler2_config_deployment, true)
  set :bundler2_config_without, fetch(:bundler2_config_without, 'development:test')
  # NOTE: `shared_path` is not defined at this point, so we can't set the default value to `default_bundle_path`
  set :bundler2_config_path, fetch(:bundler2_config_path, nil)
end

end

# Integrate bundle config hook into Capistrano namespace :deploy do

before :starting, :add_bundler2_config_hook do
  invoke 'bundler2:add_hook' if fetch(:bundler2_config_use_hook)
end

end

namespace :bundler2 do

# NOTE: no `desc` here to avoid publishing this task in the `cap -T` list
task :add_hook do
  # Override capistrano-bundler settings
  # HT: https://github.com/capistrano/bundler/issues/115#issuecomment-616570236
  set :bundle_flags, '--quiet' # this unsets --deployment, see details in config_bundler task details
  set :bundle_path, nil
  set :bundle_without, nil

  before 'bundler:install', 'bundler2:config'
end

# NOTE: This task lacks a `desc` to avoid publishing it, since we do not
#       foresee needing to run this task manually. It should run via hook.
#
# Configure bundler 2 without using deprecated arguments (overrides capistrano-bundler
task :config do
  on roles fetch(:bundler2_config_roles) do
    execute "bundle config --local deployment #{fetch(:bundler2_config_deployment)}"
    execute "bundle config --local without '#{fetch(:bundler2_config_without)}'"
    execute "bundle config --local path #{fetch(:bundler2_config_path) || default_bundle_path}"
  end
end

end