gnav 0.3.2 → 0.5.0

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: 8b7e79cbdf5cf836f06a23a8b09e190bc356d2530409fb4cd8716ea6298f60d7
4
- data.tar.gz: efd61790bae168e306b07910741d3c00aee7baebbd2aa1ce197e123dd391de78
3
+ metadata.gz: 96e88832c57a359eadeeb4857fe254cc13719604a88e1d332eb65ff1b0ee2b57
4
+ data.tar.gz: 23b13378d16d4dd3cff401a321510556c1c75f32bb87f49cf45d019213260e06
5
5
  SHA512:
6
- metadata.gz: b093501f3dab75937f63cd620396de323d9321c50953fd2876d251856603d1dc60d035c0bdd051c319da24118eaa2e94f222450f9dece50314461e0c58138715
7
- data.tar.gz: e5cc017bd44a23bd93da97774b97c77e553f5aaec8d8ec9afa000d902f0f509597b65808982e611cd24dcb7d573a88ae06a2b4486b34cb772028067687bcff3e
6
+ metadata.gz: ab48798911feef5a952fa42bb29c3fb761c80b74d7012ce52a2efc486dcecd91704cca3d57d155973fe37ce26260c936fe0a519eebe298f28920a9100f99297e
7
+ data.tar.gz: f50ccd8dba699f35aad897e5dcd67098488662b5243437cbe1caa5d39fdb57619c0995a1f19a0e865cb37e33fa9fb6a4d8a1e25e2d9ddd8b69f4395ba2bec042
data/Gemfile.lock CHANGED
@@ -1,7 +1,8 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- gnav (0.3.1)
4
+ gnav (0.5.0)
5
+ cli
5
6
  git
6
7
  tty-prompt (>= 0.22.0, < 0.24)
7
8
 
@@ -13,6 +14,7 @@ GEM
13
14
  binding_of_caller (1.0.0)
14
15
  debug_inspector (>= 0.0.1)
15
16
  byebug (11.1.3)
17
+ cli (1.4.0)
16
18
  coderay (1.1.3)
17
19
  debug_inspector (1.1.0)
18
20
  diff-lcs (1.5.0)
@@ -79,4 +81,4 @@ DEPENDENCIES
79
81
  simplecov
80
82
 
81
83
  BUNDLED WITH
82
- 2.1.4
84
+ 2.2.3
data/README.md CHANGED
@@ -1,6 +1,8 @@
1
1
  # GNav
2
2
 
3
- `gnav` is a simple command line tool to choose git tag and branch interactively.
3
+ `gnav` is an simple command line tool for interactively checking out a git tag or branch.
4
+
5
+ <img src='assets/gnav_theme.jpeg' width="260" alt='Gnav theme' />
4
6
 
5
7
 
6
8
  ## Installation
@@ -8,7 +10,7 @@
8
10
  Simply, install it with gem.
9
11
 
10
12
  ```shell
11
- $ gem 'gnav'
13
+ $ gem install gnav
12
14
  ```
13
15
 
14
16
 
Binary file
data/bin/release/gnav CHANGED
@@ -1,5 +1,14 @@
1
1
  #!/usr/bin/env ruby -W0
2
2
 
3
+ require 'cli'
4
+ require "rubygems"
3
5
  require_relative '../../lib/gnav.rb'
4
6
 
7
+ gemspec = Gem::Specification::load('gnav.gemspec')
8
+
9
+ CLI.new do
10
+ description gemspec.description
11
+ version gemspec.version
12
+ end.parse!
13
+
5
14
  GNav.run
data/gnav.gemspec CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |spec|
7
7
  spec.email = ["ttsysuzuki@googlemail.com"]
8
8
 
9
9
  spec.summary = 'Interactive git tag and branch selector'
10
- spec.description = 'A CLI to let you interactive select tag and branch'
10
+ spec.description = '`gnav` is an simple command line tool for interactively checking out a git tag or branch.'
11
11
  spec.homepage = 'https://github.com/suzukimilanpaak/gnav'
12
12
 
13
13
  spec.license = "MIT"
@@ -29,6 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.require_paths = ["lib"]
30
30
 
31
31
  spec.add_dependency 'git'
32
+ spec.add_dependency 'cli'
32
33
  # see monkey_patches/tty/prompt.rb for more details
33
34
  spec.add_dependency 'tty-prompt', '>= 0.22.0', '< 0.24'
34
35
  spec.add_development_dependency 'rspec'
data/lib/git_prompt.rb CHANGED
@@ -3,21 +3,22 @@
3
3
  require 'git'
4
4
  require 'tty-prompt'
5
5
  require 'logger'
6
- require_relative './treeish_extractor'
7
- require_relative './monkey_patches/tty/prompt.rb'
6
+ require_relative './treeish'
7
+ require_relative './monkey_patches/tty/prompt'
8
8
 
9
9
  class GitPrompt
10
10
  SELECT_OPTIONS_PER_PAGE = 10
11
11
 
12
- attr_reader :git, :extractor, :prompt, :logger
12
+ attr_reader :git, :branch, :tag, :prompt, :logger
13
13
 
14
14
  def initialize(git: nil)
15
15
  @git = git || Git.open(Dir.pwd)
16
- @extractor = TreeishExtractor.new(git: git)
16
+ @branch = Treeish::Branch.new(git: git)
17
+ @tag = Treeish::Tag.new(git: git)
17
18
 
18
19
  create_prompt
19
20
  define_key_events
20
- display_select(:branch, extractor.recent_branch_names)
21
+ display_select(:branch, branch.recents)
21
22
  end
22
23
 
23
24
  private
@@ -42,12 +43,12 @@ class GitPrompt
42
43
 
43
44
  if event.value == 'b'
44
45
  prompt.clear!
45
- display_select(:branch, extractor.recent_branch_names)
46
+ display_select(:branch, branch.recents)
46
47
  end
47
48
 
48
49
  if event.value == 't'
49
50
  prompt.clear!
50
- display_select(:tag, extractor.recent_tag_names)
51
+ display_select(:tag, tag.recents)
51
52
  end
52
53
  end
53
54
  end
data/lib/gnav/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module GNav
2
- VERSION = "0.3.2"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git'
4
+ require 'open3'
5
+
6
+ module Treeish
7
+ class Base
8
+ attr_reader :git
9
+
10
+ def initialize(git: nil)
11
+ @git = git || Git.open(Dir.pwd)
12
+ end
13
+
14
+ def recents
15
+ get_treeishes(recents_command) do |line, names|
16
+ next if reject_strategy(line, names)
17
+ names << {
18
+ value: value_strategy(line, names),
19
+ name: name_strategy(line, names)
20
+ }
21
+ end
22
+ end
23
+
24
+ private
25
+
26
+ def recents_command; end
27
+ def reject_strategy(line, names); end
28
+ def value_strategy(line, names); end
29
+ def name_strategy(line, names); end
30
+
31
+ def get_treeishes(cmd)
32
+ names = []
33
+ _stdin, stdout, _stderr, _wait_thr = Open3.popen3(cmd)
34
+ stdout.each(sep="\n") do |line|
35
+ yield(line, names)
36
+ end
37
+ names
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './base'
4
+
5
+ module Treeish
6
+ class Branch < Base
7
+ private
8
+
9
+ def recents_command
10
+ 'git branch --sort=-committerdate'
11
+ end
12
+
13
+ def reject_strategy(line, _)
14
+ # 'HEAD detached' means the last commit is detached from its HEAD.
15
+ # We don't need this information and remove it.
16
+ line =~ /HEAD detached/
17
+ end
18
+
19
+ def value_strategy(line, _)
20
+ line.sub('*', '').strip
21
+ end
22
+
23
+ def name_strategy(line, _)
24
+ if line.match(/\*\s/)
25
+ line.strip
26
+ else
27
+ " #{line.strip}"
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './base'
4
+
5
+ module Treeish
6
+ class Tag < Base
7
+ private
8
+
9
+ def recents_command
10
+ 'git tag --sort=-committerdate'
11
+ end
12
+
13
+ def reject_strategy(line, _)
14
+ false
15
+ end
16
+
17
+ def value_strategy(line, _)
18
+ line.strip
19
+ end
20
+
21
+ def name_strategy(line, _)
22
+ if line.match(/#{current}/)
23
+ "* #{line.strip}"
24
+ else
25
+ " #{line.strip}"
26
+ end
27
+ end
28
+
29
+ def current
30
+ # git describe --exact-match --tags $(git log -n1 --pretty='%h')
31
+ cmd = "git log -n1 --pretty='%h'"
32
+ _stdin, stdout, _stderr, _wait_thr = Open3.popen3(cmd)
33
+ last_commit = stdout.read.strip
34
+
35
+ cmd = "git describe --exact-match --tags #{last_commit}"
36
+ _stdin, stdout, _stderr, _wait_thr = Open3.popen3(cmd)
37
+ stdout.read.strip
38
+ end
39
+ end
40
+ end
data/lib/treeish.rb ADDED
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './treeish/branch'
4
+ require_relative './treeish/tag'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gnav
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.2
4
+ version: 0.5.0
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-11-09 00:00:00.000000000 Z
11
+ date: 2023-11-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: git
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: cli
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: tty-prompt
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -58,7 +72,8 @@ dependencies:
58
72
  - - ">="
59
73
  - !ruby/object:Gem::Version
60
74
  version: '0'
61
- description: A CLI to let you interactive select tag and branch
75
+ description: "`gnav` is an simple command line tool for interactively checking out
76
+ a git tag or branch."
62
77
  email:
63
78
  - ttsysuzuki@googlemail.com
64
79
  executables:
@@ -76,6 +91,7 @@ files:
76
91
  - LICENSE.txt
77
92
  - README.md
78
93
  - Rakefile
94
+ - assets/gnav_theme.jpeg
79
95
  - bin/console
80
96
  - bin/release/gnav
81
97
  - bin/setup
@@ -84,7 +100,10 @@ files:
84
100
  - lib/gnav.rb
85
101
  - lib/gnav/version.rb
86
102
  - lib/monkey_patches/tty/prompt.rb
87
- - lib/treeish_extractor.rb
103
+ - lib/treeish.rb
104
+ - lib/treeish/base.rb
105
+ - lib/treeish/branch.rb
106
+ - lib/treeish/tag.rb
88
107
  homepage: https://github.com/suzukimilanpaak/gnav
89
108
  licenses:
90
109
  - MIT
@@ -107,7 +126,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
107
126
  - !ruby/object:Gem::Version
108
127
  version: '0'
109
128
  requirements: []
110
- rubygems_version: 3.2.3
129
+ rubygems_version: 3.1.6
111
130
  signing_key:
112
131
  specification_version: 4
113
132
  summary: Interactive git tag and branch selector
@@ -1,60 +0,0 @@
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
- cmd = 'git tag --sort=-committerdate'
15
- get_treeishes(cmd) do |line, names|
16
- names << {
17
- value: line.strip,
18
- name: line.strip
19
- }
20
- end
21
- end
22
-
23
- def recent_branch_names
24
- cmd = 'git branch --sort=-committerdate'
25
- get_treeishes(cmd) do |line, names|
26
- next if REJECT_STRATEGY.call(line, names).nil?
27
- names << {
28
- value: VALUE_STRATEGY.call(line, names),
29
- name: NAME_STRATEGY.call(line, names)
30
- }
31
- end
32
- end
33
-
34
- private
35
-
36
- REJECT_STRATEGY = lambda do |line, _|
37
- # 'HEAD detached' means the last commit is detached from its HEAD.
38
- # We don't need this information and remove it.
39
- line unless line =~ /HEAD detached/
40
- end
41
- VALUE_STRATEGY = lambda do |line, _|
42
- line.sub('*', '').strip
43
- end
44
- NAME_STRATEGY = lambda do |line, _|
45
- if line.match(/\*\s/)
46
- line.strip
47
- else
48
- " #{line.sub('*', '').strip}"
49
- end
50
- end
51
-
52
- def get_treeishes(cmd)
53
- names = []
54
- _stdin, stdout, _stderr, _wait_thr = Open3.popen3(cmd)
55
- stdout.each(sep="\n") do |line|
56
- yield(line, names)
57
- end
58
- names
59
- end
60
- end