Sha256: 63e9a4d86b3a4b1038b2bea6dba3489f28b7842ee0e179fa826d6e486ada7aaa

Contents?: true

Size: 1.67 KB

Versions: 1

Compression:

Stored size: 1.67 KB

Contents

# frozen_string_literal: true

require 'git'
require 'tty-prompt'
require 'logger'
require_relative './treeish_extractor'

class GitPrompt
  SELECT_OPTIONS_PER_PAGE = 10

  attr_reader :git, :extractor, :prompt, :logger

  def initialize(git: nil)
    @git = git || Git.open(Dir.pwd)
    @extractor = TreeishExtractor.new(git: git)
		@prompt = TTY::Prompt.new(quiet: true)

		define_key_events
    select_tag(extractor.recent_branch_names)
  end

  def define_key_events
    prompt.on(:keypress) do |event|
      if event.value == 'q'
        exit
      end

      if event.value == 'j'
        prompt.trigger(:keydown)
      end

      if event.value == 'k'
        prompt.trigger(:keyup)
      end


      if event.value == 'b'
        clear_prompt
        select_tag(extractor.recent_branch_names)
      end

      if event.value == 't'
        clear_prompt
        select_tag(extractor.recent_tag_names)
      end
    end
  end

  private

  def clear_prompt
    # 2 is for the prompt message
    prompt.print TTY::Cursor.clear_lines(SELECT_OPTIONS_PER_PAGE + 2, :up)
  end

  def select_tag(treeish_names)
    message = <<~MSG.chomp
      j: down, k: up, q: quit, Enter: choose tag
      [b] branch mode [t] tag mode
    MSG

    if treeish_names.size > 0
      prompt.select(message, filter: false, per_page: SELECT_OPTIONS_PER_PAGE) do |menu|
        treeish_names.each do |tag_name|
          menu.choice tag_name, -> { checkout(tag_name) }
        end
      end
    else
      prompt.ok 'No tags were found'
    end
  rescue TTY::Reader::InputInterrupt => e
    exit
  end

  def checkout(tag_name)
    git.checkout(tag_name)
  rescue Git::GitExecuteError => e
    prompt.error(e.message)
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
git_selector-0.2.0 lib/git_prompt.rb