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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +4 -0
  3. data/bin/load_shopify.rb +3 -1
  4. data/bin/shopify +2 -0
  5. data/ext/shopify-cli/extconf.rb +40 -20
  6. data/lib/project_types/node/commands/create.rb +4 -4
  7. data/lib/project_types/node/commands/deploy/heroku.rb +6 -1
  8. data/lib/project_types/node/commands/generate/billing.rb +6 -5
  9. data/lib/project_types/node/commands/generate/page.rb +8 -5
  10. data/lib/project_types/node/commands/generate/webhook.rb +4 -1
  11. data/lib/project_types/node/messages/messages.rb +1 -0
  12. data/lib/project_types/rails/commands/create.rb +52 -4
  13. data/lib/project_types/rails/commands/generate.rb +1 -0
  14. data/lib/project_types/rails/commands/generate/webhook.rb +3 -2
  15. data/lib/project_types/rails/commands/serve.rb +6 -2
  16. data/lib/project_types/rails/gem.rb +61 -6
  17. data/lib/project_types/rails/messages/messages.rb +27 -11
  18. data/lib/project_types/script/config/extension_points.yml +3 -3
  19. data/lib/project_types/script/forms/create.rb +1 -1
  20. data/lib/rubygems_plugin.rb +18 -10
  21. data/lib/shopify-cli/admin_api/populate_resource_command.rb +1 -1
  22. data/lib/shopify-cli/commands/connect.rb +1 -1
  23. data/lib/shopify-cli/commands/system.rb +9 -8
  24. data/lib/shopify-cli/context.rb +28 -0
  25. data/lib/shopify-cli/heroku.rb +18 -2
  26. data/lib/shopify-cli/js_deps.rb +2 -2
  27. data/lib/shopify-cli/js_system.rb +2 -2
  28. data/lib/shopify-cli/process_supervision.rb +52 -15
  29. data/lib/shopify-cli/project.rb +14 -6
  30. data/lib/shopify-cli/tunnel.rb +10 -4
  31. data/lib/shopify-cli/version.rb +1 -1
  32. data/lib/shopify_cli.rb +6 -2
  33. data/shopify-cli.gemspec +4 -1
  34. data/vendor/deps/cli-kit/REVISION +1 -1
  35. data/vendor/deps/cli-kit/lib/cli/kit.rb +1 -1
  36. data/vendor/deps/cli-kit/lib/cli/kit/autocall.rb +2 -2
  37. data/vendor/deps/cli-kit/lib/cli/kit/error_handler.rb +12 -6
  38. data/vendor/deps/cli-kit/lib/cli/kit/executor.rb +9 -11
  39. data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +8 -2
  40. data/vendor/deps/cli-kit/lib/cli/kit/support/test_helper.rb +7 -7
  41. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +48 -17
  42. data/vendor/deps/cli-ui/REVISION +1 -1
  43. data/vendor/deps/cli-ui/lib/cli/ui.rb +5 -4
  44. data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +9 -3
  45. data/vendor/deps/cli-ui/lib/cli/ui/color.rb +1 -0
  46. data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +3 -2
  47. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +1 -0
  48. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/box.rb +13 -5
  49. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style/bracket.rb +29 -2
  50. data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +21 -10
  51. data/vendor/deps/cli-ui/lib/cli/ui/os.rb +63 -0
  52. data/vendor/deps/cli-ui/lib/cli/ui/prompt.rb +11 -2
  53. data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +1 -0
  54. data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +3 -3
  55. data/vendor/deps/cli-ui/lib/cli/ui/spinner/spin_group.rb +6 -8
  56. data/vendor/deps/cli-ui/lib/cli/ui/widgets.rb +2 -0
  57. data/vendor/gen/lib/gen.rb +39 -0
  58. data/vendor/gen/lib/gen/commands.rb +18 -0
  59. data/vendor/gen/lib/gen/commands/help.rb +20 -0
  60. data/vendor/gen/lib/gen/commands/new.rb +21 -0
  61. data/vendor/gen/lib/gen/entry_point.rb +10 -0
  62. data/vendor/gen/lib/gen/generator.rb +165 -0
  63. data/vendor/gen/template/.gitignore +2 -0
  64. data/vendor/gen/template/Gemfile +10 -0
  65. data/vendor/gen/template/README.md +1 -0
  66. data/vendor/gen/template/bin/testunit +23 -0
  67. data/vendor/gen/template/bin/update-deps +97 -0
  68. data/vendor/gen/template/dev-gems.yml +3 -0
  69. data/vendor/gen/template/dev-vendor.yml +4 -0
  70. data/vendor/gen/template/exe/__app__-gems +17 -0
  71. data/vendor/gen/template/exe/__app__-vendor +18 -0
  72. data/vendor/gen/template/lib/__app__.rb +33 -0
  73. data/vendor/gen/template/lib/__app__/commands.rb +18 -0
  74. data/vendor/gen/template/lib/__app__/commands/example.rb +19 -0
  75. data/vendor/gen/template/lib/__app__/commands/help.rb +21 -0
  76. data/vendor/gen/template/lib/__app__/entry_point.rb +10 -0
  77. data/vendor/gen/template/test/example_test.rb +17 -0
  78. data/vendor/gen/template/test/test_helper.rb +22 -0
  79. metadata +25 -4
  80. data/Vagrantfile +0 -17
  81. data/lib/project_types/script/forms/script_form.rb +0 -69
@@ -9,9 +9,12 @@ module Rails
9
9
  },
10
10
 
11
11
  gem: {
12
+ checking_installation_path: "Checking path %s for gem %s",
13
+ installed: "Installed %s gem",
12
14
  installed_debug: "%s installed: %s",
13
15
  installing: "Installing %s gem...",
14
- installed: "Installed %s gem",
16
+ setting_gem_home: "GEM_HOME being set to %s",
17
+ setting_gem_path: "GEM_PATH being set to %s",
15
18
  },
16
19
 
17
20
  create: {
@@ -33,6 +36,14 @@ module Rails
33
36
  See {{underline:https://github.com/Shopify/shopify-app-cli/blob/master/docs/installing-ruby.md}}
34
37
  for our recommended method of installing ruby.
35
38
  MSG
39
+ install_failure: "Error installing %s gem",
40
+ node_required: "node is required to create a rails project. Download at https://nodejs.org/en/download.",
41
+ node_version_failure: "Failed to get the current node version. Please make sure it is installed as " \
42
+ "per the instructions at https://nodejs.org/en.",
43
+ yarn_required: "yarn is required to create a rails project. Download at " \
44
+ "https://classic.yarnpkg.com/en/docs/install.",
45
+ yarn_version_failure: "Failed to get the current yarn version. Please make sure it is installed as per " \
46
+ "the instructions at https://classic.yarnpkg.com/en/docs/install.",
36
47
  },
37
48
 
38
49
  info: {
@@ -40,13 +51,18 @@ module Rails
40
51
  serve: "{{*}} Change directories to your new project folder {{green:%s}} and run {{command:%s serve}} " \
41
52
  "to start a local server",
42
53
  install: "{{*}} Then, visit {{underline:%s/test}} to install {{green:%s}} on your Dev Store",
54
+ open_new_shell: "{{*}} {{yellow:After installing %s, please open a new Command Prompt or PowerShell " \
55
+ "window to continue.}}",
43
56
  },
44
- installing_bundler: "Installing bundler",
57
+ installing_bundler: "Installing bundler...",
45
58
  generating_app: "Generating new rails app project in %s...",
46
- adding_shopify_gem: "{{v}} Adding shopify_app gem",
59
+ adding_shopify_gem: "{{v}} Adding shopify_app gem...",
60
+ node_version: "node %s",
61
+ yarn_version: "yarn %s",
47
62
  running_bundle_install: "Running bundle install...",
48
63
  running_generator: "Running shopify_app generator...",
49
- running_migrations: "Running migrations",
64
+ running_migrations: "Running migrations...",
65
+ running_webpacker_install: "Running webpacker:install...",
50
66
  },
51
67
 
52
68
  deploy: {
@@ -65,14 +81,14 @@ module Rails
65
81
  Deploy the current Rails project to Heroku
66
82
  Usage: {{command:%s deploy heroku}}
67
83
  HELP
68
- downloading: "Downloading Heroku CLI",
84
+ downloading: "Downloading Heroku CLI...",
69
85
  downloaded: "Downloaded Heroku CLI",
70
- installing: "Installing Heroku CLI",
86
+ installing: "Installing Heroku CLI...",
71
87
  installed: "Installed Heroku CLI",
72
88
  authenticated_with_account: "{{v}} Authenticated with Heroku as `%s`",
73
- authenticating: "Authenticating with Heroku",
89
+ authenticating: "Authenticating with Heroku...",
74
90
  authenticated: "{{v}} Authenticated with Heroku",
75
- deploying: "Deploying to Heroku",
91
+ deploying: "Deploying to Heroku...",
76
92
  deployed: "{{v}} Deployed to Heroku",
77
93
  db_check: {
78
94
  validating: "Validating application...",
@@ -86,7 +102,7 @@ module Rails
86
102
  SQLITE
87
103
  },
88
104
  git: {
89
- checking: "Checking git repo",
105
+ checking: "Checking git repo...",
90
106
  initialized: "Git repo initialized",
91
107
  what_branch: "What branch would you like to deploy?",
92
108
  branch_selected: "{{v}} Git branch `%s` selected for deploy",
@@ -95,10 +111,10 @@ module Rails
95
111
  no_apps_found: "No existing Heroku app found. What would you like to do?",
96
112
  name: "What is your Heroku app’s name?",
97
113
  select: "Specify an existing Heroku app",
98
- selecting: "Selecting Heroku app `%s`…",
114
+ selecting: "Selecting Heroku app `%s`...",
99
115
  selected: "{{v}} Heroku app `%s` selected",
100
116
  create: "Create a new Heroku app",
101
- creating: "Creating new Heroku app",
117
+ creating: "Creating new Heroku app...",
102
118
  created: "{{v}} New Heroku app created",
103
119
  },
104
120
  },
@@ -1,7 +1,7 @@
1
1
  discount:
2
2
  assemblyscript:
3
3
  package: "@shopify/extension-point-as-discount"
4
- version: "^0.2.4"
4
+ version: "^0.2.6"
5
5
  sdk-version: "^6.0.0"
6
6
  toolchain-version: "^1.1.0"
7
7
  unit_limit_per_order:
@@ -13,12 +13,12 @@ unit_limit_per_order:
13
13
  payment_filter:
14
14
  assemblyscript:
15
15
  package: "@shopify/extension-point-as-payment-filter"
16
- version: "^0.2.3"
16
+ version: "^0.2.4"
17
17
  sdk-version: "^6.0.0"
18
18
  toolchain-version: "^1.1.0"
19
19
  shipping_filter:
20
20
  assemblyscript:
21
21
  package: "@shopify/extension-point-as-shipping-filter"
22
- version: "^0.2.4"
22
+ version: "^0.2.6"
23
23
  sdk-version: "^6.0.0"
24
24
  toolchain-version: "^1.1.0"
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Script
4
4
  module Forms
5
- class Create < ScriptForm
5
+ class Create < ShopifyCli::Form
6
6
  flag_arguments :extension_point, :name
7
7
 
8
8
  def ask
@@ -1,17 +1,25 @@
1
1
  Gem.post_uninstall do |uninstaller|
2
2
  if uninstaller.spec.name == 'shopify-cli'
3
- require 'fileutils'
3
+ if RUBY_PLATFORM.match(/mingw32/)
4
+ bat_path = File.dirname(RbConfig.ruby)
5
+ bat = "#{bat_path}\\shopify.bat"
4
6
 
5
- symlink = '/usr/local/bin/shopify'
7
+ # delete the auto-generated batch script
8
+ File.unlink(bat)
9
+ else
10
+ require 'fileutils'
6
11
 
7
- # delete the symbolic link IFF it exists AND it does not point to a file
8
- # (i.e., it's been left hanging as a result of the uninstall, as expected)
9
- #
10
- # if the file still exists, either the uninstall failed (possible but
11
- # unlikely) OR
12
- # there's another installation of the gem in another ruby folder that has
13
- # overwritten it, so leave the symbolic link alone
14
- system("sudo rm -f #{symlink}") if File.symlink?(symlink) && !File.exist?(symlink)
12
+ symlink = '/usr/local/bin/shopify'
13
+
14
+ # delete the symbolic link IFF it exists AND it does not point to a file
15
+ # (i.e., it's been left hanging as a result of the uninstall, as expected)
16
+ #
17
+ # if the file still exists, either the uninstall failed (possible but
18
+ # unlikely) OR
19
+ # there's another installation of the gem in another ruby folder that has
20
+ # overwritten it, so leave the symbolic link alone
21
+ system("sudo rm -f #{symlink}") if File.symlink?(symlink) && !File.exist?(symlink)
22
+ end
15
23
  end
16
24
 
17
25
  true
@@ -118,7 +118,7 @@ module ShopifyCli
118
118
  kwargs = { input: data }
119
119
  kwargs[:shop] = @shop
120
120
  resp = AdminAPI.query(
121
- @ctx, "create_#{snake_case_resource_type}", kwargs
121
+ @ctx, "create_#{snake_case_resource_type}", **kwargs
122
122
  )
123
123
  @ctx.abort(resp['errors']) if resp['errors']
124
124
  @ctx.done(message(resp['data'])) unless @silent
@@ -13,8 +13,8 @@ module ShopifyCli
13
13
  end
14
14
 
15
15
  org = ShopifyCli::Tasks::EnsureEnv.call(@ctx, regenerate: true)
16
- api_key = Project.current.env['api_key']
17
16
  write_cli_yml(project_type, org['id']) unless Project.has_current?
17
+ api_key = Project.current(force_reload: true).env['api_key']
18
18
  @ctx.puts(@ctx.message('core.connect.connected', get_app(org['apps'], api_key).first["title"]))
19
19
  end
20
20
 
@@ -68,13 +68,14 @@ module ShopifyCli
68
68
  end
69
69
 
70
70
  def display_utility_commands(_show_all_details)
71
- commands = %w(git curl tar unzip)
71
+ commands = %w(git curl tar)
72
72
 
73
73
  @ctx.puts("\n" + @ctx.message('core.system.command_header'))
74
74
  commands.each do |s|
75
- output, status = @ctx.capture2e('which', s)
76
- if status.success?
77
- @ctx.puts(" " + @ctx.message('core.system.command_with_path', s, output))
75
+ cmd_path = @ctx.which(s)
76
+
77
+ if !cmd_path.nil?
78
+ @ctx.puts(" " + @ctx.message('core.system.command_with_path', s, cmd_path))
78
79
  else
79
80
  @ctx.puts(" " + @ctx.message('core.system.command_not_found', s))
80
81
  end
@@ -82,7 +83,7 @@ module ShopifyCli
82
83
  end
83
84
 
84
85
  def display_ngrok
85
- ngrok_location = File.join(ShopifyCli.cache_dir, 'ngrok')
86
+ ngrok_location = File.join(ShopifyCli.cache_dir, @ctx.windows? ? 'ngrok.exe' : 'ngrok')
86
87
  if File.exist?(ngrok_location)
87
88
  @ctx.puts(" " + @ctx.message('core.system.ngrok_available', ngrok_location))
88
89
  else
@@ -102,11 +103,11 @@ module ShopifyCli
102
103
  def display_project(project_type, commands)
103
104
  @ctx.puts("\n" + @ctx.message('core.system.project.header', project_type))
104
105
  commands.each do |s|
105
- output, status = @ctx.capture2e('which', s)
106
- if status.success?
106
+ cmd_path = @ctx.which(s)
107
+ if !cmd_path.nil?
107
108
  version_output, _ = @ctx.capture2e(s, '--version')
108
109
  version = version_output.match(/(\d+\.[^\s]+)/)[0]
109
- @ctx.puts(" " + @ctx.message('core.system.project.command_with_path', s, output.strip, version.strip))
110
+ @ctx.puts(" " + @ctx.message('core.system.project.command_with_path', s, cmd_path.strip, version.strip))
110
111
  else
111
112
  @ctx.puts(" " + @ctx.message('core.system.project.command_not_found', s))
112
113
  end
@@ -56,6 +56,7 @@ module ShopifyCli
56
56
  host = uname
57
57
  return :mac if /darwin/.match(host)
58
58
  return :linux if /linux/.match(host)
59
+ return :windows if /mingw32/.match(host)
59
60
  end
60
61
 
61
62
  # will return true if the cli is running on an apple computer.
@@ -68,6 +69,11 @@ module ShopifyCli
68
69
  os == :linux
69
70
  end
70
71
 
72
+ # will return true if the cli is running on Windows
73
+ def windows?
74
+ os == :windows
75
+ end
76
+
71
77
  # will return true if the cli is being run from an installation, and not a
72
78
  # development instance. The gem installation will not have a 'test' directory.
73
79
  # See `#development?` for checking for development environment.
@@ -418,6 +424,28 @@ module ShopifyCli
418
424
  end
419
425
  end
420
426
 
427
+ # Checks if the given command exists in the system
428
+ #
429
+ # #### Parameters
430
+ # - `cmd`: The command to test
431
+ #
432
+ # #### Returns
433
+ # The path of the executable if it is found
434
+ #
435
+ # @todo This is currently a duplicate of CLI::Kit::System.which() - we should make that method public when we make
436
+ # Kit changes and make this a wrapper instead.
437
+ def which(cmd)
438
+ exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
439
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
440
+ exts.each do |ext|
441
+ exe = File.join(File.expand_path(path), "#{cmd}#{ext}")
442
+ return exe if File.executable?(exe) && !File.directory?(exe)
443
+ end
444
+ end
445
+
446
+ nil
447
+ end
448
+
421
449
  private
422
450
 
423
451
  def ctx_path(fname)
@@ -3,7 +3,7 @@ module ShopifyCli
3
3
  DOWNLOAD_URLS = {
4
4
  linux: 'https://cli-assets.heroku.com/heroku-linux-x64.tar.gz',
5
5
  mac: 'https://cli-assets.heroku.com/heroku-darwin-x64.tar.gz',
6
- windows: 'https://cli-assets.heroku.com/heroku-win32-x64.tar.gz',
6
+ windows: 'https://cli-assets.heroku.com/heroku-x64.exe',
7
7
  }
8
8
 
9
9
  def initialize(ctx)
@@ -44,7 +44,11 @@ module ShopifyCli
44
44
  def install
45
45
  return if installed?
46
46
 
47
- result = @ctx.system('tar', '-xf', download_path, chdir: ShopifyCli.cache_dir)
47
+ result = if @ctx.windows?
48
+ @ctx.system(download_path)
49
+ else
50
+ @ctx.system('tar', '-xf', download_path, chdir: ShopifyCli.cache_dir)
51
+ end
48
52
  @ctx.abort(@ctx.message('core.heroku.error.install')) unless result.success?
49
53
 
50
54
  @ctx.rm(download_path)
@@ -82,6 +86,18 @@ module ShopifyCli
82
86
  local_path = File.join(ShopifyCli.cache_dir, 'heroku', 'bin', 'heroku').to_s
83
87
  if File.exist?(local_path)
84
88
  local_path
89
+ elsif @ctx.windows?
90
+ # Check if Heroku exists in the Windows registry and run it from there
91
+ require 'win32/registry'
92
+ begin
93
+ windows_path = Win32::Registry::HKEY_CURRENT_USER.open('SOFTWARE\heroku') do |reg|
94
+ reg[''] # This reads the 'Default' registry key
95
+ end
96
+
97
+ File.join(windows_path, 'bin', 'heroku').to_s
98
+ rescue
99
+ 'heroku'
100
+ end
85
101
  else
86
102
  'heroku'
87
103
  end
@@ -69,7 +69,7 @@ module ShopifyCli
69
69
  deps = parse_dependencies
70
70
  errors = nil
71
71
 
72
- spinner_title = ctx.message('core.js_deps.installing_deps', deps.size)
72
+ spinner_title = ctx.message('core.js_deps.installing', @system.package_manager)
73
73
  success = CLI::UI::Spinner.spin(spinner_title, auto_debrief: false) do |spinner|
74
74
  _, errors, status = CLI::Kit::System.capture3(*cmd, env: @ctx.env, chdir: ctx.root)
75
75
  update_spinner_title_and_status(spinner, status, deps)
@@ -81,7 +81,7 @@ module ShopifyCli
81
81
 
82
82
  def update_spinner_title_and_status(spinner, status, deps)
83
83
  if status.success?
84
- spinner.update_title(ctx.message('core.js_deps.installed_deps', deps.size))
84
+ spinner.update_title(ctx.message('core.js_deps.installed', deps.size))
85
85
  else
86
86
  spinner.update_title(ctx.message('core.js_deps.error.install_spinner_error', deps.size))
87
87
  CLI::UI::Spinner::TASK_FAILED
@@ -64,8 +64,8 @@ module ShopifyCli
64
64
  #
65
65
  def yarn?
66
66
  @has_yarn ||= begin
67
- _, status = CLI::Kit::System.capture2('which', 'yarn')
68
- File.exist?(File.join(ctx.root, 'yarn.lock')) && status.success?
67
+ cmd_path = @ctx.which('yarn')
68
+ File.exist?(File.join(ctx.root, 'yarn.lock')) && !cmd_path.nil?
69
69
  end
70
70
  end
71
71
 
@@ -8,7 +8,7 @@ module ShopifyCli
8
8
  # a string or a symbol to identify this process by
9
9
  attr_reader :identifier
10
10
  # process ID for the running process
11
- attr_reader :pid
11
+ attr_accessor :pid
12
12
  # starttime of the process
13
13
  attr_reader :time
14
14
  # filepath to the pidfile for this process
@@ -58,15 +58,37 @@ module ShopifyCli
58
58
  #
59
59
  def start(identifier, args)
60
60
  return for_ident(identifier) if running?(identifier)
61
- fork do
62
- pid_file = new(identifier, pid: Process.pid)
61
+
62
+ # Windows doesn't support forking process without extra gems, so we resort to spawning a new child process -
63
+ # that means that it dies along with the original process if it is interrupted. On UNIX, we fork the process so
64
+ # that it doesn't have to be restarted on every run.
65
+ if Context.new.windows?
66
+ pid_file = new(identifier)
67
+
68
+ # Make sure the file exists and is empty, otherwise Windows fails
69
+ File.open(pid_file.log_path, 'w') {}
70
+ pid = Process.spawn(
71
+ *args,
72
+ out: pid_file.log_path,
73
+ err: pid_file.log_path,
74
+ in: Context.new.windows? ? "nul" : "/dev/null",
75
+ )
76
+ pid_file.pid = pid
63
77
  pid_file.write
64
- STDOUT.reopen(pid_file.log_path, "w")
65
- STDERR.reopen(pid_file.log_path, "w")
66
- STDIN.reopen("/dev/null", "r")
67
- Process.setsid
68
- exec(*args)
78
+
79
+ Process.detach(pid)
80
+ else
81
+ fork do
82
+ pid_file = new(identifier, pid: Process.pid)
83
+ pid_file.write
84
+ STDOUT.reopen(pid_file.log_path, "w")
85
+ STDERR.reopen(pid_file.log_path, "w")
86
+ STDIN.reopen("/dev/null", "r")
87
+ Process.setsid
88
+ exec(*args)
89
+ end
69
90
  end
91
+
70
92
  sleep(0.1)
71
93
  for_ident(identifier)
72
94
  end
@@ -106,10 +128,11 @@ module ShopifyCli
106
128
  end
107
129
  end
108
130
 
109
- def initialize(identifier, pid:, time: Time.now.strftime('%s')) # :nodoc:
131
+ def initialize(identifier, pid: nil, time: Time.now.strftime('%s')) # :nodoc:
110
132
  @identifier = identifier
111
133
  @pid = pid
112
134
  @time = time
135
+ FileUtils.mkdir_p(ShopifyCli::ProcessSupervision.run_dir)
113
136
  @pid_path = File.join(ShopifyCli::ProcessSupervision.run_dir, "#{identifier}.pid")
114
137
  @log_path = File.join(ShopifyCli::ProcessSupervision.run_dir, "#{identifier}.log")
115
138
  end
@@ -117,13 +140,17 @@ module ShopifyCli
117
140
  ##
118
141
  # will attempt to shutdown a running process
119
142
  #
143
+ # #### Parameters
144
+ #
145
+ # * `ctx` - the context of this command
146
+ #
120
147
  # #### Returns
121
148
  #
122
149
  # * `stopped` - [true, false]
123
150
  #
124
151
  def stop
125
- unlink
126
152
  kill_proc
153
+ unlink
127
154
  true
128
155
  rescue
129
156
  false
@@ -159,7 +186,11 @@ module ShopifyCli
159
186
  end
160
187
 
161
188
  def kill_proc
162
- kill(-pid) # process group
189
+ if Context.new.windows?
190
+ kill(pid)
191
+ else
192
+ kill(-pid) # process group
193
+ end
163
194
  rescue Errno::ESRCH
164
195
  begin
165
196
  kill(pid)
@@ -169,12 +200,18 @@ module ShopifyCli
169
200
  end
170
201
 
171
202
  def kill(id)
172
- Process.kill('TERM', id)
173
- 50.times do
174
- sleep 0.1
175
- break unless stat(id)
203
+ ctx = Context.new
204
+
205
+ # Windows does not handle SIGTERM, go straight to SIGKILL
206
+ unless ctx.windows?
207
+ Process.kill('TERM', id)
208
+ 50.times do
209
+ sleep 0.1
210
+ break unless stat(id)
211
+ end
176
212
  end
177
213
  Process.kill('KILL', id) if stat(id)
214
+ sleep(0.1) if ctx.windows? # Give Windows a second to actually close the process
178
215
  end
179
216
 
180
217
  def stat(id)