fezzik 0.7.4 → 0.8.0.beta1

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.
data/bin/fez CHANGED
@@ -4,8 +4,14 @@ require "rubygems"
4
4
  require "rake"
5
5
  require "fezzik"
6
6
 
7
+ module Fezzik
8
+ RAKE_AT_LEAST_090 = defined?(Rake::VERSION) &&
9
+ Gem.loaded_specs["rake"].version >= Gem::Version.create("0.9.0")
10
+ end
11
+
7
12
  # Required for using rake/remote-task with rake >= 0.9.x
8
- include Rake::DSL
13
+ # TODO(caleb): Still necessary w/out RRT?
14
+ include Rake::DSL if Fezzik::RAKE_AT_LEAST_090
9
15
 
10
16
  Fezzik.activated = true
11
17
 
@@ -13,7 +19,11 @@ USAGE = <<EOF
13
19
  Version #{Fezzik::VERSION}
14
20
  fez <destination> <tasks> # Run deployment tasks on destination servers
15
21
  fez get <tasks> # Download tasks to use in your project
16
- fez -T # Display all tasks
22
+ fez -v, --version # Print version number
23
+ fez -h, --help # Print this help message
24
+ fez -T # Print all tasks with descriptions
25
+ fez --task-names # Print all tasks names
26
+ fez --destinations # Print all destinations
17
27
  EOF
18
28
 
19
29
  def print_usage_and_exit
@@ -26,19 +36,31 @@ def print_version_and_exit
26
36
  exit
27
37
  end
28
38
 
29
- def display_tasks_and_exit
39
+ def print_destinations_and_exit
40
+ Rake.application.init
41
+ Rake.application.load_rakefile
42
+ puts Fezzik.destinations.to_a.join("\n")
43
+ exit 0
44
+ end
45
+
46
+ def display_tasks_and_exit(hide_descriptions = false)
47
+ if Fezzik::RAKE_AT_LEAST_090
48
+ Rake::TaskManager.record_task_metadata = true
49
+ Rake::application.options.show_tasks = :tasks
50
+ end
30
51
  Rake.application.init
31
52
  Rake.application.load_rakefile
32
53
  Rake.application.options.show_task_pattern = /^fezzik:/
33
54
  output = Fezzik::Util.capture_output { Rake.application.display_tasks_and_comments }
34
55
  output.gsub!(/^rake fezzik:/, "fez <destination> ")
35
- puts output.strip.empty? ? "(No Fezzik tasks with descriptions are defined.)" : output
56
+ output.gsub!(/^fez <destination> (\S+).*$/, "\\1") if hide_descriptions
57
+ output.strip.empty? ? $stderr.puts("(No Fezzik tasks with descriptions are defined.)") : puts(output)
36
58
  exit 0
37
59
  end
38
60
 
39
61
  TASKS_URL = "https://raw.github.com/dmacdougall/fezzik/master/tasks"
40
62
  def download_tasks_and_exit
41
- ARGV[1..-1].each do |task|
63
+ OPTIONS[1..-1].each do |task|
42
64
  task += ".rake" unless task =~ /\.rake$/
43
65
  system("curl -f #{TASKS_URL}/#{task} -o #{task} > /dev/null 2>&1")
44
66
  if $? == 0
@@ -51,7 +73,7 @@ def download_tasks_and_exit
51
73
  end
52
74
 
53
75
  def run_fezzik_tasks
54
- ENV["fezzik_destination"] = ARGV[0]
76
+ ENV["fezzik_destination"] = OPTIONS[0]
55
77
  Fezzik.init
56
78
  Rake.application.init
57
79
  Rake.application.load_rakefile
@@ -60,20 +82,27 @@ def run_fezzik_tasks
60
82
  host_list = Array(domain).join("\n ")
61
83
  puts "Targeting hosts:"
62
84
  puts " #{host_list}"
63
- rescue Rake::ConfigurationError => e
85
+ rescue NameError => e
64
86
  puts "Invalid destination: #{Fezzik.target_destination}"
65
87
  puts "Make sure this destination is configured and includes `set :domain, \"yourdomain.com\"`"
66
88
  puts Fezzik.color_string("[fail]", :red)
67
89
  exit 1
68
90
  end
69
91
  begin
70
- tasks = ARGV[1..-1]
92
+ tasks = OPTIONS[1..-1]
71
93
  tasks.each do |task_with_params|
72
94
  task_name, params = Fezzik::Util.split_task_and_params(task_with_params)
73
- Rake::Task["fezzik:#{task_name}"].invoke(params)
95
+ Rake::Task["fezzik:#{task_name}"].invoke(*params)
74
96
  end
75
97
  puts Fezzik.color_string("[success]", :green)
76
- rescue SystemExit, Rake::CommandFailedError => e
98
+ rescue SystemExit => e
99
+ if e.status == 0
100
+ puts Fezzik.color_string("[success]", :green)
101
+ else
102
+ puts Fezzik.color_string("[fail]", :red)
103
+ exit e.status
104
+ end
105
+ rescue Fezzik::CommandFailedError => e
77
106
  puts Fezzik.color_string("[fail]", :red)
78
107
  exit 1
79
108
  rescue StandardError => e
@@ -84,11 +113,21 @@ def run_fezzik_tasks
84
113
  end
85
114
  end
86
115
 
87
- case ARGV[0]
116
+ # Rake directly inspects ARGV and will crash if it doesn't recognize a flag that was passed to fez.
117
+ OPTIONS = ARGV.dup
118
+ ARGV.clear
119
+
120
+ # Pass these options through to Rake.
121
+ ARGV << "--trace" if OPTIONS.delete("--trace")
122
+ ARGV << "--dry-run" if OPTIONS.delete("--dry-run")
123
+
124
+ case OPTIONS[0]
88
125
  when nil then abort USAGE
89
126
  when "-h", "--help" then print_usage_and_exit
90
127
  when "-v", "--version" then print_version_and_exit
91
128
  when "-T", "--tasks" then display_tasks_and_exit
92
129
  when "get" then download_tasks_and_exit
130
+ when "--task-names" then display_tasks_and_exit(hide_descriptions = true)
131
+ when "--destinations" then print_destinations_and_exit
93
132
  else run_fezzik_tasks
94
133
  end
@@ -0,0 +1,14 @@
1
+ _fez()
2
+ {
3
+ local cur prev completion
4
+ cur="${COMP_WORDS[COMP_CWORD]}"
5
+ prev="${COMP_WORDS[COMP_CWORD-1]}"
6
+ if [ $prev == "fez" ]; then
7
+ completion="--destinations"
8
+ else
9
+ completion="--task-names"
10
+ fi
11
+ COMPREPLY=( $(compgen -W "$(fez ${completion} 2> /dev/null | GREP_OPTIONS='' grep -v '(in')" -- ${cur}) )
12
+ return 0
13
+ }
14
+ complete -F _fez fez
@@ -0,0 +1,7 @@
1
+ #compdef fez
2
+
3
+ if [[ "${words[-2]}" == "fez" ]] ; then
4
+ compadd $(fez --destinations 2> /dev/null | GREP_OPTIONS='' grep -v '(in')
5
+ else
6
+ compadd $(fez --task-names 2> /dev/null | GREP_OPTIONS='' grep -v '(in')
7
+ fi
data/example/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source :rubygems
2
+ gem "fezzik", :path => ".."
3
+ gem "rake"
data/example/Rakefile ADDED
@@ -0,0 +1,67 @@
1
+ require "fezzik"
2
+ include Fezzik::DSL
3
+
4
+ Fezzik.init(:tasks => "../tasks")
5
+
6
+ set :app, "test"
7
+ set :deploy_to, "/opt/#{app}"
8
+ set :release_path, "#{deploy_to}/releases/#{Time.now.strftime("%Y%m%d%H%M")}"
9
+ set :local_path, Dir.pwd
10
+ set :user, "root"
11
+
12
+ destination :vagrant do
13
+ set :user, "vagrant"
14
+ set :domain, "fezzik-vagrant"
15
+
16
+ env :foo, "bar"
17
+ env :baz, "baz"
18
+ env :baz, "qux", :hosts => "localhost"
19
+
20
+ set :role_var, nil
21
+ role :role1, :role_var => "apple"
22
+ role :role2, :role_var => "banana"
23
+ end
24
+
25
+ namespace :fezzik do
26
+ desc "Print information on the destination and environment"
27
+ remote_task :info do
28
+ puts "Destination: #{Fezzik.target_destination.inspect}"
29
+ puts "Environment: #{Fezzik.environments.inspect}"
30
+ end
31
+
32
+ desc "An example of appending..."
33
+ remote_task :append do
34
+ run "echo hi"
35
+ end
36
+
37
+ desc "...new actions to an existing task"
38
+ remote_task :append do
39
+ run "echo bye"
40
+ end
41
+
42
+ desc "Tasks can take arguments"
43
+ remote_task :args, :arg1, :arg2 do |t, args|
44
+ puts "args: #{args.inspect}"
45
+ end
46
+
47
+ desc "Tasks may print out the host and user."
48
+ remote_task :host do
49
+ puts "#{user}@#{host}"
50
+ end
51
+
52
+ desc "Tasks can depend on other tasks"
53
+ remote_task :deps => :append do
54
+ puts "some other task just ran"
55
+ end
56
+
57
+ desc "If a server command fails the block should exist and fezzik should indicate failure"
58
+ remote_task :fails do
59
+ run "cd i-dont-exist"
60
+ run "echo 'should not print'"
61
+ end
62
+
63
+ desc "Use roles to override settings"
64
+ remote_task :roles, :roles => [:role1, :role2] do
65
+ puts "role_var: #{get :role_var}"
66
+ end
67
+ end
data/fezzik.gemspec CHANGED
@@ -13,15 +13,18 @@ Gem::Specification.new do |s|
13
13
  s.email = "dmacdougall@gmail.com"
14
14
 
15
15
  s.description = "A light deployment system that gets out of your way"
16
- s.summary = "Fezzik is a small wrapper around rake/remote_task. It simplifies running commands on" +
17
- "remote servers and can be used for anything from deploying code to installing libraries remotely."
16
+ s.summary =<<EOS
17
+ Fezzik adds remote ssh capabilities to Rake. It simplifies running commands on remote servers and can be used
18
+ for anything from deploying code to installing libraries remotely.
19
+ EOS
18
20
  s.homepage = "http://github.com/dmacdougall/fezzik"
19
21
  s.rubyforge_project = "fezzik"
20
22
 
21
23
  s.executables = %w(fez)
22
24
  s.files = `git ls-files`.split("\n")
23
25
 
24
- s.add_dependency("rake-remote_task", "~>2.0.2")
26
+ s.add_dependency "rake"
27
+ s.add_dependency "weave", "=0.1.0"
25
28
 
26
29
  s.add_development_dependency("scope", "~>0.2.3")
27
30
  s.add_development_dependency("vagrant", "~>1.0.5")
data/lib/fezzik.rb CHANGED
@@ -1,13 +1,14 @@
1
1
  require "stringio"
2
2
  require "thread"
3
3
  require "rake"
4
- require "rake/remote_task"
4
+ require "weave"
5
+ require "set"
6
+
7
+ require "fezzik/host_task"
5
8
  require "fezzik/base"
6
9
  require "fezzik/colors"
7
10
  require "fezzik/dsl"
8
11
  require "fezzik/environment"
9
12
  require "fezzik/role"
10
- require "fezzik/io"
11
- require "fezzik/thread_local_io"
12
13
  require "fezzik/util"
13
14
  require "fezzik/version"
data/lib/fezzik/base.rb CHANGED
@@ -2,20 +2,66 @@ module Fezzik
2
2
  def self.activated=(value) @activated = value end
3
3
  def self.activated?() @activated || false end
4
4
 
5
+ def self.set(name, value)
6
+ @@settings ||= {}
7
+
8
+ value = Array(value) if name == :domain
9
+
10
+ @@settings[name] = value
11
+
12
+ if Object.public_instance_methods.include? name.to_sym
13
+ Object.send :alias_method, :"old_#{name}", name
14
+ end
15
+
16
+ Object.send :define_method, name do
17
+ # TODO: Add deprecation note for setting/accessing global settings
18
+ Fezzik.get name
19
+ end
20
+ end
21
+
22
+ def self.get(name)
23
+ raise "Fezzik: No such setting: #{name}" unless @@settings.has_key?(name)
24
+ @@settings[name]
25
+ end
26
+
27
+ def self.remote_task(*args, &block)
28
+ roles = (Hash === args.last && args.last[:roles]) ? args.pop[:roles] : []
29
+ name, args, deps = Rake.application.resolve_args(args)
30
+ host_task(name, { :args => Array(args), :deps => Array(deps), :roles => Array(roles) }, &block)
31
+ end
32
+
33
+ def self.host_task(name, options = {}, &block)
34
+ options = {
35
+ :args => [],
36
+ :deps => [],
37
+ :roles => []
38
+ }.merge(options)
39
+ t = HostTask.define_task(name, { options[:args] => options[:deps] }, &block)
40
+ t.roles += options[:roles]
41
+ end
42
+
5
43
  def self.init(options={})
6
44
  @options = options
7
45
  @target_destination = ENV["fezzik_destination"].to_sym rescue nil
8
46
  unless options[:tasks].nil?
9
- puts "Loading Fezzik tasks from #{@options[:tasks]}"
10
- Dir[File.join(Dir.pwd, "#{@options[:tasks]}/**/*.rake")].sort.each { |lib| import lib }
47
+ $stderr.puts "Loading Fezzik tasks from #{@options[:tasks]}"
48
+ Dir[File.join(File.expand_path(@options[:tasks]), "**", "*.rake")].sort.each { |lib| import lib }
11
49
  end
12
50
  end
13
51
 
14
52
  def self.destination(*names, &block)
53
+ @destinations ||= Set.new
54
+ @destinations.merge(names)
15
55
  block.call if names.include?(@target_destination)
16
56
  end
17
57
 
18
58
  def self.target_destination
19
59
  @target_destination ||= nil
20
60
  end
61
+
62
+ def self.destinations
63
+ @destinations ||= Set.new
64
+ end
65
+
66
+ class CommandFailedError < StandardError; end
21
67
  end
data/lib/fezzik/dsl.rb CHANGED
@@ -1,13 +1,12 @@
1
1
  module Fezzik
2
2
  module DSL
3
- # This is necessary to override Rake::RemoteTask's globally eval'ed method definitions.
4
- def self.included(klass)
5
- klass.class_eval do
6
- def role(*args) Fezzik.role(*args) end
7
- end
8
- end
9
3
  def destination(*names, &block) Fezzik.destination(*names, &block) end
10
4
  def env(*args) Fezzik.env(*args) end
11
5
  def capture_output(&block) Fezzik::Util.capture_output(&block) end
6
+ def set(name, value) Fezzik.set(name, value) end
7
+ def get(name) Fezzik.get(name) end
8
+ def remote_task(*args, &block) Fezzik.remote_task(*args, &block) end
9
+ def host_task(name, options = {}, &block) Fezzik.host_task(name, options, &block) end
10
+ def role(*args) Fezzik.role(*args) end
12
11
  end
13
12
  end
@@ -1,7 +1,7 @@
1
1
  module Fezzik
2
2
  def self.env(key, value, options={})
3
3
  options = {
4
- :hosts => Array(domain).map { |domain| domain.gsub(/^.*@/, "") } # strip user off the front
4
+ :hosts => Fezzik.get(:domain)
5
5
  }.merge(options)
6
6
  options[:hosts] = Array(options[:hosts])
7
7
  @environments ||= Hash.new { |h, k| h[k] = {} }
@@ -0,0 +1,49 @@
1
+ module Fezzik
2
+ class HostTask < Rake::Task
3
+ attr_accessor :roles
4
+
5
+ def initialize(task_name, app)
6
+ super
7
+ @roles = []
8
+ @host_actions = []
9
+ end
10
+
11
+ def enhance(deps = nil, &block)
12
+ @host_actions << block if block_given?
13
+ super(deps)
14
+ end
15
+
16
+ def execute(args = nil)
17
+ return if Rake.application.options.dryrun
18
+
19
+ if @roles.empty?
20
+ hosts = Fezzik.get(:domain).map { |domain| "#{Fezzik.get(:user)}@#{domain}" }
21
+ @@connection_pool ||= Weave.connect(hosts)
22
+ @host_actions.each do |action|
23
+ begin
24
+ @@connection_pool.execute(:args => [self, args], &action)
25
+ rescue Weave::Error => e
26
+ STDERR.puts "Error running command in HostTask '#{@name}':"
27
+ abort e.message
28
+ end
29
+ end
30
+ else
31
+ @roles.each do |role|
32
+ Fezzik.with_role(role) do
33
+ hosts = Fezzik.get(:domain).map { |domain| "#{Fezzik.get(:user)}@#{domain}" }
34
+ @@role_connection_pools ||= {}
35
+ @@role_connection_pools[role] ||= Weave.connect(hosts)
36
+ @host_actions.each do |action|
37
+ begin
38
+ @@role_connection_pools[role].execute(:args => [self, args], &action)
39
+ rescue Weave::Error => e
40
+ STDERR.puts "Error running command in HostTask '#{@name}' with role '#{role}':"
41
+ abort e.message
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
data/lib/fezzik/role.rb CHANGED
@@ -6,6 +6,8 @@ module Fezzik
6
6
 
7
7
  def self.roles() @roles ||= {} end
8
8
 
9
+ # TODO: Consider allowing roles that don't override an existing setting.
10
+ # Right now you have to do: set :foo nil; role :foo_role {:foo => :bar}
9
11
  def self.with_role(role_name, &block)
10
12
  return block.call if roles[role_name].nil?
11
13
 
@@ -19,21 +21,6 @@ module Fezzik
19
21
  end
20
22
 
21
23
  def self.override_settings(settings)
22
- settings.each { |setting, value| self.send(:set, setting, value) }
23
- end
24
- end
25
-
26
- module Rake
27
- class RemoteTask
28
- def defined_target_hosts?() true end
29
- def target_hosts() domain end
30
-
31
- alias remote_task_execute execute
32
- def execute(args = nil)
33
- return Fezzik::Util.with_prepended_user { remote_task_execute(args) } if options[:roles].empty?
34
- options[:roles].each do |role|
35
- Fezzik.with_role(role) { Fezzik::Util.with_prepended_user { remote_task_execute(args) } }
36
- end
37
- end
24
+ settings.each { |setting, value| Fezzik.set setting, value }
38
25
  end
39
26
  end
data/lib/fezzik/util.rb CHANGED
@@ -20,21 +20,5 @@ module Fezzik
20
20
  end
21
21
  [task, params]
22
22
  end
23
-
24
- # Blocks passed to this function will ensure `domain` is always an Array. In addition, if `user` is set it
25
- # will automatically prepend the value of `user` to the front of any domains missing a username. This allows a
26
- # fezzik user to write the following in their configuration and have it "just work":
27
- # set :domain, ["example.com", "test@example2.com"]
28
- # set :user, "root"
29
- # `domain` will be equal to ["root@example.com", "test@example2.com"]
30
- def self.with_prepended_user(&block)
31
- old_domain = domain
32
- begin
33
- set :domain, Array(domain).map { |d| (defined?(user) && !d.include?("@")) ? "#{user}@#{d}" : d }
34
- block.call
35
- ensure
36
- set :domain, old_domain
37
- end
38
- end
39
23
  end
40
24
  end
@@ -1,3 +1,3 @@
1
1
  module Fezzik
2
- VERSION = "0.7.4"
2
+ VERSION = "0.8.0.beta1"
3
3
  end
data/tasks/command.rake CHANGED
@@ -23,7 +23,9 @@ namespace :fezzik do
23
23
  else
24
24
  begin
25
25
  Rake::Task["fezzik:command_execute"].invoke command
26
- rescue Rake::CommandFailedError
26
+ rescue Fezzik::CommandFailedError => e
27
+ puts e.message
28
+ puts e.backtrace
27
29
  ensure
28
30
  Rake::Task["fezzik:command_execute"].reenable
29
31
  end
@@ -34,9 +34,12 @@ namespace :fezzik do
34
34
  task :push do
35
35
  # Copy over the appropriate configs for the target
36
36
  server = target_host.gsub(/^.*@/, "")
37
- ["environment.rb", "environment.sh"].each do |config_file|
38
- rsync "-q", "/tmp/#{app}/#{server}_config/#{config_file}",
39
- "#{target_host}:#{release_path}/#{config_file}"
37
+ config_directory = "/tmp/#{app}/#{server}_config"
38
+ if File.directory?(config_directory)
39
+ ["environment.rb", "environment.sh"].each do |config_file|
40
+ rsync "-q", "#{config_directory}/#{config_file}",
41
+ "#{target_host}:#{release_path}/#{config_file}"
42
+ end
40
43
  end
41
44
  end
42
45
  end
data/weave_todo.md ADDED
@@ -0,0 +1,13 @@
1
+ ## Breaking changes in the weave branch
2
+
3
+ * `target_host` is gone
4
+ * `host` is now an alias for `target_host`, not a method
5
+ * `rsync` no longer exists (unless we write a new helper function)
6
+
7
+ ## Other docs to write
8
+
9
+ * Call `warn` for deprecation notices
10
+ * document --trace and --dry-run passthrough flags
11
+ * puts is not thread-safe; instead, use print "" + "\n"
12
+ * capture_output captures the host prefix on each line. Instead pass :capture => :output to `run`.
13
+ You can also use capture_output and pass :capture => raw
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fezzik
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.4
5
- prerelease:
4
+ version: 0.8.0.beta1
5
+ prerelease: 6
6
6
  platform: ruby
7
7
  authors:
8
8
  - Daniel MacDougall
@@ -10,24 +10,40 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-11-29 00:00:00.000000000 Z
13
+ date: 2013-02-10 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: rake-remote_task
16
+ name: rake
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
- - - ~>
20
+ - - ! '>='
21
21
  - !ruby/object:Gem::Version
22
- version: 2.0.2
22
+ version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
26
26
  none: false
27
27
  requirements:
28
- - - ~>
28
+ - - ! '>='
29
+ - !ruby/object:Gem::Version
30
+ version: '0'
31
+ - !ruby/object:Gem::Dependency
32
+ name: weave
33
+ requirement: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - '='
37
+ - !ruby/object:Gem::Version
38
+ version: 0.1.0
39
+ type: :runtime
40
+ prerelease: false
41
+ version_requirements: !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - '='
29
45
  - !ruby/object:Gem::Version
30
- version: 2.0.2
46
+ version: 0.1.0
31
47
  - !ruby/object:Gem::Dependency
32
48
  name: scope
33
49
  requirement: !ruby/object:Gem::Requirement
@@ -73,15 +89,18 @@ files:
73
89
  - Rakefile
74
90
  - Vagrantfile
75
91
  - bin/fez
92
+ - completions/_fez.bash
93
+ - completions/_fez.zsh
94
+ - example/Gemfile
95
+ - example/Rakefile
76
96
  - fezzik.gemspec
77
97
  - lib/fezzik.rb
78
98
  - lib/fezzik/base.rb
79
99
  - lib/fezzik/colors.rb
80
100
  - lib/fezzik/dsl.rb
81
101
  - lib/fezzik/environment.rb
82
- - lib/fezzik/io.rb
102
+ - lib/fezzik/host_task.rb
83
103
  - lib/fezzik/role.rb
84
- - lib/fezzik/thread_local_io.rb
85
104
  - lib/fezzik/util.rb
86
105
  - lib/fezzik/version.rb
87
106
  - tasks/command.rake
@@ -91,6 +110,7 @@ files:
91
110
  - test/integration/base_test.rb
92
111
  - test/integration/environment_test.rb
93
112
  - test/integration_test_helper.rb
113
+ - weave_todo.md
94
114
  homepage: http://github.com/dmacdougall/fezzik
95
115
  licenses: []
96
116
  post_install_message:
@@ -103,9 +123,6 @@ required_ruby_version: !ruby/object:Gem::Requirement
103
123
  - - ! '>='
104
124
  - !ruby/object:Gem::Version
105
125
  version: '0'
106
- segments:
107
- - 0
108
- hash: 3198673685344171649
109
126
  required_rubygems_version: !ruby/object:Gem::Requirement
110
127
  none: false
111
128
  requirements:
@@ -117,7 +134,7 @@ rubyforge_project: fezzik
117
134
  rubygems_version: 1.8.23
118
135
  signing_key:
119
136
  specification_version: 2
120
- summary: Fezzik is a small wrapper around rake/remote_task. It simplifies running
121
- commands onremote servers and can be used for anything from deploying code to installing
137
+ summary: Fezzik adds remote ssh capabilities to Rake. It simplifies running commands
138
+ on remote servers and can be used for anything from deploying code to installing
122
139
  libraries remotely.
123
140
  test_files: []
data/lib/fezzik/io.rb DELETED
@@ -1,11 +0,0 @@
1
- # Synchronize 'puts' because it's annoying to have interleaved output when rake remote task is running
2
- # several things at once in multiple threads (for instance: commands on multiple servers or commands as
3
- # multiple users).
4
- #
5
- # TODO(dmac): Is this made obsolete by thread_local_io.rb?
6
- class IO
7
- @@print_mutex = Mutex.new
8
- alias :old_puts :puts
9
- def puts(*args) @@print_mutex.synchronize { old_puts(*args) } end
10
- end
11
-
@@ -1,47 +0,0 @@
1
- # Overrides $stdout and allows it to be overridden by the thread-local variable Thread.current[:stdout].
2
- #
3
- # If Thread.current[:stdout] is set, the thread will write all output there. Otherwise the thread will
4
- # use $stdout as normal.
5
- #
6
- # Example usage:
7
- #
8
- # out = StringIO.new
9
- #
10
- # Thread.start do
11
- # Thread.current[:stdout] = out
12
- # puts "thread1"
13
- # end.join
14
- #
15
- # Thread.start do
16
- # puts "thread2"
17
- # end.join
18
- #
19
- # puts out.string
20
- #
21
- # Output:
22
- # thread2
23
- # thread1
24
-
25
- module Fezzik
26
- class ThreadLocalIO < IO
27
- @@former_stdout = $stdout
28
-
29
- def self.write(*args)
30
- if Thread.current[:stdout]
31
- Thread.current[:stdout].write(*args)
32
- else
33
- @@former_stdout.write(*args)
34
- end
35
- end
36
-
37
- def self.flush
38
- if Thread.current[:stdout]
39
- Thread.current[:stdout].flush
40
- else
41
- @@former_stdout.flush
42
- end
43
- end
44
- end
45
- end
46
-
47
- $stdout = Fezzik::ThreadLocalIO