BuildMaster 1.0.9 → 1.1.9

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.
Files changed (76) hide show
  1. data/lib/buildmaster/algorithms.rb +3 -0
  2. data/lib/buildmaster/algorithms/opn_compare.rb +108 -0
  3. data/lib/buildmaster/cotta/cotta_dir.rb +7 -4
  4. data/lib/buildmaster/cotta/cotta_file.rb +5 -2
  5. data/lib/buildmaster/cotta/in_memory_system.rb +28 -4
  6. data/lib/buildmaster/project/java.rb +4 -0
  7. data/lib/buildmaster/project/java/class_path.rb +0 -0
  8. data/lib/buildmaster/project/java/javac.rb +9 -0
  9. data/lib/buildmaster/project/mysql_served_driver.rb +15 -0
  10. data/lib/buildmaster/project/pscp_driver.rb +0 -1
  11. data/lib/buildmaster/project/svn_driver.rb +4 -4
  12. data/lib/buildmaster/project/svn_server_driver.rb +18 -0
  13. data/lib/buildmaster/project/svn_status_info.rb +45 -42
  14. data/lib/buildmaster/site/content_engine_repository.rb +9 -0
  15. data/lib/buildmaster/site/file_processor.rb +5 -1
  16. data/lib/buildmaster/site/site.rb +11 -4
  17. data/lib/buildmaster/site/site_server.rb +1 -1
  18. data/lib/buildmaster/site/templatelets/href.rb +1 -1
  19. data/lib/buildmaster/version +1 -1
  20. data/test/buildmaster/algorithms/tc_opn_compare.rb +44 -0
  21. data/test/buildmaster/common/tc_properties.rb +8 -8
  22. data/test/buildmaster/common/tc_tree_to_object.rb +8 -8
  23. data/test/buildmaster/cotta/cotta_dir_behaviors.rb +167 -0
  24. data/test/buildmaster/cotta/cotta_file_behaviors.rb +127 -0
  25. data/test/buildmaster/cotta/cotta_specifications.rb +20 -0
  26. data/test/buildmaster/cotta/file_system_behaviors.rb +167 -0
  27. data/test/buildmaster/cotta/tc_command_interface.rb +6 -6
  28. data/test/buildmaster/cotta/tc_command_runner.rb +5 -5
  29. data/test/buildmaster/cotta/tc_cotta.rb +12 -12
  30. data/test/buildmaster/cotta/tc_cotta_dir_in_memory.rb +17 -17
  31. data/test/buildmaster/cotta/tc_cotta_dir_physical.rb +5 -5
  32. data/test/buildmaster/cotta/tc_cotta_file_in_memory.rb +8 -9
  33. data/test/buildmaster/cotta/tc_cotta_file_physical.rb +11 -8
  34. data/test/buildmaster/cotta/tc_cotta_zip_support.rb +9 -9
  35. data/test/buildmaster/cotta/tc_in_memory_system.rb +7 -7
  36. data/test/buildmaster/cotta/tc_io_chain.rb +3 -3
  37. data/test/buildmaster/cotta/tc_pathname.rb +6 -6
  38. data/test/buildmaster/cotta/tc_physical_system.rb +7 -8
  39. data/test/buildmaster/project/tc_ant_driver.rb +8 -8
  40. data/test/buildmaster/project/tc_build_number_file.rb +5 -5
  41. data/test/buildmaster/project/tc_cvs_driver.rb +9 -9
  42. data/test/buildmaster/project/tc_java_manifest.rb +9 -11
  43. data/test/buildmaster/project/tc_release.rb +12 -12
  44. data/test/buildmaster/project/tc_server_manager.rb +8 -8
  45. data/test/buildmaster/project/tc_svn_driver.rb +18 -13
  46. data/test/buildmaster/project/tc_svn_status_info.rb +8 -8
  47. data/test/buildmaster/project/tc_version_number_file.rb +6 -6
  48. data/test/buildmaster/project/windows/tc_iis_driver.rb +4 -4
  49. data/test/buildmaster/project/windows/tc_sql_server_driver.rb +2 -2
  50. data/test/buildmaster/site/content/tc_content_engine_repository.rb +5 -5
  51. data/test/buildmaster/site/tc_element_processor_by_name.rb +4 -4
  52. data/test/buildmaster/site/tc_file_processor.rb +8 -9
  53. data/test/buildmaster/site/tc_site.rb +23 -7
  54. data/test/buildmaster/site/tc_site_server.rb +2 -2
  55. data/test/buildmaster/site/tc_site_spec.rb +5 -5
  56. data/test/buildmaster/site/tc_source_file_handler.rb +2 -2
  57. data/test/buildmaster/site/tc_template_builder.rb +22 -11
  58. data/test/buildmaster/site/tc_template_error.rb +2 -2
  59. data/test/buildmaster/site/tc_template_runner.rb +4 -4
  60. data/test/buildmaster/site/tc_templatelets.rb +4 -4
  61. data/test/buildmaster/site/tc_xtemplate.rb +5 -5
  62. data/test/buildmaster/site/templatelets/tc_attribute.rb +6 -6
  63. data/test/buildmaster/site/templatelets/tc_code.rb +10 -10
  64. data/test/buildmaster/site/templatelets/tc_each.rb +3 -3
  65. data/test/buildmaster/site/templatelets/tc_href.rb +7 -7
  66. data/test/buildmaster/site/templatelets/tc_include.rb +3 -3
  67. data/test/buildmaster/site/templatelets/tc_link.rb +6 -6
  68. data/test/buildmaster/site/templatelets/tc_text.rb +4 -4
  69. data/test/buildmaster/site/templatelets/tc_when.rb +4 -4
  70. data/test/tmp/svn_test/repository/db/revprops/0 +1 -1
  71. data/test/tmp/svn_test/repository/db/revprops/1 +1 -1
  72. data/test/tmp/svn_test/repository/db/revprops/2 +1 -1
  73. data/test/tmp/svn_test/repository/db/revprops/3 +1 -1
  74. data/test/tmp/svn_test/repository/db/revprops/4 +1 -1
  75. data/test/tmp/svn_test/repository/db/uuid +1 -1
  76. metadata +60 -46
@@ -37,6 +37,8 @@ def register_cotta_file_specifications
37
37
  specify 'file should support stat' do
38
38
  @file.save('test')
39
39
  @file.stat.should_not_be_nil
40
+ @file.stat.size.should == 4
41
+ @file.stat.writable?.should == true
40
42
  end
41
43
 
42
44
  specify 'should raise error if does not exist' do
@@ -108,6 +110,15 @@ def register_cotta_file_specifications
108
110
  lambda {@file.delete}.should_raise Errno::ENOENT
109
111
  end
110
112
 
113
+ specify 'should check timestamp to see which one is older' do
114
+ @file.save
115
+ file2 = @file.parent.file('another.txt')
116
+ sleep 1
117
+ file2.save
118
+ @file.older_than?(file2).should == true
119
+ file2.older_than?(@file).should == false
120
+ end
121
+
111
122
  end
112
123
 
113
124
  def register_cotta_dir_specifications
@@ -249,6 +260,15 @@ def register_cotta_dir_specifications
249
260
  dir = BuildMaster::CottaDir.new(@system, Pathname.new('no/such/directory'))
250
261
  Proc.new {dir.list}.should_raise Errno::ENOENT
251
262
  end
263
+
264
+ specify 'allow filter for archive' do
265
+ @dir.file('in/in.txt').save('test')
266
+ @dir.file('out/out.txt').save('test')
267
+ result = @dir.archive {|entry| entry.name != 'out'}
268
+ target = result.extract(@dir.dir('extract'))
269
+ target.dir('out').should_not_be_exist
270
+ target.dir('in').should_be_exist
271
+ end
252
272
 
253
273
  end
254
274
 
@@ -0,0 +1,167 @@
1
+ $:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib', 'buildmaster')
2
+
3
+ require 'cotta'
4
+ require 'pathname'
5
+ require 'spec'
6
+
7
+ module BuildMaster
8
+ describe 'FileSystemBehaviors', :shared=>true do
9
+ before do
10
+ create_system
11
+ end
12
+
13
+ it 'current directory always exists' do
14
+ @system.dir_exists?(Pathname.new('.')).should == true
15
+ end
16
+
17
+ it 'mkdir should create directory' do
18
+ pathname = Pathname.new('/one')
19
+ @system.dir_exists?(pathname).should == false
20
+ @system.mkdir(pathname)
21
+ @system.dir_exists?(pathname).should == true
22
+ end
23
+
24
+ it 'mkdir raise error if dir already exists' do
25
+ pathname = Pathname.new('/one')
26
+ @system.mkdir(pathname)
27
+ lambda {
28
+ @system.mkdir
29
+ }.should raise_error(StandardError)
30
+ end
31
+
32
+ it 'io returns IO handle' do
33
+ pathname = Pathname.new('file.txt')
34
+ @system.file_exists?(pathname).should == false
35
+ write_io = load_io(pathname, 'w')
36
+ write_io.puts 'content'
37
+ write_io.close
38
+ @system.file_exists?(pathname).should == true
39
+ read_io = load_io(pathname, 'r')
40
+ read_io.gets.should == "content\n"
41
+ read_io.close
42
+ @system.delete_file(pathname)
43
+ end
44
+
45
+ it 'file creation should leave file system consistent' do
46
+ pathname = Pathname.new('dir/sub/file.txt')
47
+ @system.mkdir(pathname.parent.parent)
48
+ @system.mkdir(pathname.parent)
49
+ @system.file_exists?(pathname).should == false
50
+ @system.dir_exists?(pathname.parent).should == true
51
+ load_io(pathname, 'w').close
52
+ @system.file_exists?(pathname).should == true
53
+ @system.dir_exists?(pathname).should == false
54
+ @system.dir_exists?(pathname.parent).should == true
55
+ children = @system.list(pathname.parent)
56
+ children.size.should == 1
57
+ children[0].should == pathname.basename.to_s
58
+ end
59
+
60
+ it 'directory creation should leave file system consistent' do
61
+ pathname = Pathname.new('root/dir/sub')
62
+ @system.dir_exists?(pathname).should == false
63
+ @system.file_exists?(pathname).should == false
64
+ @system.dir_exists?(pathname.parent).should == false
65
+ @system.mkdir(pathname.parent.parent)
66
+ @system.mkdir(pathname.parent)
67
+ @system.mkdir(pathname)
68
+ @system.dir_exists?(pathname).should == true
69
+ @system.file_exists?(pathname).should == false
70
+ @system.dir_exists?(pathname.parent).should == true
71
+ list = @system.list(pathname.parent)
72
+ list.size.should == 1
73
+ list[0].should ==(pathname.basename.to_s)
74
+ end
75
+
76
+ it 'read io should raise error if file does not exists' do
77
+ pathname = Pathname.new('dir/file.txt')
78
+ Proc.new {
79
+ @system.io(pathname, 'r')
80
+ }.should raise_error(Errno::ENOENT)
81
+ end
82
+
83
+ it 'delete dir' do
84
+ pathname = Pathname.new('dir')
85
+ @system.mkdir(pathname)
86
+ @system.delete_dir(pathname)
87
+ @system.dir_exists?(pathname).should == false
88
+ end
89
+
90
+ it 'deleting dir that does not exist should raise error' do
91
+ pathname = Pathname.new('dir/dir2')
92
+ Proc.new {
93
+ @system.delete_dir(pathname)
94
+ }.should raise_error(Errno::ENOENT)
95
+ end
96
+
97
+ it 'copy file' do
98
+ pathname = Pathname.new('file1')
99
+ write_io = load_io(pathname, 'w')
100
+ write_io.puts 'line'
101
+ write_io.close
102
+ target = Pathname.new('target')
103
+ @system.copy_file(pathname, target)
104
+ @system.file_exists?(target).should == true
105
+ read_io = load_io(target, 'r')
106
+ read_io.gets.should == "line\n"
107
+ read_io.close
108
+ end
109
+
110
+ it 'move file' do
111
+ pathname = Pathname.new('file1')
112
+ write_content(pathname, 'line')
113
+ target = Pathname.new('target')
114
+ @system.move_file(pathname, target)
115
+ @system.file_exists?(target).should == true
116
+ read_io = load_io(target, 'r')
117
+ read_io.gets.should == "line\n"
118
+ read_io.close
119
+ @system.file_exists?(pathname).should == false
120
+ end
121
+
122
+ it 'move dir' do
123
+ source = Pathname.new('source')
124
+ @system.mkdir source
125
+ source_file = Pathname.new('source/file.txt')
126
+ write_content(source_file, 'file.txt')
127
+ @system.mkdir source.join('subdir')
128
+ target = Pathname.new('target')
129
+ @system.move_dir(source, target)
130
+ @system.list(target).size.should == 2
131
+ @system.dir_exists?(source).should == false
132
+ @system.dir_exists?(target).should == true
133
+ @system.file_exists?(Pathname.new('target/file.txt')).should == true
134
+ @system.dir_exists?(Pathname.new('target/subdir')).should == true
135
+ end
136
+
137
+ it 'copy dir' do
138
+ source = Pathname.new('source')
139
+ @system.mkdir source
140
+ source_file = Pathname.new('source/file.txt')
141
+ write_content(source_file, 'file.txt')
142
+ @system.mkdir source.join('subdir')
143
+ target = Pathname.new('target')
144
+ @system.copy_dir(source, target)
145
+ @system.list(target).size.should == 2
146
+ @system.dir_exists?(source).should == true
147
+ @system.dir_exists?(target).should == true
148
+ @system.file_exists?(Pathname.new('target/file.txt')).should == true
149
+ end
150
+
151
+ def write_content(pathname, content)
152
+ write_io = load_io(pathname, 'w')
153
+ write_io.puts content
154
+ write_io.close
155
+ end
156
+
157
+ def load_io(*args)
158
+ io = @system.io(*args)
159
+ if (io)
160
+ @ios.push(io)
161
+ else
162
+ raise "IO is null for: #{args}"
163
+ end
164
+ return io
165
+ end
166
+ end
167
+ end
@@ -5,15 +5,15 @@ $:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib', 'buildmast
5
5
  require 'cotta/command_interface'
6
6
 
7
7
  module BuildMaster
8
- context 'command line interface' do
9
- specify 'delegate output to io' do
8
+ describe CommandInterface do
9
+ it 'delegate output to io' do
10
10
  io = mock('io')
11
11
  io.should_receive(:puts).with('content to output')
12
12
  interface = CommandInterface.new(io)
13
13
  interface.puts('content to output')
14
14
  end
15
15
 
16
- specify 'prompt outputs a message and get the response from io' do
16
+ it 'prompt outputs a message and get the response from io' do
17
17
  io = mock('io')
18
18
  io.should_receive(:puts).with('question')
19
19
  io.should_receive(:gets).and_return('answer')
@@ -22,7 +22,7 @@ context 'command line interface' do
22
22
  actual.should == 'answer'
23
23
  end
24
24
 
25
- specify 'prompt for choice' do
25
+ it 'prompt for choice' do
26
26
  io = mock('io')
27
27
  io.should_receive(:puts).once.with('select one of the following')
28
28
  io.should_receive(:puts).once.with('[1] item one')
@@ -33,14 +33,14 @@ context 'command line interface' do
33
33
  actual.should == 'item two'
34
34
  end
35
35
 
36
- specify 'prompt for choice returns nil for invalid choice' do
36
+ it 'prompt for choice returns nil for invalid choice' do
37
37
  io = mock('io')
38
38
  io.should_receive(:puts).with('select one')
39
39
  io.should_receive(:puts).exactly(2).times
40
40
  io.should_receive(:gets).and_return('9')
41
41
  interface = CommandInterface.new(io)
42
42
  actual = interface.prompt_for_choice('select one', ['one', 'two'])
43
- actual.should_be_nil
43
+ actual.should be_nil
44
44
  end
45
45
  end
46
46
  end
@@ -5,18 +5,18 @@ require 'cotta/command_runner'
5
5
  require 'cotta/command_error'
6
6
 
7
7
  module BuildMaster
8
- context 'command runner' do
9
- specify 'return content' do
8
+ describe CommandRunner do
9
+ it 'return content' do
10
10
  runner = CommandRunner.new('ruby --version')
11
11
  runner.execute[0..3].should == 'ruby'
12
12
  end
13
13
 
14
- specify 'raise error on abnormal exits' do
14
+ it 'raise error on abnormal exits' do
15
15
  runner = CommandRunner.new('ruby ----')
16
- Proc.new{runner.execute}.should_raise CommandError
16
+ Proc.new{runner.execute}.should raise_error(CommandError)
17
17
  end
18
18
 
19
- specify 'take closure as io processor' do
19
+ it 'take closure as io processor' do
20
20
  runner = CommandRunner.new('echo test')
21
21
  message_logged = nil
22
22
  runner.execute {|io| message_logged = io.gets}
@@ -7,14 +7,14 @@ require 'cotta/in_memory_system'
7
7
 
8
8
  module BuildMaster
9
9
 
10
- context 'Cotta' do
11
- setup do
10
+ describe 'Cotta' do
11
+ before do
12
12
  # Given
13
13
  @system = InMemorySystem.new
14
14
  @cotta = Cotta.new(@system)
15
15
  end
16
16
 
17
- specify 'shell out command to system' do
17
+ it 'shell out command to system' do
18
18
  # Given
19
19
  # When
20
20
  @system.output_for_command('shell command', 'test')
@@ -24,32 +24,32 @@ context 'Cotta' do
24
24
  @system.executed_commands[0].should == 'shell command'
25
25
  end
26
26
 
27
- specify 'instantiate dir from cotta' do
27
+ it 'instantiate dir from cotta' do
28
28
  dir = @cotta.dir('dirname')
29
29
  dir.name.should == 'dirname'
30
30
  end
31
31
 
32
- specify 'instantiate file from cotta' do
32
+ it 'instantiate file from cotta' do
33
33
  file = @cotta.file('one/two/three.txt')
34
34
  file.name.should == 'three.txt'
35
35
  file.parent.name.should == 'two'
36
36
  end
37
37
 
38
- specify 'entry creates file or directory based on which one exists' do
38
+ it 'entry creates file or directory based on which one exists' do
39
39
  @cotta.file('file').save
40
40
  @cotta.dir('dir').mkdirs
41
41
  @cotta.entry('file').exists?.should == true
42
42
  @cotta.entry('dir').exists?.should == true
43
43
  end
44
44
 
45
- specify 'nil in, nil out' do
46
- @cotta.file(nil).should_be nil
47
- @cotta.dir(nil).should_be nil
48
- Cotta.file(nil).should_be nil
49
- Cotta.dir(nil).should_be nil
45
+ it 'nil in, nil out' do
46
+ @cotta.file(nil).should be_nil
47
+ @cotta.dir(nil).should be_nil
48
+ Cotta.file(nil).should be_nil
49
+ Cotta.dir(nil).should be_nil
50
50
  end
51
51
 
52
- specify 'create parent directory directly from __FILE__' do
52
+ it 'create parent directory directly from __FILE__' do
53
53
  actual = BuildMaster::Cotta.parent_of(__FILE__)
54
54
  actual.name.should == 'cotta'
55
55
  end
@@ -1,6 +1,6 @@
1
1
  $:.unshift File.dirname(__FILE__)
2
2
 
3
- require 'cotta_specifications'
3
+ require 'cotta_dir_behaviors'
4
4
 
5
5
  $:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib', 'buildmaster')
6
6
 
@@ -8,21 +8,21 @@ require 'spec'
8
8
  require 'cotta/in_memory_system'
9
9
 
10
10
  module BuildMaster
11
- context 'Directory object with cotta for in memory system' do
12
- extend CottaSpecifications
13
- setup do
14
- @system = InMemorySystem.new
15
- end
16
-
17
- specify 'dir should not be equal if system different' do
18
- (BuildMaster::CottaDir.new(InMemorySystem.new, Pathname.new('dir')) == @dir).should == false
19
- end
20
-
21
- specify 'to_s and inspect' do
22
- file = CottaFile.new(@system, '/one/two/file.txt')
23
- "#{file.to_s}".should == '/one/two/file.txt'
24
- end
11
+ describe InMemorySystem, 'with Cotta Dir' do
12
+ it_should_behave_like 'CottaDirBehaviors'
13
+
14
+ def create_system
15
+ @system = InMemorySystem.new
16
+ end
25
17
 
26
- register_cotta_dir_specifications
27
- end
18
+ it 'dir should not be equal if system different' do
19
+ (BuildMaster::CottaDir.new(InMemorySystem.new, Pathname.new('dir')) == @dir).should == false
20
+ end
21
+
22
+ it 'to_s and inspect' do
23
+ file = CottaFile.new(@system, '/one/two/file.txt')
24
+ "#{file.to_s}".should == '/one/two/file.txt'
25
+ end
26
+
27
+ end
28
28
  end
@@ -1,17 +1,17 @@
1
1
  $:.unshift File.join(File.dirname(__FILE__))
2
2
 
3
- require 'cotta_specifications'
3
+ require 'cotta_dir_behaviors'
4
4
  require 'physical_system_stub'
5
5
 
6
6
  require 'spec'
7
7
 
8
8
  module BuildMaster
9
- context 'Directory object with cotta for physical system' do
10
- extend CottaSpecifications
11
- setup do
9
+ describe PhysicalSystem, 'work with CottaDir' do
10
+ it_should_behave_like 'CottaDirBehaviors'
11
+
12
+ def create_system
12
13
  @system = PhysicalSystemStub.new
13
14
  end
14
15
 
15
- register_cotta_dir_specifications
16
16
  end
17
17
  end
@@ -1,20 +1,19 @@
1
1
  $:.unshift File.dirname(__FILE__)
2
2
 
3
- require 'cotta_specifications'
4
3
  require 'spec'
4
+ require 'cotta_file_behaviors'
5
5
 
6
6
  $:.unshift File.join(File.dirname(__FILE__), '..', '..', '..', 'lib', 'buildmaster')
7
7
 
8
8
  require 'cotta/in_memory_system'
9
9
 
10
10
  module BuildMaster
11
- context 'Cotta file' do
12
- extend CottaSpecifications
13
- setup do
14
- @system = InMemorySystem.new
15
- end
16
-
17
- register_cotta_file_specifications
11
+ describe InMemorySystem, 'with cotta file' do
12
+ it_should_behave_like 'CottaFileBehaviors'
13
+
14
+ def create_system
15
+ @system = InMemorySystem.new
16
+ end
18
17
 
19
- end
18
+ end
20
19
  end
@@ -1,19 +1,22 @@
1
1
  $:.unshift File.dirname(__FILE__)
2
2
 
3
3
  require 'spec'
4
- require 'cotta_specifications'
4
+ require 'cotta_file_behaviors'
5
5
  require 'physical_system_stub'
6
6
 
7
7
  module BuildMaster
8
- context 'Cotta file with physical systeme' do
9
- extend CottaSpecifications
10
- setup do
8
+ describe PhysicalSystem, 'with cotta file' do
9
+ it_should_behave_like 'CottaFileBehaviors'
10
+
11
+ def create_system
11
12
  @system = PhysicalSystemStub.new
12
13
  end
13
-
14
- register_cotta_file_specifications
15
14
 
16
- specify 'copying binary files properly' do
15
+ before do
16
+ create_system unless @system
17
+ end
18
+
19
+ it 'copying binary files properly' do
17
20
  logo_gif = Cotta.parent_of(__FILE__).file('logo.gif')
18
21
  content = logo_gif.read_binary {|io| io.read}
19
22
  target = CottaFile.new(@system, Pathname.new('dir/logo.gif'))
@@ -26,7 +29,7 @@ context 'Cotta file with physical systeme' do
26
29
  actual_stat.size.should == expected_stat.size
27
30
  end
28
31
 
29
- specify 'zip and unzip' do
32
+ it 'zip and unzip' do
30
33
  logo_gif = Cotta.parent_of(__FILE__).file('logo.gif')
31
34
  content = logo_gif.read_binary {|io| io.read}
32
35
  dir = CottaDir.new(@system, Pathname.new('dir'))