pogo 2.31.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +73 -0
- data/bin/pogo +22 -0
- data/data/cacert.pem +3988 -0
- data/lib/heroku.rb +22 -0
- data/lib/heroku/auth.rb +320 -0
- data/lib/heroku/cli.rb +38 -0
- data/lib/heroku/client.rb +764 -0
- data/lib/heroku/client/heroku_postgresql.rb +111 -0
- data/lib/heroku/client/pgbackups.rb +113 -0
- data/lib/heroku/client/rendezvous.rb +105 -0
- data/lib/heroku/client/ssl_endpoint.rb +25 -0
- data/lib/heroku/command.rb +273 -0
- data/lib/heroku/command/account.rb +23 -0
- data/lib/heroku/command/accounts.rb +34 -0
- data/lib/heroku/command/addons.rb +305 -0
- data/lib/heroku/command/apps.rb +311 -0
- data/lib/heroku/command/auth.rb +86 -0
- data/lib/heroku/command/base.rb +230 -0
- data/lib/heroku/command/certs.rb +148 -0
- data/lib/heroku/command/config.rb +137 -0
- data/lib/heroku/command/db.rb +218 -0
- data/lib/heroku/command/domains.rb +85 -0
- data/lib/heroku/command/drains.rb +46 -0
- data/lib/heroku/command/git.rb +65 -0
- data/lib/heroku/command/help.rb +163 -0
- data/lib/heroku/command/keys.rb +115 -0
- data/lib/heroku/command/labs.rb +161 -0
- data/lib/heroku/command/logs.rb +98 -0
- data/lib/heroku/command/maintenance.rb +61 -0
- data/lib/heroku/command/pg.rb +277 -0
- data/lib/heroku/command/pgbackups.rb +289 -0
- data/lib/heroku/command/plugins.rb +110 -0
- data/lib/heroku/command/ps.rb +232 -0
- data/lib/heroku/command/releases.rb +124 -0
- data/lib/heroku/command/run.rb +179 -0
- data/lib/heroku/command/sharing.rb +89 -0
- data/lib/heroku/command/ssl.rb +61 -0
- data/lib/heroku/command/stack.rb +62 -0
- data/lib/heroku/command/status.rb +51 -0
- data/lib/heroku/command/update.rb +47 -0
- data/lib/heroku/command/version.rb +23 -0
- data/lib/heroku/deprecated.rb +5 -0
- data/lib/heroku/deprecated/help.rb +38 -0
- data/lib/heroku/distribution.rb +9 -0
- data/lib/heroku/helpers.rb +517 -0
- data/lib/heroku/helpers/heroku_postgresql.rb +104 -0
- data/lib/heroku/plugin.rb +161 -0
- data/lib/heroku/updater.rb +158 -0
- data/lib/heroku/version.rb +3 -0
- data/lib/vendor/heroku/okjson.rb +598 -0
- data/spec/helper/legacy_help.rb +16 -0
- data/spec/heroku/auth_spec.rb +246 -0
- data/spec/heroku/client/heroku_postgresql_spec.rb +34 -0
- data/spec/heroku/client/pgbackups_spec.rb +43 -0
- data/spec/heroku/client/rendezvous_spec.rb +62 -0
- data/spec/heroku/client/ssl_endpoint_spec.rb +48 -0
- data/spec/heroku/client_spec.rb +564 -0
- data/spec/heroku/command/addons_spec.rb +585 -0
- data/spec/heroku/command/apps_spec.rb +351 -0
- data/spec/heroku/command/auth_spec.rb +38 -0
- data/spec/heroku/command/base_spec.rb +109 -0
- data/spec/heroku/command/certs_spec.rb +178 -0
- data/spec/heroku/command/config_spec.rb +144 -0
- data/spec/heroku/command/db_spec.rb +110 -0
- data/spec/heroku/command/domains_spec.rb +87 -0
- data/spec/heroku/command/drains_spec.rb +34 -0
- data/spec/heroku/command/git_spec.rb +116 -0
- data/spec/heroku/command/help_spec.rb +93 -0
- data/spec/heroku/command/keys_spec.rb +120 -0
- data/spec/heroku/command/labs_spec.rb +99 -0
- data/spec/heroku/command/logs_spec.rb +60 -0
- data/spec/heroku/command/maintenance_spec.rb +51 -0
- data/spec/heroku/command/pg_spec.rb +223 -0
- data/spec/heroku/command/pgbackups_spec.rb +280 -0
- data/spec/heroku/command/plugins_spec.rb +104 -0
- data/spec/heroku/command/ps_spec.rb +195 -0
- data/spec/heroku/command/releases_spec.rb +130 -0
- data/spec/heroku/command/run_spec.rb +86 -0
- data/spec/heroku/command/sharing_spec.rb +59 -0
- data/spec/heroku/command/ssl_spec.rb +32 -0
- data/spec/heroku/command/stack_spec.rb +46 -0
- data/spec/heroku/command/status_spec.rb +48 -0
- data/spec/heroku/command/version_spec.rb +16 -0
- data/spec/heroku/command_spec.rb +211 -0
- data/spec/heroku/helpers/heroku_postgresql_spec.rb +109 -0
- data/spec/heroku/helpers_spec.rb +48 -0
- data/spec/heroku/plugin_spec.rb +172 -0
- data/spec/heroku/updater_spec.rb +44 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +209 -0
- data/spec/support/display_message_matcher.rb +49 -0
- data/spec/support/openssl_mock_helper.rb +8 -0
- metadata +220 -0
@@ -0,0 +1,179 @@
|
|
1
|
+
require "readline"
|
2
|
+
require "heroku/command/base"
|
3
|
+
|
4
|
+
# run one-off commands (console, rake)
|
5
|
+
#
|
6
|
+
class Heroku::Command::Run < Heroku::Command::Base
|
7
|
+
|
8
|
+
# run COMMAND
|
9
|
+
#
|
10
|
+
# run an attached process
|
11
|
+
#
|
12
|
+
#Example:
|
13
|
+
#
|
14
|
+
# $ heroku run bash
|
15
|
+
# Running `bash` attached to terminal... up, run.1
|
16
|
+
# ~ $
|
17
|
+
#
|
18
|
+
def index
|
19
|
+
command = args.join(" ")
|
20
|
+
error("Usage: heroku run COMMAND")if command.empty?
|
21
|
+
run_attached(command)
|
22
|
+
end
|
23
|
+
|
24
|
+
# run:detached COMMAND
|
25
|
+
#
|
26
|
+
# run a detached process, where output is sent to your logs
|
27
|
+
#
|
28
|
+
#Example:
|
29
|
+
#
|
30
|
+
# $ heroku run:detached ls
|
31
|
+
# Running `ls` detached... up, run.1
|
32
|
+
# Use `heroku logs -p run.1` to view the output.
|
33
|
+
#
|
34
|
+
def detached
|
35
|
+
command = args.join(" ")
|
36
|
+
error("Usage: heroku run COMMAND")if command.empty?
|
37
|
+
opts = { :attach => false, :command => command }
|
38
|
+
process_data = action("Running `#{command}` detached", :success => "up") do
|
39
|
+
process_data = api.post_ps(app, command, { :attach => false }).body
|
40
|
+
status(process_data['process'])
|
41
|
+
process_data
|
42
|
+
end
|
43
|
+
display("Use `heroku logs -p #{process_data['process']}` to view the output.")
|
44
|
+
end
|
45
|
+
|
46
|
+
# run:rake COMMAND
|
47
|
+
#
|
48
|
+
# WARNING: `heroku run:rake` has been deprecated. Please use `heroku run rake` instead."
|
49
|
+
#
|
50
|
+
# remotely execute a rake command
|
51
|
+
#
|
52
|
+
#Example:
|
53
|
+
#
|
54
|
+
# $ heroku run:rake -T
|
55
|
+
# Running `rake -T` attached to terminal... up, run.1
|
56
|
+
# (in /app)
|
57
|
+
# rake test # run tests
|
58
|
+
#
|
59
|
+
def rake
|
60
|
+
deprecate("`heroku #{current_command}` has been deprecated. Please use `heroku run rake` instead.")
|
61
|
+
command = "rake #{args.join(' ')}"
|
62
|
+
run_attached(command)
|
63
|
+
end
|
64
|
+
|
65
|
+
alias_command "rake", "run:rake"
|
66
|
+
|
67
|
+
# run:console [COMMAND]
|
68
|
+
#
|
69
|
+
# open a remote console session
|
70
|
+
#
|
71
|
+
# if COMMAND is specified, run the command and exit
|
72
|
+
#
|
73
|
+
# NOTE: For Cedar apps, use `heroku run console`
|
74
|
+
#
|
75
|
+
#Examples:
|
76
|
+
#
|
77
|
+
# $ heroku console
|
78
|
+
# Ruby console for myapp.heroku.com
|
79
|
+
# >>
|
80
|
+
#
|
81
|
+
def console
|
82
|
+
cmd = args.join(' ').strip
|
83
|
+
if cmd.empty?
|
84
|
+
console_session(app)
|
85
|
+
else
|
86
|
+
display(heroku.console(app, cmd))
|
87
|
+
end
|
88
|
+
rescue RestClient::RequestFailed => e
|
89
|
+
if e.http_body =~ /For Cedar apps, use: `heroku run console`/
|
90
|
+
deprecate("`heroku #{current_command}` has been deprecated for Cedar apps. Please use: `heroku run console` instead.")
|
91
|
+
command = "console #{args.join(' ')}"
|
92
|
+
run_attached(command)
|
93
|
+
else
|
94
|
+
raise(e)
|
95
|
+
end
|
96
|
+
rescue RestClient::RequestTimeout
|
97
|
+
error("Timed out. Long running requests are not supported on the console.\nPlease consider creating a rake task instead.")
|
98
|
+
rescue Heroku::Client::AppCrashed => e
|
99
|
+
error(e.message)
|
100
|
+
end
|
101
|
+
|
102
|
+
alias_command "console", "run:console"
|
103
|
+
|
104
|
+
protected
|
105
|
+
|
106
|
+
def run_attached(command)
|
107
|
+
process_data = action("Running `#{command}` attached to terminal", :success => "up") do
|
108
|
+
process_data = api.post_ps(app, command, { :attach => true, :ps_env => get_terminal_environment }).body
|
109
|
+
status(process_data["process"])
|
110
|
+
process_data
|
111
|
+
end
|
112
|
+
rendezvous_session(process_data["rendezvous_url"])
|
113
|
+
end
|
114
|
+
|
115
|
+
def rendezvous_session(rendezvous_url, &on_connect)
|
116
|
+
begin
|
117
|
+
set_buffer(false)
|
118
|
+
rendezvous = Heroku::Client::Rendezvous.new(
|
119
|
+
:rendezvous_url => rendezvous_url,
|
120
|
+
:connect_timeout => (ENV["HEROKU_CONNECT_TIMEOUT"] || 120).to_i,
|
121
|
+
:activity_timeout => nil,
|
122
|
+
:input => $stdin,
|
123
|
+
:output => $stdout)
|
124
|
+
rendezvous.on_connect(&on_connect)
|
125
|
+
rendezvous.start
|
126
|
+
rescue Timeout::Error
|
127
|
+
error "\nTimeout awaiting process"
|
128
|
+
rescue Errno::ECONNREFUSED, Errno::ECONNRESET, OpenSSL::SSL::SSLError
|
129
|
+
error "\nError connecting to process"
|
130
|
+
rescue Interrupt
|
131
|
+
ensure
|
132
|
+
set_buffer(true)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def console_history_dir
|
137
|
+
FileUtils.mkdir_p(path = "#{home_directory}/.heroku/console_history")
|
138
|
+
path
|
139
|
+
end
|
140
|
+
|
141
|
+
def console_session(app)
|
142
|
+
heroku.console(app) do |console|
|
143
|
+
console_history_read(app)
|
144
|
+
|
145
|
+
display "Ruby console for #{app}.#{heroku.host}"
|
146
|
+
while cmd = Readline.readline('>> ')
|
147
|
+
unless cmd.nil? || cmd.strip.empty?
|
148
|
+
console_history_add(app, cmd)
|
149
|
+
break if cmd.downcase.strip == 'exit'
|
150
|
+
display console.run(cmd)
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def console_history_file(app)
|
157
|
+
"#{console_history_dir}/#{app}"
|
158
|
+
end
|
159
|
+
|
160
|
+
def console_history_read(app)
|
161
|
+
history = File.read(console_history_file(app)).split("\n")
|
162
|
+
if history.size > 50
|
163
|
+
history = history[(history.size - 51),(history.size - 1)]
|
164
|
+
File.open(console_history_file(app), "w") { |f| f.puts history.join("\n") }
|
165
|
+
end
|
166
|
+
history.each { |cmd| Readline::HISTORY.push(cmd) }
|
167
|
+
rescue Errno::ENOENT
|
168
|
+
rescue Exception => ex
|
169
|
+
display "Error reading your console history: #{ex.message}"
|
170
|
+
if confirm("Would you like to clear it? (y/N):")
|
171
|
+
FileUtils.rm(console_history_file(app)) rescue nil
|
172
|
+
end
|
173
|
+
end
|
174
|
+
|
175
|
+
def console_history_add(app, cmd)
|
176
|
+
Readline::HISTORY.push(cmd)
|
177
|
+
File.open(console_history_file(app), "a") { |f| f.puts cmd + "\n" }
|
178
|
+
end
|
179
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require "heroku/command/base"
|
2
|
+
|
3
|
+
module Heroku::Command
|
4
|
+
|
5
|
+
# manage collaborators on an app
|
6
|
+
#
|
7
|
+
class Sharing < Base
|
8
|
+
|
9
|
+
# sharing
|
10
|
+
#
|
11
|
+
# list collaborators on an app
|
12
|
+
#
|
13
|
+
#Example:
|
14
|
+
#
|
15
|
+
# $ heroku sharing
|
16
|
+
# === myapp Collaborators
|
17
|
+
# collaborator@example.com
|
18
|
+
# email@example.com
|
19
|
+
#
|
20
|
+
def index
|
21
|
+
validate_arguments!
|
22
|
+
|
23
|
+
# this is never empty, as it always includes the owner
|
24
|
+
collaborators = api.get_collaborators(app).body
|
25
|
+
styled_header("#{app} Collaborators")
|
26
|
+
styled_array(collaborators.map {|collaborator| collaborator["email"]})
|
27
|
+
end
|
28
|
+
|
29
|
+
# sharing:add EMAIL
|
30
|
+
#
|
31
|
+
# add a collaborator to an app
|
32
|
+
#
|
33
|
+
#Example:
|
34
|
+
#
|
35
|
+
# $ heroku sharing:add collaborator@example.com
|
36
|
+
# Adding collaborator@example.com to myapp collaborators... done
|
37
|
+
#
|
38
|
+
def add
|
39
|
+
unless email = shift_argument
|
40
|
+
error("Usage: heroku sharing:add EMAIL\nMust specify EMAIL to add sharing.")
|
41
|
+
end
|
42
|
+
validate_arguments!
|
43
|
+
|
44
|
+
action("Adding #{email} to #{app} collaborators") do
|
45
|
+
api.post_collaborator(app, email)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# sharing:remove EMAIL
|
50
|
+
#
|
51
|
+
# remove a collaborator from an app
|
52
|
+
#
|
53
|
+
#Example:
|
54
|
+
#
|
55
|
+
# $ heroku sharing:remove collaborator@example.com
|
56
|
+
# Removing collaborator@example.com to myapp collaborators... done
|
57
|
+
#
|
58
|
+
def remove
|
59
|
+
unless email = shift_argument
|
60
|
+
error("Usage: heroku sharing:remove EMAIL\nMust specify EMAIL to remove sharing.")
|
61
|
+
end
|
62
|
+
validate_arguments!
|
63
|
+
|
64
|
+
action("Removing #{email} from #{app} collaborators") do
|
65
|
+
api.delete_collaborator(app, email)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# sharing:transfer EMAIL
|
70
|
+
#
|
71
|
+
# transfer an app to a new owner
|
72
|
+
#
|
73
|
+
#Example:
|
74
|
+
#
|
75
|
+
# $ heroku sharing:transfer collaborator@example.com
|
76
|
+
# Transferring myapp to collaborator@example.com... done
|
77
|
+
#
|
78
|
+
def transfer
|
79
|
+
unless email = shift_argument
|
80
|
+
error("Usage: heroku sharing:transfer EMAIL\nMust specify EMAIL to transfer an app.")
|
81
|
+
end
|
82
|
+
validate_arguments!
|
83
|
+
|
84
|
+
action("Transferring #{app} to #{email}") do
|
85
|
+
api.put_app(app, "transfer_owner" => email)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "heroku/command/base"
|
2
|
+
|
3
|
+
module Heroku::Command
|
4
|
+
|
5
|
+
# manage ssl certificates for an app
|
6
|
+
#
|
7
|
+
class Ssl < Base
|
8
|
+
|
9
|
+
# ssl
|
10
|
+
#
|
11
|
+
# list certificates for an app
|
12
|
+
#
|
13
|
+
def index
|
14
|
+
api.get_domains(app).body.each do |domain|
|
15
|
+
if cert = domain['cert']
|
16
|
+
display "#{domain['domain']} has a SSL certificate registered to #{cert['subject']} which expires on #{format_date(cert['expires_at'])}"
|
17
|
+
else
|
18
|
+
display "#{domain['domain']} has no certificate"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
# ssl:add PEM KEY
|
24
|
+
#
|
25
|
+
# add an ssl certificate to an app
|
26
|
+
#
|
27
|
+
def add
|
28
|
+
pem_file = args.shift
|
29
|
+
key_file = args.shift
|
30
|
+
fail "Usage: heroku ssl:add PEM KEY" unless pem_file && key_file
|
31
|
+
raise CommandFailed, "Missing pem file." unless pem_file
|
32
|
+
raise CommandFailed, "Missing key file." unless key_file
|
33
|
+
raise CommandFailed, "Could not find pem in #{pem_file}" unless File.exists?(pem_file)
|
34
|
+
raise CommandFailed, "Could not find key in #{key_file}" unless File.exists?(key_file)
|
35
|
+
|
36
|
+
pem = File.read(pem_file)
|
37
|
+
key = File.read(key_file)
|
38
|
+
info = heroku.add_ssl(app, pem, key)
|
39
|
+
display "Added certificate to #{info['domain']}, expiring at #{info['expires_at']}"
|
40
|
+
end
|
41
|
+
|
42
|
+
# ssl:remove DOMAIN
|
43
|
+
#
|
44
|
+
# remove an ssl certificate from an app
|
45
|
+
#
|
46
|
+
def remove
|
47
|
+
raise CommandFailed, "Missing domain. Usage:\nheroku ssl:remove <domain>" unless domain = args.shift
|
48
|
+
heroku.remove_ssl(app, domain)
|
49
|
+
display "Removed certificate from #{domain}"
|
50
|
+
end
|
51
|
+
|
52
|
+
# ssl:clear
|
53
|
+
#
|
54
|
+
# remove all ssl certificates from an app
|
55
|
+
#
|
56
|
+
def clear
|
57
|
+
heroku.clear_ssl(app)
|
58
|
+
display "Cleared certificates for #{app}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require "heroku/command/base"
|
2
|
+
|
3
|
+
module Heroku::Command
|
4
|
+
|
5
|
+
# manage the stack for an app
|
6
|
+
class Stack < Base
|
7
|
+
|
8
|
+
# stack
|
9
|
+
#
|
10
|
+
# show the list of available stacks
|
11
|
+
#
|
12
|
+
#Example:
|
13
|
+
#
|
14
|
+
# $ heroku stack
|
15
|
+
# === myapp Available Stacks
|
16
|
+
# bamboo-mri-1.9.2
|
17
|
+
# bamboo-ree-1.8.7
|
18
|
+
# * cedar
|
19
|
+
#
|
20
|
+
def index
|
21
|
+
validate_arguments!
|
22
|
+
|
23
|
+
stacks_data = api.get_stack(app).body
|
24
|
+
|
25
|
+
styled_header("#{app} Available Stacks")
|
26
|
+
stacks = stacks_data.map do |stack|
|
27
|
+
row = [stack['current'] ? '*' : ' ', stack['name']]
|
28
|
+
row << '(beta)' if stack['beta']
|
29
|
+
row << '(deprecated)' if stack['deprecated']
|
30
|
+
row << '(prepared, will migrate on next git push)' if stack['requested']
|
31
|
+
row.join(' ')
|
32
|
+
end
|
33
|
+
styled_array(stacks)
|
34
|
+
end
|
35
|
+
|
36
|
+
# stack:migrate STACK
|
37
|
+
#
|
38
|
+
# prepare migration of this app to a new stack
|
39
|
+
#
|
40
|
+
#Example:
|
41
|
+
#
|
42
|
+
# $ heroku stack:migrate cedar
|
43
|
+
# -----> Preparing to migrate evening-warrior-2345
|
44
|
+
# bamboo-mri-1.9.2 -> bamboo-ree-1.8.7
|
45
|
+
#
|
46
|
+
# NOTE: You must specify ALL gems (including Rails) in manifest
|
47
|
+
#
|
48
|
+
# Please read the migration guide:
|
49
|
+
# http://devcenter.heroku.com/articles/bamboo
|
50
|
+
#
|
51
|
+
# -----> Migration prepared.
|
52
|
+
# Run 'git push heroku master' to execute migration.
|
53
|
+
#
|
54
|
+
def migrate
|
55
|
+
unless stack = shift_argument
|
56
|
+
error("Usage: heroku stack:migrate STACK.\nMust specify target stack.")
|
57
|
+
end
|
58
|
+
|
59
|
+
display(api.put_stack(app, stack).body)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "heroku/command/base"
|
2
|
+
|
3
|
+
# check status of heroku platform
|
4
|
+
#
|
5
|
+
class Heroku::Command::Status < Heroku::Command::Base
|
6
|
+
|
7
|
+
# status
|
8
|
+
#
|
9
|
+
# display current status of heroku platform
|
10
|
+
#
|
11
|
+
#Example:
|
12
|
+
#
|
13
|
+
# $ heroku status
|
14
|
+
# === Heroku Status
|
15
|
+
# Development: No known issues at this time.
|
16
|
+
# Production: No known issues at this time.
|
17
|
+
#
|
18
|
+
def index
|
19
|
+
validate_arguments!
|
20
|
+
|
21
|
+
heroku_status_host = ENV['HEROKU_STATUS_HOST'] || "status.heroku.com"
|
22
|
+
require('excon')
|
23
|
+
status = json_decode(Excon.get("https://#{heroku_status_host}/api/v3/current-status.json", :nonblock => false).body)
|
24
|
+
|
25
|
+
styled_header("Heroku Status")
|
26
|
+
|
27
|
+
status['status'].each do |key, value|
|
28
|
+
if value == 'green'
|
29
|
+
status['status'][key] = 'No known issues at this time.'
|
30
|
+
end
|
31
|
+
end
|
32
|
+
styled_hash(status['status'])
|
33
|
+
|
34
|
+
unless status['issues'].empty?
|
35
|
+
display
|
36
|
+
status['issues'].each do |issue|
|
37
|
+
duration = time_ago(issue['created_at']).gsub(' ago', '+')
|
38
|
+
styled_header("#{issue['title']} #{duration}")
|
39
|
+
changes = issue['updates'].map do |issue|
|
40
|
+
[
|
41
|
+
time_ago(Time.now - Time.parse(issue['created_at'])),
|
42
|
+
issue['update_type'],
|
43
|
+
issue['contents']
|
44
|
+
]
|
45
|
+
end
|
46
|
+
styled_array(changes, :sort => false)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "heroku/command/base"
|
2
|
+
require "heroku/updater"
|
3
|
+
|
4
|
+
# update the heroku client
|
5
|
+
#
|
6
|
+
class Heroku::Command::Update < Heroku::Command::Base
|
7
|
+
|
8
|
+
# update
|
9
|
+
#
|
10
|
+
# update the heroku client
|
11
|
+
#
|
12
|
+
# Example:
|
13
|
+
#
|
14
|
+
# $ heroku update
|
15
|
+
# Updating from v1.2.3... done, updated to v2.3.4
|
16
|
+
#
|
17
|
+
def index
|
18
|
+
validate_arguments!
|
19
|
+
update_from_url("https://toolbelt.herokuapp.com/download/zip")
|
20
|
+
end
|
21
|
+
|
22
|
+
# update:beta
|
23
|
+
#
|
24
|
+
# update to the latest beta client
|
25
|
+
#
|
26
|
+
# $ heroku update
|
27
|
+
# Updating from v1.2.3... done, updated to v2.3.4.pre
|
28
|
+
#
|
29
|
+
def beta
|
30
|
+
validate_arguments!
|
31
|
+
update_from_url("https://toolbelt.herokuapp.com/download/beta-zip")
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def update_from_url(url)
|
37
|
+
Heroku::Updater.check_disabled!
|
38
|
+
action("Updating from #{Heroku::VERSION}") do
|
39
|
+
if new_version = Heroku::Updater.update(url)
|
40
|
+
status("updated to #{new_version}")
|
41
|
+
else
|
42
|
+
status("nothing to update")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|