mina-traackr 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +10 -0
- data/.rspec +1 -0
- data/.travis.yml +12 -0
- data/CONTRIBUTING.md +124 -0
- data/Gemfile +10 -0
- data/HISTORY.md +304 -0
- data/LICENSE +23 -0
- data/Makefile +29 -0
- data/Notes.md +72 -0
- data/Rakefile +20 -0
- data/Readme.md +1009 -0
- data/bin/mina +65 -0
- data/data/deploy.rb +74 -0
- data/data/deploy.sh.erb +120 -0
- data/lib/mina.rb +23 -0
- data/lib/mina/bundler.rb +44 -0
- data/lib/mina/chruby.rb +49 -0
- data/lib/mina/default.rb +144 -0
- data/lib/mina/deploy.rb +138 -0
- data/lib/mina/deploy_helpers.rb +34 -0
- data/lib/mina/exec_helpers.rb +104 -0
- data/lib/mina/foreman.rb +78 -0
- data/lib/mina/git.rb +62 -0
- data/lib/mina/helpers.rb +383 -0
- data/lib/mina/output_helpers.rb +92 -0
- data/lib/mina/rails.rb +206 -0
- data/lib/mina/rake.rb +9 -0
- data/lib/mina/rbenv.rb +47 -0
- data/lib/mina/rvm.rb +88 -0
- data/lib/mina/settings.rb +32 -0
- data/lib/mina/ssh_helpers.rb +122 -0
- data/lib/mina/tools.rb +20 -0
- data/lib/mina/version.rb +5 -0
- data/lib/mina/whenever.rb +27 -0
- data/manual/index.md +15 -0
- data/manual/modules.md +2 -0
- data/mina.gemspec +17 -0
- data/spec/command_helper.rb +52 -0
- data/spec/commands/cleanup_spec.rb +16 -0
- data/spec/commands/command_spec.rb +71 -0
- data/spec/commands/custom_config_spec.rb +20 -0
- data/spec/commands/deploy_spec.rb +40 -0
- data/spec/commands/outside_project_spec.rb +35 -0
- data/spec/commands/real_deploy_spec.rb +54 -0
- data/spec/commands/ssh_spec.rb +14 -0
- data/spec/commands/verbose_spec.rb +21 -0
- data/spec/dsl/invoke_spec.rb +33 -0
- data/spec/dsl/queue_spec.rb +49 -0
- data/spec/dsl/settings_in_rake_spec.rb +39 -0
- data/spec/dsl/settings_spec.rb +55 -0
- data/spec/dsl/to_spec.rb +20 -0
- data/spec/fixtures/custom_file_env/custom_deploy.rb +15 -0
- data/spec/fixtures/empty_env/config/deploy.rb +15 -0
- data/spec/helpers/output_helper_spec.rb +38 -0
- data/spec/spec_helper.rb +21 -0
- data/support/Readme-footer.md +32 -0
- data/support/Readme-header.md +17 -0
- data/support/guide.md +297 -0
- data/support/index.html +53 -0
- data/support/to_md.rb +11 -0
- data/test_env/config/deploy.rb +72 -0
- metadata +157 -0
data/bin/mina
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
$:.unshift File.expand_path('../../lib', __FILE__)
|
3
|
+
|
4
|
+
require 'rubygems' unless Object.const_defined?(:Gem)
|
5
|
+
require 'mina'
|
6
|
+
require 'rake'
|
7
|
+
|
8
|
+
# Intercept: if invoked as 'mina --help', don't let it pass through Rake, or else
|
9
|
+
# we'll see the Rake help screen. Redirect it to 'mina help'.
|
10
|
+
if ARGV.delete('--help') || ARGV.delete('-h')
|
11
|
+
ARGV << 'help'
|
12
|
+
end
|
13
|
+
|
14
|
+
if ARGV.delete('--version') || ARGV.delete('-V')
|
15
|
+
puts "Mina, version v#{Mina.version}"
|
16
|
+
exit
|
17
|
+
end
|
18
|
+
|
19
|
+
if ARGV.delete('--simulate') || ARGV.delete('-S')
|
20
|
+
ENV['simulate'] = '1'
|
21
|
+
end
|
22
|
+
|
23
|
+
scope = self
|
24
|
+
|
25
|
+
Rake.application.instance_eval do
|
26
|
+
standard_exception_handling do
|
27
|
+
begin
|
28
|
+
# Initialize Rake and make it think it's Mina.
|
29
|
+
init 'mina'
|
30
|
+
|
31
|
+
# (The only way @rakefiles has only 1 value is if -f is specified.)
|
32
|
+
custom_rakefile = (@rakefiles.size == 1)
|
33
|
+
@rakefiles = ['Minafile', 'config/deploy.rb'] unless custom_rakefile
|
34
|
+
|
35
|
+
# Workaround: Rake 0.9+ doesn't record task descriptions unless it's needed.
|
36
|
+
# Need it for 'mina help'
|
37
|
+
if Rake::TaskManager.respond_to?(:record_task_metadata)
|
38
|
+
Rake::TaskManager.record_task_metadata = true
|
39
|
+
end
|
40
|
+
|
41
|
+
# Load the Mina Rake DSL.
|
42
|
+
require 'mina/rake'
|
43
|
+
|
44
|
+
# Allow running without a Rakefile
|
45
|
+
begin
|
46
|
+
load_rakefile if have_rakefile || custom_rakefile
|
47
|
+
rescue Exception
|
48
|
+
puts "Error loading Rakefile!"
|
49
|
+
raise "There may be a problem with config/deploy.rb and/or Rakefile"
|
50
|
+
end
|
51
|
+
|
52
|
+
# Run tasks
|
53
|
+
top_level
|
54
|
+
|
55
|
+
scope.mina_cleanup! if top_level_tasks.any?
|
56
|
+
|
57
|
+
rescue Mina::Failed => e
|
58
|
+
puts ""
|
59
|
+
scope.print_error "Command failed."
|
60
|
+
scope.print_stderr "#{e.message}"
|
61
|
+
exit e.exitstatus
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
data/data/deploy.rb
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'mina/bundler'
|
2
|
+
require 'mina/rails'
|
3
|
+
require 'mina/git'
|
4
|
+
# require 'mina/rbenv' # for rbenv support. (http://rbenv.org)
|
5
|
+
# require 'mina/rvm' # for rvm support. (http://rvm.io)
|
6
|
+
|
7
|
+
# Basic settings:
|
8
|
+
# domain - The hostname to SSH to.
|
9
|
+
# deploy_to - Path to deploy into.
|
10
|
+
# repository - Git repo to clone from. (needed by mina/git)
|
11
|
+
# branch - Branch name to deploy. (needed by mina/git)
|
12
|
+
|
13
|
+
set :domain, 'foobar.com'
|
14
|
+
set :deploy_to, '/var/www/foobar.com'
|
15
|
+
set :repository, 'git://...'
|
16
|
+
set :branch, 'master'
|
17
|
+
|
18
|
+
# Manually create these paths in shared/ (eg: shared/config/database.yml) in your server.
|
19
|
+
# They will be linked in the 'deploy:link_shared_paths' step.
|
20
|
+
set :shared_paths, ['config/database.yml', 'log']
|
21
|
+
|
22
|
+
# Optional settings:
|
23
|
+
# set :user, 'foobar' # Username in the server to SSH to.
|
24
|
+
# set :port, '30000' # SSH port number.
|
25
|
+
|
26
|
+
# This task is the environment that is loaded for most commands, such as
|
27
|
+
# `mina deploy` or `mina rake`.
|
28
|
+
task :environment do
|
29
|
+
# If you're using rbenv, use this to load the rbenv environment.
|
30
|
+
# Be sure to commit your .rbenv-version to your repository.
|
31
|
+
# invoke :'rbenv:load'
|
32
|
+
|
33
|
+
# For those using RVM, use this to load an RVM version@gemset.
|
34
|
+
# invoke :'rvm:use[ruby-1.9.3-p125@default]'
|
35
|
+
end
|
36
|
+
|
37
|
+
# Put any custom mkdir's in here for when `mina setup` is ran.
|
38
|
+
# For Rails apps, we'll make some of the shared paths that are shared between
|
39
|
+
# all releases.
|
40
|
+
task :setup => :environment do
|
41
|
+
queue! %[mkdir -p "#{deploy_to}/shared/log"]
|
42
|
+
queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/log"]
|
43
|
+
|
44
|
+
queue! %[mkdir -p "#{deploy_to}/shared/config"]
|
45
|
+
queue! %[chmod g+rx,u+rwx "#{deploy_to}/shared/config"]
|
46
|
+
|
47
|
+
queue! %[touch "#{deploy_to}/shared/config/database.yml"]
|
48
|
+
queue %[echo "-----> Be sure to edit '#{deploy_to}/shared/config/database.yml'."]
|
49
|
+
end
|
50
|
+
|
51
|
+
desc "Deploys the current version to the server."
|
52
|
+
task :deploy => :environment do
|
53
|
+
deploy do
|
54
|
+
# Put things that will set up an empty directory into a fully set-up
|
55
|
+
# instance of your project.
|
56
|
+
invoke :'git:clone'
|
57
|
+
invoke :'deploy:link_shared_paths'
|
58
|
+
invoke :'bundle:install'
|
59
|
+
invoke :'rails:db_migrate'
|
60
|
+
invoke :'rails:assets_precompile'
|
61
|
+
|
62
|
+
to :launch do
|
63
|
+
queue "touch #{deploy_to}/#{current_path}/tmp/restart.txt"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# For help in making your deploy script, see the Mina documentation:
|
69
|
+
#
|
70
|
+
# - http://nadarei.co/mina
|
71
|
+
# - http://nadarei.co/mina/tasks
|
72
|
+
# - http://nadarei.co/mina/settings
|
73
|
+
# - http://nadarei.co/mina/helpers
|
74
|
+
|
data/data/deploy.sh.erb
ADDED
@@ -0,0 +1,120 @@
|
|
1
|
+
<%
|
2
|
+
prepare = commands(:default).map { |s| "(\n\n#{indent 2, s}\n\n)" }.join(" && ")
|
3
|
+
build = commands(:build).map { |s| "(\n\n#{indent 2, s}\n\n)" }.join(" && ")
|
4
|
+
launch = commands(:launch).map { |s| "(\n\n#{indent 2, s}\n\n)" }.join(" && ")
|
5
|
+
clean = commands(:clean).map { |s| "(\n\n#{indent 2, s}\n\n)" }.join(" && ")
|
6
|
+
%>
|
7
|
+
#!/usr/bin/env bash
|
8
|
+
|
9
|
+
# Go to the deploy path
|
10
|
+
cd "<%= deploy_to %>" || (
|
11
|
+
echo "! ERROR: not set up."
|
12
|
+
echo "The path '<%= deploy_to %>' is not accessible on the server."
|
13
|
+
echo "You may need to run 'mina setup' first."
|
14
|
+
false
|
15
|
+
) || exit 15
|
16
|
+
|
17
|
+
# Check releases path
|
18
|
+
if [ ! -d "<%= releases_path %>" ]; then
|
19
|
+
echo "! ERROR: not set up."
|
20
|
+
echo "The directory '<%= releases_path %>' does not exist on the server."
|
21
|
+
echo "You may need to run 'mina setup' first."
|
22
|
+
exit 16
|
23
|
+
fi
|
24
|
+
|
25
|
+
# Check lockfile
|
26
|
+
if [ -e "<%= lock_file %>" ]; then
|
27
|
+
echo "! ERROR: another deployment is ongoing."
|
28
|
+
echo "The file '<%= lock_file %>' was found."
|
29
|
+
echo "If no other deployment is ongoing, delete the file to continue."
|
30
|
+
exit 17
|
31
|
+
fi
|
32
|
+
|
33
|
+
# Determine $previous_path and other variables
|
34
|
+
[ -h "<%= current_path %>" ] && [ -d "<%= current_path %>" ] && previous_path=$(cd "<%= current_path %>" >/dev/null && pwd -LP)
|
35
|
+
build_path="./tmp/build-`date +%s`$RANDOM"
|
36
|
+
version=$((`cat "<%= deploy_to %>/last_version" 2>/dev/null`+1))
|
37
|
+
release_path="<%= releases_path %>/$version"
|
38
|
+
|
39
|
+
# Sanity check
|
40
|
+
if [ -e "$build_path" ]; then
|
41
|
+
echo "! ERROR: Path already exists."
|
42
|
+
exit 18
|
43
|
+
fi
|
44
|
+
|
45
|
+
# Bootstrap script (in deployer)
|
46
|
+
(
|
47
|
+
echo "-----> Creating a temporary build path"
|
48
|
+
<%= echo_cmd %[touch "#{lock_file}"] %> &&
|
49
|
+
<%= echo_cmd %[mkdir -p "$build_path"] %> &&
|
50
|
+
<%= echo_cmd %[cd "$build_path"] %> &&
|
51
|
+
(
|
52
|
+
<%= indent 4, (prepare.empty? ? "true" : prepare) %>
|
53
|
+
) &&
|
54
|
+
echo "-----> Deploy finished"
|
55
|
+
) &&
|
56
|
+
|
57
|
+
#
|
58
|
+
# Build
|
59
|
+
(
|
60
|
+
echo "-----> Building"
|
61
|
+
echo "-----> Moving build to $release_path"
|
62
|
+
<%= echo_cmd %[mv "$build_path" "$release_path"] %> &&
|
63
|
+
<%= echo_cmd %[cd "$release_path"] %> &&
|
64
|
+
(
|
65
|
+
<%= indent 4, (build.empty? ? "true" : build) %>
|
66
|
+
) &&
|
67
|
+
echo "-----> Build finished"
|
68
|
+
|
69
|
+
) &&
|
70
|
+
|
71
|
+
#
|
72
|
+
# Launching
|
73
|
+
# Rename to the real release path, then symlink 'current'
|
74
|
+
(
|
75
|
+
echo "-----> Launching"
|
76
|
+
echo "-----> Updating the <%= current_path %> symlink" &&
|
77
|
+
<%= echo_cmd %[ln -nfs "$release_path" "#{current_path}"] %>
|
78
|
+
) &&
|
79
|
+
|
80
|
+
# ============================
|
81
|
+
# === Start up serve => (in deployer)
|
82
|
+
(
|
83
|
+
echo "-----> Launching"
|
84
|
+
<%= echo_cmd %[cd "$release_path"] %>
|
85
|
+
<%= indent 2, (launch.empty? ? "true" : launch) %>
|
86
|
+
) &&
|
87
|
+
|
88
|
+
# ============================
|
89
|
+
# === Complete & unlock
|
90
|
+
(
|
91
|
+
rm -f "<%= lock_file %>"
|
92
|
+
echo "$version" > "./last_version"
|
93
|
+
echo "-----> Done. Deployed v$version"
|
94
|
+
) ||
|
95
|
+
|
96
|
+
# ============================
|
97
|
+
# === Failed deployment
|
98
|
+
(
|
99
|
+
echo "! ERROR: Deploy failed."
|
100
|
+
|
101
|
+
<%= indent 2, clean %>
|
102
|
+
|
103
|
+
echo "-----> Cleaning up build"
|
104
|
+
[ -e "$build_path" ] && (
|
105
|
+
<%= echo_cmd %[rm -rf "$build_path"] %>
|
106
|
+
)
|
107
|
+
[ -e "$release_path" ] && (
|
108
|
+
echo "Deleting release"
|
109
|
+
<%= echo_cmd %[rm -rf "$release_path"] %>
|
110
|
+
)
|
111
|
+
(
|
112
|
+
echo "Unlinking current"
|
113
|
+
[ -n "$previous_path" ] && <%= echo_cmd %[ln -nfs "$previous_path" "#{current_path}"] %>
|
114
|
+
)
|
115
|
+
|
116
|
+
# Unlock
|
117
|
+
<%= echo_cmd %[rm -f "#{lock_file}"] %>
|
118
|
+
echo "OK"
|
119
|
+
exit 19
|
120
|
+
)
|
data/lib/mina.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
module Mina
|
2
|
+
PREFIX = File.dirname(__FILE__)
|
3
|
+
ROOT = File.expand_path('../../', __FILE__)
|
4
|
+
|
5
|
+
require 'mina/version'
|
6
|
+
|
7
|
+
autoload :DeployHelpers, 'mina/deploy_helpers'
|
8
|
+
autoload :OutputHelpers, 'mina/output_helpers'
|
9
|
+
autoload :SshHelpers, 'mina/ssh_helpers'
|
10
|
+
autoload :ExecHelpers, 'mina/exec_helpers'
|
11
|
+
autoload :Helpers, 'mina/helpers'
|
12
|
+
autoload :Settings, 'mina/settings'
|
13
|
+
autoload :Tools, 'mina/tools'
|
14
|
+
|
15
|
+
Error = Class.new(Exception)
|
16
|
+
class Failed < Error
|
17
|
+
attr_accessor :exitstatus
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.root_path(*a)
|
21
|
+
File.join ROOT, *a
|
22
|
+
end
|
23
|
+
end
|
data/lib/mina/bundler.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# # Modules: Bundler
|
2
|
+
# Adds settings and tasks for managing Ruby Bundler.
|
3
|
+
#
|
4
|
+
# require 'mina/bundler'
|
5
|
+
|
6
|
+
# ## Settings
|
7
|
+
# Any and all of these settings can be overriden in your `deploy.rb`.
|
8
|
+
|
9
|
+
# ### bundle_bin
|
10
|
+
# Sets the bundle path.
|
11
|
+
|
12
|
+
set_default :bundle_bin, 'bundle'
|
13
|
+
|
14
|
+
# ### bundle_path
|
15
|
+
# Sets the path to where the gems are expected to be.
|
16
|
+
#
|
17
|
+
# This path will be symlinked to `./shared/bundle` so that the gems cache will
|
18
|
+
# be shared between all releases.
|
19
|
+
|
20
|
+
set_default :bundle_path, './vendor/bundle'
|
21
|
+
|
22
|
+
# ### bundle_options
|
23
|
+
# Sets the options for installing gems via Bundler.
|
24
|
+
|
25
|
+
set_default :bundle_options, lambda { %{--without development:test --path "#{bundle_path}" --binstubs bin/ --deployment} }
|
26
|
+
|
27
|
+
# ## Deploy tasks
|
28
|
+
# These tasks are meant to be invoked inside deploy scripts, not invoked on
|
29
|
+
# their own.
|
30
|
+
|
31
|
+
namespace :bundle do
|
32
|
+
# ### bundle:install
|
33
|
+
# Installs gems.
|
34
|
+
desc "Install gem dependencies using Bundler."
|
35
|
+
task :install do
|
36
|
+
queue %{
|
37
|
+
echo "-----> Installing gem dependencies using Bundler"
|
38
|
+
#{echo_cmd %[mkdir -p "#{deploy_to}/#{shared_path}/bundle"]}
|
39
|
+
#{echo_cmd %[mkdir -p "#{File.dirname bundle_path}"]}
|
40
|
+
#{echo_cmd %[ln -s "#{deploy_to}/#{shared_path}/bundle" "#{bundle_path}"]}
|
41
|
+
#{echo_cmd %[#{bundle_bin} install #{bundle_options}]}
|
42
|
+
}
|
43
|
+
end
|
44
|
+
end
|
data/lib/mina/chruby.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# # Modules: chruby
|
2
|
+
# Adds settings and tasks for managing [chruby] installations.
|
3
|
+
#
|
4
|
+
# [chruby]: https://github.com/postmodern/chruby
|
5
|
+
#
|
6
|
+
# require 'mina/chruby'
|
7
|
+
#
|
8
|
+
# ## Common usage
|
9
|
+
#
|
10
|
+
# task :environment do
|
11
|
+
# invoke :'chruby[ruby-1.9.3-p392]'
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# task :deploy => :environment do
|
15
|
+
# ...
|
16
|
+
# end
|
17
|
+
|
18
|
+
# ## Settings
|
19
|
+
# Any and all of these settings can be overriden in your `deploy.rb`.
|
20
|
+
|
21
|
+
# ### chruby_path
|
22
|
+
# Path where *chruby* init scripts are installed.
|
23
|
+
#
|
24
|
+
set_default :chruby_path, "/etc/profile.d/chruby.sh"
|
25
|
+
|
26
|
+
# ## Tasks
|
27
|
+
|
28
|
+
# ### chruby[version]
|
29
|
+
# Switch to given Ruby version
|
30
|
+
|
31
|
+
task :chruby, :env do |t, args|
|
32
|
+
unless args[:env]
|
33
|
+
print_error "Task 'chruby' needs a Ruby version as an argument."
|
34
|
+
print_error "Example: invoke :'chruby[ruby-1.9.3-p392]'"
|
35
|
+
die
|
36
|
+
end
|
37
|
+
|
38
|
+
queue %{
|
39
|
+
echo "-----> chruby to version: '#{args[:env]}'"
|
40
|
+
|
41
|
+
if [[ ! -s "#{chruby_path}" ]]; then
|
42
|
+
echo "! chruby.sh init file not found"
|
43
|
+
exit 1
|
44
|
+
fi
|
45
|
+
|
46
|
+
source #{chruby_path}
|
47
|
+
#{echo_cmd %{chruby "#{args[:env]}"}} || exit 1
|
48
|
+
}
|
49
|
+
end
|
data/lib/mina/default.rb
ADDED
@@ -0,0 +1,144 @@
|
|
1
|
+
# # Modules: Default
|
2
|
+
# This module is loaded when invoking `mina` with or without a project.
|
3
|
+
|
4
|
+
# ## Settings
|
5
|
+
# Here are some of the common settings. All settings are optional unless
|
6
|
+
# otherwise noted.
|
7
|
+
#
|
8
|
+
# ### deploy_to
|
9
|
+
# (Required) Path to deploy to.
|
10
|
+
#
|
11
|
+
# ### domain
|
12
|
+
# (Required) Host name to deploy to.
|
13
|
+
#
|
14
|
+
# ### port
|
15
|
+
# SSH port number.
|
16
|
+
#
|
17
|
+
# ### forward_agent
|
18
|
+
# If set to `true`, enables SSH agent forwarding.
|
19
|
+
#
|
20
|
+
# ### identity_file
|
21
|
+
# The local path to the SSH private key file.
|
22
|
+
#
|
23
|
+
# ### ssh_options
|
24
|
+
# Switches to be passed to the `ssh` command.
|
25
|
+
|
26
|
+
# ## Tasks
|
27
|
+
# Any and all of these settings can be overriden in your `deploy.rb`.
|
28
|
+
|
29
|
+
# ### environment
|
30
|
+
# Make the `:environment` task exist by default. This is meant to be overridden
|
31
|
+
# by users.
|
32
|
+
|
33
|
+
task :environment do
|
34
|
+
end
|
35
|
+
|
36
|
+
# ### init
|
37
|
+
# Initializes a new Mina project.
|
38
|
+
#
|
39
|
+
# $ mina init
|
40
|
+
|
41
|
+
desc "Creates a sample config file."
|
42
|
+
task :init => :environment do
|
43
|
+
name = Rake.application.name
|
44
|
+
config_file = Rake.application.rakefile
|
45
|
+
|
46
|
+
unless config_file.to_s.empty?
|
47
|
+
print_str "! You already have #{config_file}."
|
48
|
+
exit 8
|
49
|
+
end
|
50
|
+
|
51
|
+
outfile = './config/deploy.rb'
|
52
|
+
require 'fileutils'
|
53
|
+
FileUtils.mkdir_p './config'
|
54
|
+
FileUtils.cp Mina.root_path('data/deploy.rb'), outfile
|
55
|
+
|
56
|
+
print_str "-----> Created #{outfile}"
|
57
|
+
print_str "Edit this file, then run `#{name} setup` after."
|
58
|
+
end
|
59
|
+
|
60
|
+
task :default => :help
|
61
|
+
|
62
|
+
module HelpHelpers
|
63
|
+
def get_tasks(&blk)
|
64
|
+
Rake.application.tasks.select &blk
|
65
|
+
end
|
66
|
+
|
67
|
+
def print_tasks(tasks, width=nil)
|
68
|
+
name = Rake.application.name
|
69
|
+
|
70
|
+
width ||= tasks.map { |t| t.name_with_args.length }.max || 10
|
71
|
+
tasks.each do |t|
|
72
|
+
if t.comment
|
73
|
+
puts " #{name} %-#{width}s # %s" % [ t.name_with_args, t.comment ]
|
74
|
+
else
|
75
|
+
puts " #{name} %s" % [ t.name_with_args ]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
SYSTEM_TASKS = %w[help tasks init]
|
81
|
+
def system_tasks() get_tasks { |t| SYSTEM_TASKS.include? t.name }; end
|
82
|
+
def top_tasks() get_tasks { |t| ! t.name.include?(':') && t.comment && !system_tasks.include?(t) }; end
|
83
|
+
def sub_tasks() get_tasks { |t| t.name.include?(':') }; end
|
84
|
+
|
85
|
+
def show_task_help(options={})
|
86
|
+
puts "Basic usage:"
|
87
|
+
print_tasks system_tasks
|
88
|
+
|
89
|
+
if top_tasks.any?
|
90
|
+
puts "\nServer tasks:"
|
91
|
+
print_tasks top_tasks
|
92
|
+
end
|
93
|
+
|
94
|
+
if sub_tasks.any? && options[:full]
|
95
|
+
puts "\nMore tasks:"
|
96
|
+
print_tasks sub_tasks
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
extend HelpHelpers
|
102
|
+
|
103
|
+
# ### help
|
104
|
+
# Shows the help screen.
|
105
|
+
|
106
|
+
desc "Show help."
|
107
|
+
task :help do
|
108
|
+
name = Rake.application.name
|
109
|
+
|
110
|
+
puts "#{name} - Really fast server deployment and automation tool\n\n"
|
111
|
+
puts "Options:"
|
112
|
+
|
113
|
+
opts = [
|
114
|
+
[ "-h, --help", "Show help" ],
|
115
|
+
[ "-V, --version", "Show program version" ],
|
116
|
+
[ "-v, --verbose", "Show commands as they happen" ],
|
117
|
+
[ "-S, --simulate", "Run in simulation mode" ],
|
118
|
+
[ "-t, --trace", "Show backtraces when errors occur" ],
|
119
|
+
[ "-f FILE", "Use FILE as the deploy configuration" ]
|
120
|
+
]
|
121
|
+
opts.each { |args| puts " %-17s %s" % args }
|
122
|
+
puts ""
|
123
|
+
|
124
|
+
show_task_help
|
125
|
+
|
126
|
+
unless Rake.application.have_rakefile
|
127
|
+
puts ""
|
128
|
+
puts "Run this command in a project with a 'config/deploy.rb' file to see more options."
|
129
|
+
end
|
130
|
+
|
131
|
+
puts ""
|
132
|
+
puts "All of Rake's options are also available as '#{name}' options. See 'rake --help'"
|
133
|
+
puts "for more information."
|
134
|
+
end
|
135
|
+
|
136
|
+
# ### tasks
|
137
|
+
# Display all tasks in a nice table.
|
138
|
+
#
|
139
|
+
# $ mina tasks
|
140
|
+
|
141
|
+
desc "Show all tasks."
|
142
|
+
task :tasks do
|
143
|
+
show_task_help :full => true
|
144
|
+
end
|