require 'rubygems'
require 'tempfile'
require 'bundler'

CURRENT_GEM_NAME = 'oc-chef-pedant'
CURRENT_GEM_PATH = File.expand_path('../..', __FILE__)

task :chef_zero_spec do
  bundle_exec_with_chef("chef-zero", "rake pedant")
end

def bundle_exec_with_chef(test_gem, commands)
  gem_path = Bundler.environment.specs[test_gem].first.full_gem_path
  gemfile_path = File.join(gem_path, "Gemfile.#{CURRENT_GEM_NAME}-external-test")
  gemfile = File.open(gemfile_path, "w")
  begin
    IO.read(File.join(gem_path, "Gemfile")).each_line do |line|
      if line =~ /^\s*gemspec/
        next
      elsif line =~ /^\s*gem '#{CURRENT_GEM_NAME}'|\s*gem "#{CURRENT_GEM_NAME}"/
        next
      elsif line =~ /^\s*dev_gem\s*['"](.+)['"]\s*$/
        line = "gem '#{$1}', github: 'poise/#{$1}'"
      elsif line =~ /\s*gem\s*['"]#{test_gem}['"]/ # foodcritic      end
        next
      end
      gemfile.puts(line)
    end
    gemfile.puts("gem #{CURRENT_GEM_NAME.inspect}, path: #{CURRENT_GEM_PATH.inspect}")
    gemfile.puts("gemspec path: #{gem_path.inspect}")
    gemfile.close
    Dir.chdir(gem_path) do
      Bundler.with_clean_env do
        unless system({ "BUNDLE_GEMFILE" => gemfile_path, "RUBYOPT" => nil, "GEMFILE_MOD" => nil }, "bundle update")
          raise "Error running bundle update of #{gemfile_path} in #{gem_path}: #{$?.exitstatus}\nGemfile:\n#{IO.read(gemfile_path)}"
        end
        Array(commands).each do |command|
          unless system({ "BUNDLE_GEMFILE" => gemfile_path, "RUBYOPT" => nil, "GEMFILE_MOD" => nil }, "bundle exec #{command}")
            raise "Error running bundle exec #{command} in #{gem_path} with BUNDLE_GEMFILE=#{gemfile_path}: #{$?.exitstatus}\nGemfile:\n#{IO.read(gemfile_path)}"
          end
        end
      end
    end
  ensure
    File.delete(gemfile_path) if File.exist?(gemfile_path)
  end
end
