class Aid::Scripts::Finish

Public Class Methods

description() click to toggle source
# File lib/aid/scripts/finish.rb, line 13
def self.description
  "Commits what is currently staged with a [finishes] tag"
end

Public Instance Methods

run() click to toggle source
# File lib/aid/scripts/finish.rb, line 17
def run
  Dir.chdir(project_root) do
    Bundler.with_clean_env do
      check_for_staged_files!
      check_for_master!

      clean_up_feature_branch!
      amend_commit_with_finish_message!
      check_for_linter_prehook!
      force_push_to_github!
    end
  end
end

Private Instance Methods

add_rubocop_linter(linter_path) click to toggle source
# File lib/aid/scripts/finish.rb, line 80
      def add_rubocop_linter(linter_path)
        dirname = File.dirname(linter_path)
        FileUtils.mkdir_p(dirname) unless File.directory?(dirname)
        linter_template = <<~RUBOCOP_LINTER
          #!/bin/bash
          rubocop -a
        RUBOCOP_LINTER
        file = File.open(linter_path, "w+")
        file.puts linter_template
        file.close
      end
amend_commit_with_finish_message!() click to toggle source
# File lib/aid/scripts/finish.rb, line 45
def amend_commit_with_finish_message!
  step "Amending your last commit with finish message" do
    message = amend_message_with_tag(`git log -1 --pretty="format:%B"`.strip)
    template_file = create_template_file

    begin
      template_file.write(message)
      template_file.close

      system! "git commit --amend -o -F '#{template_file.path}'"
    ensure
      template_file.close
      template_file.unlink
    end
  end
end
amend_message_with_tag(message) click to toggle source
# File lib/aid/scripts/finish.rb, line 98
def amend_message_with_tag(message)
  finish_message = asana_finish_message
  message = message.gsub("\n\n#{finish_message}", "")

  "#{message}\n\n#{finish_message}"
end
asana_finish_message() click to toggle source
# File lib/aid/scripts/finish.rb, line 105
def asana_finish_message
  metadata = [asana_task_name, asana_task_url].compact
  metadata_lines = metadata.join("\n  ")

  "Finishes:\n  #{metadata_lines}"
end
asana_task_id() click to toggle source
# File lib/aid/scripts/finish.rb, line 120
def asana_task_id
  @asana_task_id ||= branch_name&.split("-")&.last
end
asana_task_name() click to toggle source
# File lib/aid/scripts/finish.rb, line 112
def asana_task_name
  git_config("tasks.#{asana_task_id}.name")
end
asana_task_url() click to toggle source
# File lib/aid/scripts/finish.rb, line 116
def asana_task_url
  git_config("tasks.#{asana_task_id}.url")
end
branch_name() click to toggle source
# File lib/aid/scripts/finish.rb, line 124
def branch_name
  `git rev-parse --abbrev-ref HEAD`.strip
end
check_for_linter_prehook!() click to toggle source
# File lib/aid/scripts/finish.rb, line 62
def check_for_linter_prehook!
  step "checking for linter prehook" do
    pre_commit_file_location = ".git/hooks/pre-commit"
    pre_commit_exists = File.exist?(pre_commit_file_location)

    linter_path = ".git/hooks/rubocop-linter"
    if pre_commit_exists
      if File.readlines(pre_commit_file_location).grep(/rubocop[-]linter/).empty?
        open(pre_commit_file_location, "a") do |f|
          f << "bash #{linter_path}"
        end
      end
    else
      add_rubocop_linter linter_path
    end
  end
end
check_for_master!() click to toggle source
# File lib/aid/scripts/finish.rb, line 33
def check_for_master!
  return unless `git rev-parse --abbrev-ref HEAD`.chomp == "master"

  abort colorize(:red, "You are on master, can not aid finish")
end
clean_up_feature_branch!() click to toggle source
# File lib/aid/scripts/finish.rb, line 39
def clean_up_feature_branch!
  step "Removing any empty commits & pulling in any changes from master" do
    system! "git fetch origin && git rebase -f origin/master"
  end
end
create_template_file() click to toggle source
# File lib/aid/scripts/finish.rb, line 128
def create_template_file
  Tempfile.new("git-commit-template")
end
force_push_to_github!() click to toggle source
# File lib/aid/scripts/finish.rb, line 92
def force_push_to_github!
  step "Force pushing your branch to origin" do
    system! "git push --force-with-lease origin #{branch_name.inspect}"
  end
end