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.
- data/CHANGELOG +292 -0
- data/MIT-LICENSE +20 -0
- data/README.integration_specs +24 -0
- data/README.markdown +832 -0
- data/Rakefile +105 -0
- data/VERSION +1 -0
- data/WHY.txt +45 -0
- data/bin/wd +61 -0
- data/bin/wd_role +42 -0
- data/examples/deploy-configs.yml +13 -0
- data/examples/deploy-local.yml +4 -0
- data/examples/deploy-multiple-remotes.yml +26 -0
- data/examples/deploy-staging.yml +8 -0
- data/examples/deploy.rake +11 -0
- data/examples/deploy.yml +16 -0
- data/init.rb +1 -0
- data/install.rb +5 -0
- data/lib/whiskey_disk.rb +327 -0
- data/lib/whiskey_disk/config.rb +127 -0
- data/lib/whiskey_disk/config/abstract_filter.rb +19 -0
- data/lib/whiskey_disk/config/filter.rb +48 -0
- data/lib/whiskey_disk/config/filters/add_environment_name_filter.rb +11 -0
- data/lib/whiskey_disk/config/filters/add_project_name_filter.rb +11 -0
- data/lib/whiskey_disk/config/filters/check_for_duplicate_domains_filter.rb +21 -0
- data/lib/whiskey_disk/config/filters/convert_role_strings_to_list_filter.rb +20 -0
- data/lib/whiskey_disk/config/filters/default_config_target_filter.rb +12 -0
- data/lib/whiskey_disk/config/filters/default_domain_filter.rb +12 -0
- data/lib/whiskey_disk/config/filters/drop_empty_domain_roles_filter.rb +32 -0
- data/lib/whiskey_disk/config/filters/environment_scope_filter.rb +20 -0
- data/lib/whiskey_disk/config/filters/hashify_domain_entries_filter.rb +29 -0
- data/lib/whiskey_disk/config/filters/localize_domains_filter.rb +24 -0
- data/lib/whiskey_disk/config/filters/modules/scope_helper.rb +11 -0
- data/lib/whiskey_disk/config/filters/normalize_ssh_options_filter.rb +29 -0
- data/lib/whiskey_disk/config/filters/project_scope_filter.rb +34 -0
- data/lib/whiskey_disk/config/filters/select_project_and_environment_filter.rb +12 -0
- data/lib/whiskey_disk/config/filters/stringify_hash_keys_filter.rb +25 -0
- data/lib/whiskey_disk/helpers.rb +50 -0
- data/lib/whiskey_disk/rake.rb +47 -0
- data/scenarios/git_repositories/config.git/HEAD +1 -0
- data/scenarios/git_repositories/config.git/config +5 -0
- data/scenarios/git_repositories/config.git/description +1 -0
- data/scenarios/git_repositories/config.git/git-daemon-export-ok +0 -0
- data/scenarios/git_repositories/config.git/hooks/applypatch-msg.sample +15 -0
- data/scenarios/git_repositories/config.git/hooks/commit-msg.sample +24 -0
- data/scenarios/git_repositories/config.git/hooks/post-commit.sample +8 -0
- data/scenarios/git_repositories/config.git/hooks/post-receive.sample +15 -0
- data/scenarios/git_repositories/config.git/hooks/post-update.sample +8 -0
- data/scenarios/git_repositories/config.git/hooks/pre-applypatch.sample +14 -0
- data/scenarios/git_repositories/config.git/hooks/pre-commit.sample +46 -0
- data/scenarios/git_repositories/config.git/hooks/pre-rebase.sample +169 -0
- data/scenarios/git_repositories/config.git/hooks/prepare-commit-msg.sample +36 -0
- data/scenarios/git_repositories/config.git/hooks/update.sample +128 -0
- data/scenarios/git_repositories/config.git/info/exclude +6 -0
- data/scenarios/git_repositories/config.git/objects/0d/b14dd6ddc54017c0a11960dcda82ed802cde69 +0 -0
- data/scenarios/git_repositories/config.git/objects/0e/e781f5ce80d64db32a74a7aae7b5248dafe112 +3 -0
- data/scenarios/git_repositories/config.git/objects/17/6bf54cf17d1d1c24556dc059c4144a5df230e8 +0 -0
- data/scenarios/git_repositories/config.git/objects/20/e9ff3feaa8ede30f707e5f1b4356e3c02bb7ec +0 -0
- data/scenarios/git_repositories/config.git/objects/45/117b1c775f0de415478dbf08ed9d667ab17d13 +0 -0
- data/scenarios/git_repositories/config.git/objects/51/3954c9aca090e6ce40359f0e9fde30ea78eb8c +0 -0
- data/scenarios/git_repositories/config.git/objects/66/947a7a11a6f5d3d561fe95de284ced3010819a +0 -0
- data/scenarios/git_repositories/config.git/objects/6b/bc79311bfac47d3ed724aa82a4814e0dda4c67 +0 -0
- data/scenarios/git_repositories/config.git/objects/71/eb5df52676e8e6efba471050b46978173af110 +1 -0
- data/scenarios/git_repositories/config.git/objects/84/17d2fe3e8fcc0825249c517b29b0f9ea8b8b31 +2 -0
- data/scenarios/git_repositories/config.git/objects/8b/384fcfcf7c0dee7c3c1d5636bee9e645d9cf38 +0 -0
- data/scenarios/git_repositories/config.git/objects/bb/59da633ba74296b0c2f9ff70784ac155ddb599 +0 -0
- data/scenarios/git_repositories/config.git/objects/cc/b86b26189afbf45d8eb9165812ab86dbdfca63 +0 -0
- data/scenarios/git_repositories/config.git/objects/d1/0bcd51fec41f854001e4d61f99d9e282a695d3 +0 -0
- data/scenarios/git_repositories/config.git/objects/d8/a8b0f5b1fd66844efb141d9544965ea0065f2d +0 -0
- data/scenarios/git_repositories/config.git/objects/e6/b02c66ad632e6b8535c4630cb8fe07732a72fc +0 -0
- data/scenarios/git_repositories/config.git/objects/e8/b8bfeeba735c0a1a873082554cb4d7256ac125 +0 -0
- data/scenarios/git_repositories/config.git/objects/f9/0181466a1a60b793ca9cc9abd584c18d4e3887 +0 -0
- data/scenarios/git_repositories/config.git/objects/f9/49d5d8a4f12c91471e34d4e277239c35ebd10d +0 -0
- data/scenarios/git_repositories/config.git/refs/heads/master +1 -0
- data/scenarios/git_repositories/project.git/HEAD +1 -0
- data/scenarios/git_repositories/project.git/config +5 -0
- data/scenarios/git_repositories/project.git/description +1 -0
- data/scenarios/git_repositories/project.git/git-daemon-export-ok +0 -0
- data/scenarios/git_repositories/project.git/hooks/applypatch-msg.sample +15 -0
- data/scenarios/git_repositories/project.git/hooks/commit-msg.sample +24 -0
- data/scenarios/git_repositories/project.git/hooks/post-commit.sample +8 -0
- data/scenarios/git_repositories/project.git/hooks/post-receive.sample +15 -0
- data/scenarios/git_repositories/project.git/hooks/post-update.sample +8 -0
- data/scenarios/git_repositories/project.git/hooks/pre-applypatch.sample +14 -0
- data/scenarios/git_repositories/project.git/hooks/pre-commit.sample +46 -0
- data/scenarios/git_repositories/project.git/hooks/pre-rebase.sample +169 -0
- data/scenarios/git_repositories/project.git/hooks/prepare-commit-msg.sample +36 -0
- data/scenarios/git_repositories/project.git/hooks/update.sample +128 -0
- data/scenarios/git_repositories/project.git/info/exclude +6 -0
- data/scenarios/git_repositories/project.git/objects/04/26e152e66c8cd42974279bdcae09be9839c172 +0 -0
- data/scenarios/git_repositories/project.git/objects/04/f4de85eaf72ef1631dc6d7424045c0a749b757 +1 -0
- data/scenarios/git_repositories/project.git/objects/06/13fe277280cbcdb2856e1eefc70bdaff011b20 +0 -0
- data/scenarios/git_repositories/project.git/objects/06/7aca89b86265eee211387434c3e50f37ccf009 +0 -0
- data/scenarios/git_repositories/project.git/objects/09/445dacc4822722612d60833c9948219ecdd8f5 +0 -0
- data/scenarios/git_repositories/project.git/objects/11/c4ec64326de35462f4e79d0f4229bf8e26e0c5 +0 -0
- data/scenarios/git_repositories/project.git/objects/20/1c7641c2e42b0b904e5c1f793489d8b858e4da +2 -0
- data/scenarios/git_repositories/project.git/objects/23/979639da60d2d31e9744468df1c1221b101e64 +0 -0
- data/scenarios/git_repositories/project.git/objects/27/a3fff2c4c45ab5513a405f694c0a042cb5d417 +1 -0
- data/scenarios/git_repositories/project.git/objects/2c/0c33cfba8e1af15df88522c0db2b10a6a94138 +2 -0
- data/scenarios/git_repositories/project.git/objects/38/b574660305ecb5fec6b2daa7ee1e0dbf1b6003 +0 -0
- data/scenarios/git_repositories/project.git/objects/4a/57abb5e4e426cfc9101b3af22ac83ccbd8e2ad +0 -0
- data/scenarios/git_repositories/project.git/objects/4c/77ebdd985e57afe7988480720c5dc77ec525c9 +0 -0
- data/scenarios/git_repositories/project.git/objects/51/c94da6f1b8aa9d2346088d3d362475b60c7f32 +0 -0
- data/scenarios/git_repositories/project.git/objects/5b/a96acf9cc9b87babe37c032676f53bf1ba9ae7 +2 -0
- data/scenarios/git_repositories/project.git/objects/5d/f555601d60f1c2a84d2364af0ad640612c3ba5 +0 -0
- data/scenarios/git_repositories/project.git/objects/71/03b5ac94940d596c2160a5cfcd55ca4ccac41f +0 -0
- data/scenarios/git_repositories/project.git/objects/73/3fc331098b03523f414f3509b9ae6e637c6866 +0 -0
- data/scenarios/git_repositories/project.git/objects/80/26076649ceccbe96a6292f2432652f08483035 +0 -0
- data/scenarios/git_repositories/project.git/objects/86/d1ef0976be4567de562224e1b51fbf9820c53a +1 -0
- data/scenarios/git_repositories/project.git/objects/87/a9d8b09b3401d21b23d90253332d6b28b47db2 +0 -0
- data/scenarios/git_repositories/project.git/objects/8b/030ba688255c917d189ae3f87d7c5ccd226bc2 +0 -0
- data/scenarios/git_repositories/project.git/objects/95/c9d5ad9b1c90e4c805516783105fc2037dedeb +2 -0
- data/scenarios/git_repositories/project.git/objects/95/d82d043af35a80eabfd56c0d705abfa3488787 +2 -0
- data/scenarios/git_repositories/project.git/objects/96/0bf34bb0b46d0aeb0be87f688f4ef06a4b35e1 +0 -0
- data/scenarios/git_repositories/project.git/objects/a3/860106dc1d148c7831cd45ae38829b4ed47702 +2 -0
- data/scenarios/git_repositories/project.git/objects/a8/506d6439b71784a72ac72d284b2ad53088f573 +0 -0
- data/scenarios/git_repositories/project.git/objects/ad/22ea6c7563777936ecfbe50d8e2cf8120fd525 +0 -0
- data/scenarios/git_repositories/project.git/objects/ae/3900de54aff557c61c81146d00f9d38e55a265 +1 -0
- data/scenarios/git_repositories/project.git/objects/bf/5e3740d52b80abb0378b3f85f93a53b1294521 +1 -0
- data/scenarios/git_repositories/project.git/objects/bf/b59811cdbc069418dee14b171e6e7e979784b7 +0 -0
- data/scenarios/git_repositories/project.git/objects/cc/5ac0afb24e727d5de344cc26a425f4fb7fd17d +3 -0
- data/scenarios/git_repositories/project.git/objects/d1/091aa2dd76885108461110c639e6b33a297fce +0 -0
- data/scenarios/git_repositories/project.git/objects/d8/913f6650eb2b7bf2a633732d8452008ca23dcb +0 -0
- data/scenarios/git_repositories/project.git/objects/db/d1b9667f1b26b13331ac0c321dced8be1aeab0 +3 -0
- data/scenarios/git_repositories/project.git/objects/e4/3b9107e9b1908ce415025e64eb83a493d329b7 +0 -0
- data/scenarios/git_repositories/project.git/objects/ef/2a88894d5421920b9dfe67a9a4d8043830e62e +0 -0
- data/scenarios/git_repositories/project.git/objects/f4/0123a1ff20c65d8dc15a38a83222647908e6f7 +0 -0
- data/scenarios/git_repositories/project.git/objects/f5/0af315b75ca0b12c720dec6d916b76b968c319 +0 -0
- data/scenarios/git_repositories/project.git/objects/f6/0215709b7b23f3738e9cbaf634b1c86bbd376a +0 -0
- data/scenarios/git_repositories/project.git/refs/heads/bad_rakefile +1 -0
- data/scenarios/git_repositories/project.git/refs/heads/hook_with_changed +1 -0
- data/scenarios/git_repositories/project.git/refs/heads/master +1 -0
- data/scenarios/git_repositories/project.git/refs/heads/no_rake_hooks +1 -0
- data/scenarios/git_repositories/project.git/refs/heads/post_rake_tasks +1 -0
- data/scenarios/invalid/deploy.yml +1 -0
- data/scenarios/local/deploy.yml.erb +17 -0
- data/scenarios/remote/deploy.yml +119 -0
- data/scenarios/setup/vagrant/.gitignore +3 -0
- data/scenarios/setup/vagrant/Vagrantfile +10 -0
- data/scenarios/setup/vagrant/manifests/integration.pp +32 -0
- data/scenarios/setup/vagrant/pids/.gitignore +1 -0
- data/spec/.bacon +0 -0
- data/spec/init_spec.rb +9 -0
- data/spec/install_spec.rb +43 -0
- data/spec/integration/branch_switching_spec.rb +41 -0
- data/spec/integration/deployment_failures_spec.rb +106 -0
- data/spec/integration/helper_spec.rb +90 -0
- data/spec/integration/invalid_configuration_spec.rb +39 -0
- data/spec/integration/local_deployments_spec.rb +230 -0
- data/spec/integration/post_rake_tasks_spec.rb +226 -0
- data/spec/integration/post_scripts_spec.rb +246 -0
- data/spec/integration/remote_deployments_spec.rb +166 -0
- data/spec/integration/staleness_checks_spec.rb +72 -0
- data/spec/spec_helper.rb +117 -0
- data/spec/wd_command_spec.rb +986 -0
- data/spec/wd_role_command_spec.rb +49 -0
- data/spec/whiskey_disk/config/filter_spec.rb +77 -0
- data/spec/whiskey_disk/config/filters/add_environment_name_filter_spec.rb +20 -0
- data/spec/whiskey_disk/config/filters/add_project_name_filter_spec.rb +19 -0
- data/spec/whiskey_disk/config/filters/check_for_duplicate_domains_filter_spec.rb +29 -0
- data/spec/whiskey_disk/config/filters/convert_role_strings_to_list_filter_spec.rb +48 -0
- data/spec/whiskey_disk/config/filters/default_config_target_filter_spec.rb +19 -0
- data/spec/whiskey_disk/config/filters/default_domain_filter_spec.rb +18 -0
- data/spec/whiskey_disk/config/filters/drop_empty_domain_roles_filter_spec.rb +60 -0
- data/spec/whiskey_disk/config/filters/environment_scope_filter_spec.rb +32 -0
- data/spec/whiskey_disk/config/filters/hashify_domain_entries_filter_spec.rb +41 -0
- data/spec/whiskey_disk/config/filters/localize_domains_filter_spec.rb +30 -0
- data/spec/whiskey_disk/config/filters/normalize_ssh_options_filter_spec.rb +56 -0
- data/spec/whiskey_disk/config/filters/project_scope_filter_spec.rb +75 -0
- data/spec/whiskey_disk/config/filters/select_project_and_environment_filter_spec.rb +30 -0
- data/spec/whiskey_disk/config/filters/stringify_hash_keys_filter_spec.rb +40 -0
- data/spec/whiskey_disk/config_spec.rb +754 -0
- data/spec/whiskey_disk/helpers_spec.rb +443 -0
- data/spec/whiskey_disk/rake_spec.rb +261 -0
- data/spec/whiskey_disk_spec.rb +1224 -0
- data/tasks/deploy.rake +2 -0
- data/whisk_deploy.gemspec +215 -0
- 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
|