geordi 3.2.0 → 4.2.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 (62) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -1
  3. data/.travis.yml +5 -0
  4. data/CHANGELOG.md +69 -1
  5. data/Gemfile +2 -1
  6. data/Gemfile.lock +46 -28
  7. data/README.md +132 -140
  8. data/Rakefile +19 -9
  9. data/exe/dumple +19 -4
  10. data/geordi.gemspec +3 -2
  11. data/lib/geordi/COMMAND_TEMPLATE +4 -2
  12. data/lib/geordi/chromedriver_updater.rb +2 -2
  13. data/lib/geordi/cli.rb +1 -1
  14. data/lib/geordi/commands/bundle_install.rb +1 -1
  15. data/lib/geordi/commands/capistrano.rb +1 -1
  16. data/lib/geordi/commands/chromedriver_update.rb +10 -3
  17. data/lib/geordi/commands/commit.rb +0 -5
  18. data/lib/geordi/commands/console.rb +11 -13
  19. data/lib/geordi/commands/create_databases.rb +7 -5
  20. data/lib/geordi/commands/cucumber.rb +22 -19
  21. data/lib/geordi/commands/delete_dumps.rb +0 -1
  22. data/lib/geordi/commands/deploy.rb +17 -17
  23. data/lib/geordi/commands/drop_databases.rb +0 -6
  24. data/lib/geordi/commands/dump.rb +20 -18
  25. data/lib/geordi/commands/firefox.rb +3 -6
  26. data/lib/geordi/commands/migrate.rb +4 -4
  27. data/lib/geordi/commands/rake.rb +7 -3
  28. data/lib/geordi/commands/rspec.rb +8 -12
  29. data/lib/geordi/commands/security_update.rb +24 -25
  30. data/lib/geordi/commands/server.rb +4 -4
  31. data/lib/geordi/commands/setup.rb +7 -16
  32. data/lib/geordi/commands/shell.rb +7 -8
  33. data/lib/geordi/commands/tests.rb +4 -4
  34. data/lib/geordi/commands/unit.rb +3 -3
  35. data/lib/geordi/commands/update.rb +4 -15
  36. data/lib/geordi/commands/vnc.rb +2 -4
  37. data/lib/geordi/commands/with_rake.rb +3 -3
  38. data/lib/geordi/commands/yarn_install.rb +1 -1
  39. data/lib/geordi/cucumber.rb +3 -3
  40. data/lib/geordi/dump_loader.rb +1 -1
  41. data/lib/geordi/gitpt.rb +1 -1
  42. data/lib/geordi/interaction.rb +1 -1
  43. data/lib/geordi/remote.rb +5 -4
  44. data/lib/geordi/settings.rb +11 -2
  45. data/lib/geordi/util.rb +35 -17
  46. data/lib/geordi/version.rb +1 -1
  47. metadata +7 -34
  48. data/exe/cap-all +0 -4
  49. data/exe/console-for +0 -4
  50. data/exe/cuc +0 -4
  51. data/exe/cuc-show +0 -4
  52. data/exe/cuc-vnc-setup +0 -4
  53. data/exe/deploy-to-production +0 -4
  54. data/exe/dump-for +0 -8
  55. data/exe/gitpt +0 -4
  56. data/exe/load-dump +0 -4
  57. data/exe/migrate-all +0 -4
  58. data/exe/rs +0 -4
  59. data/exe/run_tests +0 -4
  60. data/exe/shell-for +0 -4
  61. data/exe/tests +0 -4
  62. data/lib/geordi/commands/eurest.rb +0 -4
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ desc 'Default: Run all tests'
5
5
  task default: :features
6
6
 
7
7
  task :features do
8
- system 'bundle exec cucumber'
8
+ exec 'bundle exec cucumber'
9
9
  end
10
10
 
11
11
  task :readme do
@@ -32,21 +32,31 @@ You may abbreviate commands by typing only their first letters, e.g. `geordi
32
32
  con` will boot a development console, `geordi set -t` will setup a project and
33
33
  run tests afterwards.
34
34
 
35
- For details on commands, e.g. supported options, you may always run
36
- `geordi help <command>`.
37
-
35
+ You can always run `geordi help <command>` to quickly look up command help.
38
36
  TEXT
39
37
 
40
38
  Geordi::CLI.all_commands.sort.each do |_, command|
41
- unless command.hidden?
42
- geordi_section << "### `geordi #{command.usage}`\n\n"
43
- geordi_section << "#{command.description.sub /(\.)?$/, '.'}\n\n"
44
- geordi_section << "#{command.long_description.strip}\n\n" if command.long_description
39
+ next if command.hidden?
40
+
41
+ geordi_section << "\n### `geordi #{command.usage}`\n"
42
+ geordi_section << "#{command.description.sub /(\.)?$/, '.'}\n\n"
43
+ geordi_section << "#{command.long_description.strip}\n\n" if command.long_description
44
+
45
+ if command.options.any?
46
+ geordi_section << "**Options**\n"
47
+ # Taken from thor-1.0.1/lib/thor/base.rb:557
48
+ command.options.values.each do |option|
49
+ next if option.hide
50
+
51
+ geordi_section << "- `#{option.usage}`"
52
+ geordi_section << ": #{option.description}" if option.description
53
+ geordi_section << "\n"
54
+ end
45
55
  geordi_section << "\n"
46
56
  end
47
57
  end
48
58
 
49
59
  updated_readme = readme.sub(geordi_section_regex, geordi_section)
50
60
  File.open('README.md', 'w') { |f| f.puts updated_readme.strip }
51
- puts 'README.me updated.'
61
+ puts 'README.md updated.'
52
62
  end
data/exe/dumple CHANGED
@@ -3,6 +3,7 @@
3
3
  require 'erb'
4
4
 
5
5
  fail_gently = ARGV.include?("--fail-gently")
6
+ compress = ARGV.include?("--compress")
6
7
 
7
8
  if ARGV.include?("-i")
8
9
  puts "*******************************************************"
@@ -44,9 +45,13 @@ begin
44
45
  end
45
46
 
46
47
  config = YAML::load(ERB.new(File.read(config_path)).result)
48
+ environment, database = ARGV.reject{ |arg| arg[0].chr == '-' }
49
+ environment ||= 'production'
50
+ config = config[environment] or raise "No #{environment} database found.\nUsage: dumple ENVIRONMENT [DATABASE]"
47
51
 
48
- environment = ARGV.reject{ |arg| arg[0].chr == '-' }.first || 'production'
49
- config = config[environment] or raise "No #{environment} database found.\nUsage: dumple ENVIRONMENT"
52
+ if database
53
+ config = config[database] or raise %(Unknown #{environment} database "#{database}")
54
+ end
50
55
 
51
56
  dump_dir = "#{ENV['HOME']}/dumps"
52
57
  unless File.directory?(dump_dir)
@@ -60,7 +65,8 @@ begin
60
65
  dump_path = "#{dump_dir}/#{config['database']}_#{Time.now.strftime("%Y%m%d_%H%M%S")}.dump"
61
66
  end
62
67
 
63
- puts "> Dumping database for \"#{environment}\" environment ..."
68
+ given_database = database ? %(#{database} ) : ""
69
+ puts "> Dumping #{given_database}database for \"#{environment}\" environment ..."
64
70
 
65
71
  host = config['host']
66
72
  port = config['port']
@@ -89,13 +95,22 @@ begin
89
95
  command << " --port=#{port}" if port
90
96
  command
91
97
  else
92
- raise "Adapter \"#{config['adapter']} is not supported"
98
+ raise "Adapter \"#{config['adapter']}\" is not supported"
93
99
  end
94
100
  success = system(dump_command)
95
101
  success or raise "Creating the dump failed"
96
102
 
97
103
  system "chmod 600 #{dump_path}"
98
104
 
105
+ if compress
106
+ puts "> Compressing the dump ..."
107
+
108
+ # gzip compresses in place
109
+ compress_success = system("gzip #{dump_path}")
110
+ compress_success or raise "Compressing the dump failed"
111
+ dump_path << ".gz"
112
+ end
113
+
99
114
  dump_size_kb = (File.size(dump_path) / 1024).round
100
115
 
101
116
  puts "> Dumped to #{dump_path} (#{dump_size_kb} KB)"
@@ -11,13 +11,13 @@ Gem::Specification.new do |spec|
11
11
 
12
12
  spec.summary = 'Collection of command line tools we use in our daily work with Ruby, Rails and Linux at makandra.'
13
13
  spec.description = 'Collection of command line tools we use in our daily work with Ruby, Rails and Linux at makandra.'
14
- spec.homepage = 'http://makandra.com'
14
+ spec.homepage = 'https://makandra.com'
15
15
  spec.license = 'MIT'
16
16
 
17
17
  # Specify which files should be added to the gem when it is released.
18
18
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
19
19
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
20
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(spec|features)/}) }
21
21
  end
22
22
  spec.bindir = 'exe'
23
23
  spec.executables = spec.files.grep(%r(^exe/)) { |f| File.basename(f) }
@@ -27,5 +27,6 @@ Gem::Specification.new do |spec|
27
27
 
28
28
  spec.post_install_message = <<-ATTENTION
29
29
  * Binary `geordi` installed
30
+ * Geordi 4 has removed its deprecated executables. If you want to invoke these commands like before, you may create aliases on your machine. For the alias mapping, please refer to https://github.com/makandra/geordi/commit/68fa92acb146ebde3acb92d7b9556bd4eaa2b4ff
30
31
  ATTENTION
31
32
  end
@@ -12,14 +12,16 @@ Detailed description with anything the user needs to know.
12
12
 
13
13
  Short and long description are printed on the console AND included in the README
14
14
  by `rake update_readme`. Thus, please format descriptions in a way that's reader
15
- friendly both in Markdown and the console.
15
+ friendly both in Markdown and the console. In particular, note that simple line
16
+ breaks (\n) will be squished. Only paragraphs (\n\n) will work both on the bash
17
+ and in Markdown.
16
18
  LONGDESC
17
19
 
18
20
  option :opt, type: :boolean, aliases: '-o', banner: 'VALUE_NAME', desc: 'If set, VALUE_NAME will be used for something'
19
21
 
20
22
  def example
21
23
  # Invoke other commands like this:
22
- invoke_cmd 'other_command', 'argument', an: 'option'
24
+ invoke_geordi 'other_command', 'argument', an: 'option'
23
25
 
24
26
  Interaction.fail 'Option missing' unless options.opt?
25
27
 
@@ -5,12 +5,12 @@ require 'tempfile'
5
5
  module Geordi
6
6
  class ChromedriverUpdater
7
7
 
8
- def run
8
+ def run(options)
9
9
  chrome_version = determine_chrome_version
10
10
  chromedriver_version = determine_chromedriver_version
11
11
 
12
12
  if skip_update?(chrome_version, chromedriver_version)
13
- Interaction.warn("No update required, you are using for both executables the same version #{chrome_version}!")
13
+ Interaction.note("No update required, you are using for both executables the same version #{chrome_version}!") unless options[:quiet_if_matching]
14
14
  else
15
15
  chromedriver_zip = download_chromedriver(chrome_version)
16
16
  unzip(chromedriver_zip, File.expand_path('~/bin'))
@@ -18,7 +18,7 @@ module Geordi
18
18
  private
19
19
 
20
20
  # fix weird implementation of #invoke
21
- def invoke_cmd(name, *args)
21
+ def invoke_geordi(name, *args)
22
22
  options = args.last.is_a?(Hash) ? args.pop : {}
23
23
  invoke(name, args, options)
24
24
  end
@@ -2,6 +2,6 @@ desc 'bundle-install', 'Run bundle install if required', hide: true
2
2
  def bundle_install
3
3
  if File.exist?('Gemfile') && !system('bundle check > /dev/null 2>&1')
4
4
  Interaction.announce 'Bundling'
5
- Util.system! 'bundle install'
5
+ Util.run!('bundle install')
6
6
  end
7
7
  end
@@ -17,6 +17,6 @@ def capistrano(*args)
17
17
  command = "bundle exec cap #{stage} " + args.join(' ')
18
18
  Interaction.note_cmd command
19
19
 
20
- Util.system!(command, fail_message: 'Capistrano failed. Have a look!')
20
+ Util.run!(command, fail_message: 'Capistrano failed. Have a look!')
21
21
  end
22
22
  end
@@ -1,13 +1,20 @@
1
1
  desc 'chromedriver-update', 'Update the chromedriver'
2
-
3
2
  long_desc <<-LONGDESC
4
3
  Example: `geordi chromedriver_update`
5
4
 
6
- This command will find and install the matching chromedriver for the currently installed Chrome.
5
+ This command will find and install the matching chromedriver for the currently
6
+ installed Chrome.
7
+
8
+ Setting `auto_update_chromedriver` to `true` in your global Geordi config file
9
+ (`~/.config/geordi/global.yml`), will automatically update chromedriver before
10
+ cucumber tests, in case Chrome and chromedriver versions don't match
7
11
  LONGDESC
8
12
 
13
+ option :quiet_if_matching, type: :boolean, default: false,
14
+ desc: 'Suppress notification if chromedriver and chrome versions match'
15
+
9
16
  def chromedriver_update
10
17
  require 'geordi/chromedriver_updater'
11
18
 
12
- ChromedriverUpdater.new.run
19
+ ChromedriverUpdater.new.run(options)
13
20
  end
@@ -1,13 +1,9 @@
1
1
  desc 'commit', 'Commit using a story title from Pivotal Tracker'
2
-
3
2
  long_desc <<-LONGDESC
4
3
  Example: `geordi commit`
5
4
 
6
5
  Any extra arguments are forwarded to `git commit -m <message>`.
7
6
 
8
- If there are no staged changes, prints a warning but will continue to create
9
- an empty commit.
10
-
11
7
  On the first execution we ask for your Pivotal Tracker API token. It will be
12
8
  stored in `~/.config/geordi/global.yml`.
13
9
  LONGDESC
@@ -18,6 +14,5 @@ Unsupported Ruby Version #{RUBY_VERSION}. `geordi commit` requires Ruby 2.1+.
18
14
  TEXT
19
15
 
20
16
  require 'geordi/gitpt'
21
-
22
17
  Gitpt.new.run(git_args)
23
18
  end
@@ -1,30 +1,28 @@
1
1
  desc 'console [TARGET]', 'Open a Rails console locally or on a Capistrano deploy target'
2
2
  long_desc <<-LONGDESC
3
- Open a local Rails console: `geordi console`
3
+ Local (development): `geordi console`
4
4
 
5
- Open a Rails console on `staging`: `geordi console staging`
5
+ Remote: `geordi console staging`
6
6
 
7
- Lets you select the server to connect to from a menu when called with `--select-server` or the alias `-s`:
8
-
9
- geordi console staging -s
10
-
11
- If you already know the number of the server you want to connect to, just pass it along:
12
-
13
- geordi console staging -s2
7
+ Selecting the server: `geordi console staging -s` shows a menu with all available
8
+ servers. When passed a number, directly connects to the selected server.
14
9
  LONGDESC
15
10
 
16
-
17
- option :select_server, type: :string, aliases: '-s'
11
+ # This option is duplicated in shelll.rb
12
+ option :select_server, type: :string, aliases: '-s', banner: '[SERVER_NUMBER]',
13
+ desc: 'Select a server to connect to'
18
14
 
19
15
  def console(target = 'development', *_args)
20
16
  require 'geordi/remote'
17
+ invoke_geordi 'bundle_install'
21
18
 
22
19
  if target == 'development'
23
- invoke_cmd 'yarn_install'
20
+ invoke_geordi 'yarn_install'
24
21
 
25
22
  Interaction.announce 'Opening a local Rails console'
26
23
 
27
- Util.system! Util.console_command(target)
24
+ command = Util.console_command(target)
25
+ Util.run!(command)
28
26
  else
29
27
  Interaction.announce 'Opening a Rails console on ' + target
30
28
 
@@ -1,15 +1,17 @@
1
1
  desc 'create-databases', 'Create all databases', hide: true
2
2
  def create_databases
3
- invoke_cmd 'create_database_yml'
4
- invoke_cmd 'bundle_install'
3
+ invoke_geordi 'create_database_yml'
4
+ invoke_geordi 'bundle_install'
5
5
 
6
6
  Interaction.announce 'Creating databases'
7
7
 
8
8
  if File.exist?('config/database.yml')
9
- command = 'bundle exec rake db:create:all'
10
- command << ' parallel:create' if Util.file_containing?('Gemfile', /parallel_tests/)
9
+ command = []
10
+ command << Util.binstub_or_fallback('rake')
11
+ command << 'db:create:all'
12
+ command << 'parallel:create' if Util.file_containing?('Gemfile', /parallel_tests/)
11
13
 
12
- Util.system! command
14
+ Util.run!(command)
13
15
  else
14
16
  puts 'config/database.yml does not exist. Nothing to do.'
15
17
  end
@@ -2,26 +2,24 @@ desc 'cucumber [FILES and OPTIONS]', 'Run Cucumber features'
2
2
  long_desc <<-LONGDESC
3
3
  Example: `geordi cucumber features/authentication_feature:3`
4
4
 
5
- Runs Cucumber as you want: with `bundle exec`, using parallel tests, with
6
- a VNC session holding Selenium test browsers, support for using a dedicated
7
- testing firefox and beta support for rerunning failed scenarios.
5
+ Runs Cucumber with `bundle exec`, using parallel tests, with a VNC session
6
+ holding Selenium test browsers, support for using a dedicated testing browser
7
+ and beta support for re-running failed scenarios.
8
8
 
9
9
  - *@solo:* Generally, features are run in parallel. However, scenarios tagged
10
- with @solo are excluded and will be run sequentially, _after_ the parallel run.
10
+ with @solo are excluded from the parallel run and executed sequentially instead.
11
11
 
12
- - *Debugging:* Sometimes, the dot-printing Cucumber formatter does not show
13
- errors. In case a feature fails without a message, try running it with `--debug`
14
- or `-d`.
12
+ - *Debugging:* In some cases, the dot-printing Cucumber formatter swallows
13
+ errors. In case a feature fails without an error message, try running it with
14
+ `--debug` or `-d`.
15
15
 
16
16
  - *Options:* Any unknown option will be passed through to Cucumber,
17
- e.g. `--format pretty`.
17
+ e.g. `--format=pretty`. Make sure to connect option and value with an equals
18
+ sign, i.e. have each option a contiguous string.
18
19
 
19
20
  - *VNC:* By default, test browsers will run in a VNC session. When using a
20
- headless test browser anyway, you can disable VNC by putting the following
21
- config into `.geordi.yml` in the project root:
22
-
23
- use_vnc: false
24
-
21
+ headless test browser anyway, you can disable VNC by setting `use_vnc: false`
22
+ in `.geordi.yml` in the project root.
25
23
  LONGDESC
26
24
 
27
25
  option :modified, aliases: '-m', type: :boolean,
@@ -29,9 +27,9 @@ option :modified, aliases: '-m', type: :boolean,
29
27
  option :containing, aliases: '-c', banner: 'STRING',
30
28
  desc: 'Run all features that contain STRING'
31
29
  option :verbose, aliases: '-v', type: :boolean,
32
- desc: 'Print the testrun command'
30
+ desc: 'Show the test run command'
33
31
  option :debug, aliases: '-d', type: :boolean,
34
- desc: 'Run with `-f pretty -b` which helps hunting down bugs'
32
+ desc: 'Run Cucumber with `-f pretty -b`, which helps hunting down bugs'
35
33
  option :rerun, aliases: '-r', type: :numeric, default: 0,
36
34
  desc: 'Rerun features up to N times while failing'
37
35
 
@@ -39,7 +37,7 @@ def cucumber(*args)
39
37
  if args.empty?
40
38
  # This is not testable as there is no way to stub `git` :(
41
39
  if options.modified?
42
- modified_features = `git status --short`.split($INPUT_RECORD_SEPARATOR).map do |line|
40
+ modified_features = `git status --short`.split("\n").map do |line|
43
41
  indicators = line.slice!(0..2) # Remove leading indicators
44
42
  line if line.include?('.feature') && !indicators.include?('D')
45
43
  end.compact
@@ -47,7 +45,7 @@ def cucumber(*args)
47
45
  end
48
46
 
49
47
  if options.containing
50
- matching_features = `grep -lri '#{options.containing}' --include=*.feature features/`.split($INPUT_RECORD_SEPARATOR)
48
+ matching_features = `grep -lri '#{options.containing}' --include=*.feature features/`.split("\n")
51
49
  args = matching_features.uniq
52
50
  end
53
51
  end
@@ -55,8 +53,13 @@ def cucumber(*args)
55
53
  if File.directory?('features')
56
54
  require 'geordi/cucumber'
57
55
 
58
- invoke_cmd 'bundle_install'
59
- invoke_cmd 'yarn_install'
56
+ settings = Geordi::Settings.new
57
+
58
+ invoke_geordi 'bundle_install'
59
+ invoke_geordi 'yarn_install'
60
+ if settings.auto_update_chromedriver
61
+ invoke_geordi 'chromedriver_update', quiet_if_matching: true
62
+ end
60
63
 
61
64
  cmd_opts, files = args.partition { |f| f.start_with? '-' }
62
65
  cmd_opts << '--format' << 'pretty' << '--backtrace' if options.debug
@@ -7,7 +7,6 @@ no argument is given, two default directories are searched for dump files: the
7
7
  current working directory and `~/dumps` (for dumps created with geordi).
8
8
 
9
9
  Geordi will ask for confirmation before actually deleting files.
10
-
11
10
  LONGDESC
12
11
 
13
12
  def delete_dumps(dump_directory = nil)
@@ -5,18 +5,18 @@ Example: `geordi deploy` or `geordi deploy p[roduction]` or `geordi deploy --cur
5
5
  Merge, push and deploy with a single command! **It always tells what it will do
6
6
  before it does it.** There are different scenarios where this command is handy:
7
7
 
8
- 1) *Production deploy:* From the master branch, run `geordi deploy production`.
9
- This will merge `master` to `production`, push and deploy to production.
8
+ - *Production deploy:* From the master branch, run `geordi deploy production`.
9
+ This will merge `master` to `production`, push and deploy to production.
10
10
 
11
- 2) *Feature branch deploy:* From a feature branch, run `geordi deploy staging`.
12
- This will merge the feature branch to `master`, push and deploy to staging.
11
+ - *Feature branch deploy:* From a feature branch, run `geordi deploy staging`.
12
+ This will merge the feature branch to `master`, push and deploy to staging.
13
13
 
14
- To deploy a feature branch directly without merging, run
15
- `geordi deploy --current-branch`. This feature depends on the environment
16
- variable `DEPLOY_BRANCH` to be picked up in the respective deploy file.
14
+ To deploy a feature branch directly without merging, run
15
+ `geordi deploy --current-branch`. This feature depends on the environment
16
+ variable `DEPLOY_BRANCH` to be picked up in the respective deploy file.
17
17
 
18
- 3) *Simple deploy:* If the source branch matches the target branch, merging will
19
- be skipped.
18
+ - *Simple deploy:* If the source branch matches the target branch, merging will
19
+ be skipped.
20
20
 
21
21
  Calling the command without arguments will infer the target stage from the
22
22
  current branch and fall back to master/staging.
@@ -66,7 +66,7 @@ set :branch, ENV['DEPLOY_BRANCH'] || 'master'
66
66
  push_needed = false if Util.testing? # Hard to test
67
67
 
68
68
  Interaction.announce "Checking whether your #{source_branch} branch is ready" ############
69
- Util.system! "git checkout #{source_branch}"
69
+ Util.run!("git checkout #{source_branch}")
70
70
  if (`git status -s | wc -l`.strip != '0') && !Util.testing?
71
71
  Interaction.warn "Your #{source_branch} branch holds uncommitted changes."
72
72
  Interaction.prompt('Continue anyway?', 'n', /y|yes/) || raise('Cancelled.')
@@ -76,14 +76,14 @@ set :branch, ENV['DEPLOY_BRANCH'] || 'master'
76
76
 
77
77
  if merge_needed
78
78
  Interaction.announce "Checking what's in your #{target_branch} branch right now" #######
79
- Util.system! "git checkout #{target_branch} && git pull"
79
+ Util.run!("git checkout #{target_branch} && git pull")
80
80
  end
81
81
 
82
82
  Interaction.announce 'You are about to:' #################################################
83
83
  Interaction.note "Merge branch #{source_branch} into #{target_branch}" if merge_needed
84
84
  if push_needed
85
85
  Interaction.note 'Push these commits:' if push_needed
86
- Util.system! "git --no-pager log origin/#{target_branch}..#{source_branch} --oneline"
86
+ Util.run!("git --no-pager log origin/#{target_branch}..#{source_branch} --oneline")
87
87
  end
88
88
  Interaction.note "Deploy to #{target_stage}"
89
89
  Interaction.note "From current branch #{source_branch}" if options.current_branch
@@ -94,22 +94,22 @@ set :branch, ENV['DEPLOY_BRANCH'] || 'master'
94
94
  git_call << "git merge #{source_branch}" if merge_needed
95
95
  git_call << 'git push' if push_needed
96
96
 
97
+ invoke_geordi 'bundle_install'
98
+
97
99
  capistrano_call = "cap #{target_stage} deploy"
98
100
  capistrano_call << ':migrations' unless Util.gem_major_version('capistrano') == 3 || options.no_migrations
99
101
  capistrano_call = "bundle exec #{capistrano_call}" if Util.file_containing?('Gemfile', /capistrano/)
100
102
  capistrano_call = "DEPLOY_BRANCH=#{source_branch} #{capistrano_call}" if options.current_branch
101
103
 
102
104
  if git_call.any?
103
- Util.system! git_call.join(' && '), show_cmd: true
105
+ Util.run!(git_call.join(' && '), show_cmd: true)
104
106
  end
105
107
 
106
- invoke_cmd 'bundle_install'
107
-
108
- Util.system! capistrano_call, show_cmd: true
108
+ Util.run!(capistrano_call, show_cmd: true)
109
109
 
110
110
  Interaction.success 'Deployment complete.'
111
111
  else
112
- Util.system! "git checkout #{source_branch}"
112
+ Util.run!("git checkout #{source_branch}")
113
113
  Interaction.fail 'Deployment cancelled.'
114
114
  end
115
115
  end