shopify-cli 1.0.5 → 1.1.0

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.
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)