shopify-cli 1.0.5 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/bin/load_shopify.rb +3 -1
- data/bin/shopify +2 -0
- data/ext/shopify-cli/extconf.rb +40 -20
- data/lib/project_types/node/commands/create.rb +4 -4
- data/lib/project_types/node/commands/deploy/heroku.rb +6 -1
- data/lib/project_types/node/commands/generate/billing.rb +6 -5
- data/lib/project_types/node/commands/generate/page.rb +8 -5
- data/lib/project_types/node/commands/generate/webhook.rb +4 -1
- data/lib/project_types/node/messages/messages.rb +1 -0
- data/lib/project_types/rails/commands/create.rb +52 -4
- data/lib/project_types/rails/commands/generate.rb +1 -0
- data/lib/project_types/rails/commands/generate/webhook.rb +3 -2
- data/lib/project_types/rails/commands/serve.rb +6 -2
- data/lib/project_types/rails/gem.rb +61 -6
- data/lib/project_types/rails/messages/messages.rb +27 -11
- data/lib/project_types/script/config/extension_points.yml +3 -3
- data/lib/project_types/script/forms/create.rb +1 -1
- data/lib/rubygems_plugin.rb +18 -10
- data/lib/shopify-cli/admin_api/populate_resource_command.rb +1 -1
- data/lib/shopify-cli/commands/connect.rb +1 -1
- data/lib/shopify-cli/commands/system.rb +9 -8
- data/lib/shopify-cli/context.rb +28 -0
- data/lib/shopify-cli/heroku.rb +18 -2
- data/lib/shopify-cli/js_deps.rb +2 -2
- data/lib/shopify-cli/js_system.rb +2 -2
- data/lib/shopify-cli/process_supervision.rb +52 -15
- data/lib/shopify-cli/project.rb +14 -6
- data/lib/shopify-cli/tunnel.rb +10 -4
- data/lib/shopify-cli/version.rb +1 -1
- data/lib/shopify_cli.rb +6 -2
- data/shopify-cli.gemspec +4 -1
- data/vendor/deps/cli-kit/REVISION +1 -1
- data/vendor/deps/cli-kit/lib/cli/kit.rb +1 -1
- data/vendor/deps/cli-kit/lib/cli/kit/autocall.rb +2 -2
- data/vendor/deps/cli-kit/lib/cli/kit/error_handler.rb +12 -6
- data/vendor/deps/cli-kit/lib/cli/kit/executor.rb +9 -11
- data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +8 -2
- data/vendor/deps/cli-kit/lib/cli/kit/support/test_helper.rb +7 -7
- data/vendor/deps/cli-kit/lib/cli/kit/system.rb +48 -17
- data/vendor/deps/cli-ui/REVISION +1 -1
- data/vendor/deps/cli-ui/lib/cli/ui.rb +5 -4
- data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +9 -3
- data/vendor/deps/cli-ui/lib/cli/ui/color.rb +1 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +3 -2
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +1 -0
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/box.rb +13 -5
- data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/bracket.rb +29 -2
- data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +21 -10
- data/vendor/deps/cli-ui/lib/cli/ui/os.rb +63 -0
- data/vendor/deps/cli-ui/lib/cli/ui/prompt.rb +11 -2
- data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +1 -0
- data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +3 -3
- data/vendor/deps/cli-ui/lib/cli/ui/spinner/spin_group.rb +6 -8
- data/vendor/deps/cli-ui/lib/cli/ui/widgets.rb +2 -0
- data/vendor/gen/lib/gen.rb +39 -0
- data/vendor/gen/lib/gen/commands.rb +18 -0
- data/vendor/gen/lib/gen/commands/help.rb +20 -0
- data/vendor/gen/lib/gen/commands/new.rb +21 -0
- data/vendor/gen/lib/gen/entry_point.rb +10 -0
- data/vendor/gen/lib/gen/generator.rb +165 -0
- data/vendor/gen/template/.gitignore +2 -0
- data/vendor/gen/template/Gemfile +10 -0
- data/vendor/gen/template/README.md +1 -0
- data/vendor/gen/template/bin/testunit +23 -0
- data/vendor/gen/template/bin/update-deps +97 -0
- data/vendor/gen/template/dev-gems.yml +3 -0
- data/vendor/gen/template/dev-vendor.yml +4 -0
- data/vendor/gen/template/exe/__app__-gems +17 -0
- data/vendor/gen/template/exe/__app__-vendor +18 -0
- data/vendor/gen/template/lib/__app__.rb +33 -0
- data/vendor/gen/template/lib/__app__/commands.rb +18 -0
- data/vendor/gen/template/lib/__app__/commands/example.rb +19 -0
- data/vendor/gen/template/lib/__app__/commands/help.rb +21 -0
- data/vendor/gen/template/lib/__app__/entry_point.rb +10 -0
- data/vendor/gen/template/test/example_test.rb +17 -0
- data/vendor/gen/template/test/test_helper.rb +22 -0
- metadata +25 -4
- data/Vagrantfile +0 -17
- data/lib/project_types/script/forms/script_form.rb +0 -69
data/lib/shopify-cli/project.rb
CHANGED
@@ -15,6 +15,10 @@ module ShopifyCli
|
|
15
15
|
# will get an instance of the project that the user is currently operating
|
16
16
|
# on. This is used for access to project resources.
|
17
17
|
#
|
18
|
+
# #### Parameters
|
19
|
+
#
|
20
|
+
# * `force_reload` - whether to force a reload of the project files
|
21
|
+
#
|
18
22
|
# #### Returns
|
19
23
|
#
|
20
24
|
# * `project` - a Project instance if the user is currently in the project.
|
@@ -29,8 +33,8 @@ module ShopifyCli
|
|
29
33
|
#
|
30
34
|
# project = ShopifyCli::Project.current
|
31
35
|
#
|
32
|
-
def current
|
33
|
-
at(Dir.pwd)
|
36
|
+
def current(force_reload: false)
|
37
|
+
at(Dir.pwd, force_reload: force_reload)
|
34
38
|
end
|
35
39
|
|
36
40
|
##
|
@@ -93,13 +97,17 @@ module ShopifyCli
|
|
93
97
|
|
94
98
|
private
|
95
99
|
|
96
|
-
def directory(dir)
|
100
|
+
def directory(dir, force_reload: false)
|
101
|
+
@dir = nil if force_reload
|
102
|
+
|
97
103
|
@dir ||= Hash.new { |h, k| h[k] = __directory(k) }
|
98
104
|
@dir[dir]
|
99
105
|
end
|
100
106
|
|
101
|
-
def at(dir)
|
102
|
-
|
107
|
+
def at(dir, force_reload: false)
|
108
|
+
@at = nil if force_reload
|
109
|
+
|
110
|
+
proj_dir = directory(dir, force_reload: force_reload)
|
103
111
|
unless proj_dir
|
104
112
|
raise(ShopifyCli::Abort, Context.message('core.project.error.not_in_project'))
|
105
113
|
end
|
@@ -109,7 +117,7 @@ module ShopifyCli
|
|
109
117
|
|
110
118
|
def __directory(curr)
|
111
119
|
loop do
|
112
|
-
return nil if curr == '/'
|
120
|
+
return nil if curr == '/' || /^[A-Z]:\/$/.match?(curr)
|
113
121
|
file = File.join(curr, '.shopify-cli.yml')
|
114
122
|
return curr if File.exist?(file)
|
115
123
|
curr = File.dirname(curr)
|
data/lib/shopify-cli/tunnel.rb
CHANGED
@@ -21,6 +21,7 @@ module ShopifyCli
|
|
21
21
|
DOWNLOAD_URLS = {
|
22
22
|
mac: 'https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-darwin-amd64.zip',
|
23
23
|
linux: 'https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip',
|
24
|
+
windows: 'https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-windows-amd64.zip',
|
24
25
|
}
|
25
26
|
|
26
27
|
NGROK_TUNNELS_URI = URI.parse('http://localhost:4040/api/tunnels')
|
@@ -122,14 +123,19 @@ module ShopifyCli
|
|
122
123
|
private
|
123
124
|
|
124
125
|
def install(ctx)
|
125
|
-
return if File.exist?(File.join(ShopifyCli.cache_dir, 'ngrok'))
|
126
|
+
return if File.exist?(File.join(ShopifyCli.cache_dir, ctx.windows? ? 'ngrok.exe' : 'ngrok'))
|
126
127
|
spinner = CLI::UI::SpinGroup.new
|
127
128
|
spinner.add('Installing ngrok...') do
|
128
129
|
zip_dest = File.join(ShopifyCli.cache_dir, 'ngrok.zip')
|
129
130
|
unless File.exist?(zip_dest)
|
130
131
|
ctx.system('curl', '-o', zip_dest, DOWNLOAD_URLS[ctx.os], chdir: ShopifyCli.cache_dir)
|
131
132
|
end
|
132
|
-
|
133
|
+
args = if ctx.linux?
|
134
|
+
%W(unzip -u #{zip_dest})
|
135
|
+
else
|
136
|
+
%W(tar -xf #{zip_dest})
|
137
|
+
end
|
138
|
+
ctx.system(*args, chdir: ShopifyCli.cache_dir)
|
133
139
|
ctx.rm(zip_dest)
|
134
140
|
end
|
135
141
|
spinner.wait
|
@@ -143,7 +149,7 @@ module ShopifyCli
|
|
143
149
|
end
|
144
150
|
|
145
151
|
def ngrok_command(port)
|
146
|
-
"
|
152
|
+
"#{File.join(ShopifyCli.cache_dir, 'ngrok')} http -inspect=false -log=stdout -log-level=debug #{port}"
|
147
153
|
end
|
148
154
|
|
149
155
|
def seconds_to_hm(seconds)
|
@@ -195,7 +201,7 @@ module ShopifyCli
|
|
195
201
|
end
|
196
202
|
|
197
203
|
def parse_account
|
198
|
-
account, timeout, _ = @log.match(/AccountName:([\w\s]*) SessionDuration:([\d]+) PlanName/)&.captures
|
204
|
+
account, timeout, _ = @log.match(/AccountName:([\w\s\d@._\-]*) SessionDuration:([\d]+) PlanName/)&.captures
|
199
205
|
@account = account&.empty? ? nil : account
|
200
206
|
@timeout = timeout&.empty? ? 0 : timeout.to_i
|
201
207
|
end
|
data/lib/shopify-cli/version.rb
CHANGED
data/lib/shopify_cli.rb
CHANGED
@@ -127,8 +127,10 @@ module ShopifyCli
|
|
127
127
|
def self.cache_dir
|
128
128
|
cache_dir = if ENV.key?('RUNNING_SHOPIFY_CLI_TESTS')
|
129
129
|
TEMP_DIR
|
130
|
-
|
130
|
+
elsif ENV['LOCALAPPDATA'].nil?
|
131
131
|
File.join(File.expand_path(ENV.fetch('XDG_CACHE_HOME', '~/.cache')), TOOL_NAME)
|
132
|
+
else
|
133
|
+
File.join(File.expand_path(ENV['LOCALAPPDATA']), TOOL_NAME)
|
132
134
|
end
|
133
135
|
|
134
136
|
# Make sure the cache dir always exists
|
@@ -140,8 +142,10 @@ module ShopifyCli
|
|
140
142
|
def self.tool_config_path
|
141
143
|
if ENV.key?('RUNNING_SHOPIFY_CLI_TESTS')
|
142
144
|
TEMP_DIR
|
143
|
-
|
145
|
+
elsif ENV['APPDATA'].nil?
|
144
146
|
File.join(File.expand_path(ENV.fetch('XDG_CONFIG_HOME', '~/.config')), TOOL_NAME)
|
147
|
+
else
|
148
|
+
File.join(File.expand_path(ENV['APPDATA']), TOOL_NAME)
|
145
149
|
end
|
146
150
|
end
|
147
151
|
|
data/shopify-cli.gemspec
CHANGED
@@ -26,7 +26,10 @@ Gem::Specification.new do |spec|
|
|
26
26
|
# Specify which files should be added to the gem when it is released.
|
27
27
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
28
28
|
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
29
|
-
%x(git ls-files -z).split("\x0").reject
|
29
|
+
%x(git ls-files -z).split("\x0").reject do |f|
|
30
|
+
f.match(%r{^(test|spec|features|packaging)/}) ||
|
31
|
+
f.match(%r{^bin/(update-deps|shopify.bat)$})
|
32
|
+
end
|
30
33
|
end
|
31
34
|
spec.bindir = "bin"
|
32
35
|
spec.require_paths = ["lib", "vendor"]
|
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
1013aa5c5664e7034ca3f02fd2e0513361b07e95 (dirty)
|
@@ -51,7 +51,7 @@ module CLI
|
|
51
51
|
# 1. rescue Abort or Bug
|
52
52
|
# 2. Print a contextualized error message
|
53
53
|
# 3. Re-raise AbortSilent or BugSilent respectively.
|
54
|
-
GenericAbort = Class.new(Exception)
|
54
|
+
GenericAbort = Class.new(Exception) # rubocop:disable Lint/InheritException
|
55
55
|
Abort = Class.new(GenericAbort)
|
56
56
|
Bug = Class.new(GenericAbort)
|
57
57
|
BugSilent = Class.new(GenericAbort)
|
@@ -22,11 +22,11 @@ module CLI
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def handle_exception(error)
|
25
|
-
if notify_with = exception_for_submission(error)
|
25
|
+
if (notify_with = exception_for_submission(error))
|
26
26
|
logs = begin
|
27
27
|
File.read(@log_file)
|
28
|
-
|
29
|
-
|
28
|
+
rescue => e
|
29
|
+
"(#{e.class}: #{e.message})"
|
30
30
|
end
|
31
31
|
exception_reporter.report(notify_with, logs)
|
32
32
|
end
|
@@ -56,7 +56,7 @@ module CLI
|
|
56
56
|
# if it was `exit 30`, translate the exit code to 1, and submit nothing.
|
57
57
|
# 30 is used to signal normal failures that are not indicative of bugs.
|
58
58
|
# However, users should see it presented as 1.
|
59
|
-
exit
|
59
|
+
exit(1)
|
60
60
|
else
|
61
61
|
# A weird termination status happened. `error.exception "message"` will maintain backtrace
|
62
62
|
# but allow us to set a message
|
@@ -83,7 +83,7 @@ module CLI
|
|
83
83
|
|
84
84
|
CLI::Kit::EXIT_FAILURE_BUT_NOT_BUG
|
85
85
|
rescue Interrupt
|
86
|
-
|
86
|
+
stderr_puts_message('Interrupt')
|
87
87
|
CLI::Kit::EXIT_FAILURE_BUT_NOT_BUG
|
88
88
|
rescue Errno::ENOSPC
|
89
89
|
message = if @tool_name
|
@@ -91,10 +91,16 @@ module CLI
|
|
91
91
|
else
|
92
92
|
"Your disk is full - free space is required to operate"
|
93
93
|
end
|
94
|
-
|
94
|
+
stderr_puts_message(message)
|
95
95
|
CLI::Kit::EXIT_FAILURE_BUT_NOT_BUG
|
96
96
|
end
|
97
97
|
|
98
|
+
def stderr_puts_message(message)
|
99
|
+
$stderr.puts(format_error_message(message))
|
100
|
+
rescue Errno::EPIPE
|
101
|
+
nil
|
102
|
+
end
|
103
|
+
|
98
104
|
def exception_reporter
|
99
105
|
if @exception_reporter_or_proc.respond_to?(:report)
|
100
106
|
@exception_reporter_or_proc
|
@@ -13,19 +13,17 @@ module CLI
|
|
13
13
|
def call(command, command_name, args)
|
14
14
|
with_traps do
|
15
15
|
with_logging do |id|
|
16
|
+
command.call(args, command_name)
|
17
|
+
rescue => e
|
16
18
|
begin
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
# Outputting to stderr is best-effort. Avoid raising another error when outputting debug info so that
|
24
|
-
# we can detect and log the original error, which may even be the source of this error.
|
25
|
-
nil
|
26
|
-
end
|
27
|
-
raise e
|
19
|
+
$stderr.puts "This command ran with ID: #{id}"
|
20
|
+
$stderr.puts "Please include this information in any issues/report along with relevant logs"
|
21
|
+
rescue SystemCallError
|
22
|
+
# Outputting to stderr is best-effort. Avoid raising another error when outputting debug info so that
|
23
|
+
# we can detect and log the original error, which may even be the source of this error.
|
24
|
+
nil
|
28
25
|
end
|
26
|
+
raise e
|
29
27
|
end
|
30
28
|
end
|
31
29
|
end
|
@@ -10,9 +10,10 @@ module CLI
|
|
10
10
|
# Constructor for CLI::Kit::Logger
|
11
11
|
#
|
12
12
|
# @param debug_log_file [String] path to the file where debug logs should be stored
|
13
|
-
def initialize(debug_log_file:)
|
13
|
+
def initialize(debug_log_file:, env_debug_name: 'DEBUG')
|
14
14
|
FileUtils.mkpath(File.dirname(debug_log_file))
|
15
15
|
@debug_logger = ::Logger.new(debug_log_file, MAX_NUM_LOGS, MAX_LOG_SIZE)
|
16
|
+
@env_debug_name = env_debug_name
|
16
17
|
end
|
17
18
|
|
18
19
|
# Functionally equivalent to Logger#info
|
@@ -60,7 +61,7 @@ module CLI
|
|
60
61
|
#
|
61
62
|
# @param msg [String] the message to log
|
62
63
|
def debug(msg)
|
63
|
-
$stdout.puts CLI::UI.fmt(msg) if
|
64
|
+
$stdout.puts CLI::UI.fmt(msg) if is_debug?
|
64
65
|
@debug_logger.debug(format_debug(msg))
|
65
66
|
end
|
66
67
|
|
@@ -71,6 +72,11 @@ module CLI
|
|
71
72
|
return msg unless CLI::UI::StdoutRouter.current_id
|
72
73
|
"[#{CLI::UI::StdoutRouter.current_id[:id]}] #{msg}"
|
73
74
|
end
|
75
|
+
|
76
|
+
def is_debug?
|
77
|
+
val = ENV[@env_debug_name]
|
78
|
+
val && val != '0' && val != ''
|
79
|
+
end
|
74
80
|
end
|
75
81
|
end
|
76
82
|
end
|
@@ -10,7 +10,7 @@ module CLI
|
|
10
10
|
def assert_all_commands_run(should_raise: true)
|
11
11
|
errors = CLI::Kit::System.error_message
|
12
12
|
CLI::Kit::System.reset!
|
13
|
-
assert
|
13
|
+
assert(false, errors) if should_raise && !errors.nil?
|
14
14
|
errors
|
15
15
|
end
|
16
16
|
|
@@ -196,22 +196,22 @@ module CLI
|
|
196
196
|
|
197
197
|
unless errors[:unexpected].empty?
|
198
198
|
final_error << CLI::UI.fmt(<<~EOF)
|
199
|
-
|
200
|
-
|
199
|
+
{{bold:Unexpected command invocations:}}
|
200
|
+
{{command:#{errors[:unexpected].join("\n")}}}
|
201
201
|
EOF
|
202
202
|
end
|
203
203
|
|
204
204
|
unless errors[:not_run].empty?
|
205
205
|
final_error << CLI::UI.fmt(<<~EOF)
|
206
|
-
|
207
|
-
|
206
|
+
{{bold:Expected commands were not run:}}
|
207
|
+
{{command:#{errors[:not_run].join("\n")}}}
|
208
208
|
EOF
|
209
209
|
end
|
210
210
|
|
211
211
|
unless errors[:other].empty?
|
212
212
|
final_error << CLI::UI.fmt(<<~EOF)
|
213
|
-
|
214
|
-
|
213
|
+
{{bold:Commands were not run as expected:}}
|
214
|
+
#{errors[:other].map { |cmd, msg| "{{command:#{cmd}}}\n#{msg}" }.join("\n\n")}
|
215
215
|
EOF
|
216
216
|
end
|
217
217
|
|
@@ -19,7 +19,7 @@ module CLI
|
|
19
19
|
#
|
20
20
|
def sudo_reason(msg)
|
21
21
|
# See if sudo has a cached password
|
22
|
-
|
22
|
+
%x(env SUDO_ASKPASS=/usr/bin/false sudo -A true)
|
23
23
|
return if $CHILD_STATUS.success?
|
24
24
|
CLI::UI.with_frame_color(:blue) do
|
25
25
|
puts(CLI::UI.fmt("{{i}} #{msg}"))
|
@@ -90,6 +90,18 @@ module CLI
|
|
90
90
|
delegate_open3(*a, sudo: sudo, env: env, method: :capture3, **kwargs)
|
91
91
|
end
|
92
92
|
|
93
|
+
def popen2(*a, sudo: false, env: ENV, **kwargs, &block)
|
94
|
+
delegate_open3(*a, sudo: sudo, env: env, method: :popen2, **kwargs, &block)
|
95
|
+
end
|
96
|
+
|
97
|
+
def popen2e(*a, sudo: false, env: ENV, **kwargs)
|
98
|
+
delegate_open3(*a, sudo: sudo, env: env, method: :popen2e, **kwargs, &block)
|
99
|
+
end
|
100
|
+
|
101
|
+
def popen3(*a, sudo: false, env: ENV, **kwargs)
|
102
|
+
delegate_open3(*a, sudo: sudo, env: env, method: :popen3, **kwargs, &block)
|
103
|
+
end
|
104
|
+
|
93
105
|
# Execute a command in the user's environment
|
94
106
|
# Outputs result of the command without capturing it
|
95
107
|
#
|
@@ -130,13 +142,11 @@ module CLI
|
|
130
142
|
|
131
143
|
readers, = IO.select(ios)
|
132
144
|
readers.each do |io|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
io.close
|
139
|
-
end
|
145
|
+
data, trailing = split_partial_characters(io.readpartial(4096))
|
146
|
+
handlers[io].call(previous_trailing[io] + data)
|
147
|
+
previous_trailing[io] = trailing
|
148
|
+
rescue IOError
|
149
|
+
io.close
|
140
150
|
end
|
141
151
|
end
|
142
152
|
|
@@ -163,6 +173,14 @@ module CLI
|
|
163
173
|
[data.byteslice(0...partial_character_index), data.byteslice(partial_character_index..-1)]
|
164
174
|
end
|
165
175
|
|
176
|
+
def os
|
177
|
+
return :mac if /darwin/.match(RUBY_PLATFORM)
|
178
|
+
return :linux if /linux/.match(RUBY_PLATFORM)
|
179
|
+
return :windows if /mingw32/.match(RUBY_PLATFORM)
|
180
|
+
|
181
|
+
raise "Could not determine OS from platform #{RUBY_PLATFORM}"
|
182
|
+
end
|
183
|
+
|
166
184
|
private
|
167
185
|
|
168
186
|
def apply_sudo(*a, sudo)
|
@@ -171,9 +189,9 @@ module CLI
|
|
171
189
|
a
|
172
190
|
end
|
173
191
|
|
174
|
-
def delegate_open3(*a, sudo: raise, env: raise, method: raise, **kwargs)
|
192
|
+
def delegate_open3(*a, sudo: raise, env: raise, method: raise, **kwargs, &block)
|
175
193
|
a = apply_sudo(*a, sudo)
|
176
|
-
Open3.send(method, env, *resolve_path(a, env), **kwargs)
|
194
|
+
Open3.send(method, env, *resolve_path(a, env), **kwargs, &block)
|
177
195
|
rescue Errno::EINTR
|
178
196
|
raise(Errno::EINTR, "command interrupted: #{a.join(' ')}")
|
179
197
|
end
|
@@ -189,17 +207,30 @@ module CLI
|
|
189
207
|
# See https://github.com/Shopify/dev/pull/625 for more details.
|
190
208
|
def resolve_path(a, env)
|
191
209
|
# If only one argument was provided, make sure it's interpreted by a shell.
|
192
|
-
|
210
|
+
if a.size == 1
|
211
|
+
if os == :windows
|
212
|
+
return ["break && " + a[0]]
|
213
|
+
else
|
214
|
+
return ["true ; " + a[0]]
|
215
|
+
end
|
216
|
+
end
|
193
217
|
return a if a.first.include?('/')
|
194
218
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
219
|
+
item = which(a.first, env)
|
220
|
+
a[0] = item if item
|
221
|
+
a
|
222
|
+
end
|
223
|
+
|
224
|
+
def which(cmd, env)
|
225
|
+
exts = os == :windows ? env.fetch('PATHEXT').split(';') : ['']
|
226
|
+
env.fetch('PATH', '').split(File::PATH_SEPARATOR).each do |path|
|
227
|
+
exts.each do |ext|
|
228
|
+
exe = File.join(path, "#{cmd}#{ext}")
|
229
|
+
return exe if File.executable?(exe) && !File.directory?(exe)
|
230
|
+
end
|
199
231
|
end
|
200
232
|
|
201
|
-
|
202
|
-
a
|
233
|
+
nil
|
203
234
|
end
|
204
235
|
end
|
205
236
|
end
|
data/vendor/deps/cli-ui/REVISION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
5ea578d3110af35c73837a8008147ce53a4b56ed (dirty)
|
@@ -4,6 +4,7 @@ module CLI
|
|
4
4
|
autoload :Glyph, 'cli/ui/glyph'
|
5
5
|
autoload :Color, 'cli/ui/color'
|
6
6
|
autoload :Frame, 'cli/ui/frame'
|
7
|
+
autoload :OS, 'cli/ui/os'
|
7
8
|
autoload :Printer, 'cli/ui/printer'
|
8
9
|
autoload :Progress, 'cli/ui/progress'
|
9
10
|
autoload :Prompt, 'cli/ui/prompt'
|
@@ -131,8 +132,8 @@ module CLI
|
|
131
132
|
# * +args+ - arguments for +Frame.open+
|
132
133
|
# * +block+ - block for +Frame.open+
|
133
134
|
#
|
134
|
-
def self.frame(*args, &block)
|
135
|
-
CLI::UI::Frame.open(*args, &block)
|
135
|
+
def self.frame(*args, **kwargs, &block)
|
136
|
+
CLI::UI::Frame.open(*args, **kwargs, &block)
|
136
137
|
end
|
137
138
|
|
138
139
|
# Convenience Method for +CLI::UI::Spinner.spin+
|
@@ -142,8 +143,8 @@ module CLI
|
|
142
143
|
# * +args+ - arguments for +Spinner.open+
|
143
144
|
# * +block+ - block for +Spinner.open+
|
144
145
|
#
|
145
|
-
def self.spinner(*args, &block)
|
146
|
-
CLI::UI::Spinner.spin(*args, &block)
|
146
|
+
def self.spinner(*args, **kwargs, &block)
|
147
|
+
CLI::UI::Spinner.spin(*args, **kwargs, &block)
|
147
148
|
end
|
148
149
|
|
149
150
|
# Convenience Method to override frame color using +CLI::UI::Frame.with_frame_color+
|