flight_plan_cli 0.2.3 → 0.2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/flight_plan_cli/commands/checkout.rb +61 -0
- data/lib/flight_plan_cli/commands/ls.rb +50 -0
- data/lib/flight_plan_cli/config.rb +37 -0
- data/lib/flight_plan_cli/initializer.rb +3 -117
- data/lib/flight_plan_cli.rb +3 -0
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8dfec330bff6d5d502e675e8735f53583d62b52c
|
4
|
+
data.tar.gz: aef12432b2608aa887e15520e2272384c0246fac
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bde04240bf206d50d1f5365e08a0ba95fbc4377959bcebf914c8b77b88c2e8288a97b4f4eef0d14a8d4c60a7733a8a0d69f6aa5e354d373c77221b506299be82
|
7
|
+
data.tar.gz: 3e44b780dc1035fe0e1217dae0fe7c29fc3300d8c967b6dd469a2dda997c234f6baa510414ecda1fe6312ffa1d2cba56672ffca002f92faa5e06c93b9c820046
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.4
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module FlightPlanCli
|
2
|
+
module Commands
|
3
|
+
class Checkout
|
4
|
+
def process(issue_no)
|
5
|
+
puts "Checking out branch for #{issue_no}"
|
6
|
+
local_branch_for(issue_no) ||
|
7
|
+
remote_branch_for(issue_no) ||
|
8
|
+
new_branch_for(issue_no)
|
9
|
+
rescue Rugged::CheckoutError => e
|
10
|
+
puts "Unable to checkout: #{e.message}".red
|
11
|
+
end
|
12
|
+
|
13
|
+
def local_branch_for(issue)
|
14
|
+
issue_branches = local_branches.map(&:name).grep(/##{issue}[^0-9]/)
|
15
|
+
return false unless issue_branches.count == 1
|
16
|
+
|
17
|
+
branch = issue_branches.first
|
18
|
+
puts "Checking out local branch '#{branch}'".green
|
19
|
+
git.checkout(branch)
|
20
|
+
true
|
21
|
+
end
|
22
|
+
|
23
|
+
def remote_branch_for(issue)
|
24
|
+
fetch
|
25
|
+
issue_branches = remote_branches.map(&:name).grep(/##{issue}[^0-9]/)
|
26
|
+
return false unless issue_branches.count == 1
|
27
|
+
|
28
|
+
remote_branch_name = issue_branches.first
|
29
|
+
branch = remote_branches.find { |rb| rb.name == remote_branch_name }
|
30
|
+
local_name = branch.name[branch.remote_name.size + 1..-1]
|
31
|
+
|
32
|
+
puts "Checking out and tracking remote branch '#{local_name}'".green
|
33
|
+
new_branch = git.branches.create(local_name, branch.name)
|
34
|
+
new_branch.upstream = branch
|
35
|
+
git.checkout(local_name)
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def local_branches
|
40
|
+
@local_branches ||= git.branches.each(:local)
|
41
|
+
end
|
42
|
+
|
43
|
+
def remote_branches
|
44
|
+
@remote_branches ||= git.branches.each(:remote)
|
45
|
+
end
|
46
|
+
|
47
|
+
def git
|
48
|
+
@git ||= Rugged::Repository.new(Dir.pwd)
|
49
|
+
end
|
50
|
+
|
51
|
+
def fetch
|
52
|
+
puts 'Fetching...'.green
|
53
|
+
git.remotes.each { |remote| remote.fetch(credentials: ssh_agent) }
|
54
|
+
end
|
55
|
+
|
56
|
+
def ssh_agent
|
57
|
+
@ssh_agent ||= Rugged::Credentials::SshKeyFromAgent.new(username: 'git')
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
module FlightPlanCli
|
2
|
+
module Commands
|
3
|
+
class Ls
|
4
|
+
include FlightPlanCli::Config
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
read_config
|
8
|
+
end
|
9
|
+
|
10
|
+
def process
|
11
|
+
swimlanes = tickets_by_swimlane
|
12
|
+
default_swimlane_ids.each do |swimlane_id|
|
13
|
+
next unless swimlanes.key?(swimlane_id)
|
14
|
+
|
15
|
+
print_swimlane(swimlanes[swimlane_id])
|
16
|
+
end
|
17
|
+
rescue ApiUnauthorized
|
18
|
+
puts 'Unauthorize. Please ensure your key and secret as setup correctly'.red
|
19
|
+
rescue Errno::ECONNREFUSED, SocketError => e
|
20
|
+
# TODO: caching - low timeout (5s) then fallback to cache
|
21
|
+
puts "Network error. #{e.message}".red
|
22
|
+
end
|
23
|
+
|
24
|
+
def tickets_by_swimlane
|
25
|
+
response = client.board_tickets(board_id: board_id, repo_id: repo_id)
|
26
|
+
puts 'ok2'
|
27
|
+
raise ApiUnauthorized if response.code == 401
|
28
|
+
raise ApiNotFound if response.code == 404
|
29
|
+
|
30
|
+
swimlanes = {}
|
31
|
+
response.each do |board_ticket|
|
32
|
+
swimlane = board_ticket['swimlane']
|
33
|
+
next unless default_swimlane_ids.include? swimlane['id']
|
34
|
+
|
35
|
+
swimlanes[swimlane['id']] ||= swimlane
|
36
|
+
swimlanes[swimlane['id']]['tickets'] ||= []
|
37
|
+
swimlanes[swimlane['id']]['tickets'] << board_ticket['ticket']
|
38
|
+
end
|
39
|
+
swimlanes
|
40
|
+
end
|
41
|
+
|
42
|
+
def print_swimlane(swimlane)
|
43
|
+
puts "#{swimlane['name']} (#{swimlane['tickets'].count})".green
|
44
|
+
swimlane['tickets'].each do |ticket|
|
45
|
+
puts "├── #{ticket['remote_number'].rjust(4)} : #{ticket['remote_title']}".yellow
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module FlightPlanCli
|
2
|
+
module Config
|
3
|
+
YAML_FILE = '.flight_plan_cli.yml'.freeze
|
4
|
+
|
5
|
+
attr_reader :board_id, :repo_id, :default_swimlane_ids
|
6
|
+
attr_reader :api_url, :api_key, :api_secret
|
7
|
+
|
8
|
+
def read_config
|
9
|
+
@board_id = config['board_id']
|
10
|
+
@repo_id = config['repo_id']
|
11
|
+
@default_swimlane_ids = config['ls']['default_swimlane_ids']
|
12
|
+
|
13
|
+
@api_url = config['api_url']
|
14
|
+
@api_key = ENV['FLIGHT_PLAN_API_KEY']
|
15
|
+
@api_secret = ENV['FLIGHT_PLAN_API_SECRET']
|
16
|
+
end
|
17
|
+
|
18
|
+
def client
|
19
|
+
@client ||= FlightPlanCli::Api.new(
|
20
|
+
url: api_url,
|
21
|
+
key: api_key,
|
22
|
+
secret: api_secret
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
def config
|
27
|
+
@config ||=
|
28
|
+
begin
|
29
|
+
unless File.exist?(YAML_FILE)
|
30
|
+
puts "Could not file #{YAML_FILE} file."
|
31
|
+
exit 1
|
32
|
+
end
|
33
|
+
YAML.load_file(YAML_FILE)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -7,7 +7,7 @@ module FlightPlanCli
|
|
7
7
|
class ApiNotFound < StandardError; end
|
8
8
|
|
9
9
|
class Initializer < Thor
|
10
|
-
|
10
|
+
include FlightPlanCli::Config
|
11
11
|
|
12
12
|
def initialize(*args)
|
13
13
|
read_config
|
@@ -16,128 +16,14 @@ module FlightPlanCli
|
|
16
16
|
|
17
17
|
desc 'ls', 'List open issues'
|
18
18
|
def ls
|
19
|
-
|
20
|
-
default_swimlane_ids.each do |swimlane_id|
|
21
|
-
next unless swimlanes.key?(swimlane_id)
|
22
|
-
|
23
|
-
print_swimlane(swimlanes[swimlane_id])
|
24
|
-
end
|
25
|
-
rescue ApiUnauthorized
|
26
|
-
puts 'Unauthorize. Please ensure your key and secret as setup correctly'.red
|
27
|
-
rescue Errno::ECONNREFUSED, SocketError => e
|
28
|
-
# TODO: caching - low timeout (5s) then fallback to cache
|
29
|
-
puts "Network error. #{e.message}".red
|
19
|
+
Commands::Ls.new.process
|
30
20
|
end
|
31
21
|
|
32
22
|
desc 'checkout ISSUE_NO', 'checkout a branch for ISSUE_NO'
|
33
23
|
def checkout(issue_no)
|
34
|
-
|
35
|
-
local_branch_for(issue_no) || remote_branch_for(issue_no)
|
36
|
-
rescue Rugged::CheckoutError => e
|
37
|
-
puts "Unable to checkout: #{e.message}".red
|
24
|
+
Commands::Checkout.new.process(issue_no)
|
38
25
|
end
|
39
26
|
|
40
27
|
map co: :checkout
|
41
|
-
|
42
|
-
private
|
43
|
-
|
44
|
-
attr_reader :board_id, :repo_id, :default_swimlane_ids
|
45
|
-
attr_reader :api_url, :api_key, :api_secret
|
46
|
-
|
47
|
-
def read_config
|
48
|
-
@board_id = config['board_id']
|
49
|
-
@repo_id = config['repo_id']
|
50
|
-
@default_swimlane_ids = config['ls']['default_swimlane_ids']
|
51
|
-
|
52
|
-
@api_url = config['api_url']
|
53
|
-
@api_key = ENV['FLIGHT_PLAN_API_KEY']
|
54
|
-
@api_secret = ENV['FLIGHT_PLAN_API_SECRET']
|
55
|
-
end
|
56
|
-
|
57
|
-
def local_branch_for(issue)
|
58
|
-
issue_branches = local_branches.map(&:name).grep(/##{issue}[^0-9]/)
|
59
|
-
return false unless issue_branches.count == 1
|
60
|
-
|
61
|
-
branch = issue_branches.first
|
62
|
-
puts "Checking out local branch '#{branch}'".green
|
63
|
-
git.checkout(branch)
|
64
|
-
true
|
65
|
-
end
|
66
|
-
|
67
|
-
def remote_branch_for(issue)
|
68
|
-
git.fetch('origin')
|
69
|
-
issue_branches = remote_branches.map(&:name).grep(/##{issue}[^0-9]/)
|
70
|
-
return false unless issue_branches.count == 1
|
71
|
-
|
72
|
-
remote_branch_name = issue_branches.first
|
73
|
-
branch = remote_branches.find { |rb| rb.name == remote_branch_name }
|
74
|
-
local_name = branch.name[branch.remote_name.size + 1..-1]
|
75
|
-
|
76
|
-
puts "Checking out and tracking remote branch '#{local_name}'".green
|
77
|
-
new_branch = git.branches.create(local_name, branch.name)
|
78
|
-
new_branch.upstream = branch
|
79
|
-
git.checkout(local_name)
|
80
|
-
true
|
81
|
-
end
|
82
|
-
|
83
|
-
def local_branches
|
84
|
-
@local_branches ||= git.branches.each(:local)
|
85
|
-
end
|
86
|
-
|
87
|
-
def remote_branches
|
88
|
-
@remote_branches ||= git.branches.each(:remote)
|
89
|
-
end
|
90
|
-
|
91
|
-
def git
|
92
|
-
@git ||= Rugged::Repository.new(Dir.pwd)
|
93
|
-
end
|
94
|
-
|
95
|
-
def fetch
|
96
|
-
puts 'fetching...'
|
97
|
-
git.remotes.each(&:fetch)
|
98
|
-
end
|
99
|
-
|
100
|
-
def print_swimlane(swimlane)
|
101
|
-
puts "#{swimlane['name']} (#{swimlane['tickets'].count})".green
|
102
|
-
swimlane['tickets'].each do |ticket|
|
103
|
-
puts "├── #{ticket['remote_number'].rjust(4)} : #{ticket['remote_title']}".yellow
|
104
|
-
end
|
105
|
-
end
|
106
|
-
|
107
|
-
def tickets_by_swimlane
|
108
|
-
response = client.board_tickets(board_id: board_id, repo_id: repo_id)
|
109
|
-
raise ApiUnauthorized if response.code == 401
|
110
|
-
raise ApiNotFound if response.code == 404
|
111
|
-
|
112
|
-
swimlanes = {}
|
113
|
-
response.each do |board_ticket|
|
114
|
-
swimlane = board_ticket['swimlane']
|
115
|
-
next unless default_swimlane_ids.include? swimlane['id']
|
116
|
-
|
117
|
-
swimlanes[swimlane['id']] ||= swimlane
|
118
|
-
swimlanes[swimlane['id']]['tickets'] ||= []
|
119
|
-
swimlanes[swimlane['id']]['tickets'] << board_ticket['ticket']
|
120
|
-
end
|
121
|
-
swimlanes
|
122
|
-
end
|
123
|
-
|
124
|
-
def config
|
125
|
-
@config ||=
|
126
|
-
begin
|
127
|
-
unless File.exist?(YAML_FILE)
|
128
|
-
puts "Could not file #{YAML_FILE} file."
|
129
|
-
exit 1
|
130
|
-
end
|
131
|
-
YAML.load_file(YAML_FILE)
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
def client
|
136
|
-
@client ||= FlightPlanCli::Api.new(
|
137
|
-
url: api_url,
|
138
|
-
key: api_key,
|
139
|
-
secret: api_secret
|
140
|
-
)
|
141
|
-
end
|
142
28
|
end
|
143
29
|
end
|
data/lib/flight_plan_cli.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: flight_plan_cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Cleary
|
@@ -190,6 +190,9 @@ files:
|
|
190
190
|
- bin/fp
|
191
191
|
- lib/flight_plan_cli.rb
|
192
192
|
- lib/flight_plan_cli/api.rb
|
193
|
+
- lib/flight_plan_cli/commands/checkout.rb
|
194
|
+
- lib/flight_plan_cli/commands/ls.rb
|
195
|
+
- lib/flight_plan_cli/config.rb
|
193
196
|
- lib/flight_plan_cli/initializer.rb
|
194
197
|
- lib/flight_plan_cli/version.rb
|
195
198
|
homepage: https://github.com/jcleary/flight_plan_cli
|