desc “Rolls out a release, updating tag and changelog, run to see options” task :roll => :environment do

roller = RakeRoll::Roller.new
puts "----------------------"
version = RakeRoll::Versioning.new(roller.current_version)
puts "rake roll options are:"
puts "----------------------"
puts "rake roll:pre             #{roller.current_version} => #{version.pre}"
puts "rake roll:revision        #{roller.current_version} => #{version.revision}"
puts "rake roll:minor           #{roller.current_version} => #{version.minor}"
puts "rake roll:major           #{roller.current_version} => #{version.major}"
puts "rake roll:next            Writes latest commits to changelog without tagging or updating version"
puts "rake roll:bump            Pass bumped version in eg: VERSION=#{version.bump_example}"
puts "----------------------"
puts "Above will do a dry run, Run with PUSH=true to run for real"
puts "----------------------"
puts RakeRoll::Never.new.line
roller.log_to_s

end

desc “bump the version, update the tag and changelog” namespace :roll do

desc "#{RakeRoll::Roller.new.current_version} => #{RakeRoll::Versioning.new(RakeRoll::Roller.new.current_version).revision}"
task :revision => :environment do
  roller = RakeRoll::Roller.new
  version = RakeRoll::Versioning.new(roller.current_version)
  if version.current_version
    roller.new_version = version.revision
    do_your_thing(roller, version, "revision")
  else
    puts "ERROR: Invalid Version Number #{roller.current_version}"
  end
end

desc "#{RakeRoll::Roller.new.current_version} => #{RakeRoll::Versioning.new(RakeRoll::Roller.new.current_version).major}"
task :major => :environment do
  roller = RakeRoll::Roller.new
  version = RakeRoll::Versioning.new(roller.current_version)
  if version.current_version
    roller.new_version = version.major
    do_your_thing(roller, version, "major")
  else
    puts "ERROR: Invalid Version Number #{roller.current_version}"
  end
end

desc "#{RakeRoll::Roller.new.current_version} => #{RakeRoll::Versioning.new(RakeRoll::Roller.new.current_version).minor}"
task :minor => :environment do
  roller = RakeRoll::Roller.new
  version = RakeRoll::Versioning.new(roller.current_version)
  if version.current_version
    roller.new_version = version.minor
    do_your_thing(roller, version, "minor")
  else
    puts "ERROR: Invalid Version Number #{roller.current_version}"
  end
end

desc "#{RakeRoll::Roller.new.current_version} => #{RakeRoll::Versioning.new(RakeRoll::Roller.new.current_version).pre}"
task :pre => :environment do
  roller = RakeRoll::Roller.new
  version = RakeRoll::Versioning.new(roller.current_version)
  if version.current_version
    roller.new_version = version.pre
    do_your_thing(roller, version, "pre")
  else
    puts "ERROR: Invalid Version Number #{roller.current_version}"
  end
end

desc "#{RakeRoll::Roller.new.current_version} => Writes latest commits to changelog without tagging"
task :next => :environment do
  roller = RakeRoll::Roller.new
  version = RakeRoll::Versioning.new(roller.current_version)
  if version.current_version
    roller.new_version = version.next
    do_your_thing(roller, version, "next")
  else
    puts "ERROR: Invalid Version Number #{roller.current_version}"
  end
end

desc "#{RakeRoll::Roller.new.current_version} => Pass bumped version in eg: VERSION=1.2.3"
task :bump => :environment do
  roller = RakeRoll::Roller.new
  version = RakeRoll::Versioning.new(roller.current_version)
  if new_version = ENV["VERSION"]
    if version.current_version
      roller.new_version = new_version
      do_your_thing(roller, version, "bump")
    else
      puts "ERROR: Invalid Version Number #{roller.current_version}"
    end
  else
    puts "You must supply a version number i.e. VERSION=#{version.revision} rake roll:bump"
  end
end

end

def do_your_thing(roller, version, type)

roller.print_versions
if ENV["PUSH"]
  roller.push
else
  roller.print_run_for_real_text(type)
end

end