git-branch-selector 1.0.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 +7 -0
- data/bin/git-branch-selector +54 -0
- data/lib/git-branch-selector.rb +66 -0
- metadata +105 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: dd8312a533e0e4197b38cc768fc1afe2fd53ec325121d75260051cd15c5cf37e
|
4
|
+
data.tar.gz: a78388d8bb9f5396fedc38a7c677849cf6000db78dcdf01d4f9244a22d5972ea
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4b8032178c720e5cf1ea0516408a49d76b1d688188e72a4346a743ebe47508bd54dbb08bd5ffac4bb81d17ecad2a8ad9f05f6ea35890b14e0e7258e3a244b436
|
7
|
+
data.tar.gz: 9783d3ec925e46202c7e3422ad4ff7842235cc2f90d4c7d75bb591d6e2890ba017edfa5ab0c0b4dd2bdbf85fd6fa8201fae5f605614403477530578ff0f9ce71
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'optparse'
|
4
|
+
# require 'pry'
|
5
|
+
require 'git-branch-selector'
|
6
|
+
|
7
|
+
options = {
|
8
|
+
count: 15,
|
9
|
+
list: false,
|
10
|
+
copy: false
|
11
|
+
}
|
12
|
+
|
13
|
+
OptionParser.new do |opts|
|
14
|
+
opts.banner = 'Usage: gbs.rb [options].'
|
15
|
+
opts.banner << ' Passing no options will change branches on select.'
|
16
|
+
opts.banner << ' Default count is 15.'
|
17
|
+
opts.separator ''
|
18
|
+
opts.separator 'Specific options:'
|
19
|
+
|
20
|
+
opts.on('-n COUNT', '--num=COUNT', Integer, 'Number of branches to display') do |count|
|
21
|
+
options[:count] = count
|
22
|
+
end
|
23
|
+
|
24
|
+
opts.on('-l', '--list', 'List branches') do |bool|
|
25
|
+
options[:list] = !!bool
|
26
|
+
end
|
27
|
+
|
28
|
+
opts.on('-c', '--copy', 'Copy selected branch name') do |bool|
|
29
|
+
options[:copy] = !!bool
|
30
|
+
end
|
31
|
+
end.parse!
|
32
|
+
|
33
|
+
begin
|
34
|
+
if options[:list] && options[:copy]
|
35
|
+
p 'List (-l) and copy (-c) cannot be used together. Please choose only one option'
|
36
|
+
return
|
37
|
+
end
|
38
|
+
|
39
|
+
flag =
|
40
|
+
if options[:list]
|
41
|
+
'list'
|
42
|
+
elsif options[:copy]
|
43
|
+
'copy'
|
44
|
+
else
|
45
|
+
nil
|
46
|
+
end
|
47
|
+
|
48
|
+
GitBranchSelector.new(
|
49
|
+
flag: flag,
|
50
|
+
branch_lookback_count: options[:count]
|
51
|
+
).build_menu
|
52
|
+
rescue TTY::Reader::InputInterrupt
|
53
|
+
exit 1
|
54
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#! /usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'tty-prompt'
|
4
|
+
require 'open3'
|
5
|
+
require 'pry'
|
6
|
+
|
7
|
+
class GitBranchSelector
|
8
|
+
attr_reader :flag, :branch_lookback_count
|
9
|
+
|
10
|
+
def initialize(flag:, branch_lookback_count:)
|
11
|
+
@flag = flag
|
12
|
+
@branch_lookback_count = branch_lookback_count
|
13
|
+
end
|
14
|
+
|
15
|
+
def build_menu
|
16
|
+
return show_list if flag == 'list'
|
17
|
+
|
18
|
+
if cleaned_branches.empty?
|
19
|
+
puts %q(
|
20
|
+
No branches to list. Ensure you're using this within a Git repository.
|
21
|
+
)
|
22
|
+
return
|
23
|
+
end
|
24
|
+
|
25
|
+
selected_option = TTY::Prompt.new.select(
|
26
|
+
"Pick a branch",
|
27
|
+
cycle: true,
|
28
|
+
symbols: { marker: '☾' },
|
29
|
+
per_page: cleaned_branches.length,
|
30
|
+
filter: true,
|
31
|
+
help: '(Arrows, numbers, type to filter, enter to select)',
|
32
|
+
show_help: :always
|
33
|
+
) do |menu|
|
34
|
+
menu.enum ':'
|
35
|
+
|
36
|
+
cleaned_branches.each_with_index do |b, index|
|
37
|
+
menu.choice b, index + 1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
branch_name = cleaned_branches[selected_option - 1]
|
42
|
+
|
43
|
+
cmd = flag == 'copy' ? "echo #{branch_name} | pbcopy" : "git checkout #{branch_name}"
|
44
|
+
|
45
|
+
Open3.capture3(cmd)
|
46
|
+
end
|
47
|
+
|
48
|
+
def show_list
|
49
|
+
cleaned_branches.each_with_index do |b, i|
|
50
|
+
puts "#{i + 1}: #{b}"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def cleaned_branches
|
55
|
+
@cleaned_branches ||= get_branches.split("\n").map do |branch|
|
56
|
+
branch.split(/\s+\d+\t\s+/).last
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def get_branches
|
61
|
+
get_branches_cmd = "git log -g --grep-reflog 'checkout:' --format='%gs' | sed -E 's/checkout: moving from .* to//g' | awk '!seen[$0]++' | head -n #{branch_lookback_count} | cat -n"
|
62
|
+
|
63
|
+
recent_branches, = Open3.capture3(get_branches_cmd)
|
64
|
+
recent_branches
|
65
|
+
end
|
66
|
+
end
|
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: git-branch-selector
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ryan Back
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2022-11-09 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: optparse
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0.1'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0.1'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: open3
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.1'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.1'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: tty-prompt
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.23'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.23'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.14'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0.14'
|
69
|
+
description: This is a Git branch selection tool. It provides a way to quickly look
|
70
|
+
back at your most recently checked-out branches. You can list the branches, use
|
71
|
+
the selector tool to add the branch name to your clipboard, or checkout to the selected
|
72
|
+
branch.
|
73
|
+
email:
|
74
|
+
- ryanpback@gmail.com
|
75
|
+
executables:
|
76
|
+
- git-branch-selector
|
77
|
+
extensions: []
|
78
|
+
extra_rdoc_files: []
|
79
|
+
files:
|
80
|
+
- bin/git-branch-selector
|
81
|
+
- lib/git-branch-selector.rb
|
82
|
+
homepage: https://github.com/ryanpback/git-branch-selector
|
83
|
+
licenses:
|
84
|
+
- MIT
|
85
|
+
metadata: {}
|
86
|
+
post_install_message:
|
87
|
+
rdoc_options: []
|
88
|
+
require_paths:
|
89
|
+
- lib
|
90
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
91
|
+
requirements:
|
92
|
+
- - ">="
|
93
|
+
- !ruby/object:Gem::Version
|
94
|
+
version: 2.7.6
|
95
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
96
|
+
requirements:
|
97
|
+
- - ">="
|
98
|
+
- !ruby/object:Gem::Version
|
99
|
+
version: '0'
|
100
|
+
requirements: []
|
101
|
+
rubygems_version: 3.1.6
|
102
|
+
signing_key:
|
103
|
+
specification_version: 4
|
104
|
+
summary: A Git Branch Selector for your most recently used branches.
|
105
|
+
test_files: []
|