pogo 2.31.2
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.
- 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,110 @@
|
|
|
1
|
+
require "heroku/command/base"
|
|
2
|
+
|
|
3
|
+
module Heroku::Command
|
|
4
|
+
|
|
5
|
+
# manage plugins to the heroku gem
|
|
6
|
+
class Plugins < Base
|
|
7
|
+
|
|
8
|
+
# plugins
|
|
9
|
+
#
|
|
10
|
+
# list installed plugins
|
|
11
|
+
#
|
|
12
|
+
#Example:
|
|
13
|
+
#
|
|
14
|
+
# $ heroku plugins
|
|
15
|
+
# === Installed Plugins
|
|
16
|
+
# heroku-accounts
|
|
17
|
+
#
|
|
18
|
+
def index
|
|
19
|
+
validate_arguments!
|
|
20
|
+
|
|
21
|
+
plugins = ::Heroku::Plugin.list
|
|
22
|
+
|
|
23
|
+
if plugins.length > 0
|
|
24
|
+
styled_header("Installed Plugins")
|
|
25
|
+
styled_array(plugins)
|
|
26
|
+
else
|
|
27
|
+
display("You have no installed plugins.")
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
# plugins:install URL
|
|
32
|
+
#
|
|
33
|
+
# install a plugin
|
|
34
|
+
#
|
|
35
|
+
#Example:
|
|
36
|
+
#
|
|
37
|
+
# $ heroku plugins:install https://github.com/ddollar/heroku-accounts.git
|
|
38
|
+
# Installing heroku-accounts... done
|
|
39
|
+
#
|
|
40
|
+
def install
|
|
41
|
+
plugin = Heroku::Plugin.new(shift_argument)
|
|
42
|
+
validate_arguments!
|
|
43
|
+
|
|
44
|
+
action("Installing #{plugin.name}") do
|
|
45
|
+
if plugin.install
|
|
46
|
+
unless Heroku::Plugin.load_plugin(plugin.name)
|
|
47
|
+
plugin.uninstall
|
|
48
|
+
exit(1)
|
|
49
|
+
end
|
|
50
|
+
else
|
|
51
|
+
error("Could not install #{plugin.name}. Please check the URL and try again")
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# plugins:uninstall PLUGIN
|
|
57
|
+
#
|
|
58
|
+
# uninstall a plugin
|
|
59
|
+
#
|
|
60
|
+
#Example:
|
|
61
|
+
#
|
|
62
|
+
# $ heroku plugins:uninstall heroku-accounts
|
|
63
|
+
# Uninstalling heroku-accounts... done
|
|
64
|
+
#
|
|
65
|
+
def uninstall
|
|
66
|
+
plugin = Heroku::Plugin.new(shift_argument)
|
|
67
|
+
validate_arguments!
|
|
68
|
+
|
|
69
|
+
action("Uninstalling #{plugin.name}") do
|
|
70
|
+
plugin.uninstall
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# plugins:update [PLUGIN]
|
|
75
|
+
#
|
|
76
|
+
# updates all plugins or a single plugin by name
|
|
77
|
+
#
|
|
78
|
+
#Example:
|
|
79
|
+
#
|
|
80
|
+
# $ heroku plugins:update
|
|
81
|
+
# Updating heroku-accounts... done
|
|
82
|
+
#
|
|
83
|
+
# $ heroku plugins:update heroku-accounts
|
|
84
|
+
# Updating heroku-accounts... done
|
|
85
|
+
#
|
|
86
|
+
def update
|
|
87
|
+
plugins = if plugin = shift_argument
|
|
88
|
+
[plugin]
|
|
89
|
+
else
|
|
90
|
+
::Heroku::Plugin.list
|
|
91
|
+
end
|
|
92
|
+
validate_arguments!
|
|
93
|
+
|
|
94
|
+
plugins.each do |plugin|
|
|
95
|
+
begin
|
|
96
|
+
action("Updating #{plugin}") do
|
|
97
|
+
begin
|
|
98
|
+
Heroku::Plugin.new(plugin).update
|
|
99
|
+
rescue Heroku::Plugin::ErrorUpdatingSymlinkPlugin
|
|
100
|
+
status "skipped symlink"
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
rescue SystemExit
|
|
104
|
+
# ignore so that other plugins still update
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
end
|
|
110
|
+
end
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
require "heroku/command/base"
|
|
2
|
+
|
|
3
|
+
# manage processes (dynos, workers)
|
|
4
|
+
#
|
|
5
|
+
class Heroku::Command::Ps < Heroku::Command::Base
|
|
6
|
+
|
|
7
|
+
# ps:dynos [QTY]
|
|
8
|
+
#
|
|
9
|
+
# DEPRECATED: use `heroku ps:scale dynos=N`
|
|
10
|
+
#
|
|
11
|
+
# scale to QTY web processes
|
|
12
|
+
#
|
|
13
|
+
# if QTY is not specified, display the number of web processes currently running
|
|
14
|
+
#
|
|
15
|
+
#Example:
|
|
16
|
+
#
|
|
17
|
+
# $ heroku ps:dynos 3
|
|
18
|
+
# Scaling dynos... done, now running 3
|
|
19
|
+
#
|
|
20
|
+
def dynos
|
|
21
|
+
# deprecation notice added to v2.21.3 on 03/16/12
|
|
22
|
+
display("~ `heroku ps:dynos QTY` has been deprecated and replaced with `heroku ps:scale dynos=QTY`")
|
|
23
|
+
|
|
24
|
+
dynos = shift_argument
|
|
25
|
+
validate_arguments!
|
|
26
|
+
|
|
27
|
+
if dynos
|
|
28
|
+
action("Scaling dynos") do
|
|
29
|
+
new_dynos = api.put_dynos(app, dynos).body["dynos"]
|
|
30
|
+
status("now running #{new_dynos}")
|
|
31
|
+
end
|
|
32
|
+
else
|
|
33
|
+
app_data = api.get_app(app).body
|
|
34
|
+
if app_data["stack"] == "cedar"
|
|
35
|
+
raise(Heroku::Command::CommandFailed, "For Cedar apps, use `heroku ps`")
|
|
36
|
+
else
|
|
37
|
+
display("#{app} is running #{quantify("dyno", app_data["dynos"])}")
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
alias_command "dynos", "ps:dynos"
|
|
43
|
+
|
|
44
|
+
# ps:workers [QTY]
|
|
45
|
+
#
|
|
46
|
+
# DEPRECATED: use `heroku ps:scale workers=N`
|
|
47
|
+
#
|
|
48
|
+
# scale to QTY background processes
|
|
49
|
+
#
|
|
50
|
+
# if QTY is not specified, display the number of background processes currently running
|
|
51
|
+
#
|
|
52
|
+
#Example:
|
|
53
|
+
#
|
|
54
|
+
# $ heroku ps:dynos 3
|
|
55
|
+
# Scaling workers... done, now running 3
|
|
56
|
+
#
|
|
57
|
+
def workers
|
|
58
|
+
# deprecation notice added to v2.21.3 on 03/16/12
|
|
59
|
+
display("~ `heroku ps:workers QTY` has been deprecated and replaced with `heroku ps:scale workers=QTY`")
|
|
60
|
+
|
|
61
|
+
workers = shift_argument
|
|
62
|
+
validate_arguments!
|
|
63
|
+
|
|
64
|
+
if workers
|
|
65
|
+
action("Scaling workers") do
|
|
66
|
+
new_workers = api.put_workers(app, workers).body["workers"]
|
|
67
|
+
status("now running #{new_workers}")
|
|
68
|
+
end
|
|
69
|
+
else
|
|
70
|
+
app_data = api.get_app(app).body
|
|
71
|
+
if app_data["stack"] == "cedar"
|
|
72
|
+
raise(Heroku::Command::CommandFailed, "For Cedar apps, use `heroku ps`")
|
|
73
|
+
else
|
|
74
|
+
display("#{app} is running #{quantify("worker", app_data["workers"])}")
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
alias_command "workers", "ps:workers"
|
|
80
|
+
|
|
81
|
+
# ps
|
|
82
|
+
#
|
|
83
|
+
# list processes for an app
|
|
84
|
+
#
|
|
85
|
+
#Example:
|
|
86
|
+
#
|
|
87
|
+
# $ heroku ps
|
|
88
|
+
# === run: one-off processes
|
|
89
|
+
# run.1: up for 5m: `bash`
|
|
90
|
+
#
|
|
91
|
+
# === web: `bundle exec thin start -p $PORT`
|
|
92
|
+
# web.1: created for 30s
|
|
93
|
+
#
|
|
94
|
+
def index
|
|
95
|
+
validate_arguments!
|
|
96
|
+
processes = api.get_ps(app).body
|
|
97
|
+
|
|
98
|
+
processes_by_command = Hash.new {|hash,key| hash[key] = []}
|
|
99
|
+
processes.each do |process|
|
|
100
|
+
name = process["process"].split(".").first
|
|
101
|
+
elapsed = time_ago(Time.now - process['elapsed'])
|
|
102
|
+
|
|
103
|
+
if name == "run"
|
|
104
|
+
key = "run: one-off processes"
|
|
105
|
+
item = "%s: %s %s: `%s`" % [ process["process"], process["state"], elapsed, process["command"] ]
|
|
106
|
+
else
|
|
107
|
+
key = "#{name}: `#{process["command"]}`"
|
|
108
|
+
item = "%s: %s %s" % [ process["process"], process["state"], elapsed ]
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
processes_by_command[key] << item
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
processes_by_command.keys.each do |key|
|
|
115
|
+
processes_by_command[key] = processes_by_command[key].sort do |x,y|
|
|
116
|
+
x.match(/\.(\d+):/).captures.first.to_i <=> y.match(/\.(\d+):/).captures.first.to_i
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
processes_by_command.keys.sort.each do |key|
|
|
121
|
+
styled_header(key)
|
|
122
|
+
styled_array(processes_by_command[key], :sort => false)
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
# ps:restart [PROCESS]
|
|
127
|
+
#
|
|
128
|
+
# restart an app process
|
|
129
|
+
#
|
|
130
|
+
# if PROCESS is not specified, restarts all processes on the app
|
|
131
|
+
#
|
|
132
|
+
#Examples:
|
|
133
|
+
#
|
|
134
|
+
# $ heroku ps:restart web.1
|
|
135
|
+
# Restarting web.1 process... done
|
|
136
|
+
#
|
|
137
|
+
# $ heroku ps:restart web
|
|
138
|
+
# Restarting web processes... done
|
|
139
|
+
#
|
|
140
|
+
# $ heroku ps:restart
|
|
141
|
+
# Restarting processes... done
|
|
142
|
+
#
|
|
143
|
+
def restart
|
|
144
|
+
process = shift_argument
|
|
145
|
+
validate_arguments!
|
|
146
|
+
|
|
147
|
+
message, options = case process
|
|
148
|
+
when NilClass
|
|
149
|
+
["Restarting processes", {}]
|
|
150
|
+
when /.+\..+/
|
|
151
|
+
ps = args.first
|
|
152
|
+
["Restarting #{ps} process", { :ps => ps }]
|
|
153
|
+
else
|
|
154
|
+
type = args.first
|
|
155
|
+
["Restarting #{type} processes", { :type => type }]
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
action(message) do
|
|
159
|
+
api.post_ps_restart(app, options)
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
alias_command "restart", "ps:restart"
|
|
164
|
+
|
|
165
|
+
# ps:scale PROCESS1=AMOUNT1 [PROCESS2=AMOUNT2 ...]
|
|
166
|
+
#
|
|
167
|
+
# scale processes by the given amount
|
|
168
|
+
#
|
|
169
|
+
#Examples:
|
|
170
|
+
#
|
|
171
|
+
# $ heroku ps:scale web=3 worker+1
|
|
172
|
+
# Scaling web processes... done, now running 3
|
|
173
|
+
# Scaling worker processes... done, now running 1
|
|
174
|
+
#
|
|
175
|
+
def scale
|
|
176
|
+
changes = {}
|
|
177
|
+
args.each do |arg|
|
|
178
|
+
if arg =~ /^([a-zA-Z0-9_]+)([=+-]\d+)$/
|
|
179
|
+
changes[$1] = $2
|
|
180
|
+
end
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
if changes.empty?
|
|
184
|
+
error("Usage: heroku ps:scale PROCESS1=AMOUNT1 [PROCESS2=AMOUNT2 ...]\nMust specify PROCESS and AMOUNT to scale.")
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
changes.keys.sort.each do |process|
|
|
188
|
+
amount = changes[process]
|
|
189
|
+
action("Scaling #{process} processes") do
|
|
190
|
+
amount.gsub!("=", "")
|
|
191
|
+
new_qty = api.post_ps_scale(app, process, amount).body
|
|
192
|
+
status("now running #{new_qty}")
|
|
193
|
+
end
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
|
|
197
|
+
alias_command "scale", "ps:scale"
|
|
198
|
+
|
|
199
|
+
# ps:stop PROCESS
|
|
200
|
+
#
|
|
201
|
+
# stop an app process
|
|
202
|
+
#
|
|
203
|
+
# Examples:
|
|
204
|
+
#
|
|
205
|
+
# $ heroku stop run.3
|
|
206
|
+
# Stopping run.3 process... done
|
|
207
|
+
#
|
|
208
|
+
# $ heroku stop run
|
|
209
|
+
# Stopping run processes... done
|
|
210
|
+
#
|
|
211
|
+
def stop
|
|
212
|
+
process = shift_argument
|
|
213
|
+
validate_arguments!
|
|
214
|
+
|
|
215
|
+
message, options = case process
|
|
216
|
+
when NilClass
|
|
217
|
+
error("Usage: heroku ps:stop PROCESS\nMust specify PROCESS to stop.")
|
|
218
|
+
when /.+\..+/
|
|
219
|
+
ps = args.first
|
|
220
|
+
["Stopping #{ps} process", { :ps => ps }]
|
|
221
|
+
else
|
|
222
|
+
type = args.first
|
|
223
|
+
["Stopping #{type} processes", { :type => type }]
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
action(message) do
|
|
227
|
+
api.post_ps_stop(app, options)
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
alias_command "stop", "ps:stop"
|
|
232
|
+
end
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
require "heroku/command/base"
|
|
2
|
+
|
|
3
|
+
# manage app releases
|
|
4
|
+
#
|
|
5
|
+
class Heroku::Command::Releases < Heroku::Command::Base
|
|
6
|
+
|
|
7
|
+
# releases
|
|
8
|
+
#
|
|
9
|
+
# list releases
|
|
10
|
+
#
|
|
11
|
+
#Example:
|
|
12
|
+
#
|
|
13
|
+
# $ heroku releases
|
|
14
|
+
# === myapp Releases
|
|
15
|
+
# v1 Config add FOO_BAR by email@example.com 0s ago
|
|
16
|
+
# v2 Config add BAR_BAZ by email@example.com 0s ago
|
|
17
|
+
# v3 Config add BAZ_QUX by email@example.com 0s ago
|
|
18
|
+
#
|
|
19
|
+
def index
|
|
20
|
+
validate_arguments!
|
|
21
|
+
|
|
22
|
+
releases_data = api.get_releases(app).body.sort_by do |release|
|
|
23
|
+
release["name"][1..-1].to_i
|
|
24
|
+
end.reverse.slice(0, 15)
|
|
25
|
+
|
|
26
|
+
unless releases_data.empty?
|
|
27
|
+
releases = releases_data.map do |release|
|
|
28
|
+
[
|
|
29
|
+
release["name"],
|
|
30
|
+
truncate(release["descr"], 40),
|
|
31
|
+
release["user"],
|
|
32
|
+
time_ago(release['created_at'])
|
|
33
|
+
]
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
styled_header("#{app} Releases")
|
|
37
|
+
styled_array(releases, :sort => false)
|
|
38
|
+
else
|
|
39
|
+
display("#{app} has no releases.")
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# releases:info RELEASE
|
|
44
|
+
#
|
|
45
|
+
# view detailed information for a release
|
|
46
|
+
# find latest release details by passing 'current' as the release
|
|
47
|
+
#
|
|
48
|
+
# -s, --shell # output config vars in shell format
|
|
49
|
+
#
|
|
50
|
+
#Example:
|
|
51
|
+
#
|
|
52
|
+
# $ heroku releases:info v10
|
|
53
|
+
# === Release v10
|
|
54
|
+
# Addons: deployhooks:http
|
|
55
|
+
# By: email@example.com
|
|
56
|
+
# Change: deploy ABCDEFG
|
|
57
|
+
# When: 2012-01-01 12:00:00
|
|
58
|
+
#
|
|
59
|
+
# === v10 Config Vars
|
|
60
|
+
# EXAMPLE: foo
|
|
61
|
+
#
|
|
62
|
+
def info
|
|
63
|
+
unless release = shift_argument
|
|
64
|
+
error("Usage: heroku releases:info RELEASE")
|
|
65
|
+
end
|
|
66
|
+
validate_arguments!
|
|
67
|
+
|
|
68
|
+
release_data = api.get_release(app, release).body
|
|
69
|
+
|
|
70
|
+
data = {
|
|
71
|
+
'By' => release_data['user'],
|
|
72
|
+
'Change' => release_data['descr'],
|
|
73
|
+
'When' => time_ago(release_data["created_at"])
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
unless release_data['addons'].empty?
|
|
77
|
+
data['Addons'] = release_data['addons']
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
styled_header("Release #{release}")
|
|
81
|
+
styled_hash(data)
|
|
82
|
+
|
|
83
|
+
display
|
|
84
|
+
|
|
85
|
+
styled_header("#{release} Config Vars")
|
|
86
|
+
unless release_data['env'].empty?
|
|
87
|
+
if options[:shell]
|
|
88
|
+
release_data['env'].keys.sort.each do |key|
|
|
89
|
+
display("#{key}=#{release_data['env'][key]}")
|
|
90
|
+
end
|
|
91
|
+
else
|
|
92
|
+
styled_hash(release_data['env'])
|
|
93
|
+
end
|
|
94
|
+
else
|
|
95
|
+
display("#{release} has no config vars.")
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# releases:rollback [RELEASE]
|
|
100
|
+
#
|
|
101
|
+
# roll back to an older release
|
|
102
|
+
#
|
|
103
|
+
# if RELEASE is not specified, will roll back one step
|
|
104
|
+
#
|
|
105
|
+
#Example:
|
|
106
|
+
#
|
|
107
|
+
# $ heroku releases:rollback
|
|
108
|
+
# Rolling back myapp... done, v122
|
|
109
|
+
#
|
|
110
|
+
# $ heroku releases:rollback v42
|
|
111
|
+
# Rolling back myapp to v42... done
|
|
112
|
+
#
|
|
113
|
+
def rollback
|
|
114
|
+
release = shift_argument
|
|
115
|
+
validate_arguments!
|
|
116
|
+
|
|
117
|
+
action("Rolling back #{app}") do
|
|
118
|
+
status(api.post_release(app, release).body)
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
alias_command "rollback", "releases:rollback"
|
|
123
|
+
|
|
124
|
+
end
|