namespace :git do

def strategy
  @strategy ||= Capistrano::Git.new(self, fetch(:git_strategy, Capistrano::Git::DefaultStrategy))
end

set :git_environmental_variables, lambda {
  {
    git_askpass: "/bin/echo",
    git_ssh: "#{fetch(:tmp_dir)}/#{fetch(:application)}/git-ssh.sh"
  }
}

desc "Upload the git wrapper script, this script guarantees that we can script git without getting an interactive prompt"
task :wrapper do
  on release_roles :all do
    execute :mkdir, "-p", "#{fetch(:tmp_dir)}/#{fetch(:application)}/"
    upload! StringIO.new("#!/bin/sh -e\nexec /usr/bin/ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no \"$@\"\n"), "#{fetch(:tmp_dir)}/#{fetch(:application)}/git-ssh.sh"
    execute :chmod, "+rx", "#{fetch(:tmp_dir)}/#{fetch(:application)}/git-ssh.sh"
  end
end

desc "Check that the repository is reachable"
task check: :'git:wrapper' do
  fetch(:branch)
  on release_roles :all do
    with fetch(:git_environmental_variables) do
      strategy.check
    end
  end
end

desc "Clone the repo to the cache"
task clone: :'git:wrapper' do
  on release_roles :all do
    if strategy.test
      info t(:mirror_exists, at: repo_path)
    else
      within deploy_path do
        with fetch(:git_environmental_variables) do
          strategy.clone
        end
      end
    end
  end
end

desc "Update the repo mirror to reflect the origin state"
task update: :'git:clone' do
  on release_roles :all do
    within repo_path do
      with fetch(:git_environmental_variables) do
        strategy.update
      end
    end
  end
end

desc "Copy repo to releases"
task create_release: :'git:update' do
  on release_roles :all do
    with fetch(:git_environmental_variables) do
      within repo_path do
        execute :mkdir, "-p", release_path
        strategy.release
      end
    end
  end
end

desc "Determine the revision that will be deployed"
task :set_current_revision do
  on release_roles :all do
    within repo_path do
      with fetch(:git_environmental_variables) do
        set :current_revision, strategy.fetch_revision
      end
    end
  end
end

end