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 |