vlad 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +26 -1
- data/Manifest.txt +4 -1
- data/README.txt +9 -12
- data/Rakefile +26 -2
- data/doco/faq.txt +75 -0
- data/doco/getting_started.txt +18 -4
- data/doco/migration.txt +22 -0
- data/doco/variables.txt +38 -6
- data/lib/rake_remote_task.rb +274 -134
- data/lib/vlad.rb +62 -51
- data/lib/vlad/apache.rb +37 -0
- data/lib/{vlad_tasks.rb → vlad/core.rb} +21 -135
- data/lib/vlad/mongrel.rb +65 -0
- data/lib/vlad/perforce.rb +5 -9
- data/lib/vlad/subversion.rb +8 -4
- data/test/test_rake_remote_task.rb +6 -1
- data/test/test_vlad.rb +8 -16
- data/test/test_vlad_perforce.rb +0 -1
- data/test/test_vlad_subversion.rb +2 -1
- data/test/vlad_test_case.rb +17 -7
- metadata +9 -5
data/lib/vlad/perforce.rb
CHANGED
@@ -1,18 +1,14 @@
|
|
1
1
|
class Vlad::Perforce
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
set :p4config, ".p4config" unless respond_to? :p4config
|
6
|
-
end
|
7
|
-
|
8
|
-
reset
|
3
|
+
set :p4_cmd, "p4"
|
4
|
+
set :source, Vlad::Perforce.new
|
9
5
|
|
10
6
|
##
|
11
7
|
# Returns the p4 command that will checkout +revision+ into the directory
|
12
8
|
# +destination+.
|
13
9
|
|
14
10
|
def checkout(revision, destination)
|
15
|
-
"#{
|
11
|
+
"#{p4_cmd} sync ...#{rev_no(revision)}"
|
16
12
|
end
|
17
13
|
|
18
14
|
##
|
@@ -21,7 +17,7 @@ class Vlad::Perforce
|
|
21
17
|
|
22
18
|
def export(revision_or_source, destination)
|
23
19
|
if revision_or_source =~ /^(\d+|head)$/i then
|
24
|
-
"(cd #{destination} && #{
|
20
|
+
"(cd #{destination} && #{p4_cmd} sync ...#{rev_no(revision_or_source)})"
|
25
21
|
else
|
26
22
|
"cp -r #{revision_or_source} #{destination}"
|
27
23
|
end
|
@@ -32,7 +28,7 @@ class Vlad::Perforce
|
|
32
28
|
# into a Perforce revision specification.
|
33
29
|
|
34
30
|
def revision(revision)
|
35
|
-
"`#{
|
31
|
+
"`#{p4_cmd} changes -s submitted -m 1 ...#{rev_no(revision)} | cut -f 2 -d\\ `"
|
36
32
|
end
|
37
33
|
|
38
34
|
##
|
data/lib/vlad/subversion.rb
CHANGED
@@ -1,11 +1,14 @@
|
|
1
1
|
class Vlad::Subversion
|
2
2
|
|
3
|
+
set :source, Vlad::Subversion.new
|
4
|
+
set :svn_cmd, "svn"
|
5
|
+
|
3
6
|
##
|
4
7
|
# Returns the command that will check out +revision+ from the repository
|
5
8
|
# into directory +destination+
|
6
9
|
|
7
10
|
def checkout(revision, destination)
|
8
|
-
"
|
11
|
+
"#{svn_cmd} co -r #{revision} #{repository} #{destination}"
|
9
12
|
end
|
10
13
|
|
11
14
|
##
|
@@ -14,9 +17,9 @@ class Vlad::Subversion
|
|
14
17
|
|
15
18
|
def export(revision_or_source, destination)
|
16
19
|
if revision_or_source =~ /^(\d+|head)$/i then
|
17
|
-
"
|
20
|
+
"#{svn_cmd} export -r #{revision_or_source} #{repository} #{destination}"
|
18
21
|
else
|
19
|
-
"
|
22
|
+
"#{svn_cmd} export #{revision_or_source} #{destination}"
|
20
23
|
end
|
21
24
|
end
|
22
25
|
|
@@ -25,6 +28,7 @@ class Vlad::Subversion
|
|
25
28
|
# into a subversion revision specification.
|
26
29
|
|
27
30
|
def revision(revision)
|
28
|
-
"
|
31
|
+
"`#{svn_cmd} info #{repository} | grep 'Revision:' | cut -f2 -d\\ `"
|
29
32
|
end
|
30
33
|
end
|
34
|
+
|
@@ -135,7 +135,12 @@ class TestRakeRemoteTask < VladTestCase
|
|
135
135
|
commands.first
|
136
136
|
|
137
137
|
assert_equal "my password\n", @task.input.string
|
138
|
-
|
138
|
+
|
139
|
+
# WARN: Technically incorrect, the password line should be
|
140
|
+
# first... this is an artifact of changes to the IO code in run
|
141
|
+
# and the fact that we have a very simplistic (non-blocking)
|
142
|
+
# testing model.
|
143
|
+
assert_equal "file1\nfile2\nPassword:\n", result
|
139
144
|
|
140
145
|
assert_equal "file1\nfile2\n", out.read
|
141
146
|
assert_equal "Password:\n", err.read
|
data/test/test_vlad.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'test/vlad_test_case'
|
2
2
|
require 'vlad'
|
3
3
|
|
4
|
+
$TESTING = true
|
5
|
+
|
4
6
|
class TestVlad < VladTestCase
|
5
7
|
def test_all_hosts
|
6
8
|
util_set_hosts
|
@@ -66,8 +68,10 @@ class TestVlad < VladTestCase
|
|
66
68
|
end
|
67
69
|
|
68
70
|
def test_initialize
|
69
|
-
|
71
|
+
@vlad.set_defaults # ensure these three are virginal
|
70
72
|
assert_raise(Vlad::ConfigurationError) { @vlad.repository }
|
73
|
+
assert_raise(Vlad::ConfigurationError) { @vlad.deploy_to }
|
74
|
+
assert_raise(Vlad::ConfigurationError) { @vlad.domain }
|
71
75
|
end
|
72
76
|
|
73
77
|
def test_role
|
@@ -156,21 +160,6 @@ class TestVlad < VladTestCase
|
|
156
160
|
assert_equal %w[master], task.target_hosts
|
157
161
|
end
|
158
162
|
|
159
|
-
def test_source
|
160
|
-
set :scm, :perforce
|
161
|
-
assert_equal "Vlad::Perforce", @vlad.source.class.name
|
162
|
-
end
|
163
|
-
|
164
|
-
def test_source_default
|
165
|
-
assert_equal "Vlad::Subversion", @vlad.source.class.name
|
166
|
-
end
|
167
|
-
|
168
|
-
def test_source_singleton
|
169
|
-
s1 = @vlad.source
|
170
|
-
s2 = @vlad.source
|
171
|
-
assert_equal s1.object_id, s2.object_id
|
172
|
-
end
|
173
|
-
|
174
163
|
def test_set
|
175
164
|
set :test, 5
|
176
165
|
assert_equal 5, @vlad.test
|
@@ -212,8 +201,11 @@ class TestVlad < VladTestCase
|
|
212
201
|
end
|
213
202
|
|
214
203
|
def test_set_with_reserved_name
|
204
|
+
$TESTING = false
|
215
205
|
e = assert_raise(ArgumentError) { set(:all_hosts, []) }
|
216
206
|
assert_equal "cannot set reserved name: 'all_hosts'", e.message
|
207
|
+
ensure
|
208
|
+
$TESTING = true
|
217
209
|
end
|
218
210
|
end
|
219
211
|
|
data/test/test_vlad_perforce.rb
CHANGED
@@ -2,8 +2,9 @@ require 'test/vlad_test_case'
|
|
2
2
|
require 'vlad'
|
3
3
|
require 'vlad/subversion'
|
4
4
|
|
5
|
-
class TestVladSubversion <
|
5
|
+
class TestVladSubversion < VladTestCase
|
6
6
|
def setup
|
7
|
+
super
|
7
8
|
@scm = Vlad::Subversion.new
|
8
9
|
set :repository, "svn+ssh://repo/myproject"
|
9
10
|
end
|
data/test/vlad_test_case.rb
CHANGED
@@ -6,6 +6,18 @@ class StringIO
|
|
6
6
|
def readpartial(size) read end # suck!
|
7
7
|
end
|
8
8
|
|
9
|
+
module Process
|
10
|
+
def self.expected status
|
11
|
+
@@expected ||= []
|
12
|
+
@@expected << status
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.waitpid2(pid)
|
16
|
+
[ @@expected.shift ]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
9
21
|
class Rake::RemoteTask
|
10
22
|
attr_accessor :commands, :action, :input, :output, :error
|
11
23
|
|
@@ -27,10 +39,12 @@ class Rake::RemoteTask
|
|
27
39
|
out = StringIO.new @output.shift.to_s
|
28
40
|
err = StringIO.new @error.shift.to_s
|
29
41
|
|
30
|
-
|
42
|
+
raise if block_given?
|
31
43
|
|
32
44
|
status = self.action ? self.action[command.join(' ')] : 0
|
33
|
-
Status.new
|
45
|
+
Process.expected Status.new(status)
|
46
|
+
|
47
|
+
return 42, @input, out, err
|
34
48
|
end
|
35
49
|
|
36
50
|
def select reads, writes, errs, timeout
|
@@ -44,16 +58,12 @@ class VladTestCase < Test::Unit::TestCase
|
|
44
58
|
|
45
59
|
def setup
|
46
60
|
@vlad = Rake::RemoteTask
|
61
|
+
@vlad.reset
|
47
62
|
Rake.application.clear
|
48
63
|
@task_count = Rake.application.tasks.size
|
49
64
|
@vlad.set :domain, "example.com"
|
50
65
|
end
|
51
66
|
|
52
|
-
def teardown
|
53
|
-
@vlad.env.keys.each { |k| Object.send(:remove_method, k) if @vlad.respond_to?(k) }
|
54
|
-
@vlad.reset
|
55
|
-
end
|
56
|
-
|
57
67
|
def util_set_hosts
|
58
68
|
@vlad.host "app.example.com", :app
|
59
69
|
@vlad.host "db.example.com", :db
|
metadata
CHANGED
@@ -3,15 +3,15 @@ rubygems_version: 0.9.4
|
|
3
3
|
specification_version: 1
|
4
4
|
name: vlad
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.
|
7
|
-
date: 2007-
|
8
|
-
summary:
|
6
|
+
version: 1.1.0
|
7
|
+
date: 2007-09-12 00:00:00 -07:00
|
8
|
+
summary: Vlad the Deployer is pragmatic application deployment automation, without mercy. Much like Capistrano, but with 1/10th the complexity. Vlad integrates seamlessly with Rake, and uses familiar and standard tools like ssh and rsync.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
11
|
email: ryand-ruby@zenspider.com
|
12
12
|
homepage: http://rubyhitsquad.com/
|
13
13
|
rubyforge_project: hitsquad
|
14
|
-
description: "Vlad the Deployer is pragmatic application deployment automation, without mercy. Much like Capistrano, but with 1/10th the complexity. Vlad integrates seamlessly with Rake, and uses familiar and standard tools like ssh and rsync. Impale your application on the heartless spike of the Deployer. == FEATURES/PROBLEMS: * Full deployment automation stack. * Supports single server deployment with just
|
14
|
+
description: "Vlad the Deployer is pragmatic application deployment automation, without mercy. Much like Capistrano, but with 1/10th the complexity. Vlad integrates seamlessly with Rake, and uses familiar and standard tools like ssh and rsync. Impale your application on the heartless spike of the Deployer. == FEATURES/PROBLEMS: * Full deployment automation stack. * Turnkey deployment for mongrel+apache+svn. * Supports single server deployment with just 3 variables defined. * Built on rake. Easy. Engine is small. * Very few dependencies. All simple. * Uses ssh with your ssh settings already in place. * Uses rsync for efficient transfers. * Run remote commands on one or more servers. * Mix and match local and remote tasks. * Compatible with all of your tab completion shell script rake-tastic goodness. * Ships with tests that actually pass in 0.028 seconds! * Does NOT support Windows right now (we think). Coming soon in 1.2."
|
15
15
|
autorequire:
|
16
16
|
default_executable:
|
17
17
|
bindir: bin
|
@@ -36,15 +36,18 @@ files:
|
|
36
36
|
- README.txt
|
37
37
|
- Rakefile
|
38
38
|
- considerations.txt
|
39
|
+
- doco/faq.txt
|
39
40
|
- doco/getting_started.txt
|
40
41
|
- doco/migration.txt
|
41
42
|
- doco/perforce.txt
|
42
43
|
- doco/variables.txt
|
43
44
|
- lib/rake_remote_task.rb
|
44
45
|
- lib/vlad.rb
|
46
|
+
- lib/vlad/apache.rb
|
47
|
+
- lib/vlad/core.rb
|
48
|
+
- lib/vlad/mongrel.rb
|
45
49
|
- lib/vlad/perforce.rb
|
46
50
|
- lib/vlad/subversion.rb
|
47
|
-
- lib/vlad_tasks.rb
|
48
51
|
- test/test_rake_remote_task.rb
|
49
52
|
- test/test_vlad.rb
|
50
53
|
- test/test_vlad_perforce.rb
|
@@ -63,6 +66,7 @@ extra_rdoc_files:
|
|
63
66
|
- Manifest.txt
|
64
67
|
- README.txt
|
65
68
|
- considerations.txt
|
69
|
+
- doco/faq.txt
|
66
70
|
- doco/getting_started.txt
|
67
71
|
- doco/migration.txt
|
68
72
|
- doco/perforce.txt
|