whisk_deploy 0.6.26

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 (177) hide show
  1. data/CHANGELOG +292 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.integration_specs +24 -0
  4. data/README.markdown +832 -0
  5. data/Rakefile +105 -0
  6. data/VERSION +1 -0
  7. data/WHY.txt +45 -0
  8. data/bin/wd +61 -0
  9. data/bin/wd_role +42 -0
  10. data/examples/deploy-configs.yml +13 -0
  11. data/examples/deploy-local.yml +4 -0
  12. data/examples/deploy-multiple-remotes.yml +26 -0
  13. data/examples/deploy-staging.yml +8 -0
  14. data/examples/deploy.rake +11 -0
  15. data/examples/deploy.yml +16 -0
  16. data/init.rb +1 -0
  17. data/install.rb +5 -0
  18. data/lib/whiskey_disk.rb +327 -0
  19. data/lib/whiskey_disk/config.rb +127 -0
  20. data/lib/whiskey_disk/config/abstract_filter.rb +19 -0
  21. data/lib/whiskey_disk/config/filter.rb +48 -0
  22. data/lib/whiskey_disk/config/filters/add_environment_name_filter.rb +11 -0
  23. data/lib/whiskey_disk/config/filters/add_project_name_filter.rb +11 -0
  24. data/lib/whiskey_disk/config/filters/check_for_duplicate_domains_filter.rb +21 -0
  25. data/lib/whiskey_disk/config/filters/convert_role_strings_to_list_filter.rb +20 -0
  26. data/lib/whiskey_disk/config/filters/default_config_target_filter.rb +12 -0
  27. data/lib/whiskey_disk/config/filters/default_domain_filter.rb +12 -0
  28. data/lib/whiskey_disk/config/filters/drop_empty_domain_roles_filter.rb +32 -0
  29. data/lib/whiskey_disk/config/filters/environment_scope_filter.rb +20 -0
  30. data/lib/whiskey_disk/config/filters/hashify_domain_entries_filter.rb +29 -0
  31. data/lib/whiskey_disk/config/filters/localize_domains_filter.rb +24 -0
  32. data/lib/whiskey_disk/config/filters/modules/scope_helper.rb +11 -0
  33. data/lib/whiskey_disk/config/filters/normalize_ssh_options_filter.rb +29 -0
  34. data/lib/whiskey_disk/config/filters/project_scope_filter.rb +34 -0
  35. data/lib/whiskey_disk/config/filters/select_project_and_environment_filter.rb +12 -0
  36. data/lib/whiskey_disk/config/filters/stringify_hash_keys_filter.rb +25 -0
  37. data/lib/whiskey_disk/helpers.rb +50 -0
  38. data/lib/whiskey_disk/rake.rb +47 -0
  39. data/scenarios/git_repositories/config.git/HEAD +1 -0
  40. data/scenarios/git_repositories/config.git/config +5 -0
  41. data/scenarios/git_repositories/config.git/description +1 -0
  42. data/scenarios/git_repositories/config.git/git-daemon-export-ok +0 -0
  43. data/scenarios/git_repositories/config.git/hooks/applypatch-msg.sample +15 -0
  44. data/scenarios/git_repositories/config.git/hooks/commit-msg.sample +24 -0
  45. data/scenarios/git_repositories/config.git/hooks/post-commit.sample +8 -0
  46. data/scenarios/git_repositories/config.git/hooks/post-receive.sample +15 -0
  47. data/scenarios/git_repositories/config.git/hooks/post-update.sample +8 -0
  48. data/scenarios/git_repositories/config.git/hooks/pre-applypatch.sample +14 -0
  49. data/scenarios/git_repositories/config.git/hooks/pre-commit.sample +46 -0
  50. data/scenarios/git_repositories/config.git/hooks/pre-rebase.sample +169 -0
  51. data/scenarios/git_repositories/config.git/hooks/prepare-commit-msg.sample +36 -0
  52. data/scenarios/git_repositories/config.git/hooks/update.sample +128 -0
  53. data/scenarios/git_repositories/config.git/info/exclude +6 -0
  54. data/scenarios/git_repositories/config.git/objects/0d/b14dd6ddc54017c0a11960dcda82ed802cde69 +0 -0
  55. data/scenarios/git_repositories/config.git/objects/0e/e781f5ce80d64db32a74a7aae7b5248dafe112 +3 -0
  56. data/scenarios/git_repositories/config.git/objects/17/6bf54cf17d1d1c24556dc059c4144a5df230e8 +0 -0
  57. data/scenarios/git_repositories/config.git/objects/20/e9ff3feaa8ede30f707e5f1b4356e3c02bb7ec +0 -0
  58. data/scenarios/git_repositories/config.git/objects/45/117b1c775f0de415478dbf08ed9d667ab17d13 +0 -0
  59. data/scenarios/git_repositories/config.git/objects/51/3954c9aca090e6ce40359f0e9fde30ea78eb8c +0 -0
  60. data/scenarios/git_repositories/config.git/objects/66/947a7a11a6f5d3d561fe95de284ced3010819a +0 -0
  61. data/scenarios/git_repositories/config.git/objects/6b/bc79311bfac47d3ed724aa82a4814e0dda4c67 +0 -0
  62. data/scenarios/git_repositories/config.git/objects/71/eb5df52676e8e6efba471050b46978173af110 +1 -0
  63. data/scenarios/git_repositories/config.git/objects/84/17d2fe3e8fcc0825249c517b29b0f9ea8b8b31 +2 -0
  64. data/scenarios/git_repositories/config.git/objects/8b/384fcfcf7c0dee7c3c1d5636bee9e645d9cf38 +0 -0
  65. data/scenarios/git_repositories/config.git/objects/bb/59da633ba74296b0c2f9ff70784ac155ddb599 +0 -0
  66. data/scenarios/git_repositories/config.git/objects/cc/b86b26189afbf45d8eb9165812ab86dbdfca63 +0 -0
  67. data/scenarios/git_repositories/config.git/objects/d1/0bcd51fec41f854001e4d61f99d9e282a695d3 +0 -0
  68. data/scenarios/git_repositories/config.git/objects/d8/a8b0f5b1fd66844efb141d9544965ea0065f2d +0 -0
  69. data/scenarios/git_repositories/config.git/objects/e6/b02c66ad632e6b8535c4630cb8fe07732a72fc +0 -0
  70. data/scenarios/git_repositories/config.git/objects/e8/b8bfeeba735c0a1a873082554cb4d7256ac125 +0 -0
  71. data/scenarios/git_repositories/config.git/objects/f9/0181466a1a60b793ca9cc9abd584c18d4e3887 +0 -0
  72. data/scenarios/git_repositories/config.git/objects/f9/49d5d8a4f12c91471e34d4e277239c35ebd10d +0 -0
  73. data/scenarios/git_repositories/config.git/refs/heads/master +1 -0
  74. data/scenarios/git_repositories/project.git/HEAD +1 -0
  75. data/scenarios/git_repositories/project.git/config +5 -0
  76. data/scenarios/git_repositories/project.git/description +1 -0
  77. data/scenarios/git_repositories/project.git/git-daemon-export-ok +0 -0
  78. data/scenarios/git_repositories/project.git/hooks/applypatch-msg.sample +15 -0
  79. data/scenarios/git_repositories/project.git/hooks/commit-msg.sample +24 -0
  80. data/scenarios/git_repositories/project.git/hooks/post-commit.sample +8 -0
  81. data/scenarios/git_repositories/project.git/hooks/post-receive.sample +15 -0
  82. data/scenarios/git_repositories/project.git/hooks/post-update.sample +8 -0
  83. data/scenarios/git_repositories/project.git/hooks/pre-applypatch.sample +14 -0
  84. data/scenarios/git_repositories/project.git/hooks/pre-commit.sample +46 -0
  85. data/scenarios/git_repositories/project.git/hooks/pre-rebase.sample +169 -0
  86. data/scenarios/git_repositories/project.git/hooks/prepare-commit-msg.sample +36 -0
  87. data/scenarios/git_repositories/project.git/hooks/update.sample +128 -0
  88. data/scenarios/git_repositories/project.git/info/exclude +6 -0
  89. data/scenarios/git_repositories/project.git/objects/04/26e152e66c8cd42974279bdcae09be9839c172 +0 -0
  90. data/scenarios/git_repositories/project.git/objects/04/f4de85eaf72ef1631dc6d7424045c0a749b757 +1 -0
  91. data/scenarios/git_repositories/project.git/objects/06/13fe277280cbcdb2856e1eefc70bdaff011b20 +0 -0
  92. data/scenarios/git_repositories/project.git/objects/06/7aca89b86265eee211387434c3e50f37ccf009 +0 -0
  93. data/scenarios/git_repositories/project.git/objects/09/445dacc4822722612d60833c9948219ecdd8f5 +0 -0
  94. data/scenarios/git_repositories/project.git/objects/11/c4ec64326de35462f4e79d0f4229bf8e26e0c5 +0 -0
  95. data/scenarios/git_repositories/project.git/objects/20/1c7641c2e42b0b904e5c1f793489d8b858e4da +2 -0
  96. data/scenarios/git_repositories/project.git/objects/23/979639da60d2d31e9744468df1c1221b101e64 +0 -0
  97. data/scenarios/git_repositories/project.git/objects/27/a3fff2c4c45ab5513a405f694c0a042cb5d417 +1 -0
  98. data/scenarios/git_repositories/project.git/objects/2c/0c33cfba8e1af15df88522c0db2b10a6a94138 +2 -0
  99. data/scenarios/git_repositories/project.git/objects/38/b574660305ecb5fec6b2daa7ee1e0dbf1b6003 +0 -0
  100. data/scenarios/git_repositories/project.git/objects/4a/57abb5e4e426cfc9101b3af22ac83ccbd8e2ad +0 -0
  101. data/scenarios/git_repositories/project.git/objects/4c/77ebdd985e57afe7988480720c5dc77ec525c9 +0 -0
  102. data/scenarios/git_repositories/project.git/objects/51/c94da6f1b8aa9d2346088d3d362475b60c7f32 +0 -0
  103. data/scenarios/git_repositories/project.git/objects/5b/a96acf9cc9b87babe37c032676f53bf1ba9ae7 +2 -0
  104. data/scenarios/git_repositories/project.git/objects/5d/f555601d60f1c2a84d2364af0ad640612c3ba5 +0 -0
  105. data/scenarios/git_repositories/project.git/objects/71/03b5ac94940d596c2160a5cfcd55ca4ccac41f +0 -0
  106. data/scenarios/git_repositories/project.git/objects/73/3fc331098b03523f414f3509b9ae6e637c6866 +0 -0
  107. data/scenarios/git_repositories/project.git/objects/80/26076649ceccbe96a6292f2432652f08483035 +0 -0
  108. data/scenarios/git_repositories/project.git/objects/86/d1ef0976be4567de562224e1b51fbf9820c53a +1 -0
  109. data/scenarios/git_repositories/project.git/objects/87/a9d8b09b3401d21b23d90253332d6b28b47db2 +0 -0
  110. data/scenarios/git_repositories/project.git/objects/8b/030ba688255c917d189ae3f87d7c5ccd226bc2 +0 -0
  111. data/scenarios/git_repositories/project.git/objects/95/c9d5ad9b1c90e4c805516783105fc2037dedeb +2 -0
  112. data/scenarios/git_repositories/project.git/objects/95/d82d043af35a80eabfd56c0d705abfa3488787 +2 -0
  113. data/scenarios/git_repositories/project.git/objects/96/0bf34bb0b46d0aeb0be87f688f4ef06a4b35e1 +0 -0
  114. data/scenarios/git_repositories/project.git/objects/a3/860106dc1d148c7831cd45ae38829b4ed47702 +2 -0
  115. data/scenarios/git_repositories/project.git/objects/a8/506d6439b71784a72ac72d284b2ad53088f573 +0 -0
  116. data/scenarios/git_repositories/project.git/objects/ad/22ea6c7563777936ecfbe50d8e2cf8120fd525 +0 -0
  117. data/scenarios/git_repositories/project.git/objects/ae/3900de54aff557c61c81146d00f9d38e55a265 +1 -0
  118. data/scenarios/git_repositories/project.git/objects/bf/5e3740d52b80abb0378b3f85f93a53b1294521 +1 -0
  119. data/scenarios/git_repositories/project.git/objects/bf/b59811cdbc069418dee14b171e6e7e979784b7 +0 -0
  120. data/scenarios/git_repositories/project.git/objects/cc/5ac0afb24e727d5de344cc26a425f4fb7fd17d +3 -0
  121. data/scenarios/git_repositories/project.git/objects/d1/091aa2dd76885108461110c639e6b33a297fce +0 -0
  122. data/scenarios/git_repositories/project.git/objects/d8/913f6650eb2b7bf2a633732d8452008ca23dcb +0 -0
  123. data/scenarios/git_repositories/project.git/objects/db/d1b9667f1b26b13331ac0c321dced8be1aeab0 +3 -0
  124. data/scenarios/git_repositories/project.git/objects/e4/3b9107e9b1908ce415025e64eb83a493d329b7 +0 -0
  125. data/scenarios/git_repositories/project.git/objects/ef/2a88894d5421920b9dfe67a9a4d8043830e62e +0 -0
  126. data/scenarios/git_repositories/project.git/objects/f4/0123a1ff20c65d8dc15a38a83222647908e6f7 +0 -0
  127. data/scenarios/git_repositories/project.git/objects/f5/0af315b75ca0b12c720dec6d916b76b968c319 +0 -0
  128. data/scenarios/git_repositories/project.git/objects/f6/0215709b7b23f3738e9cbaf634b1c86bbd376a +0 -0
  129. data/scenarios/git_repositories/project.git/refs/heads/bad_rakefile +1 -0
  130. data/scenarios/git_repositories/project.git/refs/heads/hook_with_changed +1 -0
  131. data/scenarios/git_repositories/project.git/refs/heads/master +1 -0
  132. data/scenarios/git_repositories/project.git/refs/heads/no_rake_hooks +1 -0
  133. data/scenarios/git_repositories/project.git/refs/heads/post_rake_tasks +1 -0
  134. data/scenarios/invalid/deploy.yml +1 -0
  135. data/scenarios/local/deploy.yml.erb +17 -0
  136. data/scenarios/remote/deploy.yml +119 -0
  137. data/scenarios/setup/vagrant/.gitignore +3 -0
  138. data/scenarios/setup/vagrant/Vagrantfile +10 -0
  139. data/scenarios/setup/vagrant/manifests/integration.pp +32 -0
  140. data/scenarios/setup/vagrant/pids/.gitignore +1 -0
  141. data/spec/.bacon +0 -0
  142. data/spec/init_spec.rb +9 -0
  143. data/spec/install_spec.rb +43 -0
  144. data/spec/integration/branch_switching_spec.rb +41 -0
  145. data/spec/integration/deployment_failures_spec.rb +106 -0
  146. data/spec/integration/helper_spec.rb +90 -0
  147. data/spec/integration/invalid_configuration_spec.rb +39 -0
  148. data/spec/integration/local_deployments_spec.rb +230 -0
  149. data/spec/integration/post_rake_tasks_spec.rb +226 -0
  150. data/spec/integration/post_scripts_spec.rb +246 -0
  151. data/spec/integration/remote_deployments_spec.rb +166 -0
  152. data/spec/integration/staleness_checks_spec.rb +72 -0
  153. data/spec/spec_helper.rb +117 -0
  154. data/spec/wd_command_spec.rb +986 -0
  155. data/spec/wd_role_command_spec.rb +49 -0
  156. data/spec/whiskey_disk/config/filter_spec.rb +77 -0
  157. data/spec/whiskey_disk/config/filters/add_environment_name_filter_spec.rb +20 -0
  158. data/spec/whiskey_disk/config/filters/add_project_name_filter_spec.rb +19 -0
  159. data/spec/whiskey_disk/config/filters/check_for_duplicate_domains_filter_spec.rb +29 -0
  160. data/spec/whiskey_disk/config/filters/convert_role_strings_to_list_filter_spec.rb +48 -0
  161. data/spec/whiskey_disk/config/filters/default_config_target_filter_spec.rb +19 -0
  162. data/spec/whiskey_disk/config/filters/default_domain_filter_spec.rb +18 -0
  163. data/spec/whiskey_disk/config/filters/drop_empty_domain_roles_filter_spec.rb +60 -0
  164. data/spec/whiskey_disk/config/filters/environment_scope_filter_spec.rb +32 -0
  165. data/spec/whiskey_disk/config/filters/hashify_domain_entries_filter_spec.rb +41 -0
  166. data/spec/whiskey_disk/config/filters/localize_domains_filter_spec.rb +30 -0
  167. data/spec/whiskey_disk/config/filters/normalize_ssh_options_filter_spec.rb +56 -0
  168. data/spec/whiskey_disk/config/filters/project_scope_filter_spec.rb +75 -0
  169. data/spec/whiskey_disk/config/filters/select_project_and_environment_filter_spec.rb +30 -0
  170. data/spec/whiskey_disk/config/filters/stringify_hash_keys_filter_spec.rb +40 -0
  171. data/spec/whiskey_disk/config_spec.rb +754 -0
  172. data/spec/whiskey_disk/helpers_spec.rb +443 -0
  173. data/spec/whiskey_disk/rake_spec.rb +261 -0
  174. data/spec/whiskey_disk_spec.rb +1224 -0
  175. data/tasks/deploy.rake +2 -0
  176. data/whisk_deploy.gemspec +215 -0
  177. metadata +241 -0
@@ -0,0 +1,443 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper.rb'))
2
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib', 'whiskey_disk', 'helpers'))
3
+
4
+ describe 'when checking for a role during setup or deployment' do
5
+ it 'accepts a role string' do
6
+ lambda { role?('web') }.should.not.raise(ArgumentError)
7
+ end
8
+
9
+ it 'requires a role string' do
10
+ lambda { role? }.should.raise(ArgumentError)
11
+ end
12
+
13
+ it 'returns false if the WD_ROLES environment variable is unset' do
14
+ ENV['WD_ROLES'] = nil
15
+ role?(:web).should.be.false
16
+ end
17
+
18
+ it 'returns false if the WD_ROLES environment variable is empty' do
19
+ ENV['WD_ROLES'] = ''
20
+ role?(:web).should.be.false
21
+ end
22
+
23
+ it 'returns true if the role, as a symbol is among the roles in the WD_ROLES env variable' do
24
+ ENV['WD_ROLES'] = 'db:web'
25
+ role?(:db).should.be.true
26
+ end
27
+
28
+ it 'returns true if the role, as a string is among the roles in the WD_ROLES env variable' do
29
+ ENV['WD_ROLES'] = 'db:web'
30
+ role?('db').should.be.true
31
+ end
32
+
33
+ it 'returns false if the role, as a symbol is not among the roles in the WD_ROLES env variable' do
34
+ ENV['WD_ROLES'] = 'db:web'
35
+ role?(:app).should.be.false
36
+ end
37
+
38
+ it 'returns false if the role, as a string is not among the roles in the WD_ROLES env variable' do
39
+ ENV['WD_ROLES'] = 'db:web'
40
+ role?('app').should.be.false
41
+ end
42
+ end
43
+
44
+ def set_git_changes(changes)
45
+ self.stub!(:git_changes).and_return(changes)
46
+ end
47
+
48
+ def set_rsync_changes(changes)
49
+ self.stub!(:rsync_changes).and_return(changes)
50
+ end
51
+
52
+ describe 'when determining if certain files changed when a deployment was run' do
53
+ before do
54
+ @matching_file = '/path/to/file'
55
+ @matching_path = '/path/to'
56
+ @non_matching_file = '/nowhere/file'
57
+ @substring_file = '/nowhere/filething'
58
+ @random_file = '/random/path'
59
+
60
+ set_git_changes([])
61
+ set_rsync_changes([])
62
+ end
63
+
64
+ it 'accepts a path' do
65
+ lambda { changed?('foo') }.should.not.raise(ArgumentError)
66
+ end
67
+
68
+ it 'requires a path' do
69
+ lambda { changed? }.should.raise(ArgumentError)
70
+ end
71
+
72
+ it 'returns true when the specified file is in the list of git changes' do
73
+ set_git_changes([ @matching_file, @random_file])
74
+ changed?(@matching_file).should.be.true
75
+ end
76
+
77
+ it 'ignores trailing "/"s in the provided path when doing an exact git change match' do
78
+ set_git_changes([ @matching_file, @random_file])
79
+ changed?(@matching_file + '///').should.be.true
80
+ end
81
+
82
+ it 'returns true when the specified path is a full path prefix in the list of git changes' do
83
+ set_git_changes([ @matching_file , @random_file])
84
+ changed?(@matching_path).should.be.true
85
+ end
86
+
87
+ it 'ignores trailing "/"s in the provided path when doing a path git change match' do
88
+ set_git_changes([ @matching_file , @random_file])
89
+ changed?(@matching_path + '///').should.be.true
90
+ end
91
+
92
+ it 'returns true when the specified file is in the list of rsync changes' do
93
+ set_rsync_changes([ @matching_file, @random_file])
94
+ changed?(@matching_file).should.be.true
95
+ end
96
+
97
+ it 'ignores trailing "/"s in the provided path when doing an exact rsync change match' do
98
+ set_rsync_changes([ @matching_file, @random_file])
99
+ changed?(@matching_file + "///").should.be.true
100
+ end
101
+
102
+ it 'returnes true when the specified path is a full path prefix in the list of git changes' do
103
+ set_rsync_changes([ @matching_file , @random_file])
104
+ changed?(@matching_path).should.be.true
105
+ end
106
+
107
+ it 'ignores trailing "/"s in the provided path when doing a path rsync change match' do
108
+ set_rsync_changes([ @matching_file , @random_file])
109
+ changed?(@matching_path + '///').should.be.true
110
+ end
111
+
112
+ it 'ignores regex metacharacters when looking for a git match' do
113
+ set_git_changes([ '/path/to/somestring'])
114
+ changed?('/path/to/some.*').should.be.false
115
+ end
116
+
117
+ it 'ignores regex metacharacters when looking for an rsync match' do
118
+ set_rsync_changes([ '/path/to/somestring'])
119
+ changed?('/path/to/some.*').should.be.false
120
+ end
121
+
122
+ it 'returns true when the git changes file cannot be found' do
123
+ set_git_changes(nil)
124
+ changed?(@matching_file).should.be.true
125
+ end
126
+
127
+ it 'returns false if not path or file matches the specified file' do
128
+ set_git_changes([@matching_file, @matching_path, @random_file, @substring_file])
129
+ set_rsync_changes([@matching_file, @matching_path, @random_file, @substring_file])
130
+ changed?(@non_matching_file).should.be.false
131
+ end
132
+ end
133
+
134
+ describe "when finding files changed by git in a deployment" do
135
+ before do
136
+ @contents = 'CHANGELOG
137
+ README.markdown
138
+ Rakefile
139
+ VERSION
140
+ lib/whiskey_disk.rb
141
+ lib/whiskey_disk/config.rb
142
+ lib/whiskey_disk/helpers.rb
143
+ scenarios/git_repositories/project.git/objects/04/26e152e66c8cd42974279bdcae09be9839c172
144
+ scenarios/git_repositories/project.git/objects/04/f4de85eaf72ef1631dc6d7424045c0a749b757
145
+ scenarios/git_repositories/project.git/refs/heads/bad_rakefile
146
+ scenarios/git_repositories/project.git/refs/heads/master
147
+ scenarios/remote/deploy.yml
148
+ spec/integration/deployment_failures_spec.rb
149
+ spec/integration/post_rake_tasks_spec.rb
150
+ spec/integration/staleness_checks_spec.rb
151
+ spec/spec_helper.rb
152
+ spec/whiskey_disk/config_spec.rb
153
+ spec/whiskey_disk/helpers_spec.rb
154
+ spec/whiskey_disk_spec.rb
155
+ whiskey_disk.gemspec
156
+ '
157
+ end
158
+
159
+ it 'works without arguments' do
160
+ lambda { git_changes }.should.not.raise(ArgumentError)
161
+ end
162
+
163
+ it 'does not allow arguments' do
164
+ lambda { git_changes(:foo) }.should.raise(ArgumentError)
165
+ end
166
+
167
+ it 'returns nil when a git changes file cannot be found' do
168
+ self.stub!(:read_git_changes_file).and_raise
169
+ git_changes.should.be.nil
170
+ end
171
+
172
+ it 'returns an empty list if no files are found in the git changes file' do
173
+ self.stub!(:read_git_changes_file).and_return('')
174
+ git_changes.should == []
175
+ end
176
+
177
+ it 'returns a list of all filenames mentioned in the git changes file' do
178
+ self.stub!(:read_git_changes_file).and_return(@contents)
179
+ git_changes.should == @contents.split("\n")
180
+ end
181
+
182
+ it 'strips duplicates from filenames mentioned in the git changes file' do
183
+ lines = @contents.split("\n")
184
+ duplicates = @contents + lines.first + "\n" + lines.last + "\n"
185
+ self.stub!(:read_git_changes_file).and_return(duplicates)
186
+ git_changes.sort.should == @contents.split("\n").sort
187
+ end
188
+ end
189
+
190
+ describe "when finding files changed by rsync in a deployment" do
191
+ before do
192
+ @contents = '2011/02/27 20:11:42 [36728] receiving file list
193
+ 2011/02/27 20:11:42 [36728] sent 24 bytes received 9 bytes total size 0
194
+ 2011/02/27 20:11:58 [36780] receiving file list
195
+ 2011/02/27 20:11:58 [36780] sent 24 bytes received 9 bytes total size 0
196
+ 2011/02/27 20:12:09 [36808] receiving file list
197
+ 2011/02/27 20:12:09 [36808] sent 24 bytes received 9 bytes total size 0
198
+ 2011/02/27 20:12:19 [36835] receiving file list
199
+ 2011/02/27 20:12:19 [36835] .d..t.... ./
200
+ 2011/02/27 20:12:19 [36835] >f+++++++ Info.plist
201
+ 2011/02/27 20:12:19 [36835] cd+++++++ Application Support/
202
+ 2011/02/27 20:12:19 [36835] cd+++++++ Application Support/Google/
203
+ 2011/02/27 20:12:19 [36835] cd+++++++ Application Support/Google/GoogleTalkPlugin.app/
204
+ 2011/02/27 20:12:19 [36835] cd+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/
205
+ 2011/02/27 20:12:19 [36835] >f+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/Info.plist
206
+ 2011/02/27 20:12:19 [36835] cd+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/
207
+ 2011/02/27 20:12:19 [36835] cd+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/
208
+ 2011/02/27 20:12:19 [36835] cL+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/GoogleBreakpad -> Versions/Current/GoogleBreakpad
209
+ 2011/02/27 20:12:19 [36835] cL+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Resources -> Versions/Current/Resources
210
+ 2011/02/27 20:12:19 [36835] cd+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/
211
+ 2011/02/27 20:12:19 [36835] cL+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/Current -> A
212
+ 2011/02/27 20:12:19 [36835] cd+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/
213
+ 2011/02/27 20:12:19 [36835] cd+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/
214
+ 2011/02/27 20:12:19 [36835] cd+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/
215
+ 2011/02/27 20:12:19 [36835] cd+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents/
216
+ 2011/02/27 20:12:19 [36835] cd+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/MacOS/
217
+ 2011/02/27 20:12:20 [36835] >f+++++++ Application Support/Google/GoogleTalkPlugin.app/Contents/MacOS/GoogleTalkPlugin
218
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/
219
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/googletalkbrowserplugin.plugin/
220
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/googletalkbrowserplugin.plugin/Contents/
221
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/googletalkbrowserplugin.plugin/Contents/MacOS/
222
+ 2011/02/27 20:12:20 [36835] >f+++++++ Internet Plug-Ins/googletalkbrowserplugin.plugin/Contents/MacOS/googletalkbrowserplugin
223
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/googletalkbrowserplugin.plugin/Contents/Resources/
224
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/npgtpo3dautoplugin.plugin/
225
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/
226
+ 2011/02/27 20:12:20 [36835] >f+++++++ Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Info.plist
227
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks/
228
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks/Cg.framework/
229
+ 2011/02/27 20:12:20 [36835] cL+++++++ Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks/Cg.framework/Cg -> Versions/Current/Cg
230
+ 2011/02/27 20:12:20 [36835] cL+++++++ Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks/Cg.framework/Resources -> Versions/Current/Resources
231
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks/Cg.framework/Versions/
232
+ 2011/02/27 20:12:20 [36835] cL+++++++ Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks/Cg.framework/Versions/Current -> 1.0
233
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks/Cg.framework/Versions/1.0/
234
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/MacOS/
235
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Resources/
236
+ 2011/02/27 20:12:20 [36835] cd+++++++ Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Resources/English.lproj/
237
+ 2011/02/27 20:12:20 [36835] cd+++++++ QuickTime/
238
+ 2011/02/27 20:12:20 [36835] cd+++++++ QuickTime/Google Camera Adapter 0.component/
239
+ 2011/02/27 20:12:20 [36835] cd+++++++ QuickTime/Google Camera Adapter 0.component/Contents/
240
+ 2011/02/27 20:12:20 [36835] cd+++++++ QuickTime/Google Camera Adapter 0.component/Contents/MacOS/
241
+ 2011/02/27 20:12:20 [36835] cd+++++++ QuickTime/Google Camera Adapter 0.component/Contents/Resources/
242
+ 2011/02/27 20:12:20 [36835] cd+++++++ QuickTime/Google Camera Adapter 1.component/
243
+ 2011/02/27 20:12:20 [36835] cd+++++++ QuickTime/Google Camera Adapter 1.component/Contents/
244
+ 2011/02/27 20:12:20 [36835] >f+++++++ QuickTime/Google Camera Adapter 1.component/Contents/Info.plist
245
+ 2011/02/27 20:12:20 [36835] cd+++++++ QuickTime/Google Camera Adapter 1.component/Contents/MacOS/
246
+ 2011/02/27 20:12:20 [36835] cd+++++++ QuickTime/Google Camera Adapter 1.component/Contents/Resources/
247
+ 2011/02/27 20:12:20 [36835] sent 386 bytes received 1431 bytes total size 5229466
248
+ '
249
+
250
+ @changes = [
251
+ "Info.plist",
252
+ "Application Support",
253
+ "Application Support/Google",
254
+ "Application Support/Google/GoogleTalkPlugin.app",
255
+ "Application Support/Google/GoogleTalkPlugin.app/Contents",
256
+ "Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks",
257
+ "Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework",
258
+ "Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/GoogleBreakpad -> Versions/Current/GoogleBreakpad",
259
+ "Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Resources -> Versions/Current/Resources",
260
+ "Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Versions",
261
+ "Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A",
262
+ "Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources",
263
+ "Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app",
264
+ "Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/A/Resources/Reporter.app/Contents",
265
+ "Application Support/Google/GoogleTalkPlugin.app/Contents/Frameworks/GoogleBreakpad.framework/Versions/Current -> A",
266
+ "Application Support/Google/GoogleTalkPlugin.app/Contents/Info.plist",
267
+ "Application Support/Google/GoogleTalkPlugin.app/Contents/MacOS",
268
+ "Application Support/Google/GoogleTalkPlugin.app/Contents/MacOS/GoogleTalkPlugin",
269
+ "Internet Plug-Ins",
270
+ "Internet Plug-Ins/googletalkbrowserplugin.plugin",
271
+ "Internet Plug-Ins/googletalkbrowserplugin.plugin/Contents",
272
+ "Internet Plug-Ins/googletalkbrowserplugin.plugin/Contents/MacOS",
273
+ "Internet Plug-Ins/googletalkbrowserplugin.plugin/Contents/MacOS/googletalkbrowserplugin",
274
+ "Internet Plug-Ins/googletalkbrowserplugin.plugin/Contents/Resources",
275
+ "Internet Plug-Ins/npgtpo3dautoplugin.plugin",
276
+ "Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents",
277
+ "Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks",
278
+ "Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks/Cg.framework",
279
+ "Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks/Cg.framework/Cg -> Versions/Current/Cg",
280
+ "Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks/Cg.framework/Resources -> Versions/Current/Resources",
281
+ "Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks/Cg.framework/Versions",
282
+ "Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks/Cg.framework/Versions/1.0",
283
+ "Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Frameworks/Cg.framework/Versions/Current -> 1.0",
284
+ "Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Info.plist",
285
+ "Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/MacOS",
286
+ "Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Resources",
287
+ "Internet Plug-Ins/npgtpo3dautoplugin.plugin/Contents/Resources/English.lproj",
288
+ "QuickTime",
289
+ "QuickTime/Google Camera Adapter 0.component",
290
+ "QuickTime/Google Camera Adapter 0.component/Contents",
291
+ "QuickTime/Google Camera Adapter 0.component/Contents/MacOS",
292
+ "QuickTime/Google Camera Adapter 0.component/Contents/Resources",
293
+ "QuickTime/Google Camera Adapter 1.component",
294
+ "QuickTime/Google Camera Adapter 1.component/Contents",
295
+ "QuickTime/Google Camera Adapter 1.component/Contents/Info.plist",
296
+ "QuickTime/Google Camera Adapter 1.component/Contents/MacOS",
297
+ "QuickTime/Google Camera Adapter 1.component/Contents/Resources",
298
+ ]
299
+ end
300
+
301
+ it 'works without arguments' do
302
+ lambda { rsync_changes }.should.not.raise(ArgumentError)
303
+ end
304
+
305
+ it 'does not allow arguments' do
306
+ lambda { rsync_changes(:foo) }.should.raise(ArgumentError)
307
+ end
308
+
309
+ it 'returns nil when an rsync changes file cannot be found' do
310
+ self.stub!(:read_rsync_changes_file).and_raise
311
+ rsync_changes.should.be.nil
312
+ end
313
+
314
+ it 'returns an empty list if no files are found in the rsync changes file' do
315
+ self.stub!(:read_rsync_changes_file).and_return('')
316
+ rsync_changes.should == []
317
+ end
318
+
319
+ it 'returns a list of all changed filenames mentioned in the rsync changes file, excluding "."' do
320
+ self.stub!(:read_rsync_changes_file).and_return(@contents)
321
+ rsync_changes.sort.first.should == @changes.sort.first
322
+ end
323
+ end
324
+
325
+ describe 'when reading the git-related changes for a deployment' do
326
+ before do
327
+ @contents = 'git changes'
328
+ @changes_path = '/path/to/git/changes'
329
+ self.stub!(:git_changes_path).and_return(@changes_path)
330
+ File.stub!(:read).with(@changes_path).and_return(@contents)
331
+ end
332
+
333
+ it 'works without arguments' do
334
+ lambda { read_git_changes_file }.should.not.raise(ArgumentError)
335
+ end
336
+
337
+ it 'does not allow arguments' do
338
+ lambda { read_git_changes_file(:foo) }.should.raise(ArgumentError)
339
+ end
340
+
341
+ it 'reads the git changes file' do
342
+ File.should.receive(:read) do |arg|
343
+ arg.should == @changes_path
344
+ @contents
345
+ end
346
+ read_git_changes_file
347
+ end
348
+
349
+ it 'returns the contents of the git changes file' do
350
+ read_git_changes_file.should == @contents
351
+ end
352
+
353
+ it 'fails if the git changes file cannot be read' do
354
+ File.stub!(:read).with(@changes_path).and_raise(Errno::ENOENT)
355
+ lambda { read_git_changes_file }.should.raise(Errno::ENOENT)
356
+ end
357
+ end
358
+
359
+ describe 'when reading the rsync-related changes for a deployment' do
360
+ before do
361
+ @contents = 'rsync changes'
362
+ @changes_path = '/path/to/rsync/changes'
363
+ self.stub!(:rsync_changes_path).and_return(@changes_path)
364
+ File.stub!(:read).with(@changes_path).and_return(@contents)
365
+ end
366
+
367
+ it 'works without arguments' do
368
+ lambda { read_rsync_changes_file }.should.not.raise(ArgumentError)
369
+ end
370
+
371
+ it 'does not allow arguments' do
372
+ lambda { read_rsync_changes_file(:foo) }.should.raise(ArgumentError)
373
+ end
374
+
375
+ it 'reads the rsync changes file' do
376
+ File.should.receive(:read) do |arg|
377
+ arg.should == @changes_path
378
+ @contents
379
+ end
380
+ read_rsync_changes_file
381
+ end
382
+
383
+ it 'returns the contents of the rsync changes file' do
384
+ read_rsync_changes_file.should == @contents
385
+ end
386
+
387
+ it 'fails if the rsync changes file cannot be read' do
388
+ File.stub!(:read).with(@changes_path).and_raise(Errno::ENOENT)
389
+ lambda { read_rsync_changes_file }.should.raise(Errno::ENOENT)
390
+ end
391
+ end
392
+
393
+ describe 'computing the path to the git changes file' do
394
+ before do
395
+ @git_path = '/path/to/toplevel'
396
+ @io_handle = ''
397
+ IO.stub!(:popen).with("git rev-parse --show-toplevel").and_return(@io_handle)
398
+ @io_handle.stub!(:read).and_return(@git_path + "\n")
399
+ end
400
+
401
+ it 'works without arguments' do
402
+ lambda { git_changes_path }.should.not.raise(ArgumentError)
403
+ end
404
+
405
+ it 'does not allow arguments' do
406
+ lambda { git_changes_path(:foo) }.should.raise(ArgumentError)
407
+ end
408
+
409
+ it 'returns the path to the .whiskey_disk_git_changes file in the git top-level path' do
410
+ git_changes_path.should == File.join(@git_path, '.whiskey_disk_git_changes')
411
+ end
412
+
413
+ it 'returns the path to the .whiskey_disk_git_changes file in the current directory of the git top-level cannot be found' do
414
+ @io_handle.stub!(:read).and_return('')
415
+ git_changes_path.should == File.join(Dir.pwd, '.whiskey_disk_git_changes')
416
+ end
417
+ end
418
+
419
+ describe 'computing the path to the rsync changes file' do
420
+ before do
421
+ @rsync_path = '/path/to/toplevel'
422
+ @io_handle = ''
423
+ IO.stub!(:popen).with("git rev-parse --show-toplevel").and_return(@io_handle)
424
+ @io_handle.stub!(:read).and_return(@rsync_path + "\n")
425
+ end
426
+
427
+ it 'works without arguments' do
428
+ lambda { rsync_changes_path }.should.not.raise(ArgumentError)
429
+ end
430
+
431
+ it 'does not allow arguments' do
432
+ lambda { rsync_changes_path(:foo) }.should.raise(ArgumentError)
433
+ end
434
+
435
+ it 'returns the path to the .whiskey_disk_rsync_changes file in the git top-level path' do
436
+ rsync_changes_path.should == File.join(@rsync_path, '.whiskey_disk_rsync_changes')
437
+ end
438
+
439
+ it 'returns the path to the .whiskey_disk_rsync_changes file in the current directory of the git top-level cannot be found' do
440
+ @io_handle.stub!(:read).and_return('')
441
+ rsync_changes_path.should == File.join(Dir.pwd, '.whiskey_disk_rsync_changes')
442
+ end
443
+ end
@@ -0,0 +1,261 @@
1
+ require File.expand_path(File.join(File.dirname(__FILE__), '..', 'spec_helper.rb'))
2
+ require 'rake'
3
+
4
+ describe 'rake tasks' do
5
+ before do
6
+ Rake.application = @rake = Rake::Application.new
7
+ load File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib', 'whiskey_disk', 'rake.rb'))
8
+ @whiskey_disk = WhiskeyDisk.new
9
+ WhiskeyDisk.stub!(:new).and_return(@whiskey_disk)
10
+ end
11
+
12
+ after do
13
+ Rake.application = nil
14
+ end
15
+
16
+ describe 'deploy:setup' do
17
+ before do
18
+ @whiskey_disk.configuration = {}
19
+ [
20
+ :ensure_main_parent_path_is_present,
21
+ :ensure_config_parent_path_is_present,
22
+ :checkout_main_repository,
23
+ :install_hooks,
24
+ :checkout_configuration_repository,
25
+ :update_main_repository_checkout,
26
+ :update_configuration_repository_checkout,
27
+ :refresh_configuration,
28
+ :initialize_all_changes,
29
+ :run_post_setup_hooks,
30
+ :flush,
31
+ :summarize
32
+ ].each do |meth|
33
+ @whiskey_disk.stub!(meth)
34
+ end
35
+
36
+ @whiskey_disk.stub!(:success?).and_return(true)
37
+ end
38
+
39
+ it 'ensures that the parent path for the main repository checkout is present' do
40
+ @whiskey_disk.should.receive(:ensure_main_parent_path_is_present)
41
+ @rake["deploy:setup"].invoke
42
+ end
43
+
44
+ describe 'when a configuration repo is specified' do
45
+ it 'ensures that the parent path for the configuration repository checkout is present' do
46
+ @whiskey_disk.configuration = { 'config_repository' => 'foo' }
47
+ @whiskey_disk.should.receive(:ensure_config_parent_path_is_present)
48
+ @rake["deploy:setup"].invoke
49
+ end
50
+ end
51
+
52
+ describe 'when no configuration repo is specified' do
53
+ it 'does not ensure that the path for the configuration repository checkout is present' do
54
+ @whiskey_disk.should.not.receive(:ensure_config_parent_path_is_present)
55
+ @rake["deploy:setup"].invoke
56
+ end
57
+ end
58
+
59
+ it 'checks out the main repository' do
60
+ @whiskey_disk.should.receive(:checkout_main_repository)
61
+ @rake["deploy:setup"].invoke
62
+ end
63
+
64
+ describe 'when a configuration repository is specified' do
65
+ it 'checks out the configuration repository' do
66
+ @whiskey_disk.configuration = { 'config_repository' => 'foo' }
67
+ @whiskey_disk.should.receive(:checkout_configuration_repository)
68
+ @rake["deploy:setup"].invoke
69
+ end
70
+ end
71
+
72
+ describe 'when no configuration repository is specified' do
73
+ it 'does not check out the configuration repository' do
74
+ @whiskey_disk.should.not.receive(:checkout_configuration_repository)
75
+ @rake["deploy:setup"].invoke
76
+ end
77
+ end
78
+
79
+ it 'updates the main repository checkout' do
80
+ @whiskey_disk.should.receive(:update_main_repository_checkout)
81
+ @rake["deploy:setup"].invoke
82
+ end
83
+
84
+ describe 'when a configuration repository is specified' do
85
+ it 'updates the configuration repository checkout' do
86
+ @whiskey_disk.configuration = { 'config_repository' => 'foo' }
87
+ @whiskey_disk.should.receive(:update_configuration_repository_checkout)
88
+ @rake["deploy:setup"].invoke
89
+ end
90
+ end
91
+
92
+ it 'clears any tracked git or rsync changes' do
93
+ @whiskey_disk.should.receive(:initialize_all_changes)
94
+ @rake["deploy:setup"].invoke
95
+ end
96
+
97
+ describe 'when no configuration repository is specified' do
98
+ it 'updates the configuration repository checkout' do
99
+ @whiskey_disk.should.not.receive(:update_configuration_repository_checkout)
100
+ @rake["deploy:setup"].invoke
101
+ end
102
+ end
103
+
104
+ describe 'when a configuration repository is specified' do
105
+ it 'refreshes the configuration' do
106
+ @whiskey_disk.configuration = { 'config_repository' => 'foo' }
107
+ @whiskey_disk.should.receive(:refresh_configuration)
108
+ @rake["deploy:setup"].invoke
109
+ end
110
+ end
111
+
112
+ describe 'when no configuration repository is specified' do
113
+ it 'does not refresh the configuration' do
114
+ @whiskey_disk.should.not.receive(:refresh_configuration)
115
+ @rake["deploy:setup"].invoke
116
+ end
117
+ end
118
+
119
+ it 'runs any post setup hooks' do
120
+ @whiskey_disk.should.receive(:run_post_setup_hooks)
121
+ @rake["deploy:setup"].invoke
122
+ end
123
+
124
+ it 'flushes @whiskey_disk changes' do
125
+ @whiskey_disk.should.receive(:flush)
126
+ @rake["deploy:setup"].invoke
127
+ end
128
+
129
+ it 'summarizes the results of the setup run' do
130
+ @whiskey_disk.should.receive(:summarize)
131
+ @rake["deploy:setup"].invoke
132
+ end
133
+
134
+ it 'does not exit in error if all setup runs were successful' do
135
+ lambda { @rake["deploy:setup"].invoke }.should.not.raise(SystemExit)
136
+ end
137
+
138
+ it 'exits in error if some setup run was unsuccessful' do
139
+ @whiskey_disk.stub!(:success?).and_return(false)
140
+ lambda { @rake["deploy:setup"].invoke }.should.raise(SystemExit)
141
+ end
142
+ end
143
+
144
+ describe 'deploy:now' do
145
+ before do
146
+ @whiskey_disk.configuration = { }
147
+ [
148
+ :update_main_repository_checkout,
149
+ :update_configuration_repository_checkout,
150
+ :refresh_configuration,
151
+ :run_post_deploy_hooks,
152
+ :flush,
153
+ :summarize
154
+ ].each do |meth|
155
+ @whiskey_disk.stub!(meth)
156
+ end
157
+
158
+ @whiskey_disk.stub!(:success?).and_return(true)
159
+ end
160
+
161
+ it 'enables staleness checks' do
162
+ WhiskeyDisk.should.receive(:new).with(:staleness_checks => true).and_return(@whiskey_disk)
163
+ @rake["deploy:now"].invoke
164
+ end
165
+
166
+ it 'updates the main repository checkout' do
167
+ @whiskey_disk.should.receive(:update_main_repository_checkout)
168
+ @rake["deploy:now"].invoke
169
+ end
170
+
171
+ describe 'when a configuration repository is specified' do
172
+ it 'updates the configuration repository checkout' do
173
+ @whiskey_disk.configuration = { 'config_repository' => 'foo' }
174
+ @whiskey_disk.should.receive(:update_configuration_repository_checkout)
175
+ @rake["deploy:now"].invoke
176
+ end
177
+ end
178
+
179
+ describe 'when no configuration repository is specified' do
180
+ it 'does not update the configuration repository checkout' do
181
+ @whiskey_disk.should.not.receive(:update_configuration_repository_checkout)
182
+ @rake["deploy:now"].invoke
183
+ end
184
+ end
185
+
186
+ describe 'when a configuration repository is specified' do
187
+ it 'refreshes the configuration' do
188
+ @whiskey_disk.configuration = { 'config_repository' => 'foo' }
189
+ @whiskey_disk.should.receive(:refresh_configuration)
190
+ @rake["deploy:now"].invoke
191
+ end
192
+ end
193
+
194
+ describe 'when no configuration repository is specified' do
195
+ it 'does not refresh the configuration' do
196
+ @whiskey_disk.should.not.receive(:refresh_configuration)
197
+ @rake["deploy:now"].invoke
198
+ end
199
+ end
200
+
201
+ it 'runs any post deployment hooks' do
202
+ @whiskey_disk.should.receive(:run_post_deploy_hooks)
203
+ @rake["deploy:now"].invoke
204
+ end
205
+
206
+ it 'flushes @whiskey_disk changes' do
207
+ @whiskey_disk.should.receive(:flush)
208
+ @rake["deploy:now"].invoke
209
+ end
210
+
211
+ it 'summarizes the results of the deployment run' do
212
+ @whiskey_disk.should.receive(:summarize)
213
+ @rake["deploy:now"].invoke
214
+ end
215
+
216
+ it 'does not exit in error if all deployment runs were successful' do
217
+ lambda { @rake["deploy:now"].invoke }.should.not.raise(SystemExit)
218
+ end
219
+
220
+ it 'exits in error if some deployment run was unsuccessful' do
221
+ @whiskey_disk.stub!(:success?).and_return(false)
222
+ lambda { @rake["deploy:now"].invoke }.should.raise(SystemExit)
223
+ end
224
+ end
225
+
226
+ describe 'deploy:post_setup' do
227
+ it 'runs the defined post_setup rake task when a post_setup rake task is defined for this environment' do
228
+ @whiskey_disk.configuration = { 'environment' => 'production'}
229
+
230
+ task "deploy:production:post_setup" do
231
+ @whiskey_disk.fake_method
232
+ end
233
+
234
+ @whiskey_disk.should.receive(:fake_method)
235
+ Rake::Task['deploy:post_setup'].invoke
236
+ end
237
+
238
+ it 'does not fail when no post_setup rake task is defined for this environment' do
239
+ @whiskey_disk.configuration = { 'environment' => 'staging'}
240
+ lambda { Rake::Task['deploy:post_setup'].invoke }.should.not.raise
241
+ end
242
+ end
243
+
244
+ describe 'deploy:post_deploy' do
245
+ it 'runs the defined post_deploy rake task when a post_deploy rake task is defined for this environment' do
246
+ @whiskey_disk.configuration = { 'environment' => 'production'}
247
+
248
+ task "deploy:production:post_deploy" do
249
+ @whiskey_disk.fake_method
250
+ end
251
+
252
+ @whiskey_disk.should.receive(:fake_method)
253
+ Rake::Task['deploy:post_deploy'].invoke
254
+ end
255
+
256
+ it 'does not fail when no post_deploy rake task is defined for this environment' do
257
+ @whiskey_disk.configuration = { 'environment' => 'staging'}
258
+ lambda { Rake::Task['deploy:post_deploy'].invoke }.should.not.raise
259
+ end
260
+ end
261
+ end