raykit 0.0.467 → 0.0.469

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.
@@ -1,345 +1,345 @@
1
- # frozen_string_literal: true
2
-
3
- require "rake/clean"
4
- require "digest"
5
- RAKE_DIRECTORY = Rake.application.original_dir
6
-
7
- module Raykit
8
- class Project
9
- attr_accessor :name, :description, :timer, :verbose, :target
10
-
11
- @directory
12
- @version
13
- @remote
14
- @repository
15
- @git_directory
16
- @timeout
17
- @values
18
- @commands
19
-
20
- # @log
21
- # @commit_message_filename
22
-
23
- # TODO: refactor to remove the defaults
24
- def initialize(name = "", description = "", version = "")
25
- @description = description if description.length.positive?
26
- @version = version if version.length.positive?
27
- @timeout = 1000 * 60 * 15
28
- @verbose = false
29
- @timer = Raykit::Timer.new
30
- @remote = ""
31
- @commit_message_filename = "commit_message.tmp"
32
- if Dir.exist?(RAKE_DIRECTORY)
33
- @directory = RAKE_DIRECTORY
34
- if Dir.exist?("#{RAKE_DIRECTORY}/.git") && Dir.exist?(@directory)
35
- @git_directory = Raykit::Git::Directory.new(@directory)
36
- @remote = @git_directory.remote
37
- end
38
- else
39
- @directory = ""
40
- end
41
-
42
- # @log=Log.new("#{RAKE_DIRECTORY}/tmp/raykit.log")
43
- if (name.length.positive?)
44
- @name = name
45
- else
46
- if defined?(NAME)
47
- @name = NAME
48
- else
49
- slns = Dir.glob("*.sln")
50
- if slns.length == 1
51
- @name = slns[0].gsub(".sln", "")
52
- else
53
- gemspecs = Dir.glob("*.gemspec")
54
- if gemspecs.length == 1
55
- @name = gemspecs[0].gsub(".gemspec", "")
56
- else
57
- remote_parts = @remote.split("/")
58
- @name = remote_parts[-1].gsub(".git", "") if remote_parts.length.positive?
59
- end
60
- end
61
- end
62
- end
63
- @repository = Raykit::Git::Repository.new(@remote)
64
- @values = Hash::new()
65
- @commands = Array::new()
66
- end
67
-
68
- def get_dev_dir(subdir)
69
- Raykit::Environment.get_dev_dir(subdir)
70
- end
71
-
72
- attr_reader :log, :directory, :remote
73
-
74
- # def target
75
- # @target
76
- # end
77
- def target_md5
78
- return Digest::MD5.file(target).to_s.strip if !target.nil? && File.exist?(target)
79
-
80
- ""
81
- end
82
-
83
- def branch
84
- return "main" if @git_directory.nil?
85
- @git_directory.branch
86
- end
87
-
88
- def values
89
- @values
90
- end
91
-
92
- # latest local commit
93
- def latest_commit
94
- return "" if detached?
95
- Dir.chdir(@directory) do
96
- text = `git log -n 1`
97
- scan = text.scan(/commit (\w+)\s/)
98
- return scan[0][0].to_s
99
- end
100
- end
101
-
102
- def outstanding_commit?
103
- Dir.chdir(@directory) do
104
- return true unless `git status`.include?("nothing to commit")
105
- end
106
- false
107
- end
108
-
109
- def outstanding_tag?
110
- # puts `git log -n 1`
111
- # !latest_tag_commit.eql?(latest_commit)
112
- # commit 2e4cb6d6c0721e16cd06afee85b7cdc27354921b (HEAD -> master, tag: 0.0.180, origin/master, origin/HEAD)
113
- outstanding_commit? || !`git log -n 1`.include?("tag:")
114
- end
115
-
116
- def read_only?
117
- return true if !File.exist?(".git") || detached?
118
- return false
119
- end
120
-
121
- def detached?
122
- return true if @git_directory.nil?
123
- @git_directory.detached?
124
- end
125
-
126
- def has_diff?(filename)
127
- Dir.chdir(@directory) do
128
- text = `git diff #{filename}`.strip
129
- return true if text.length.positive?
130
- end
131
- end
132
-
133
- def version
134
- if @version.nil?
135
- # Dir.chdir(@directory) do
136
- # if(Dir.glob("*.gemspec").length > 0)
137
- # @version=`bump current`.gsub('Current version:','').strip
138
- # else
139
- # @version=Raykit::VersionHelper.detect(@name,@verbose)
140
- # end
141
- @version = Raykit::Version.detect(@name, @verbose)
142
- # end
143
- end
144
- @version
145
- end
146
-
147
- def set_version(version)
148
- @version = version
149
- end
150
-
151
- # def update_version
152
- # @version=Raykit::Version.detect(@name,@verbose)
153
- # end
154
-
155
- def latest_tag
156
- `git describe --abbrev=0`.strip
157
- end
158
-
159
- def latest_tag_commit
160
- `git show-ref -s #{latest_tag}`.strip
161
- end
162
-
163
- def latest_tag_md5
164
- text = `git tag #{latest_tag} -n3`
165
- scan = text.scan(/md5=(\w{32})/)
166
- return scan[0][0].to_s.strip if scan.length.positive? && scan[0].length.positive?
167
-
168
- ""
169
- end
170
-
171
- def last_modified_filename
172
- Dir.chdir(@directory) do
173
- Dir.glob("**/*.*").select { |f| File.file?(f) }.max_by { |f| File.mtime(f) }
174
- end
175
- end
176
-
177
- def size
178
- Dir.chdir(@directory) do
179
- text = `git count-objects -v -H`
180
- if matches = text.match(/size: ([. \w]+)$/)
181
- matches[1]
182
- else
183
- text
184
- end
185
- end
186
- end
187
-
188
- def size_pack
189
- Dir.chdir(@directory) do
190
- text = `git count-objects -v -H`
191
- if matches = text.match(/size-pack: ([. \w]+)$/)
192
- matches[1]
193
- else
194
- text
195
- end
196
- end
197
- end
198
-
199
- def elapsed
200
- elapsed = @timer.elapsed
201
- if elapsed < 1.0
202
- "#{format("%.1f", @timer.elapsed)}s"
203
- else
204
- "#{format("%.0f", @timer.elapsed)}s"
205
- end
206
- end
207
-
208
- def info
209
- ljust = 35
210
- puts ""
211
- puts "PROJECT.name".ljust(ljust) + Rainbow(PROJECT.name).yellow.bright
212
- puts "PROJECT.version".ljust(ljust) + Rainbow(PROJECT.version).yellow.bright
213
- puts "PROJECT.remote".ljust(ljust) + Rainbow(PROJECT.remote).yellow.bright
214
- puts "PROJECT.branch".ljust(ljust) + Rainbow(PROJECT.branch).yellow.bright
215
- puts "PROJECT.detached?".ljust(ljust) + Rainbow(PROJECT.detached?).yellow.bright
216
- # puts "PROJECT.target".ljust(ljust) + Rainbow(PROJECT.target).yellow.bright
217
- # puts "PROJECT.target_md5".ljust(ljust) + Rainbow(PROJECT.target_md5).yellow.bright
218
- puts "PROJECT.latest_tag".ljust(ljust) + Rainbow(PROJECT.latest_tag).yellow.bright
219
- puts "PROJECT.latest_tag_commit".ljust(ljust) + Rainbow(PROJECT.latest_tag_commit).yellow.bright
220
- puts "PROJECT.latest_tag_md5".ljust(ljust) + Rainbow(PROJECT.latest_tag_md5).yellow.bright
221
- puts "PROJECT.latest_commit".ljust(ljust) + Rainbow(PROJECT.latest_commit).yellow.bright
222
- puts "PROJECT.last_modified_filename".ljust(ljust) + Rainbow(PROJECT.last_modified_filename).yellow.bright
223
- # puts "PROJECT.elapsed".ljust(ljust) + Rainbow(PROJECT.elapsed).yellow.bright
224
- puts "PROJECT.size".ljust(ljust) + Rainbow(PROJECT.size).yellow.bright
225
- puts "PROJECT.size_pack".ljust(ljust) + Rainbow(PROJECT.size_pack).yellow.bright
226
- puts "PROJECT.outstanding_commit?".ljust(ljust) + Rainbow(PROJECT.outstanding_commit?).yellow.bright
227
- puts "PROJECT.outstanding_tag?".ljust(ljust) + Rainbow(PROJECT.outstanding_tag?).yellow.bright
228
- puts ""
229
- self
230
- end
231
-
232
- def to_markdown()
233
- md = "# #{@name}"
234
- md += get_markdown_nvp("Name", "Value", " ")
235
- md += get_markdown_nvp("-", "-", "-")
236
- md += get_markdown_nvp("Version", "#{@version}", " ")
237
- md += get_markdown_nvp("Machine", "#{Raykit::Environment::machine}", " ")
238
- md += get_markdown_nvp("User", "#{Raykit::Environment::user}", " ")
239
- @values.each do |key, value|
240
- md += get_markdown_nvp(key, value, " ")
241
- end
242
- @commands.each do |cmd|
243
- md = md + "\n" + cmd.to_markdown
244
- end
245
- md
246
- end
247
-
248
- def get_markdown_nvp(key, value, pad_char)
249
- "\n| " + key.to_s.ljust(36, pad_char) + "| " + value.to_s.ljust(36, pad_char)
250
- end
251
-
252
- def summary
253
- info if @verbose
254
- puts "[#{elapsed}] #{Rainbow(@name).yellow.bright} #{Rainbow(version).yellow.bright}"
255
- end
256
-
257
- def commit_message_filename
258
- warn "[DEPRECATION] 'commit_message_filename' is deprecated."
259
- @commit_message_filename
260
- end
261
-
262
- def commit(commit_message)
263
- warn "[DEPRECATION] 'commit_message_filename' is deprecated. Use a run command for better transparency."
264
- Dir.chdir(@directory) do
265
- if File.exist?(".gitignore")
266
- status = `git status`
267
- if status.include?("Changes not staged for commit:")
268
- run("git add --all")
269
- if GIT_DIRECTORY.outstanding_commit?
270
- if File.exist?(@commit_message_filename)
271
- run("git commit --file #{@commit_message_filename}")
272
- File.delete(@commit_message_filename)
273
- else
274
- run("git commit -m'#{commit_message}'")
275
- end
276
- end
277
- end
278
- else
279
- puts "warning: .gitignore not found."
280
- end
281
- end
282
- self
283
- end
284
-
285
- def push
286
- Dir.chdir(@directory) do
287
- status = `git status`
288
- if status.include?('use "git push"')
289
- run("git push")
290
- end
291
- end
292
- self
293
- end
294
-
295
- def pull
296
- Dir.chdir(@directory) do
297
- run("git pull")
298
- end
299
- self
300
- end
301
-
302
- def tag
303
- warn "[DEPRECATION] 'tag' is deprecated. Use run command(s) for better transparency."
304
- Dir.chdir(@directory) do
305
- specific_tag = `git tag -l #{@version}`.strip
306
- puts Rainbow("git tag - #{@version}").green if @verbose
307
- puts `git tag -l #{@version}` if @verbose
308
- if specific_tag.length.zero?
309
- puts "tag #{@version} not detected." if @verbose
310
- tag = `git describe --abbrev=0 --tags`.strip
311
- if @version != tag
312
- puts "latest tag #{@tag}" if @verbose
313
- run("git tag #{@version} -m'#{@version}'")
314
- run("git push origin #{@version}")
315
- # push
316
- end
317
- elsif @verbose
318
- puts "already has tag #{specific_tag}"
319
- end
320
- end
321
- self
322
- end
323
-
324
- def run(command, quit_on_failure = true)
325
- if command.is_a?(Array)
326
- command.each { |subcommand| run(subcommand, quit_on_failure) }
327
- else
328
- cmd = Command.new(command).set_timeout(@timeout).run
329
- cmd.summary
330
- elapsed_str = Timer.get_elapsed_str(cmd.elapsed, 0)
331
- if !cmd.exitstatus.nil? && cmd.exitstatus.zero?
332
- else
333
- # display error details
334
- cmd.details
335
- if quit_on_failure
336
- abort
337
- end
338
- end
339
- cmd.save
340
- @commands << cmd
341
- cmd
342
- end
343
- end
344
- end
345
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "rake/clean"
4
+ require "digest"
5
+ RAKE_DIRECTORY = Rake.application.original_dir
6
+
7
+ module Raykit
8
+ class Project
9
+ attr_accessor :name, :description, :version, :timer, :verbose, :target
10
+
11
+ @directory
12
+ #@version
13
+ @remote
14
+ @repository
15
+ @git_directory
16
+ @timeout
17
+ @values
18
+ @commands
19
+
20
+ # @log
21
+ # @commit_message_filename
22
+
23
+ # TODO: refactor to remove the defaults
24
+ def initialize(name = "", description = "", version = "")
25
+ @description = description if description.length.positive?
26
+ @version = version if version.length.positive?
27
+ @timeout = 1000 * 60 * 15
28
+ @verbose = false
29
+ @timer = Raykit::Timer.new
30
+ @remote = ""
31
+ @commit_message_filename = "commit_message.tmp"
32
+ if Dir.exist?(RAKE_DIRECTORY)
33
+ @directory = RAKE_DIRECTORY
34
+ if Dir.exist?("#{RAKE_DIRECTORY}/.git") && Dir.exist?(@directory)
35
+ @git_directory = Raykit::Git::Directory.new(@directory)
36
+ @remote = @git_directory.remote
37
+ end
38
+ else
39
+ @directory = ""
40
+ end
41
+
42
+ # @log=Log.new("#{RAKE_DIRECTORY}/tmp/raykit.log")
43
+ if (name.length.positive?)
44
+ @name = name
45
+ else
46
+ if defined?(NAME)
47
+ @name = NAME
48
+ else
49
+ slns = Dir.glob("*.sln")
50
+ if slns.length == 1
51
+ @name = slns[0].gsub(".sln", "")
52
+ else
53
+ gemspecs = Dir.glob("*.gemspec")
54
+ if gemspecs.length == 1
55
+ @name = gemspecs[0].gsub(".gemspec", "")
56
+ else
57
+ remote_parts = @remote.split("/")
58
+ @name = remote_parts[-1].gsub(".git", "") if remote_parts.length.positive?
59
+ end
60
+ end
61
+ end
62
+ end
63
+
64
+ if version.length.zero? && defined?(VERSION) && VERSION.is_a?(String) && VERSION.length > 0
65
+ @version = VERSION
66
+ else
67
+ @version = Raykit::Version.detect(@name, true) if version.length.zero?
68
+ end
69
+
70
+ @repository = Raykit::Git::Repository.new(@remote)
71
+ @values = Hash::new()
72
+ @commands = Array::new()
73
+ end
74
+
75
+ def get_dev_dir(subdir)
76
+ Raykit::Environment.get_dev_dir(subdir)
77
+ end
78
+
79
+ attr_reader :log, :directory, :remote
80
+
81
+ # def target
82
+ # @target
83
+ # end
84
+ def target_md5
85
+ return Digest::MD5.file(target).to_s.strip if !target.nil? && File.exist?(target)
86
+
87
+ ""
88
+ end
89
+
90
+ def branch
91
+ return "main" if @git_directory.nil?
92
+ @git_directory.branch
93
+ end
94
+
95
+ def values
96
+ @values
97
+ end
98
+
99
+ # latest local commit
100
+ def latest_commit
101
+ return "" if detached?
102
+ Dir.chdir(@directory) do
103
+ text = `git log -n 1`
104
+ scan = text.scan(/commit (\w+)\s/)
105
+ return scan[0][0].to_s
106
+ end
107
+ end
108
+
109
+ def outstanding_commit?
110
+ Dir.chdir(@directory) do
111
+ return true unless `git status`.include?("nothing to commit")
112
+ end
113
+ false
114
+ end
115
+
116
+ def outstanding_tag?
117
+ # puts `git log -n 1`
118
+ # !latest_tag_commit.eql?(latest_commit)
119
+ # commit 2e4cb6d6c0721e16cd06afee85b7cdc27354921b (HEAD -> master, tag: 0.0.180, origin/master, origin/HEAD)
120
+ outstanding_commit? || !`git log -n 1`.include?("tag:")
121
+ end
122
+
123
+ def read_only?
124
+ return true if !File.exist?(".git") || detached?
125
+ return false
126
+ end
127
+
128
+ def detached?
129
+ return true if @git_directory.nil?
130
+ @git_directory.detached?
131
+ end
132
+
133
+ def has_diff?(filename)
134
+ Dir.chdir(@directory) do
135
+ text = `git diff #{filename}`.strip
136
+ return true if text.length.positive?
137
+ end
138
+ end
139
+
140
+ #def version
141
+ # if @version.nil?
142
+ # @version = Raykit::Version.detect(@name, @verbose)
143
+ # end
144
+ # @version
145
+ #end
146
+
147
+ def set_version(version)
148
+ @version = version
149
+ end
150
+
151
+ # def update_version
152
+ # @version=Raykit::Version.detect(@name,@verbose)
153
+ # end
154
+
155
+ def latest_tag
156
+ `git describe --abbrev=0`.strip
157
+ end
158
+
159
+ def latest_tag_commit
160
+ `git show-ref -s #{latest_tag}`.strip
161
+ end
162
+
163
+ def latest_tag_md5
164
+ text = `git tag #{latest_tag} -n3`
165
+ scan = text.scan(/md5=(\w{32})/)
166
+ return scan[0][0].to_s.strip if scan.length.positive? && scan[0].length.positive?
167
+
168
+ ""
169
+ end
170
+
171
+ def last_modified_filename
172
+ Dir.chdir(@directory) do
173
+ Dir.glob("**/*.*").select { |f| File.file?(f) }.max_by { |f| File.mtime(f) }
174
+ end
175
+ end
176
+
177
+ def size
178
+ Dir.chdir(@directory) do
179
+ text = `git count-objects -v -H`
180
+ if matches = text.match(/size: ([. \w]+)$/)
181
+ matches[1]
182
+ else
183
+ text
184
+ end
185
+ end
186
+ end
187
+
188
+ def size_pack
189
+ Dir.chdir(@directory) do
190
+ text = `git count-objects -v -H`
191
+ if matches = text.match(/size-pack: ([. \w]+)$/)
192
+ matches[1]
193
+ else
194
+ text
195
+ end
196
+ end
197
+ end
198
+
199
+ def elapsed
200
+ elapsed = @timer.elapsed
201
+ if elapsed < 1.0
202
+ "#{format("%.1f", @timer.elapsed)}s"
203
+ else
204
+ "#{format("%.0f", @timer.elapsed)}s"
205
+ end
206
+ end
207
+
208
+ def info
209
+ ljust = 35
210
+ puts ""
211
+ puts "PROJECT.name".ljust(ljust) + Rainbow(PROJECT.name).yellow.bright
212
+ puts "PROJECT.version".ljust(ljust) + Rainbow(PROJECT.version).yellow.bright
213
+ puts "PROJECT.remote".ljust(ljust) + Rainbow(PROJECT.remote).yellow.bright
214
+ puts "PROJECT.branch".ljust(ljust) + Rainbow(PROJECT.branch).yellow.bright
215
+ puts "PROJECT.detached?".ljust(ljust) + Rainbow(PROJECT.detached?).yellow.bright
216
+ # puts "PROJECT.target".ljust(ljust) + Rainbow(PROJECT.target).yellow.bright
217
+ # puts "PROJECT.target_md5".ljust(ljust) + Rainbow(PROJECT.target_md5).yellow.bright
218
+ puts "PROJECT.latest_tag".ljust(ljust) + Rainbow(PROJECT.latest_tag).yellow.bright
219
+ puts "PROJECT.latest_tag_commit".ljust(ljust) + Rainbow(PROJECT.latest_tag_commit).yellow.bright
220
+ puts "PROJECT.latest_tag_md5".ljust(ljust) + Rainbow(PROJECT.latest_tag_md5).yellow.bright
221
+ puts "PROJECT.latest_commit".ljust(ljust) + Rainbow(PROJECT.latest_commit).yellow.bright
222
+ puts "PROJECT.last_modified_filename".ljust(ljust) + Rainbow(PROJECT.last_modified_filename).yellow.bright
223
+ # puts "PROJECT.elapsed".ljust(ljust) + Rainbow(PROJECT.elapsed).yellow.bright
224
+ puts "PROJECT.size".ljust(ljust) + Rainbow(PROJECT.size).yellow.bright
225
+ puts "PROJECT.size_pack".ljust(ljust) + Rainbow(PROJECT.size_pack).yellow.bright
226
+ puts "PROJECT.outstanding_commit?".ljust(ljust) + Rainbow(PROJECT.outstanding_commit?).yellow.bright
227
+ puts "PROJECT.outstanding_tag?".ljust(ljust) + Rainbow(PROJECT.outstanding_tag?).yellow.bright
228
+ puts ""
229
+ self
230
+ end
231
+
232
+ def to_markdown()
233
+ md = "# #{@name}"
234
+ md += get_markdown_nvp("Name", "Value", " ")
235
+ md += get_markdown_nvp("-", "-", "-")
236
+ md += get_markdown_nvp("Version", "#{@version}", " ")
237
+ md += get_markdown_nvp("Machine", "#{Raykit::Environment::machine}", " ")
238
+ md += get_markdown_nvp("User", "#{Raykit::Environment::user}", " ")
239
+ @values.each do |key, value|
240
+ md += get_markdown_nvp(key, value, " ")
241
+ end
242
+ @commands.each do |cmd|
243
+ md = md + "\n" + cmd.to_markdown
244
+ end
245
+ md
246
+ end
247
+
248
+ def get_markdown_nvp(key, value, pad_char)
249
+ "\n| " + key.to_s.ljust(36, pad_char) + "| " + value.to_s.ljust(36, pad_char)
250
+ end
251
+
252
+ def summary
253
+ info if @verbose
254
+ puts "[#{elapsed}] #{Rainbow(@name).yellow.bright} #{Rainbow(version).yellow.bright}"
255
+ end
256
+
257
+ def commit_message_filename
258
+ warn "[DEPRECATION] 'commit_message_filename' is deprecated."
259
+ @commit_message_filename
260
+ end
261
+
262
+ def commit(commit_message)
263
+ warn "[DEPRECATION] 'commit_message_filename' is deprecated. Use a run command for better transparency."
264
+ Dir.chdir(@directory) do
265
+ if File.exist?(".gitignore")
266
+ status = `git status`
267
+ if status.include?("Changes not staged for commit:")
268
+ run("git add --all")
269
+ if GIT_DIRECTORY.outstanding_commit?
270
+ if File.exist?(@commit_message_filename)
271
+ run("git commit --file #{@commit_message_filename}")
272
+ File.delete(@commit_message_filename)
273
+ else
274
+ run("git commit -m'#{commit_message}'")
275
+ end
276
+ end
277
+ end
278
+ else
279
+ puts "warning: .gitignore not found."
280
+ end
281
+ end
282
+ self
283
+ end
284
+
285
+ def push
286
+ Dir.chdir(@directory) do
287
+ status = `git status`
288
+ if status.include?('use "git push"')
289
+ run("git push")
290
+ end
291
+ end
292
+ self
293
+ end
294
+
295
+ def pull
296
+ Dir.chdir(@directory) do
297
+ run("git pull")
298
+ end
299
+ self
300
+ end
301
+
302
+ def tag
303
+ warn "[DEPRECATION] 'tag' is deprecated. Use run command(s) for better transparency."
304
+ Dir.chdir(@directory) do
305
+ specific_tag = `git tag -l #{@version}`.strip
306
+ puts Rainbow("git tag - #{@version}").green if @verbose
307
+ puts `git tag -l #{@version}` if @verbose
308
+ if specific_tag.length.zero?
309
+ puts "tag #{@version} not detected." if @verbose
310
+ tag = `git describe --abbrev=0 --tags`.strip
311
+ if @version != tag
312
+ puts "latest tag #{@tag}" if @verbose
313
+ run("git tag #{@version} -m'#{@version}'")
314
+ run("git push origin #{@version}")
315
+ # push
316
+ end
317
+ elsif @verbose
318
+ puts "already has tag #{specific_tag}"
319
+ end
320
+ end
321
+ self
322
+ end
323
+
324
+ def run(command, quit_on_failure = true)
325
+ if command.is_a?(Array)
326
+ command.each { |subcommand| run(subcommand, quit_on_failure) }
327
+ else
328
+ cmd = Command.new(command).set_timeout(@timeout).run
329
+ cmd.summary
330
+ elapsed_str = Timer.get_elapsed_str(cmd.elapsed, 0)
331
+ if !cmd.exitstatus.nil? && cmd.exitstatus.zero?
332
+ else
333
+ # display error details
334
+ cmd.details
335
+ if quit_on_failure
336
+ abort
337
+ end
338
+ end
339
+ cmd.save
340
+ @commands << cmd
341
+ cmd
342
+ end
343
+ end
344
+ end
345
+ end