capsaicin 0.1.5 → 0.1.6
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/VERSION.yml +1 -1
- data/lib/capsaicin.rb +8 -0
- data/lib/capsaicin/files.rb +0 -2
- data/lib/capsaicin/files/local.rb +11 -2
- data/lib/capsaicin/files/remote.rb +48 -7
- data/lib/capsaicin/invocation.rb +24 -2
- data/lib/capsaicin/service/command.rb +14 -5
- data/test/helper.rb +19 -0
- data/test/test_local_files.rb +58 -0
- metadata +7 -4
data/VERSION.yml
CHANGED
data/lib/capsaicin.rb
CHANGED
@@ -3,8 +3,16 @@ unless Capistrano::Configuration.respond_to?(:instance)
|
|
3
3
|
end
|
4
4
|
require 'capistrano'
|
5
5
|
|
6
|
+
module Capsaicin; end
|
7
|
+
|
6
8
|
require File.join(File.dirname(__FILE__), %w(capsaicin sys))
|
7
9
|
require File.join(File.dirname(__FILE__), %w(capsaicin invocation))
|
8
10
|
require File.join(File.dirname(__FILE__), %w(capsaicin files))
|
9
11
|
require File.join(File.dirname(__FILE__), %w(capsaicin service))
|
10
12
|
require File.join(File.dirname(__FILE__), %w(capsaicin ui))
|
13
|
+
|
14
|
+
Capistrano::Configuration.send :include, Capsaicin::Invocation
|
15
|
+
|
16
|
+
Capistrano.plugin :files, Capsaicin::Files
|
17
|
+
Capistrano.plugin :local_files, Capsaicin::Files::Local
|
18
|
+
Capistrano.plugin :remote_files, Capsaicin::Files::Remote
|
data/lib/capsaicin/files.rb
CHANGED
@@ -70,6 +70,17 @@ module Capsaicin
|
|
70
70
|
_lstar Zlib::GzipReader.new(File.open(src, 'rb')), options, &block
|
71
71
|
end
|
72
72
|
|
73
|
+
def tar_x(src, options={}, &block)
|
74
|
+
logger and logger.trace "tar -xf #{src}"
|
75
|
+
_untar File.open(src, 'wb'), options, &block
|
76
|
+
end
|
77
|
+
|
78
|
+
def tar_xz(src, options={}, &block)
|
79
|
+
require 'zlib' unless defined? Zlib::GzipWriter
|
80
|
+
logger and logger.trace "tar -xzf #{src}"
|
81
|
+
_untar Zlib::GzipReader.new(File.open(src, 'rb')), options, &block
|
82
|
+
end
|
83
|
+
|
73
84
|
private
|
74
85
|
|
75
86
|
def _tar(os, src, options, &filter)
|
@@ -130,5 +141,3 @@ module Capsaicin
|
|
130
141
|
end
|
131
142
|
end
|
132
143
|
end
|
133
|
-
|
134
|
-
Capistrano.plugin :local_files, Capsaicin::Files::Local
|
@@ -56,12 +56,26 @@ module Capsaicin
|
|
56
56
|
logger.trace "interrupted (Ctrl-C)" if logger
|
57
57
|
end
|
58
58
|
|
59
|
-
def upload(
|
59
|
+
def upload(from, to, options={}, &block)
|
60
60
|
case _via
|
61
61
|
when :system, :local_run
|
62
|
-
cp
|
62
|
+
cp from, to
|
63
63
|
else
|
64
|
-
|
64
|
+
if _via.to_s[0,4] == 'sudo'
|
65
|
+
if to[-1]==?/ || to[-1]==?\ || directory?(to)
|
66
|
+
tof = File.basename from
|
67
|
+
to2, to = "#{to}/#{tof}", "/tmp/#{tof}-#{Time.now.utc.to_i}"
|
68
|
+
else
|
69
|
+
tof = File.basename to
|
70
|
+
to2, to = to, "/tmp/#{tof}-#{Time.now.utc.to_i}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
@config.upload(from, to, options, &block)
|
74
|
+
if to2
|
75
|
+
run "chmod 0644 #{to}"
|
76
|
+
cp to, to2
|
77
|
+
run "rm -f #{to}"
|
78
|
+
end
|
65
79
|
end
|
66
80
|
end
|
67
81
|
|
@@ -74,12 +88,26 @@ module Capsaicin
|
|
74
88
|
end
|
75
89
|
end
|
76
90
|
|
77
|
-
def put(
|
91
|
+
def put(data, path, options={})
|
78
92
|
case _via
|
79
93
|
when :system, :local_run
|
80
94
|
FileUtils::Verbose.copy_stream StringIO.new(from), to
|
81
95
|
else
|
82
|
-
|
96
|
+
if _via.to_s[0,4] == 'sudo'
|
97
|
+
if path[-1]==?/ || path[-1]==?\ || directory?(path)
|
98
|
+
pathf = File.basename from
|
99
|
+
path2, path = "#{path}/#{pathf}", "/tmp/#{pathf}-#{Time.now.utc.to_i}"
|
100
|
+
else
|
101
|
+
pathf = File.basename path
|
102
|
+
path2, path = path, "/tmp/#{pathf}-#{Time.now.utc.to_i}"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
@config.put(data, path, options)
|
106
|
+
if path2
|
107
|
+
run "chmod 0644 #{path}"
|
108
|
+
cp path, path2
|
109
|
+
run "rm -f #{path}"
|
110
|
+
end
|
83
111
|
end
|
84
112
|
end
|
85
113
|
|
@@ -111,6 +139,21 @@ module Capsaicin
|
|
111
139
|
_r 'tar -cjf', Array(src).unshift(dest)
|
112
140
|
end
|
113
141
|
|
142
|
+
def tar_x(dest, options={}, &filter)
|
143
|
+
filter and abort "tar_x: remote mode does not support a filtering proc"
|
144
|
+
_r 'tar -xf', [dest]
|
145
|
+
end
|
146
|
+
|
147
|
+
def tar_xz(dest, options={}, &filter)
|
148
|
+
filter and abort "tar_xz: remote mode does not support a filtering proc"
|
149
|
+
_r 'tar -xzf', [dest]
|
150
|
+
end
|
151
|
+
|
152
|
+
def tar_xj(dest, src, options={}, &filter)
|
153
|
+
filter and abort "tar_xj: remote mode does not support a filtering proc"
|
154
|
+
_r 'tar -xjf', Array(src).unshift(dest)
|
155
|
+
end
|
156
|
+
|
114
157
|
def tar_t(src, options={}, &filter)
|
115
158
|
filter and abort "tar_t: remote mode does not support a filtering proc"
|
116
159
|
_t 'tar -tf', [src]
|
@@ -172,5 +215,3 @@ module Capsaicin
|
|
172
215
|
end
|
173
216
|
end
|
174
217
|
end
|
175
|
-
|
176
|
-
Capistrano.plugin :remote_files, Capsaicin::Files::Remote
|
data/lib/capsaicin/invocation.rb
CHANGED
@@ -2,6 +2,30 @@ module Capsaicin
|
|
2
2
|
|
3
3
|
module Invocation
|
4
4
|
|
5
|
+
# Automatically uses the :run_method variable to run things.
|
6
|
+
# Equivalent to +invoke_command *args, :via=>fetch(:run_method, :run)+
|
7
|
+
def vrun(*args, &block)
|
8
|
+
options = Hash===args.last ? args.pop.dup : {}
|
9
|
+
options[:via] = fetch(:run_method, :run)
|
10
|
+
invoke_command *args.push(options), &block
|
11
|
+
end
|
12
|
+
|
13
|
+
# Automatically uses the :run_method variable to run things.
|
14
|
+
# Equivalent to +capture *args, :via=>fetch(:run_method, :run)+
|
15
|
+
def vcapture(*args, &block)
|
16
|
+
options = Hash===args.last ? args.pop.dup : {}
|
17
|
+
options[:via] = fetch(:run_method, :run)
|
18
|
+
capture *args.push(options), &block
|
19
|
+
end
|
20
|
+
|
21
|
+
# Automatically uses the :run_method variable to run things.
|
22
|
+
# Equivalent to +stream *args, :via=>fetch(:run_method, :run)+
|
23
|
+
def vstream(*args, &block)
|
24
|
+
options = Hash===args.last ? args.pop.dup : {}
|
25
|
+
options[:via] = fetch(:run_method, :run)
|
26
|
+
stream *args.push(options), &block
|
27
|
+
end
|
28
|
+
|
5
29
|
# Capistrano's system() override is only available from the base deployment strategy.
|
6
30
|
# Also, we could do with a few more windows checks.
|
7
31
|
def local_run(*args, &block)
|
@@ -43,6 +67,4 @@ module Capsaicin
|
|
43
67
|
run *args.push(options), &block
|
44
68
|
end
|
45
69
|
end
|
46
|
-
|
47
|
-
Capistrano::Configuration.send :include, Invocation
|
48
70
|
end
|
@@ -14,7 +14,7 @@ module Capsaicin
|
|
14
14
|
|
15
15
|
svc_name = id.to_s
|
16
16
|
svc_desc = next_description(:reset) || (svc_name.capitalize unless options.delete(:hide))
|
17
|
-
extras =
|
17
|
+
extras = options.delete(:extras) || {}
|
18
18
|
via = options.delete(:via)
|
19
19
|
|
20
20
|
namespace id do
|
@@ -29,10 +29,19 @@ module Capsaicin
|
|
29
29
|
send(via || fetch(:run_method, :local_run), stop)
|
30
30
|
end
|
31
31
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
32
|
+
unless extras.key? :restart
|
33
|
+
desc "#{svc_desc}: #{SVC_ACTION_CAPTIONS[:restart]}" if svc_desc
|
34
|
+
task :restart, options do
|
35
|
+
stop
|
36
|
+
start
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
extras.each do |k,cmd|
|
41
|
+
desc "#{svc_desc}: #{SVC_ACTION_CAPTIONS[k]}" if svc_desc
|
42
|
+
task k, options do
|
43
|
+
send(via || fetch(:run_method, :local_run), cmd)
|
44
|
+
end
|
36
45
|
end
|
37
46
|
|
38
47
|
instance_eval { yield } if block_given?
|
data/test/helper.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'stringio'
|
2
|
+
require 'rubygems'
|
3
|
+
require 'capistrano/logger'
|
4
|
+
|
5
|
+
class CapistranoMock
|
6
|
+
|
7
|
+
def logbuf
|
8
|
+
@logbuf ||= StringIO.new
|
9
|
+
end
|
10
|
+
|
11
|
+
def logger
|
12
|
+
if @logger.nil?
|
13
|
+
@logger = Capistrano::Logger.new :output=>logbuf
|
14
|
+
@logger.level = Capistrano::Logger::MAX_LEVEL
|
15
|
+
end
|
16
|
+
@logger
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'helper'
|
3
|
+
require 'tmpdir'
|
4
|
+
require 'capsaicin/files'
|
5
|
+
require 'capsaicin/files/local'
|
6
|
+
|
7
|
+
class TestLocalFiles < Test::Unit::TestCase
|
8
|
+
|
9
|
+
def setup
|
10
|
+
@local = CapistranoMock.new
|
11
|
+
@local.extend Capsaicin::Files::Local
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_exists
|
15
|
+
assert @local.exists?(__FILE__)
|
16
|
+
assert_equal "test -e #{__FILE__}", @local.logbuf.string.strip
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_not_exists
|
20
|
+
assert ! @local.exists?(__FILE__+'/nope')
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_readable
|
24
|
+
assert @local.readable?(__FILE__)
|
25
|
+
assert_equal "test -r #{__FILE__}", @local.logbuf.string.strip
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_not_readable
|
29
|
+
assert ! @local.readable?(__FILE__+'/nope')
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_writable
|
33
|
+
assert @local.writable?(Dir.tmpdir)
|
34
|
+
assert_equal "test -w #{Dir.tmpdir}", @local.logbuf.string.strip
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_not_writable
|
38
|
+
assert ! @local.writable?(__FILE__+'/nope')
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_file
|
42
|
+
assert @local.file?(__FILE__)
|
43
|
+
assert_equal "test -f #{__FILE__}", @local.logbuf.string.strip
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_not_file
|
47
|
+
assert ! @local.file?(__FILE__+'/nope')
|
48
|
+
end
|
49
|
+
|
50
|
+
def test_directory
|
51
|
+
assert @local.directory?(File.dirname(__FILE__))
|
52
|
+
assert_equal "test -d #{File.dirname __FILE__}", @local.logbuf.string.strip
|
53
|
+
end
|
54
|
+
|
55
|
+
def test_not_directory
|
56
|
+
assert ! @local.directory?(__FILE__)
|
57
|
+
end
|
58
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capsaicin
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Joe Khoobyar
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-06-
|
12
|
+
date: 2009-06-06 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -59,6 +59,8 @@ files:
|
|
59
59
|
- lib/capsaicin/service/windows.rb
|
60
60
|
- lib/capsaicin/sys.rb
|
61
61
|
- lib/capsaicin/ui.rb
|
62
|
+
- test/helper.rb
|
63
|
+
- test/test_local_files.rb
|
62
64
|
has_rdoc: true
|
63
65
|
homepage: http://github.com/joekhoobyar/capsaicin
|
64
66
|
licenses: []
|
@@ -87,5 +89,6 @@ rubygems_version: 1.3.4
|
|
87
89
|
signing_key:
|
88
90
|
specification_version: 3
|
89
91
|
summary: Joe Khoobyar's spicy capistrano extensions
|
90
|
-
test_files:
|
91
|
-
|
92
|
+
test_files:
|
93
|
+
- test/helper.rb
|
94
|
+
- test/test_local_files.rb
|