# Formats output to a bold, green text def puts(*) # Formats output print("\e[1m\e[32m") # formats text to bold, green super print("\e[22m\e[0m") # clear format end # Outputs error message and exits program with failure(1) def fail(message) Kernel.puts "\e[1m\e[31m#{message}\e[22m\e[0m" # bold, red exit false end puts '$ git fetch --all' system 'git fetch --all' default_branch = 'master' current_branch = `git rev-parse --abbrev-ref HEAD`.strip input_branch = ARGV[0] target_branch = input_branch || default_branch if input_branch `git show-ref #{input_branch}` fail('Input Branch not found') if $?.exitstatus == 1 end puts "Finding Diff migrations between" \ "\n\tCurrent -> #{current_branch}" \ "\n\tTarget -> #{target_branch}" migrations = `git diff #{target_branch} --name-status | egrep db/migrate` migrations = migrations.split("\n").map{ |str| str.delete_prefix("A\tdb/migrate/") } if migrations.any? puts migrations.each { |migration| puts " #{migration}" } puts puts 'Rollbacking "LIFO"...' migrations.reverse.each do |migration| version = migration.gsub(/[^\d]/, '') `bundle exec rake db:migrate:down VERSION=#{version}` puts "#{version} Down." end puts 'Rollback Done.' `git restore db/schema.rb` else puts 'No migrations to rollback.' end puts "Checking out to #{target_branch}..." puts "$ git checkout #{target_branch}" `git checkout #{target_branch}` fail('Checkout failed. Please check error message above.') if $?.exitstatus == 1 puts "Done."