geordi 0.18.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +13 -5
  2. data/.ruby-version +1 -0
  3. data/README.md +199 -110
  4. data/Rakefile +40 -0
  5. data/bin/apache-site +1 -19
  6. data/bin/cap-all +1 -27
  7. data/bin/cleanup-directory +1 -11
  8. data/bin/console-for +1 -12
  9. data/bin/cuc +1 -2
  10. data/bin/cuc-show +1 -2
  11. data/bin/cuc-vnc-setup +1 -114
  12. data/bin/deploy-to-production +1 -91
  13. data/bin/dump-for +4 -32
  14. data/bin/dumple +2 -4
  15. data/bin/geordi +10 -0
  16. data/bin/gitpt +1 -2
  17. data/bin/launchy_browser +9 -3
  18. data/bin/load-dump +1 -4
  19. data/bin/migrate-all +1 -13
  20. data/bin/optimize-png +1 -118
  21. data/bin/power-rake +1 -7
  22. data/bin/remove-executable-flags +1 -6
  23. data/bin/rs +1 -26
  24. data/bin/run_tests +1 -2
  25. data/bin/setup-firefox-for-selenium +1 -3
  26. data/bin/shell-for +1 -8
  27. data/bin/tests +1 -5
  28. data/geordi.gemspec +19 -0
  29. data/lib/geordi/COMMAND_TEMPLATE +29 -0
  30. data/lib/geordi/capistrano.rb +9 -7
  31. data/lib/geordi/capistrano_config.rb +66 -0
  32. data/lib/geordi/cli.rb +28 -0
  33. data/lib/geordi/commands/all_targets.rb +26 -0
  34. data/lib/geordi/commands/apache_site.rb +22 -0
  35. data/lib/geordi/commands/bundle_install.rb +7 -0
  36. data/lib/geordi/commands/cleanup_directory.rb +16 -0
  37. data/lib/geordi/commands/commit.rb +171 -0
  38. data/lib/geordi/commands/console.rb +24 -0
  39. data/lib/geordi/commands/create_database_yml.rb +18 -0
  40. data/lib/geordi/commands/create_databases.rb +16 -0
  41. data/lib/geordi/commands/cucumber.rb +20 -0
  42. data/lib/geordi/commands/deploy.rb +65 -0
  43. data/lib/geordi/commands/devserver.rb +14 -0
  44. data/lib/geordi/commands/dump.rb +63 -0
  45. data/lib/geordi/commands/migrate.rb +26 -0
  46. data/lib/geordi/commands/png_optimize.rb +92 -0
  47. data/lib/geordi/commands/rake.rb +21 -0
  48. data/lib/geordi/commands/remove_executable_flags.rb +14 -0
  49. data/lib/geordi/commands/rspec.rb +40 -0
  50. data/lib/geordi/commands/security_update.rb +56 -0
  51. data/lib/geordi/commands/setup.rb +33 -0
  52. data/lib/geordi/commands/setup_firefox_for_selenium.rb +6 -0
  53. data/lib/geordi/commands/setup_vnc.rb +84 -0
  54. data/lib/geordi/commands/shell.rb +20 -0
  55. data/lib/geordi/commands/test.rb +9 -0
  56. data/lib/geordi/commands/unit.rb +11 -0
  57. data/lib/geordi/commands/update.rb +33 -0
  58. data/lib/geordi/commands/version.rb +7 -0
  59. data/lib/geordi/commands/vnc_show.rb +6 -0
  60. data/lib/geordi/commands/with_firefox_for_selenium.rb +18 -0
  61. data/lib/geordi/commands/with_rake.rb +11 -0
  62. data/lib/geordi/{cuc.rb → cucumber.rb} +28 -39
  63. data/lib/geordi/dump_loader.rb +44 -70
  64. data/lib/geordi/firefox_for_selenium.rb +93 -74
  65. data/lib/geordi/interaction.rb +47 -0
  66. data/lib/geordi/remote.rb +66 -0
  67. data/lib/geordi/util.rb +60 -0
  68. data/lib/geordi/version.rb +1 -1
  69. data/lib/geordi.rb +1 -0
  70. metadata +50 -16
  71. data/bin/install-gems-remotely +0 -18
  72. data/bin/install-gems-remotely.sh +0 -16
  73. data/bin/power-deploy +0 -18
  74. data/bin/remotify-local-branch +0 -12
  75. data/lib/geordi/gitpt.rb +0 -175
data/bin/cuc-vnc-setup CHANGED
@@ -1,116 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- class String
4
- # colorization
5
- def colorize(color_code)
6
- "\e[#{color_code}m#{self}\e[0m"
7
- end
8
-
9
- def red
10
- colorize(31)
11
- end
12
-
13
- def green
14
- colorize(32)
15
- end
16
-
17
- def yellow
18
- colorize(33)
19
- end
20
- end
21
-
22
- def pause
23
- puts
24
- puts "[ENTER] to continue".yellow
25
- gets
26
- puts
27
- end
28
-
29
- def say(text)
30
- text =~ /^( *)./
31
- level = $1 ? $1.size : 0
32
- text.gsub!(/^ {#{level}}/, '')
33
- puts text
34
- end
35
-
36
- def installed?(app)
37
- `which #{app}`
38
- $?.success?
39
- end
40
-
41
-
42
- `clear`
43
-
44
- say <<-TEXT
45
-
46
- This script will help you install a VNC server and a VNC viewer.
47
-
48
- With those you will be able to use #{"cuc".green} without being disturbed by
49
- focus-stealing selenium windows.
50
-
51
- All windows will insteads open inside a VNC session. You can still inspect
52
- everything by using the #{"cuc-show".green} command.
53
- TEXT
54
- pause
55
-
56
- say <<-TEXT
57
- #{"Please open a second shell to execute any commands.".red}
58
- TEXT
59
- pause
60
-
61
- if installed?("vncserver")
62
- say <<-TEXT
63
- It appears #{"you already have a VNC server installed".green}. Good job.
64
- TEXT
65
- pause
66
- else
67
- say <<-TEXT
68
- We are going to install and configure a VNC server.
69
-
70
- Please run:
71
- #{"sudo apt-get install vnc4server".red}
72
- TEXT
73
- pause
74
-
75
- say <<-TEXT
76
- We will now set a password for your VNC server. #{"Please choose a secure password.".red}
77
-
78
- When running the #{"cuc".green} script, you will not actually need this password,
79
- and there is no security risk. However if you start a vncserver without
80
- #{"cuc".green}, a user with this password can connect to your machine.
81
-
82
- Please run:
83
- #{"vncserver :20".red}
84
- #{"and enter a password".red}
85
- TEXT
86
- pause
87
-
88
- say <<-TEXT
89
- We will now stop the server again.
90
-
91
- Please run:
92
- #{"vncserver -kill :20".red}
93
- TEXT
94
- pause
95
- end
96
-
97
- if installed?("vncviewer")
98
- say <<-TEXT
99
- It appears #{"you already have a VNC viewer installed".green}. Good job.
100
- TEXT
101
- pause
102
- else
103
- say <<-TEXT
104
- We are going to install and configure a VNC viewer.
105
-
106
- Please run:
107
- #{"sudo apt-get install xtightvncviewer".red}
108
- TEXT
109
- pause
110
- end
111
-
112
- say <<-TEXT
113
- All done. #{"cuc".green} will automatically use this from now on.
114
-
115
- #{"Happy cuking!".green}
116
- TEXT
3
+ exec 'geordi', 'setup-vnc'
@@ -1,93 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- def color_code(color_name, background_color_name = nil)
4
- colors = %w[ black red green yellow blue pink cyan white ].map(&:to_sym)
5
- color = 30 + colors.index(color_name)
6
- if background_code = colors.index(background_color_name)
7
- background = 40 + background_code
8
- bold = 1
9
- end
10
- [ bold, color, background ].compact.join ';'
11
- end
12
-
13
- def colorize(text, color_name, background_color_name = nil)
14
- color_code = color_code(color_name, background_color_name)
15
- "\e[#{color_code}m#{text}\e[0m"
16
- end
17
-
18
- def header(text)
19
- puts colorize(text, :yellow, :blue), ''
20
- end
21
-
22
- def call_or_fail(command, return_output = false)
23
- puts colorize(command, :pink), ''
24
- if return_output
25
- result = `#{command}`.to_s.strip
26
- $?.success? or raise "Error while calling #{command}: #{$?}"
27
- else
28
- result = system(command) or raise "Error while calling #{command}: #{$?}"
29
- puts
30
- end
31
- result
32
- end
33
-
34
- def prompt(message, default)
35
- print "#{message}"
36
- print " [#{default}]" if default
37
- print ": "
38
- input = gets.strip
39
- if input.empty? && default
40
- input = default
41
- end
42
- puts
43
- input
44
- end
45
-
46
- def success(message)
47
- puts colorize(message, :green), ''
48
- exit 0
49
- end
50
-
51
- def error(message)
52
- puts colorize(message, :red), ''
53
- exit 1
54
- end
55
-
56
- puts
57
-
58
- ENV['PAGER'] = 'cat'
59
-
60
- master_branch = prompt('master branch', 'master')
61
- production_branch = prompt('production branch', 'production')
62
- production_stage = prompt('production capistrano stage', 'production')
63
-
64
- header("Checking if your #{master_branch} is up to date")
65
-
66
- diff_size = call_or_fail("git fetch && git diff #{master_branch} origin/#{master_branch} | wc -l", true)
67
- changes_size = call_or_fail("git status -s | wc -l", true)
68
-
69
- if diff_size == '0' and changes_size == '0'
70
- puts "All good.", ''
71
- else
72
- error "Your #{master_branch} is not the same as on origin or holds uncommitted changes. Fix that first."
73
- end
74
-
75
- header("Checking what's on #{production_stage} right now...")
76
-
77
- call_or_fail("git checkout #{production_branch} && git pull")
78
-
79
- header("You are about to deploy the following commits from #{master_branch} to #{production_branch}:")
80
-
81
- call_or_fail("git log #{production_branch}..#{master_branch} --oneline")
82
-
83
- if prompt("Go ahead with the deployment? (y/n)", "n").downcase == 'y'
84
- capistrano_call = "cap #{production_stage} deploy:migrations"
85
- if File.exists?('Gemfile') && File.open('Gemfile').read.scan(/capistrano/).any?
86
- capistrano_call = "bundle exec #{capistrano_call}"
87
- end
88
- call_or_fail("git merge #{master_branch} && git push && #{capistrano_call}")
89
- success 'Deployment complete.'
90
- else
91
- error 'Deployment cancelled.'
92
- end
93
-
3
+ exec 'geordi', 'deploy'
data/bin/dump-for CHANGED
@@ -1,35 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
- require File.dirname(__FILE__) + "/../lib/geordi/capistrano"
3
- require File.dirname(__FILE__) + "/../lib/geordi/dump_loader"
4
- include Geordi::Capistrano
5
2
 
6
- catching_errors do
7
- self.stage = ARGV.shift
8
-
9
- success = shell_for("dumple #{config.env} --for_download", :exec => false)
10
-
11
- if success
12
- source_path = "~/dumps/dump_for_download.dump"
13
- destination_directory = "#{config.root}/tmp"
14
- system "mkdir -p #{destination_directory}" # Ensure the destination directory exists
15
- destination_path = "#{destination_directory}/#{stage}.dump"
16
-
17
- puts "Downloading dump_for_download ..."
18
- system "scp #{config.user}@#{config.primary_server}:#{source_path} #{destination_path}"
19
- puts "Dumped the #{stage.upcase} database to RAILS_ROOT/tmp/#{stage}.dump"
20
-
21
- # source dump if option was given
22
- if ARGV.include?("-s")
23
- puts
24
- puts "Sourcing dump into development database..."
25
- success = DumpLoader.new([destination_path]).execute
26
- if success
27
- puts "Your database is now sourced with a fresh #{stage} dump."
28
- else
29
- $stderr.puts "Could not source the downloaded #{stage} dump."
30
- end
31
- end
32
- else
33
- raise "An error occurred. Aborting..."
34
- end
3
+ if (i = ARGV.index '-s')
4
+ ARGV[i] = '-l'
35
5
  end
6
+
7
+ exec 'geordi', 'dump', *ARGV
data/bin/dumple CHANGED
@@ -60,8 +60,7 @@ begin
60
60
  dump_path = "#{dump_dir}/#{config['database']}_#{Time.now.strftime("%Y%m%d_%H%M%S")}.dump"
61
61
  end
62
62
 
63
- puts
64
- puts "Dumping database for \"#{environment}\" environment ..."
63
+ puts "> Dumping database for \"#{environment}\" environment ..."
65
64
 
66
65
  host = config['host'] || 'localhost'
67
66
 
@@ -78,8 +77,7 @@ begin
78
77
 
79
78
  dump_size_kb = (File.size(dump_path) / 1024).round
80
79
 
81
- puts "Dumped to #{dump_path} (#{dump_size_kb} KB)"
82
- puts
80
+ puts "> Dumped to #{dump_path} (#{dump_size_kb} KB)"
83
81
  rescue Exception => e
84
82
  $stderr.puts e.message
85
83
  exit 1
data/bin/geordi ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'geordi/util'
4
+
5
+ Geordi::Util.installing_missing_gems do
6
+ require 'geordi'
7
+ require 'thor'
8
+
9
+ Geordi::CLI.start
10
+ end
data/bin/gitpt CHANGED
@@ -1,4 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
- require File.join(File.dirname(__FILE__), '../lib/geordi/gitpt')
3
2
 
4
- Geordi::Gitpt.new.run
3
+ exec 'geordi', 'commit'
data/bin/launchy_browser CHANGED
@@ -1,9 +1,15 @@
1
1
  #!/usr/bin/env ruby
2
- require File.join(File.dirname(__FILE__), '../lib/geordi/cuc')
3
2
 
4
- require 'rubygems'
5
- require 'launchy'
3
+ # This script is a part of Geordi. It is used by the cucumber command to have
4
+ # launchy open error pages from tests in the users browser, as apposed to
5
+ # opening it within VNC.
6
6
 
7
+ # For unknown reasons, #require cannot find 'geordi/cucumber', so we need to
8
+ # require it this way. Hours have been spent trying to require 'geordi/cucumber'.
9
+ require File.expand_path('../../lib/geordi/cucumber', __FILE__)
7
10
  Geordi::Cucumber.new.restore_env
8
11
 
12
+ require 'rubygems'
13
+ require 'launchy'
14
+
9
15
  Launchy.open(ARGV.first)
data/bin/load-dump CHANGED
@@ -1,6 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require File.dirname(__FILE__) + "/../lib/geordi/dump_loader"
4
-
5
-
6
- DumpLoader.new(ARGV).execute!
3
+ exec 'geordi', 'dump', '-l', *ARGV
data/bin/migrate-all CHANGED
@@ -1,15 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # Check if parallel_tests is available
4
- parallel_tests_available = ['rake', 'parallel:spec'] if File.exists?('Gemfile') && File.open('Gemfile').read.scan(/parallel_tests/).any?
5
-
6
- command = if parallel_tests_available
7
- 'b rake db:migrate parallel:prepare'
8
- else
9
- 'power-rake db:migrate'
10
- end
11
-
12
- 4.times { puts }
13
- puts "Running command:\n#{command}"
14
- puts "============================================"
15
- exec command
3
+ exec 'geordi', 'migrate'
data/bin/optimize-png CHANGED
@@ -1,120 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
- require 'fileutils'
3
-
4
- # pngcrush -rem allb -reduce -brute original.png optimized.png
5
- # pngcrush -d target-dir/ *.png
6
- #
7
- # -rem allb — remove all extraneous data (Except transparency and gamma; to remove everything except transparency, try -rem alla)
8
- # -reduce — eliminate unused colors and reduce bit-depth (If possible)
9
- #
10
- # -brute — attempt all optimization methods (Requires MUCH MORE processing time and may not improve optimization by much)
11
- #
12
- # original.png — the name of the original (unoptimized) PNG file
13
- # optimized.png — the name of the new, optimized PNG file
14
- # -d target-dir/ — bulk convert into this directory "target-dir"
15
- #
16
- # -rem cHRM -rem sRGB -rem gAMA -rem ICC — remove color profiles by name (shortcut -rem alla)
17
- #
18
- # An article explaining why removing gamma correction
19
- # http://hsivonen.iki.fi/png-gamma/
20
-
21
- # Rails: file activesupport/lib/active_support/core_ext/string/starts_ends_with.rb, line 27
22
- def ends_with?(string, suffix)
23
- string[-suffix.length, suffix.length] == suffix
24
- end
25
-
26
- def indented_puts(str="")
27
- puts " #{str}"
28
- end
29
-
30
- def print_manual
31
- script_name = "optimize-png"
32
-
33
- indented_puts
34
- indented_puts script_name
35
- indented_puts "=" *script_name.size
36
- indented_puts "- Removes color profiles: cHRM, sRGB, gAMA, ICC, etc."
37
- indented_puts "- Eliminates unused colors and reduce bit-depth (If possible)"
38
- indented_puts "- May reduce PNG file size lossless"
39
- indented_puts
40
- indented_puts "Batch-optimize all *.png in a directory:"
41
- indented_puts " #{script_name} directory"
42
- indented_puts
43
- indented_puts "Batch-optimize the current directory:"
44
- indented_puts " #{script_name} ."
45
- indented_puts
46
- indented_puts "Optimize single file:"
47
- indented_puts " #{script_name} input.png"
48
- indented_puts
49
- end
50
-
51
- def optimization_default_args
52
- args = ""
53
- args << "-rem alla " # remove everything except transparency
54
- args << "-rem text " # remove text chunks
55
- args << "-reduce " # eliminate unused colors and reduce bit-depth (If possible)
56
- args
57
- end
58
-
59
- def optimize_file(input_file, output_file)
60
- system "pngcrush #{optimization_default_args} '#{input_file}' '#{output_file}'"
61
- end
62
-
63
- def unused_tempfile_path(original)
64
- dirname = File.dirname(original)
65
- basename = File.basename(original)
66
- count = 0
67
- begin
68
- tmp_name = "#{dirname}/#{basename}_temp_#{count += 1}.png"
69
- end while File.exists?(tmp_name)
70
- tmp_name
71
- end
72
-
73
- def optimize_inplace(input_file)
74
- temp_file = unused_tempfile_path(input_file)
75
- result = optimize_file(input_file, temp_file)
76
- if result.nil?
77
- puts "Error was #{$?}"
78
- else
79
- FileUtils.rm(input_file)
80
- FileUtils.mv("#{temp_file}", "#{input_file}")
81
- end
82
- end
83
-
84
- def batch_optimize_inplace(path)
85
- # Dir[".png"] works case sensitive, so to catch all funky .png extensions we have to go the following way:
86
- png_relative_paths = []
87
- Dir["#{path}/*.*"].each do |file_name|
88
- png_relative_paths << file_name if ends_with?(File.basename(file_name.downcase), ".png")
89
- end
90
- png_relative_paths.each do |png_relative_path|
91
- optimize_inplace(png_relative_path)
92
- end
93
- end
94
-
95
- def main
96
- if `which pngcrush`.strip == ""
97
- indented_puts
98
- indented_puts "You have to install pngcrush first: sudo apt-get install pngcrush"
99
- indented_puts
100
- elsif ARGV.size == 1
101
- path = ARGV[0]
102
- if File.directory?(path)
103
- batch_optimize_inplace(path)
104
- elsif File.file?(path)
105
- optimize_inplace(path)
106
- else
107
- print_manual
108
- indented_puts "*** Error: '#{path}' is neither a directory nor a file ***"
109
- indented_puts
110
- end
111
- else
112
- print_manual
113
- end
114
- end
115
-
116
- main()
117
-
118
-
119
-
120
2
 
3
+ exec 'geordi', 'png-optimize', *ARGV
data/bin/power-rake CHANGED
@@ -1,9 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- for env in %w[development test cucumber performance]
4
- if File.exists? "config/environments/#{env}.rb"
5
- call = ['b', 'rake'] + ARGV + ["RAILS_ENV=#{env}"]
6
- puts call.join(' ')
7
- system *call
8
- end
9
- end
3
+ exec 'geordi', 'rake', *ARGV
@@ -1,8 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- puts "Removing executable-flags:"
4
- for pattern in %w[ *.rb *.html *.erb *.haml *.yml *.css *.sass *.rake *.png *.jpg *.gif *.pdf *.txt *.rdoc Rakefile VERSION README Capfile ]
5
- puts "- #{pattern}"
6
- `find . -name "#{pattern}" -exec chmod -x {} ';'`
7
- end
8
- puts "Done."
3
+ exec 'geordi', 'remove-executable-flags'
data/bin/rs CHANGED
@@ -1,28 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # Print some whitespace
4
- 4.times { puts }
5
- puts "Running RSpec tests..."
6
- puts "======================"
7
-
8
- # Check if we're looking at a Rails 2 / rspec 1 project
9
- rspec1 = File.exists?('script/spec')
10
- rspec_args = rspec1 ? ["spec", "-c"] : ["rspec"]
11
-
12
- # Check if rspec_spinner is available
13
- spinner_available = File.exists?('Gemfile') && File.open('Gemfile').read.scan(/rspec_spinner/).any?
14
- spinner_args = spinner_available ? ['-r', 'rspec_spinner', '-f', 'RspecSpinner::Bar'] : []
15
-
16
- # Check if parallel_tests is available
17
- parallel_tests_available = ['rake', 'parallel:spec'] if File.exists?('Gemfile') && File.open('Gemfile').read.scan(/parallel_tests/).any?
18
-
19
- use_parallel_tests = parallel_tests_available && (ARGV[0] == nil)
20
-
21
- if use_parallel_tests
22
- puts "Using parallel_tests ...\n\n"
23
- exec 'b rake parallel:spec'
24
- else
25
- # Run rspec behind bundler
26
- ARGV[0] ||= 'spec'
27
- exec *["b", rspec_args, spinner_args, ARGV].flatten
28
- end
3
+ exec 'geordi', 'rspec', *ARGV
data/bin/run_tests CHANGED
@@ -1,4 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
- require File.join(File.dirname(__FILE__), '../lib/geordi/run_tests')
3
2
 
4
- Geordi::RunTests.new.run
3
+ exec 'geordi', 'with-firefox-for-selenium', *ARGV
@@ -1,5 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
- require File.dirname(__FILE__) + "/../lib/geordi/firefox_for_selenium"
3
- require 'tempfile'
4
2
 
5
- Geordi::FirefoxForSelenium.install
3
+ exec 'geordi', 'setup-firefox-for-selenium'
data/bin/shell-for CHANGED
@@ -1,10 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
- require File.dirname(__FILE__) + "/../lib/geordi/capistrano"
3
- include Geordi::Capistrano
4
2
 
5
- catching_errors do
6
- self.stage = ARGV.shift
7
- command = ARGV.any? ? ARGV.join(' ') : nil
8
-
9
- shell_for(command, :select_server => true)
10
- end
3
+ exec 'geordi', 'shell', *ARGV
data/bin/tests CHANGED
@@ -1,7 +1,3 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # Delete any state from previous Cucumber failures
4
- File.delete 'rerun.txt' if File.exists? 'rerun.txt'
5
-
6
- # Run rspec and cucumber
7
- exec "rs && cuc"
3
+ exec 'geordi', 'test'
data/geordi.gemspec CHANGED
@@ -19,4 +19,23 @@ Gem::Specification.new do |s|
19
19
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
20
20
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
21
21
  s.require_paths = ["lib"]
22
+
23
+ # s.add_development_dependency 'debugger'
24
+
25
+ s.post_install_message = <<-ATTENTION
26
+
27
+ ********************************************
28
+
29
+ geordi 1.0.0 moves most of the scripts to
30
+ the `geordi` binary. Run `geordi` and
31
+ `geordi help <cmd>` for further information.
32
+
33
+ Tip: Create an alias for geordi for quick
34
+ access. Add this to your ~/.bashrc:
35
+
36
+ alias g="geordi"
37
+
38
+ ********************************************
39
+
40
+ ATTENTION
22
41
  end
@@ -0,0 +1,29 @@
1
+ # This file serves as a template for adding new commands.
2
+ # For more inspiration, see already implemented commands.
3
+
4
+ # Since commands can be invoked by only typing their first letters, please try
5
+ # to find a command name that has a unique prefix.
6
+
7
+ desc 'command ARG [OPTIONAL]', 'one-line description'
8
+ long_desc <<-LONGDESC # optional
9
+ Start with an example: `command bla bla`
10
+
11
+ Detailed description with anything the user needs to know.
12
+
13
+ Short and long description are printed on the console AND included in the README
14
+ by `rake update_readme`. Thus, please format descriptions in a way that's reader
15
+ friendly both in Markdown and the console.
16
+ LONGDESC
17
+
18
+ option :opt, :type => :boolean, :aliases => '-o', :banner => 'VALUE_NAME',
19
+ :desc => 'If set, VALUE_NAME will be used for something'
20
+
21
+ def setup
22
+ # Invoke other commands like this:
23
+ invoke_cmd 'other_command', 'argument', :an => 'option'
24
+
25
+ fail 'Option missing' unless options.opt?
26
+
27
+ # For formatted output, see geordi/interaction.rb
28
+ success 'Done.'
29
+ end
@@ -16,7 +16,7 @@ module Geordi
16
16
  @root = find_project_root!
17
17
  load_capistrano_config
18
18
  end
19
-
19
+
20
20
  def user
21
21
  @capistrano_config.fetch(:user)
22
22
  end
@@ -24,7 +24,7 @@ module Geordi
24
24
  def servers
25
25
  @capistrano_config.find_servers(:roles => [:app])
26
26
  end
27
-
27
+
28
28
  def primary_server
29
29
  @capistrano_config.find_servers(:roles => [:app], :only => { :primary => true }).first
30
30
  end
@@ -40,7 +40,7 @@ module Geordi
40
40
  def shell
41
41
  @capistrano_config.fetch(:default_shell, 'bash --login')
42
42
  end
43
-
43
+
44
44
 
45
45
  private
46
46
 
@@ -49,7 +49,9 @@ module Geordi
49
49
  config.load('deploy')
50
50
  config.load('config/deploy')
51
51
  if @stage and @stage != ''
52
+ puts ::Capistrano::Version.to_s
52
53
  config.stage = @stage
54
+
53
55
  config.find_and_execute_task(stage)
54
56
  end
55
57
 
@@ -83,7 +85,7 @@ module Geordi
83
85
  exit 1
84
86
  end
85
87
  end
86
-
88
+
87
89
  def select_server
88
90
  choose do |menu|
89
91
  config.servers.each do |server|
@@ -99,11 +101,11 @@ module Geordi
99
101
 
100
102
  def shell_for(command, options = {})
101
103
  server = options[:select_server] ? select_server : config.primary_server
102
-
104
+
103
105
  remote_commands = [ 'cd', config.path ]
104
106
  remote_commands << '&&' << config.shell
105
107
  remote_commands << "-c '#{command}'" if command
106
-
108
+
107
109
  args = [ 'ssh', %(#{config.user}@#{server}), '-t', remote_commands.join(' ') ]
108
110
  if options.fetch(:exec, true)
109
111
  exec(*args)
@@ -111,6 +113,6 @@ module Geordi
111
113
  system(*args)
112
114
  end
113
115
  end
114
-
116
+
115
117
  end
116
118
  end