hu 1.3.6 → 1.3.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 61e3b5270bf085d9b7027fba304081beafad7410
4
- data.tar.gz: f109881ac2f36bb35e04b4d9bb98428d73b3f854
3
+ metadata.gz: e8a02a4340c2f4801397be2b132d2288cbf6753a
4
+ data.tar.gz: 7b2dc932c8dc82a4a67ce5b976b33d7e45de401a
5
5
  SHA512:
6
- metadata.gz: adbb4b03a6c2d9159b4e50b6a2717c1c7f55f43833df29fb648ebca76989a3c8e4ab03360684d8f0e9a569489eef852ce87bad556093d659a845963eb82b5a56
7
- data.tar.gz: 98a39b7b4499614550b9209fa6b4d63005110fc4a638200b3b73b6fbe7eb113c8b1e6240b6f0f99374861e2023247b7bb8ada282f625e81f0a464fcfd47302c9
6
+ metadata.gz: 65aa3c9352155a1c6a975a97b6cda88b26b6b923f44dddfb87a42e62919e594cb26422fdda354a3932ead1d63ae52d441644af8fe9df22648de53813d8df97d5
7
+ data.tar.gz: d3517a63fa07bce2035acaffbd3cb95415a59041b3241b1a05c3004ae5883956dcde6e1ef46c63bc242cb6df1f5532405b3563aace78467a20d70bb55a6c6ab9
@@ -0,0 +1,5 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ AllCops:
4
+ TargetRubyVersion: 2.3
5
+
@@ -0,0 +1,56 @@
1
+ # Offense count: 13
2
+ Metrics/AbcSize:
3
+ Max: 276
4
+
5
+ # Offense count: 2
6
+ # Configuration parameters: CountComments.
7
+ Metrics/ClassLength:
8
+ Max: 651
9
+
10
+ # Offense count: 6
11
+ Metrics/CyclomaticComplexity:
12
+ Max: 45
13
+
14
+ # Offense count: 83
15
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes.
16
+ # URISchemes: http, https
17
+ Metrics/LineLength:
18
+ Max: 176
19
+
20
+ # Offense count: 14
21
+ # Configuration parameters: CountComments.
22
+ Metrics/MethodLength:
23
+ Max: 230
24
+
25
+ # Offense count: 4
26
+ Metrics/PerceivedComplexity:
27
+ Max: 43
28
+
29
+ # Offense count: 4
30
+ Style/ClassVars:
31
+ Exclude:
32
+ - 'lib/hu/deploy.rb'
33
+
34
+ # Offense count: 5
35
+ Style/Documentation:
36
+ Exclude:
37
+ - 'spec/**/*'
38
+ - 'test/**/*'
39
+ - 'lib/hu/cli.rb'
40
+ - 'lib/hu/collab.rb'
41
+ - 'lib/hu/common.rb'
42
+ - 'lib/hu/deploy.rb'
43
+
44
+ # Offense count: 3
45
+ # Configuration parameters: AllowedVariables.
46
+ Style/GlobalVars:
47
+ Exclude:
48
+ - 'lib/hu/cli.rb'
49
+ - 'lib/hu/collab.rb'
50
+
51
+ # Offense count: 1
52
+ # Cop supports --auto-correct.
53
+ # Configuration parameters: AllowAsExpressionSeparator.
54
+ Style/Semicolon:
55
+ Exclude:
56
+ - 'lib/hu/deploy.rb'
data/Gemfile CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  source 'https://rubygems.org'
2
3
 
3
4
  # Specify your gem's dependencies in hu.gemspec
data/Rakefile CHANGED
@@ -1 +1,2 @@
1
- require "bundler/gem_tasks"
1
+ # frozen_string_literal: true
2
+ require 'bundler/gem_tasks'
data/bin/hu CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  require 'hu/cli'
4
5
 
5
6
  Optix.invoke!
6
-
data/hu.gemspec CHANGED
@@ -1,41 +1,42 @@
1
1
  # coding: utf-8
2
+ # frozen_string_literal: true
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'hu/version'
5
6
 
6
7
  Gem::Specification.new do |spec|
7
- spec.name = "hu"
8
+ spec.name = 'hu'
8
9
  spec.version = Hu::VERSION
9
- spec.authors = ["moe"]
10
- spec.email = ["moe@busyloop.net"]
11
- spec.summary = %q{Heroku Utility.}
12
- spec.description = %q{Heroku Utility.}
13
- spec.homepage = "https://github.com/busyloop/hu"
14
- spec.license = "MIT"
10
+ spec.authors = ['moe']
11
+ spec.email = ['moe@busyloop.net']
12
+ spec.summary = 'Heroku Utility.'
13
+ spec.description = 'Heroku Utility.'
14
+ spec.homepage = 'https://github.com/busyloop/hu'
15
+ spec.license = 'MIT'
15
16
 
16
- spec.files = `git ls-files`.split($/)
17
+ spec.files = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
17
18
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
- spec.require_paths = ["lib"]
20
+ spec.require_paths = ['lib']
20
21
  spec.required_ruby_version = '>= 2.3.0'
21
22
 
22
- spec.add_development_dependency "bundler", "~> 1.5"
23
- spec.add_development_dependency "rake"
24
- spec.add_development_dependency "bump"
23
+ spec.add_development_dependency 'bundler', '~> 1.5'
24
+ spec.add_development_dependency 'rake'
25
+ spec.add_development_dependency 'bump'
25
26
 
26
- spec.add_dependency "optix", "~> 1.2.4"
27
- spec.add_dependency "blackbox", "~> 3.1.4"
28
- spec.add_dependency "platform-api", "~> 0.7.0"
29
- spec.add_dependency "powerbar", ">= 1.0.16"
30
- spec.add_dependency "hashdiff", "~> 0.3.0"
31
- spec.add_dependency "version_sorter", "~> 2.0.0"
32
- spec.add_dependency "versionomy", "~> 0.5.0"
33
- spec.add_dependency "tty-prompt"
34
- spec.add_dependency "tty-spinner"
35
- spec.add_dependency "tty-table"
36
- spec.add_dependency "rainbow"
37
- spec.add_dependency "netrc"
38
- spec.add_dependency "chronic_duration"
39
- spec.add_dependency "thread_safe"
40
- spec.add_dependency "rugged"
27
+ spec.add_dependency 'optix', '~> 1.2.4'
28
+ spec.add_dependency 'blackbox', '~> 3.1.4'
29
+ spec.add_dependency 'platform-api', '~> 0.7.0'
30
+ spec.add_dependency 'powerbar', '>= 1.0.16'
31
+ spec.add_dependency 'hashdiff', '~> 0.3.0'
32
+ spec.add_dependency 'version_sorter', '~> 2.0.0'
33
+ spec.add_dependency 'versionomy', '~> 0.5.0'
34
+ spec.add_dependency 'tty-prompt'
35
+ spec.add_dependency 'tty-spinner'
36
+ spec.add_dependency 'tty-table'
37
+ spec.add_dependency 'rainbow'
38
+ spec.add_dependency 'netrc'
39
+ spec.add_dependency 'chronic_duration'
40
+ spec.add_dependency 'thread_safe'
41
+ spec.add_dependency 'rugged'
41
42
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'hu/version'
2
3
  require 'optix'
3
4
  require 'powerbar'
@@ -11,18 +12,17 @@ require 'hu/deploy'
11
12
 
12
13
  module Hu
13
14
  class Cli < Optix::Cli
14
- Optix::command do
15
+ Optix.command do
15
16
  text "Hu v#{Hu::VERSION} - Heroku Utility"
16
- opt :quiet, "Quiet mode (no progress output)", :default => false
17
- opt :version, "Print version and exit", :short => :none
17
+ opt :quiet, 'Quiet mode (no progress output)', default: false
18
+ opt :version, 'Print version and exit', short: :none
18
19
  trigger :version do
19
20
  puts "Hu v#{Hu::VERSION}"
20
21
  end
21
- filter do |cmd, opts, argv|
22
+ filter do |_cmd, opts, _argv|
22
23
  $quiet = opts[:quiet]
23
24
  $quiet = true unless STDOUT.isatty
24
25
  end
25
26
  end
26
27
  end
27
28
  end
28
-
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'powerbar'
2
3
  require 'yaml'
3
4
  require 'hashdiff'
@@ -12,25 +13,25 @@ module Hu
12
13
  class InvalidPlan < StandardError
13
14
  attr_accessor :invalid_plan
14
15
 
15
- def initialize(message=nil, invalid_plan=nil)
16
+ def initialize(message = nil, invalid_plan = nil)
16
17
  super(message)
17
18
  self.invalid_plan = invalid_plan
18
19
  end
19
20
  end
20
21
 
21
- text "Manage application/collaborator mapping."
22
- text ""
23
- text "Start by exporting the current mapping,"
24
- text "edit to taste, then diff and import."
25
- text ""
26
- text "The environment variable HU_IGNORE_APPS"
27
- text "may contain space delimited glob(7) patterns"
28
- text "of apps to be ignored."
29
- text ""
30
- text "WARNING: If you remove yourself from an application"
22
+ text 'Manage application/collaborator mapping.'
23
+ text ''
24
+ text 'Start by exporting the current mapping,'
25
+ text 'edit to taste, then diff and import.'
26
+ text ''
27
+ text 'The environment variable HU_IGNORE_APPS'
28
+ text 'may contain space delimited glob(7) patterns'
29
+ text 'of apps to be ignored.'
30
+ text ''
31
+ text 'WARNING: If you remove yourself from an application'
31
32
  text " then hu won't be able to see it anymore."
32
33
  if Hu::API_TOKEN.nil?
33
- text ""
34
+ text ''
34
35
  text "\e[1mWARNING: Environment variable 'HEROKU_API_KEY' must be set.\e[0m"
35
36
  end
36
37
  filter do
@@ -44,14 +45,14 @@ module Hu
44
45
  OP_COLORS = {
45
46
  '+' => "\e[0;1;32m",
46
47
  '-' => "\e[0;1;34m",
47
- '~' => "\e[0;32m",
48
- }
49
- desc "Read mapping from stdin and diff to heroku state"
50
- text "Read mapping from stdin and diff to heroku state"
51
- parent "collab"
52
- def diff(cmd, opts, argv)
48
+ '~' => "\e[0;32m"
49
+ }.freeze
50
+ desc 'Read mapping from stdin and diff to heroku state'
51
+ text 'Read mapping from stdin and diff to heroku state'
52
+ parent 'collab'
53
+ def diff(_cmd, opts, _argv)
53
54
  parsed_state = parse_as_json_or_yaml(STDIN.read)
54
- show_plan( plan(HashDiff.diff(heroku_state['apps'], parsed_state['apps']), opts) )
55
+ show_plan(plan(HashDiff.diff(heroku_state['apps'], parsed_state['apps']), opts))
55
56
  end
56
57
 
57
58
  def show_plan(plan)
@@ -61,7 +62,7 @@ module Hu
61
62
  icon = ' '
62
63
  if s[:method].nil?
63
64
  color = "\e[0m"
64
- msg = "<-- Can not resolve this (NO-OP)"
65
+ msg = '<-- Can not resolve this (NO-OP)'
65
66
  icon = "⚠️"
66
67
  elsif s[:invalid]
67
68
  color = "\e[0m"
@@ -74,27 +75,27 @@ module Hu
74
75
  end
75
76
  end
76
77
 
77
- desc "Print current mapping to stdout"
78
- text "Print current mapping to stdout"
79
- opt :format, "yaml|json", :default => 'yaml'
80
- parent "collab", "Manage application collaborators"
81
- def export(cmd, opts, argv)
78
+ desc 'Print current mapping to stdout'
79
+ text 'Print current mapping to stdout'
80
+ opt :format, 'yaml|json', default: 'yaml'
81
+ parent 'collab', 'Manage application collaborators'
82
+ def export(_cmd, opts, _argv)
82
83
  puts heroku_state.send("to_#{opts[:format]}".to_sym)
83
84
  end
84
85
 
85
- desc "Read mapping from stdin and push to heroku"
86
- text "Read mapping from stdin and push to heroku"
87
- opt :allow_create, "Create new collaborators on heroku", :short => 'c'
88
- opt :silent_create, "Suppress email invitation when creating collaborators"
89
- parent "collab"
90
- def import(cmd, opts, argv)
86
+ desc 'Read mapping from stdin and push to heroku'
87
+ text 'Read mapping from stdin and push to heroku'
88
+ opt :allow_create, 'Create new collaborators on heroku', short: 'c'
89
+ opt :silent_create, 'Suppress email invitation when creating collaborators'
90
+ parent 'collab'
91
+ def import(_cmd, opts, _argv)
91
92
  parsed_state = parse_as_json_or_yaml(STDIN.read)
92
93
  validators = {
93
- :op_add_collaborators => Proc.new { |op|
94
- unless heroku_state['collaborators'].include? op[:value] or opts[:allow_create]
94
+ op_add_collaborators: proc do |op|
95
+ unless heroku_state['collaborators'].include?(op[:value]) || opts[:allow_create]
95
96
  raise InvalidOperation, "Use -c to allow creation of new collaborator '#{op[:value]}'"
96
97
  end
97
- }
98
+ end
98
99
  }
99
100
  begin
100
101
  plan(HashDiff.diff(heroku_state['apps'], parsed_state['apps']), opts, validators).each do |s|
@@ -104,14 +105,14 @@ module Hu
104
105
  eol = "\e[1G"
105
106
  if s[:method].nil?
106
107
  color = "\e[0;41;33;1m"
107
- msg = "Skipped."
108
+ msg = 'Skipped.'
108
109
  icon = "\e[0;31;1m\u2718\e[0m" # X
109
110
  eol = "\n"
110
111
  end
111
112
  STDERR.printf "%s %s%6s %-30s %-15s %-30s %s\e[0m%s", icon, color, s[:op_name], s[:app_name], s[:role], s[:value], msg, eol
112
113
  next if s[:method].nil?
113
114
  begin
114
- self.send(s[:method], s)
115
+ send(s[:method], s)
115
116
  STDERR.puts "\e[0;32;1m\u2713\e[0m\n" # check
116
117
  rescue => e
117
118
  STDERR.puts "\e[0;31;1m\u2718\e[0m\n" # X
@@ -130,9 +131,9 @@ module Hu
130
131
  OP_MAP = {
131
132
  '+' => 'add',
132
133
  '-' => 'remove',
133
- '~' => 'change',
134
- }
135
- def plan(diff, env={}, validators={})
134
+ '~' => 'change'
135
+ }.freeze
136
+ def plan(diff, env = {}, validators = {})
136
137
  plan = []
137
138
  last_error = nil
138
139
  diff.each do |op, target, lval, rval|
@@ -146,10 +147,10 @@ module Hu
146
147
  app_name: app_name,
147
148
  op: op,
148
149
  op_name: op_name,
149
- method: self.respond_to?(method_name) ? method_name : nil,
150
+ method: respond_to?(method_name) ? method_name : nil,
150
151
  value: value,
151
152
  role: role,
152
- env: env,
153
+ env: env
153
154
  }
154
155
  if validators.include? method_name
155
156
  begin
@@ -160,12 +161,12 @@ module Hu
160
161
  end
161
162
  plan << operation
162
163
  end
163
- raise InvalidPlan.new("Plan did not pass validation", plan) unless last_error.nil?
164
+ raise InvalidPlan.new('Plan did not pass validation', plan) unless last_error.nil?
164
165
  plan
165
166
  end
166
167
 
167
168
  def op_add_collaborators(args)
168
- h.collaborator.create(args[:app_name], :user => args[:value], :silent => args[:env][:silent_create])
169
+ h.collaborator.create(args[:app_name], user: args[:value], silent: args[:env][:silent_create])
169
170
  end
170
171
 
171
172
  def op_remove_collaborators(args)
@@ -179,13 +180,13 @@ module Hu
179
180
  begin
180
181
  parsed = YAML.load(input)
181
182
  if parsed.is_a? String
182
- raise ArgumentError, "Input parsed as YAML yields a String"
183
+ raise ArgumentError, 'Input parsed as YAML yields a String'
183
184
  end
184
185
  rescue => yex
185
- STDERR.puts "Error: Could neither parse stdin as YAML nor as JSON."
186
- STDERR.puts "-- JSON Error --"
186
+ STDERR.puts 'Error: Could neither parse stdin as YAML nor as JSON.'
187
+ STDERR.puts '-- JSON Error --'
187
188
  STDERR.puts jex
188
- STDERR.puts "-- YAML Error --"
189
+ STDERR.puts '-- YAML Error --'
189
190
  STDERR.puts yex
190
191
  raise ArgumentError
191
192
  end
@@ -197,7 +198,7 @@ module Hu
197
198
  unless parsed.include? 'apps'
198
199
  raise ArgumentError, "Malformed input, key 'apps' not found."
199
200
  end
200
- parsed['apps'].reject!{ |e| ignored_app?(e) }
201
+ parsed['apps'].reject! { |e| ignored_app?(e) }
201
202
  parsed['apps'].each do |app_name, v|
202
203
  unless heroku_state['apps'].include? app_name
203
204
  raise ArgumentError, "Unknown application: #{app_name}"
@@ -210,37 +211,37 @@ module Hu
210
211
  end
211
212
 
212
213
  def ignored_app?(app_name)
213
- ENV.fetch('HU_IGNORE_APPS','').split(' ').each do |p|
214
+ ENV.fetch('HU_IGNORE_APPS', '').split(' ').each do |p|
214
215
  return true if File.fnmatch(p, app_name)
215
216
  end
216
217
  false
217
218
  end
218
219
 
219
- def heroku_state(force_refresh=false)
220
- return @heroku_state unless force_refresh or @heroku_state.nil?
220
+ def heroku_state(force_refresh = false)
221
+ return @heroku_state unless force_refresh || @heroku_state.nil?
221
222
  all_collaborators = Set.new
222
223
  data = { 'apps' => {} }
223
- app_names = h.app.list.map{|e| e['name']}.reject{ |e| ignored_app?(e) }
224
+ app_names = h.app.list.map { |e| e['name'] }.reject { |e| ignored_app?(e) }
224
225
  threads = []
225
- app_names.each_with_index do |app_name,i|
226
+ app_names.each_with_index do |app_name, _i|
226
227
  threads << Thread.new do
227
228
  d = data['apps'][app_name] = { 'collaborators' => [] }
228
- h.collaborator.list(app_name).map{|e|
229
+ h.collaborator.list(app_name).map do |e|
229
230
  case e['role']
230
231
  when 'owner'
231
232
  d['owner'] = e['user']['email']
232
233
  when nil
233
234
  d['collaborators'] << e['user']['email']
234
235
  else
235
- raise RuntimeError, "Unknown collaborator role: #{e['role']}"
236
+ raise "Unknown collaborator role: #{e['role']}"
236
237
  end
237
238
  all_collaborators << e['user']['email']
238
- }
239
+ end
239
240
  end
240
241
  end
241
242
  threads.each_with_index do |t, i|
242
243
  t.join
243
- pb :msg => app_names[i], :total => app_names.length, :done => i+1
244
+ pb msg: app_names[i], total: app_names.length, done: i + 1
244
245
  end
245
246
  pb :wipe
246
247
  data['collaborators'] = all_collaborators.to_a.sort
@@ -256,7 +257,6 @@ module Hu
256
257
  @pb ||= PowerBar.new
257
258
  show_opts == :wipe ? @pb.wipe : @pb.show(show_opts)
258
259
  end
259
-
260
260
  end
261
261
  end
262
262
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'blackbox/gem'
2
3
 
3
4
  module Hu
@@ -11,9 +12,13 @@ class String
11
12
  end
12
13
  end
13
14
 
14
- version_info = BB::Gem.version_info(check_interval: 900)
15
- unless version_info[:installed_is_latest] == true
16
- puts "\e[33;1mWARNING: \e[0mA newer version of #{version_info[:gem_name]} is available."
17
- puts " Please type '\e[1mgem install #{version_info[:gem_name]}\e[0m' to upgrade (v#{version_info[:gem_installed_version]} -> v#{version_info[:gem_latest_version]})."
18
- sleep 1
15
+ unless ENV['SKIP_VERSION_CHECK']
16
+ version_info = BB::Gem.version_info(check_interval: 900)
17
+ unless version_info[:installed_is_latest] == true
18
+ puts "\e[33;1mWoops! \e[0mA newer version of #{version_info[:gem_name]} is available."
19
+ puts " Please type '\e[1mgem install #{version_info[:gem_name]}\e[0m' to upgrade (v#{version_info[:gem_installed_version]} -> v#{version_info[:gem_latest_version]})."
20
+ sleep 1
21
+ puts
22
+ exit 1
23
+ end
19
24
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'version_sorter'
2
3
  require 'versionomy'
3
4
  require 'tty-prompt'
@@ -24,10 +25,10 @@ module Hu
24
25
  @@shutting_down = false
25
26
  @@spinner = nil
26
27
 
27
- text "Interactive deployment."
28
- desc "Interactive deployment"
28
+ text 'Interactive deployment.'
29
+ desc 'Interactive deployment'
29
30
  if Hu::API_TOKEN.nil?
30
- text ""
31
+ text ''
31
32
  text "\e[1mWARNING: Environment variable 'HEROKU_API_KEY' must be set.\e[0m"
32
33
  end
33
34
  filter do
@@ -37,22 +38,22 @@ module Hu
37
38
  end
38
39
  end
39
40
 
40
- def deploy(cmd, opts, argv)
41
+ def deploy(_cmd, _opts, _argv)
41
42
  trap('INT') { shutdown; safe_abort; exit 1 }
42
- at_exit {
43
- if $!.class == SystemExit && 130 == $!.status
43
+ at_exit do
44
+ if $ERROR_INFO.class == SystemExit && 130 == $ERROR_INFO.status
44
45
  shutdown
45
46
  puts
46
47
  safe_abort
47
48
  end
48
- }
49
+ end
49
50
 
50
51
  begin
51
52
  @git = Rugged::Repository.discover('.')
52
53
  rescue Rugged::RepositoryError => e
53
54
  puts
54
55
  puts "Git error: #{e}".color(:red)
55
- puts "You need to be inside the working copy of the app that you wish to deploy.".color(:red)
56
+ puts 'You need to be inside the working copy of the app that you wish to deploy.'.color(:red)
56
57
  puts
57
58
  safe_abort
58
59
  print TTY::Cursor.prev_line
@@ -65,7 +66,7 @@ module Hu
65
66
  puts
66
67
  puts "ERROR: Remote of branch 'master' does not point to 'origin'.".color(:red)
67
68
  puts
68
- puts " Sorry, we need an origin here. We really do."
69
+ puts ' Sorry, we need an origin here. We really do.'
69
70
  puts
70
71
  exit 1
71
72
  end
@@ -82,16 +83,16 @@ module Hu
82
83
  unless @git.config['gitflow.prefix.versiontag'].nil? ||
83
84
  @git.config['gitflow.prefix.versiontag'].empty?
84
85
  puts
85
- puts "ERROR: git-flow version prefix configured.".color(:red)
86
+ puts 'ERROR: git-flow version prefix configured.'.color(:red)
86
87
  puts
87
- puts " Please use this command to remove the prefix:"
88
+ puts ' Please use this command to remove the prefix:'
88
89
  puts
89
90
  puts " git config --add gitflow.prefix.versiontag ''".bright
90
91
  puts
91
92
  exit 1
92
93
  end
93
94
 
94
- push_url = get_heroku_git_remote
95
+ push_url = heroku_git_remote
95
96
 
96
97
  wc_update = Thread.new { update_working_copy }
97
98
 
@@ -100,7 +101,7 @@ module Hu
100
101
  if app.nil?
101
102
  puts
102
103
  puts "ERROR: Found no heroku app for git remote #{push_url}".color(:red)
103
- puts " Are you logged into the right heroku account?".color(:red)
104
+ puts ' Are you logged into the right heroku account?'.color(:red)
104
105
  puts
105
106
  puts " Please run 'git remote rm heroku'. Then run 'hu deploy' again to select a new remote."
106
107
  puts
@@ -112,10 +113,10 @@ module Hu
112
113
  if app['id'] != stag_app_id
113
114
  puts
114
115
  puts "ERROR: The git remote 'heroku' points to app '#{app['name']}'".color(:red)
115
- puts " which is not in stage 'staging'".color(:red)+
116
+ puts " which is not in stage 'staging'".color(:red) +
116
117
  " of pipeline '#{pipeline_name}'.".color(:red)
117
118
  puts
118
- puts " The referenced app MUST be the staging member of the pipeline."
119
+ puts ' The referenced app MUST be the staging member of the pipeline.'
119
120
 
120
121
  puts " Please run 'git remote rm heroku'. Then run 'hu deploy' again to select a new remote."
121
122
  puts
@@ -139,14 +140,14 @@ module Hu
139
140
  highest_versionomy = Versionomy.parse('v0.0.0')
140
141
  end
141
142
 
142
- all_tags = Set.new(@git.references.to_a("refs/tags/*").collect{|e| e.name[10..-1]})
143
+ all_tags = Set.new(@git.references.to_a('refs/tags/*').collect { |o| o.name[10..-1] })
143
144
 
144
145
  tiny_bump = highest_versionomy.dup
145
146
  minor_bump = highest_versionomy.dup
146
147
  major_bump = highest_versionomy.dup
147
148
 
148
149
  loop do
149
- tiny_bump = tiny_bump.bump(:tiny)
150
+ tiny_bump = tiny_bump.bump(:tiny)
150
151
  break unless all_tags.include? tiny_bump.to_s
151
152
  end
152
153
  loop do
@@ -172,60 +173,57 @@ module Hu
172
173
  git_revisions = show_pipeline_status(pipeline_name, stag_app_name, prod_app_name, release_tag, clearscreen)
173
174
  clearscreen = true
174
175
 
175
- changelog='Initial revision'
176
+ changelog = 'Initial revision'
176
177
  release_branch_exists = branch_exists?("release/#{release_tag}")
177
178
 
178
179
  if release_branch_exists
179
- puts "\nThis release will be "+release_tag.color(:red).bright
180
+ puts "\nThis release will be " + release_tag.color(:red).bright
180
181
  unless highest_version == 'v0.0.0'
181
182
  env = {
182
183
  'PREVIOUS_TAG' => highest_version,
183
184
  'RELEASE_TAG' => release_tag
184
185
  }
185
- changelog=create_changelog(env) unless highest_version == 'v0.0.0'
186
+ changelog = create_changelog(env) unless highest_version == 'v0.0.0'
186
187
  unless changelog.empty?
187
- puts "\nChanges since "+highest_version.bright+":"
188
+ puts "\nChanges since " + highest_version.bright + ':'
188
189
  puts changelog
189
190
  end
190
191
  end
191
- puts
192
192
  else
193
- puts "\nThis is release "+release_tag.color(:green).bright
194
- puts
193
+ puts "\nThis is release " + release_tag.color(:green).bright
195
194
  end
195
+ puts
196
196
 
197
- unless git_revisions[:release] == git_revisions[stag_app_name] or !release_branch_exists
198
- puts "Phase 1/3: The local release branch "+"release/#{release_tag}".bright+" was created."
199
- puts " Nothing else has happened so far. Push this branch to"
200
- puts " "+"#{stag_app_name}".bright+" to begin the deploy procedure."
197
+ unless git_revisions[:release] == git_revisions[stag_app_name] || !release_branch_exists
198
+ puts 'Phase 1/3: The local release branch ' + "release/#{release_tag}".bright + ' was created.'
199
+ puts ' Nothing else has happened so far. Push this branch to'
200
+ puts ' ' + stag_app_name.to_s.bright + ' to begin the deploy procedure.'
201
201
  puts
202
202
  end
203
203
 
204
204
  if release_branch_exists && git_revisions[:release] == git_revisions[stag_app_name]
205
- puts "Phase 2/3: Your local "+"release/#{release_tag}".bright+" (formerly "+"develop".bright+") is now live at #{stag_app_name}."
206
- puts " Please test thoroughly: "+"#{app['web_url']}".bright
207
- puts " If everything looks good, you may proceed and finish the release."
208
- puts " If there are problems: Quit, delete the release branch and start fixing."
205
+ puts 'Phase 2/3: Your local ' + "release/#{release_tag}".bright + ' (formerly ' + 'develop'.bright + ") is now live at #{stag_app_name}."
206
+ puts ' Please test thoroughly: ' + (app['web_url']).to_s.bright
207
+ puts ' If everything looks good, you may proceed and finish the release.'
208
+ puts ' If there are problems: Quit, delete the release branch and start fixing.'
209
209
  puts
210
- elsif git_revisions[prod_app_name] != git_revisions[stag_app_name] and !release_branch_exists and git_revisions[:release] != git_revisions[stag_app_name]
211
- puts "Phase 3/3: HEADS UP. This is the last chance to detect problems."
212
- puts " The final version of "+"release/#{release_tag}".bright+" is now staged."
210
+ elsif git_revisions[prod_app_name] != git_revisions[stag_app_name] && !release_branch_exists && git_revisions[:release] != git_revisions[stag_app_name]
211
+ puts 'Phase 3/3: HEADS UP. This is the last chance to detect problems.'
212
+ puts ' The final version of ' + "release/#{release_tag}".bright + ' is now staged.'
213
213
  puts
214
- puts " Test here: "+"#{app['web_url']}".bright
214
+ puts ' Test here: ' + (app['web_url']).to_s.bright
215
215
  sleep 1
216
216
  puts
217
- puts " This is the exact version that will be promoted to production."
217
+ puts ' This is the exact version that will be promoted to production.'
218
218
  puts " From here you are on your own. Good luck #{`whoami`.chomp}!"
219
219
  puts
220
220
  end
221
221
 
222
-
223
-
224
- choice = prompt.select("Choose your destiny") do |menu|
222
+ choice = prompt.select('Choose your destiny') do |menu|
225
223
  menu.enum '.'
226
- menu.choice "Refresh", :refresh
227
- menu.choice "Quit", :abort_ask
228
- unless git_revisions[:release] == git_revisions[stag_app_name] or !release_branch_exists
224
+ menu.choice 'Refresh', :refresh
225
+ menu.choice 'Quit', :abort_ask
226
+ unless git_revisions[:release] == git_revisions[stag_app_name] || !release_branch_exists
229
227
  menu.choice "Push release/#{release_tag} to #{stag_app_name}", :push_to_staging
230
228
  end
231
229
  if release_branch_exists
@@ -242,7 +240,7 @@ module Hu
242
240
  end
243
241
 
244
242
  if git_revisions[:release] == git_revisions[stag_app_name]
245
- menu.choice "Finish release (merge, tag and final stage)", :finish_release
243
+ menu.choice 'Finish release (merge, tag and final stage)', :finish_release
246
244
  end
247
245
  elsif git_revisions[prod_app_name] != git_revisions[stag_app_name]
248
246
  menu.choice "DEPLOY (promote #{stag_app_name} to #{prod_app_name})", :DEPLOY
@@ -252,66 +250,66 @@ module Hu
252
250
  puts
253
251
 
254
252
  case choice
255
- when :DEPLOY
256
- promote_to_production
257
- anykey
258
- when :finish_release
259
- old_editor = ENV['EDITOR']
260
- tf = Tempfile.new('hu-tag')
261
- tf.write "#{release_tag}\n#{changelog}"
262
- tf.close
263
- ENV['EDITOR'] = "cp #{tf.path}"
264
- env = {
265
- 'PREVIOUS_TAG' => highest_version,
266
- 'RELEASE_TAG' => release_tag
267
- }
268
- unless 0 == finish_release(release_tag, env)
269
- abort_merge
270
- puts "*** ERROR! Could not finish release *** ".color(:red)
271
- puts
272
- puts "This usually means a merge conflict or"
273
- puts "something similarly complicated has occured."
274
- puts
275
- puts "Please bring the universe into a state"
276
- puts "where the above command succeeds, then try again."
277
- puts
278
- exit 1
279
- end
280
- ENV['EDITOR'] = old_editor
281
- anykey
282
- when :push_to_staging
283
- run_each <<-EOS.strip_heredoc
253
+ when :DEPLOY
254
+ promote_to_production
255
+ anykey
256
+ when :finish_release
257
+ old_editor = ENV['EDITOR']
258
+ tf = Tempfile.new('hu-tag')
259
+ tf.write "#{release_tag}\n#{changelog}"
260
+ tf.close
261
+ ENV['EDITOR'] = "cp #{tf.path}"
262
+ env = {
263
+ 'PREVIOUS_TAG' => highest_version,
264
+ 'RELEASE_TAG' => release_tag
265
+ }
266
+ unless 0 == finish_release(release_tag, env)
267
+ abort_merge
268
+ puts '*** ERROR! Could not finish release *** '.color(:red)
269
+ puts
270
+ puts 'This usually means a merge conflict or'
271
+ puts 'something similarly complicated has occured.'
272
+ puts
273
+ puts 'Please bring the universe into a state'
274
+ puts 'where the above command succeeds, then try again.'
275
+ puts
276
+ exit 1
277
+ end
278
+ ENV['EDITOR'] = old_editor
279
+ anykey
280
+ when :push_to_staging
281
+ run_each <<-EOS.strip_heredoc
284
282
  :stream
285
283
  git push #{push_url} release/#{release_tag}:master -f
286
284
  EOS
287
- anykey
288
- when :abort_ask
289
- puts if delete_branch("release/#{release_tag}")
290
- exit 0
291
- when :bump_tiny
292
- if delete_branch("release/#{release_tag}")
293
- release_tag, branch_already_exists = prompt_for_release_tag(tiny_bump, tiny_bump)
294
- end
295
- when :bump_minor
296
- if delete_branch("release/#{release_tag}")
297
- release_tag, branch_already_exists = prompt_for_release_tag(minor_bump, minor_bump)
298
- end
299
- when :bump_major
300
- if delete_branch("release/#{release_tag}")
301
- release_tag, branch_already_exists = prompt_for_release_tag(major_bump, major_bump)
302
- end
285
+ anykey
286
+ when :abort_ask
287
+ puts if delete_branch("release/#{release_tag}")
288
+ exit 0
289
+ when :bump_tiny
290
+ if delete_branch("release/#{release_tag}")
291
+ release_tag, branch_already_exists = prompt_for_release_tag(tiny_bump, tiny_bump)
292
+ end
293
+ when :bump_minor
294
+ if delete_branch("release/#{release_tag}")
295
+ release_tag, branch_already_exists = prompt_for_release_tag(minor_bump, minor_bump)
296
+ end
297
+ when :bump_major
298
+ if delete_branch("release/#{release_tag}")
299
+ release_tag, branch_already_exists = prompt_for_release_tag(major_bump, major_bump)
300
+ end
303
301
  end
304
302
  end
305
303
  end
306
304
 
307
- def show_pipeline_status(pipeline_name, stag_app_name, prod_app_name, release_tag, clear=true)
308
- table = TTY::Table.new header: %w{location commit tag app_last_modified app_last_modified_by dynos# state}
305
+ def show_pipeline_status(pipeline_name, stag_app_name, prod_app_name, release_tag, clear = true)
306
+ table = TTY::Table.new header: %w(location commit tag app_last_modified app_last_modified_by dynos# state)
309
307
  busy 'loading', :classic
310
308
  ts = []
311
309
  tpl_row = ['?', '', '', '', '', '', '']
312
310
  revs = ThreadSafe::Hash.new
313
311
 
314
- [[0,stag_app_name],[1,prod_app_name]].each do |idx, app_name|
312
+ [[0, stag_app_name], [1, prod_app_name]].each do |idx, app_name|
315
313
  ts << Thread.new do
316
314
  table_row = tpl_row.dup
317
315
  table_row[0] = app_name
@@ -325,7 +323,7 @@ module Hu
325
323
  release_version = dynos.dig(0, 'release', 'version')
326
324
  break if release_version.nil?
327
325
 
328
- state = Set.new(dynos.collect{|d| d['state']}).sort.join(', ')
326
+ state = Set.new(dynos.collect { |d| d['state'] }).sort.join(', ')
329
327
  state_color = (state == 'up') ? 32 : 31
330
328
  table_row[6] = "\e[#{state_color};1m#{state}"
331
329
 
@@ -340,15 +338,15 @@ module Hu
340
338
  revs[app_name] = table_row[1] = slug_info['commit'][0..5]
341
339
 
342
340
  table_row[2] = `git tag --points-at #{slug_info['commit']} 2>/dev/null`
343
- table_row[2] = '' if $? != 0
341
+ table_row[2] = '' if $CHILD_STATUS != 0
344
342
 
345
343
  # heroku uses wrong timezone offset in the slug api... /facepalm
346
- #table_row[3] = ChronicDuration.output(Time.now.utc - Time.parse(slug_info['updated_at']), :units => 1)
344
+ # table_row[3] = ChronicDuration.output(Time.now.utc - Time.parse(slug_info['updated_at']), :units => 1)
347
345
 
348
346
  delta = Time.now.utc - Time.parse(release_info['updated_at'])
349
- table_row[3] = delta < 60 ? 'less than a minute' : ChronicDuration.output(delta, :units => 1)
350
- table_row[3] += " ago"
351
- #table_row[3] += "\n\e[30;1m" + slug_info['updated_at']
347
+ table_row[3] = delta < 60 ? 'less than a minute' : ChronicDuration.output(delta, units: 1)
348
+ table_row[3] += ' ago'
349
+ # table_row[3] += "\n\e[30;1m" + slug_info['updated_at']
352
350
 
353
351
  table_row[4] = release_info['user']['email']
354
352
  table_row[5] = dynos.length
@@ -386,21 +384,21 @@ module Hu
386
384
 
387
385
  unbusy
388
386
 
389
- rows.each do |row|
390
- table << row
387
+ rows.each do |r|
388
+ table << r
391
389
  end
392
390
 
393
391
  puts "\e[H\e[2J" if clear
394
392
  puts " PIPELINE #{pipeline_name} ".inverse
395
393
  puts
396
394
 
397
- puts table.render(:unicode, padding: [0,1,0,1], multiline: true)
395
+ puts table.render(:unicode, padding: [0, 1, 0, 1], multiline: true)
398
396
  revs
399
397
  end
400
398
 
401
399
  def heroku_app_by_git(git_url)
402
400
  busy('fetching heroku apps', :dots)
403
- r = h.app.list.select{ |e| e['git_url'] == git_url }
401
+ r = h.app.list.select { |e| e['git_url'] == git_url }
404
402
  unbusy
405
403
  raise "FATAL: Found multiple heroku apps with git_url=#{git_url}" if r.length > 1
406
404
  r[0]
@@ -410,16 +408,16 @@ module Hu
410
408
  busy('fetching heroku pipelines', :dots)
411
409
  couplings = h.pipeline_coupling.list
412
410
  unbusy
413
- r = couplings.select{ |e| e['app']['id'] == app['id'] }
411
+ r = couplings.select { |e| e['app']['id'] == app['id'] }
414
412
  raise "FATAL: Found multiple heroku pipelines with app.id=#{r['id']}" if r.length > 1
415
413
  raise "FATAL: Found no heroku pipeline for app.id=#{r['id']}" if r.length != 1
416
414
  r = r[0]
417
415
  pipeline_name = r['pipeline']['name']
418
416
 
419
- r = couplings.select{ |e| e['pipeline']['id'] == r['pipeline']['id'] and e['stage'] == 'staging' }[0]
417
+ r = couplings.select { |e| e['pipeline']['id'] == r['pipeline']['id'] && e['stage'] == 'staging' }[0]
420
418
  staging_app_id = r['app']['id']
421
419
 
422
- r = couplings.select{ |e| e['pipeline']['id'] == r['pipeline']['id'] and e['stage'] == 'production' }[0]
420
+ r = couplings.select { |e| e['pipeline']['id'] == r['pipeline']['id'] && e['stage'] == 'production' }[0]
423
421
  raise "FATAL: No production app in pipeline #{pipeline_name}" if r.nil?
424
422
  prod_app_id = r['app']['id']
425
423
  [pipeline_name, staging_app_id, prod_app_id]
@@ -429,7 +427,7 @@ module Hu
429
427
  @h ||= PlatformAPI.connect_oauth(Hu::API_TOKEN)
430
428
  end
431
429
 
432
- def run_each(script, opts={})
430
+ def run_each(script, opts = {})
433
431
  opts = {
434
432
  quiet: false,
435
433
  failfast: true,
@@ -441,23 +439,23 @@ module Hu
441
439
  script.lines.each_with_index do |line, i|
442
440
  line.chomp!
443
441
  case line[0]
444
- when '#'
445
- puts "\n" + line.bright unless opts[:quiet]
446
- when ':'
447
- opts[:quiet] = true if line == ':quiet'
448
- opts[:failfast] = false if line == ':return'
449
- opts[:spinner] = false if line == ':nospinner'
450
- if line == ':stream'
451
- opts[:stream] = true
452
- opts[:quiet] = false
453
- end
442
+ when '#'
443
+ puts "\n" + line.bright unless opts[:quiet]
444
+ when ':'
445
+ opts[:quiet] = true if line == ':quiet'
446
+ opts[:failfast] = false if line == ':return'
447
+ opts[:spinner] = false if line == ':nospinner'
448
+ if line == ':stream'
449
+ opts[:stream] = true
450
+ opts[:quiet] = false
451
+ end
454
452
  end
455
- next if line.empty? or ['#', ':'].include? line[0]
453
+ next if line.empty? || ['#', ':'].include?(line[0])
456
454
 
457
455
  status = nil
458
456
  if opts[:stream]
459
457
  puts "\n> ".color(:green) + line.color(:black).bright
460
- PTY.spawn(line) do |r,w,pid|
458
+ PTY.spawn(line) do |r, _w, pid|
461
459
  @tspin ||= Thread.new do
462
460
  @minispin_last_char = Time.now
463
461
  i = 0
@@ -467,48 +465,47 @@ module Hu
467
465
  sleep 0.1
468
466
  next
469
467
  end
470
- @spinlock.synchronize {
468
+ @spinlock.synchronize do
471
469
  print "\e[?25l"
472
- print Paint[' ', '#000', Lol.rainbow(1, i/3.0)]
470
+ print Paint[' ', '#000', Lol.rainbow(1, i / 3.0)]
473
471
  sleep 0.12
474
472
  print 8.chr
475
473
  print ' '
476
474
  print 8.chr
477
475
  i += 1
478
476
  print "\e[?25h"
479
- }
477
+ end
480
478
  end
481
479
  end
482
480
 
483
- while !r.eof?
481
+ until r.eof?
484
482
  c = r.getc
485
- @spinlock.synchronize {
483
+ @spinlock.synchronize do
486
484
  print c
487
485
  @minispin_last_char = Time.now
488
- }
486
+ end
489
487
  end
490
- pid, status = Process.wait2(pid)
488
+ _pid, status = Process.wait2(pid)
491
489
  @minispin_last_char = :end
492
490
  @tspin.join
493
491
  @tspin = nil
494
- #status = PTY.check(pid)
492
+ # status = PTY.check(pid)
495
493
  end
496
494
  else
497
495
  busy line if opts[:spinner]
498
496
  output, status = Open3.capture2e(line)
499
497
  unbusy if opts[:spinner]
500
498
  color = (status.exitstatus == 0) ? :green : :red
501
- if status.exitstatus != 0 or !opts[:quiet]
499
+ if status.exitstatus != 0 || !opts[:quiet]
502
500
  puts "\n> ".color(color) + line.color(:black).bright
503
501
  puts output
504
502
  end
505
503
  end
506
- if status.exitstatus != 0
507
- shutdown if opts[:failfast]
508
- puts "Error, exit #{status.exitstatus}: #{line} (L#{i})".color(:red).bright
509
- exit status.exitstatus if opts[:failfast]
510
- return status.exitstatus
511
- end
504
+ next unless status.exitstatus != 0
505
+ shutdown if opts[:failfast]
506
+ puts "Error, exit #{status.exitstatus}: #{line} (L#{i})".color(:red).bright
507
+ exit status.exitstatus if opts[:failfast]
508
+ return status.exitstatus
512
509
  end
513
510
  0
514
511
  end
@@ -516,13 +513,13 @@ module Hu
516
513
  def find_highest_version_tag
517
514
  output, status = Open3.capture2e('git tag')
518
515
  if status.exitstatus != 0
519
- puts "Error fetching git tags."
516
+ puts 'Error fetching git tags.'
520
517
  exit status.exitstatus
521
518
  end
522
519
 
523
- versions = VersionSorter.sort(output.lines.map(&:chomp).map {|e| e[0].downcase == 'v' ? e.downcase : "v#{e.downcase}" })
520
+ versions = VersionSorter.sort(output.lines.map(&:chomp).map { |e| e[0].casecmp('v').zero? ? e.downcase : "v#{e.downcase}" })
524
521
  latest = versions[-1] || 'v0.0.0'
525
- latest = "v#{latest}" unless latest[0] == "v"
522
+ latest = "v#{latest}" unless latest[0] == 'v'
526
523
  latest
527
524
  end
528
525
 
@@ -569,7 +566,7 @@ module Hu
569
566
  EOS
570
567
  end
571
568
 
572
- def get_heroku_git_remote
569
+ def heroku_git_remote
573
570
  ensure_repo_has_heroku_remote
574
571
  `git remote show -n heroku | grep Push`.chomp.split(':', 2)[1][1..-1]
575
572
  end
@@ -586,23 +583,23 @@ module Hu
586
583
  # Setup git remote
587
584
  puts
588
585
  puts "This repository has no 'heroku' remote.".color(:red)
589
- puts "We will set one up now. Please select the pipeline that you"
586
+ puts 'We will set one up now. Please select the pipeline that you'
590
587
  puts "wish to deploy to, and we will set the 'heroku' remote"
591
- puts "to the staging application in that pipeline."
588
+ puts 'to the staging application in that pipeline.'
592
589
  puts
593
590
 
594
591
  busy
595
- heroku_apps=JSON.parse(`heroku pipelines:list --json`)
592
+ heroku_apps = JSON.parse(`heroku pipelines:list --json`)
596
593
  unbusy
597
594
 
598
595
  prompt = TTY::Prompt.new
599
- pipeline_name = prompt.select("Select pipeline:") do |menu|
596
+ pipeline_name = prompt.select('Select pipeline:') do |menu|
600
597
  menu.enum '.'
601
598
  heroku_apps.each do |app|
602
599
  menu.choice app['name']
603
600
  end
604
601
  end
605
- staging_app=JSON.parse(`heroku pipelines:info #{pipeline_name} --json`)['apps'].select{|e| e['coupling']['stage'] == 'staging'}[0]
602
+ staging_app = JSON.parse(`heroku pipelines:info #{pipeline_name} --json`)['apps'].select { |e| e['coupling']['stage'] == 'staging' }[0]
606
603
  if staging_app.nil?
607
604
  puts "Error: Pipeline #{pipeline_name} has no staging app.".color(:red)
608
605
  exit 1
@@ -614,7 +611,7 @@ module Hu
614
611
  EOS
615
612
  end
616
613
 
617
- def prompt_for_release_tag(propose_version='v0.0.1', try_version=nil, keep_existing=false)
614
+ def prompt_for_release_tag(propose_version = 'v0.0.1', try_version = nil, keep_existing = false)
618
615
  prompt = TTY::Prompt.new
619
616
  loop do
620
617
  if try_version
@@ -622,14 +619,12 @@ module Hu
622
619
  try_version = nil
623
620
  else
624
621
  show_existing_git_tags
625
- release_tag = prompt.ask("Please enter a tag for this release", default: propose_version)
622
+ release_tag = prompt.ask('Please enter a tag for this release', default: propose_version)
626
623
  begin
627
624
  unless release_tag[0] == 'v'
628
- raise ArgumentError, "Version string must start with the letter v"
629
- end
630
- if release_tag.length < 5
631
- raise ArgumentError, "too short"
625
+ raise ArgumentError, 'Version string must start with the letter v'
632
626
  end
627
+ raise ArgumentError, 'too short' if release_tag.length < 5
633
628
  Versionomy.parse(release_tag)
634
629
  rescue => e
635
630
  puts "Error: Tag does not look like a semantic version (#{e})".color(:red)
@@ -638,32 +633,32 @@ module Hu
638
633
  end
639
634
 
640
635
  branches = `git for-each-ref refs/heads/ --format='%(refname:short)'`.lines.map(&:chomp)
641
- existing_branch = branches.find {|e| e.start_with? 'release/'}
636
+ existing_branch = branches.find { |b| b.start_with? 'release/' }
642
637
  branch_already_exists = !existing_branch.nil?
643
638
  release_tag = existing_branch[8..-1] if keep_existing && branch_already_exists
644
639
 
645
640
  if branch_already_exists && !keep_existing
646
- choice = prompt.expand("The branch '"+"release/#{release_tag}".color(:red)+"' already exists. What shall we do?",
647
- {default: 0}) do |q|
641
+ choice = prompt.expand("The branch '" + "release/#{release_tag}".color(:red) + "' already exists. What shall we do?",
642
+ default: 0) do |q|
648
643
  q.choice key: 'k', name: 'Keep, continue with the existing branch', value: :keep
649
644
  q.choice key: 'D', name: "Delete branch release/#{release_tag} and retry", value: :delete
650
645
  q.choice key: 'q', name: 'Quit', value: :quit
651
646
  end
652
647
 
653
648
  case choice
654
- when :quit
655
- puts
656
- exit 0
657
- when :delete
658
- delete_branch("release/#{release_tag}")
659
- next
649
+ when :quit
650
+ puts
651
+ exit 0
652
+ when :delete
653
+ delete_branch("release/#{release_tag}")
654
+ next
660
655
  end
661
656
  end
662
657
 
663
658
  if branch_already_exists
664
659
  checkout_branch("release/#{release_tag}")
665
660
  else
666
- develop_tag=`git tag --points-at develop 2>/dev/null`.lines.find { |e| e[0] == 'v' }&.chomp
661
+ develop_tag = `git tag --points-at develop 2>/dev/null`.lines.find { |tag| tag[0] == 'v' }&.chomp
667
662
  if develop_tag
668
663
  release_tag = develop_tag
669
664
  else
@@ -697,7 +692,7 @@ module Hu
697
692
  end
698
693
 
699
694
  def finish_release(release_tag, env)
700
- env.each { |k,v| ENV[k] = v }
695
+ env.each { |k, v| ENV[k] = v }
701
696
  if File.executable? '.hu/hooks/pre_release'
702
697
  run_each <<-EOS.strip_heredoc
703
698
  # Run pre-release hook
@@ -733,7 +728,7 @@ module Hu
733
728
 
734
729
  def create_changelog(env)
735
730
  if File.executable? '.hu/hooks/changelog'
736
- env.each { |k,v| ENV[k] = v }
731
+ env.each { |k, v| ENV[k] = v }
737
732
  `.hu/hooks/changelog`
738
733
  else
739
734
  `git log --pretty=format:" - %s" #{env['PREVIOUS_TAG']}..HEAD 2>/dev/null`
@@ -745,10 +740,10 @@ module Hu
745
740
  unbusy
746
741
  end
747
742
 
748
- def busy(msg='', format=:classic, clear=true)
743
+ def busy(msg = '', format = :classic, clear = true)
749
744
  return if @@shutting_down
750
745
  format ||= TTY::Formats::FORMATS.keys.sample
751
- options = {format: format, hide_cursor: true, error_mark: "\e[31;1m✖\e[0m", success_mark: "\e[32;1m✔\e[0m", clear: clear}
746
+ options = { format: format, hide_cursor: true, error_mark: "\e[31;1m✖\e[0m", success_mark: "\e[32;1m✔\e[0m", clear: clear }
752
747
  @@spinner = TTY::Spinner.new("\e[0;1m#{msg}#{msg.empty? ? '' : ' '}\e[0m\e[32;1m:spinner\e[0m", options)
753
748
  @@spinner.start
754
749
  end
@@ -758,15 +753,15 @@ module Hu
758
753
  printf "\e[?25h"
759
754
  end
760
755
 
761
- def with_spinner(msg='', format=:classic, &block)
756
+ def with_spinner(msg = '', format = :classic)
762
757
  busy(msg, format)
763
- block.call
758
+ yield
764
759
  unbusy
765
760
  end
766
761
 
767
762
  def anykey
768
763
  puts TTY::Cursor.hide
769
- print "--- Press any key ---".color(:cyan)
764
+ print '--- Press any key ---'.color(:cyan)
770
765
  STDIN.getch
771
766
  print TTY::Cursor.clear_line + TTY::Cursor.show
772
767
  end
@@ -774,7 +769,7 @@ module Hu
774
769
  def dp(label, *args)
775
770
  return unless ENV['DEBUG']
776
771
  puts "--- DEBUG #{label} ---"
777
- ap *args
772
+ ap(*args)
778
773
  puts "--- ^#{label}^ ---"
779
774
  end
780
775
 
@@ -800,4 +795,3 @@ module Hu
800
795
  end
801
796
  end
802
797
  end
803
-
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module Hu
2
- VERSION = "1.3.6"
3
+ VERSION = '1.3.8'
3
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hu
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.6
4
+ version: 1.3.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - moe
@@ -271,6 +271,8 @@ extensions: []
271
271
  extra_rdoc_files: []
272
272
  files:
273
273
  - ".gitignore"
274
+ - ".rubocop.yml"
275
+ - ".rubocop_todo.yml"
274
276
  - Gemfile
275
277
  - LICENSE.txt
276
278
  - README.md