git_selector 0.1.5 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8f2734e6da62645d6b903f92142553b2dd991a20faa809ce0662f796cd0c822c
4
- data.tar.gz: 682eda4bf7d7c1e4387b8a42de0e4bd2bb1ecfac49c218abccd56636876128c4
3
+ metadata.gz: a5542bea66cbcdb66da2a5819c0a237a4b6b1eb60f861fde66584d0456068084
4
+ data.tar.gz: 23e70bbc2fa0285da59cf4d61fc69158c0c952b0ae9a7104c19635c13bb8af86
5
5
  SHA512:
6
- metadata.gz: 1109670e78c2e653966b8e45f83367d55dc5924bca9db76b7c0facc7a4225585b0a0a29a4a04604b82adecc8f9e64105bf8e48942797d408b11dcc71be9961ff
7
- data.tar.gz: 3779f33f9e2385d07aeb0e6ffd48b2c8f21cc6296f09f3482bdb121a9908936a646047d876640db46ef98da2d04c0dd4606d1cc9a5a3a9813933ea90e3b30ef8
6
+ metadata.gz: 3be88e8b39bd7c2639be38f59df491728dfa7d31253a10a609b60ab481a8717a4383a873e9097427223107f18b31bc3df70c4ead430a094ffc9df20dc4ec46ac
7
+ data.tar.gz: 30ac1fc2c1431719f188f1ecc24400840f6fd0064093cb2afb756726cf0c03df718d1cf673b202157984ef4359087b9224c5adbb2e69cb6b422eb85b55342a64
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- git_selector (0.1.5)
4
+ git_selector (0.2.1)
5
5
  git
6
6
  tty-prompt
7
7
 
data/lib/git_prompt.rb CHANGED
@@ -3,52 +3,86 @@
3
3
  require 'git'
4
4
  require 'tty-prompt'
5
5
  require 'logger'
6
- require_relative './tag_extractor'
6
+ require_relative './treeish_extractor'
7
+ require_relative './monkey_patches/tty/prompt.rb'
7
8
 
8
9
  class GitPrompt
10
+ SELECT_OPTIONS_PER_PAGE = 10
11
+
9
12
  attr_reader :git, :extractor, :prompt, :logger
10
13
 
11
14
  def initialize(git: nil)
12
15
  @git = git || Git.open(Dir.pwd)
13
- @extractor = TagExtractor.new(git: git)
14
- @prompt = TTY::Prompt.new
16
+ @extractor = TreeishExtractor.new(git: git)
15
17
 
18
+ create_prompt
16
19
  define_key_events
17
- end
18
-
19
- def select_tag
20
- message = 'j/↓: down, k/↑: up, Enter: choose tag, Type to filter tags'
21
- prompt.select(message, filter: false, per_page: 10) do |menu|
22
- extractor.recent_tag_names.each do |tag_name|
23
- menu.choice tag_name, -> { checkout(tag_name) }
24
- end
25
- end
26
- rescue TTY::Reader::InputInterrupt => e
27
- exit
20
+ select_tag(extractor.recent_tag_names)
28
21
  end
29
22
 
30
23
  def define_key_events
31
24
  prompt.on(:keypress) do |event|
32
- if event.value == "j"
25
+ if event.value == 'q'
26
+ exit
27
+ end
28
+
29
+ # move up/down in the list
30
+
31
+ if event.value == 'j'
33
32
  prompt.trigger(:keydown)
34
33
  end
35
34
 
36
- if event.value == "k"
35
+ if event.value == 'k'
37
36
  prompt.trigger(:keyup)
38
37
  end
39
38
 
40
- if event.value == "q"
41
- exit
39
+ # Select a mode
40
+
41
+ if event.value == 'b'
42
+ clear_prompt
43
+ select_tag(extractor.recent_branch_names)
44
+ end
45
+
46
+ if event.value == 't'
47
+ clear_prompt
48
+ select_tag(extractor.recent_tag_names)
42
49
  end
43
50
  end
44
51
  end
45
52
 
46
53
  private
47
54
 
55
+ def clear_prompt
56
+ prompt.clear_list
57
+ end
58
+
59
+ def create_prompt
60
+ @prompt = TTY::Prompt.new(quiet: true)
61
+ end
62
+
63
+ def select_tag(treeish_names)
64
+ message = <<~MSG.chomp
65
+ j: down, k: up, q: quit, Enter: choose tag
66
+ [b] branch mode [t] tag mode
67
+ MSG
68
+
69
+ if treeish_names.size > 0
70
+ prompt.select(message, filter: false, per_page: SELECT_OPTIONS_PER_PAGE) do |menu|
71
+ treeish_names.each do |tag_name|
72
+ menu.choice tag_name, -> { checkout(tag_name) }
73
+ end
74
+ end
75
+ else
76
+ prompt.ok 'No tags were found'
77
+ end
78
+ rescue TTY::Reader::InputInterrupt => e
79
+ # exit automatically
80
+ end
81
+
48
82
  def checkout(tag_name)
49
83
  git.checkout(tag_name)
84
+ exit
50
85
  rescue Git::GitExecuteError => e
51
86
  prompt.error(e.message)
52
87
  end
53
88
  end
54
-
@@ -1,3 +1,3 @@
1
1
  module GitSelector
2
- VERSION = "0.1.5"
2
+ VERSION = "0.2.1"
3
3
  end
data/lib/git_selector.rb CHANGED
@@ -6,4 +6,4 @@ require_relative '../lib/git_prompt'
6
6
  # require 'bundler/setup'
7
7
  # Bundler.require(:default)
8
8
 
9
- GitPrompt.new.select_tag
9
+ GitPrompt.new
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git'
4
+ require 'open3'
5
+
6
+ class TreeishExtractor
7
+ attr_reader :git
8
+
9
+ def initialize(git: nil)
10
+ @git = git || Git.open(Dir.pwd)
11
+ end
12
+
13
+ def recent_tag_names
14
+ # TODO unlimit number of tags when arg is given
15
+ cmd = "git describe --tags $(git rev-list --tags --max-count=1000)"
16
+ # reject commits without a tag
17
+ selecting_rule = ->(line, names) do
18
+ names << line.strip unless line =~ /-[\d]+-[a-z0-9]{8,}$/
19
+ end
20
+ get_treeish_names(cmd, selecting_rule)
21
+ end
22
+
23
+ def recent_branch_names
24
+ # TODO limit number of branches when arg is not given
25
+ cmd = 'git branch --sort=-committerdate'
26
+ # a current branch is prefixed with '* ' to indicate it's selected
27
+ selecting_rule = ->(line, names) do
28
+ names << line.strip.sub('* ', '') unless line =~ /HEAD detached/
29
+ end
30
+ get_treeish_names(cmd, selecting_rule)
31
+ end
32
+
33
+ private
34
+
35
+ def get_treeish_names(cmd, selecting_rule)
36
+ names = []
37
+ _stdin, stdout, _stderr, _wait_thr = Open3.popen3(cmd)
38
+ stdout.each(sep="\n") do |line|
39
+ selecting_rule.call(line, names)
40
+ end
41
+ names
42
+ end
43
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: git_selector
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tatsuya Suzuki
8
8
  autorequire:
9
9
  bindir: bin/release
10
10
  cert_chain: []
11
- date: 2023-02-24 00:00:00.000000000 Z
11
+ date: 2023-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git
@@ -76,7 +76,7 @@ files:
76
76
  - lib/git_prompt.rb
77
77
  - lib/git_selector.rb
78
78
  - lib/git_selector/version.rb
79
- - lib/tag_extractor.rb
79
+ - lib/treeish_extractor.rb
80
80
  homepage: https://github.com/suzukimilanpaak/git_selector
81
81
  licenses:
82
82
  - MIT
data/lib/tag_extractor.rb DELETED
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'git'
4
- require 'open3'
5
-
6
- class TagExtractor
7
- attr_reader :git, :shas_names
8
-
9
- def initialize(git: nil)
10
- @git = git || Git.open(Dir.pwd)
11
- end
12
-
13
- def recent_tag_names
14
- if head_changed?
15
- tag_names = []
16
- # TODO unlimit tags when arg is given
17
- cmd = "git describe --tags $(git rev-list --tags --max-count=1000)"
18
- _stdin, stdout, _stderr, _wait_thr = Open3.popen3(cmd)
19
- stdout.each(sep="\n") do |line|
20
- # reject rev without a tag
21
- tag_names << line.chomp unless line =~ /-[\d]+-[a-z0-9]{8,}$/
22
- end
23
- @tag_names = tag_names
24
- else
25
- @tag_names
26
- end
27
- end
28
-
29
- private
30
-
31
- def shas_names
32
- if head_changed?
33
- @shas_names = git.tags.each_with_object({}) { |t, sum| (sum[t.sha] ||= []) << t.name }
34
- else
35
- @shas_names
36
- end
37
- end
38
-
39
- def head_changed?
40
- changed = (@head_sha != git.log(1).first.sha)
41
- @head_sha = git.log(1).first.sha
42
- changed
43
- end
44
- end
45
-