hillary 0.0.1
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.
- checksums.yaml +15 -0
- data/.gitignore +22 -0
- data/.rspec +2 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +2 -0
- data/hillary.gemspec +31 -0
- data/lib/hillary/railtie.rb +9 -0
- data/lib/hillary/repo/version.rb +94 -0
- data/lib/hillary/repo.rb +131 -0
- data/lib/hillary/shellable.rb +39 -0
- data/lib/hillary/slug/bucket.rb +32 -0
- data/lib/hillary/slug.rb +105 -0
- data/lib/hillary/tasks/rails/ci.rake +18 -0
- data/lib/hillary/version.rb +3 -0
- data/lib/hillary.rb +5 -0
- data/spec/hillary/repo/version_spec.rb +241 -0
- data/spec/hillary/repo_spec.rb +135 -0
- data/spec/hillary/slug/bucket_spec.rb +43 -0
- data/spec/hillary/slug_spec.rb +160 -0
- data/spec/hillary_spec.rb +7 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/support/contexts/git_repository.rb +49 -0
- metadata +201 -0
@@ -0,0 +1,241 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hillary::Repo::Version do
|
4
|
+
include_context 'git repository'
|
5
|
+
|
6
|
+
describe '.create!' do
|
7
|
+
context 'when the repository is on master, but not a production build' do
|
8
|
+
let!(:version){Hillary::Repo::Version.create!(repo)}
|
9
|
+
|
10
|
+
it 'creates an rc tag' do
|
11
|
+
expect(version.rc_tag).to eq(repo.last_rc_tag.name)
|
12
|
+
expect(version.rc_tag).to match(Hillary::Repo::RC_TAG_REGEX)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
context 'when the repository is on master and is a production build' do
|
17
|
+
before(:each){repo.create_rc_tag}
|
18
|
+
|
19
|
+
let!(:version){Hillary::Repo::Version.create!(repo, production: true)}
|
20
|
+
|
21
|
+
it 'creates a production tag' do
|
22
|
+
expect(version.production_tag).to eq(repo.last_production_tag.name)
|
23
|
+
expect(version.production_tag).to match(Hillary::Repo::PRODUCTION_TAG_REGEX)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'when the repository is on dev' do
|
28
|
+
before(:each){local_repo.git.checkout({b: true}, 'dev')}
|
29
|
+
|
30
|
+
let!(:version){Hillary::Repo::Version.create!(repo)}
|
31
|
+
|
32
|
+
it 'does not create a tag' do
|
33
|
+
expect(version.rc_tag).to be_nil
|
34
|
+
expect(version.production_tag).to be_nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
describe '#name' do
|
40
|
+
let(:version){Hillary::Repo::Version.new(repo)}
|
41
|
+
|
42
|
+
context 'when branch is dev' do
|
43
|
+
before(:each){local_repo.git.checkout({b: true}, 'dev')}
|
44
|
+
|
45
|
+
it 'returns the commit sha of the current branch' do
|
46
|
+
expect(version.name).to eq(local_repo.commits.last.sha)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'when branch is master, but not a production build' do
|
51
|
+
before(:each){repo.create_rc_tag}
|
52
|
+
|
53
|
+
it 'returns the last rc tag' do
|
54
|
+
expect(version.name).to eq(repo.last_rc_tag.name)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'when branch is master, but not a production build' do
|
59
|
+
before(:each) do
|
60
|
+
repo.create_rc_tag
|
61
|
+
repo.create_production_tag
|
62
|
+
end
|
63
|
+
|
64
|
+
let(:version){Hillary::Repo::Version.new(repo, production: true)}
|
65
|
+
|
66
|
+
it 'returns the last production tag' do
|
67
|
+
expect(version.name).to eq(repo.last_production_tag.name)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#branch' do
|
73
|
+
let(:version){Hillary::Repo::Version.new(repo)}
|
74
|
+
|
75
|
+
context 'when branch is dev' do
|
76
|
+
before(:each){local_repo.git.checkout({b: true}, 'dev')}
|
77
|
+
|
78
|
+
it 'returns "dev"' do
|
79
|
+
expect(version.branch).to eq('dev')
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'when branch is master' do
|
84
|
+
it 'returns "master"' do
|
85
|
+
expect(version.branch).to eq('master')
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
describe '#tag' do
|
91
|
+
let(:version){Hillary::Repo::Version.new(repo)}
|
92
|
+
|
93
|
+
context 'when the branch is dev and no rc tag points to the same commit' do
|
94
|
+
it 'returns nil' do
|
95
|
+
expect(version.tag).to be_nil
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context 'when the branch is master, but not a production build' do
|
100
|
+
before(:each){repo.create_rc_tag}
|
101
|
+
|
102
|
+
it 'returns last rc tag' do
|
103
|
+
expect(version.tag).to eq(repo.last_rc_tag.name)
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context 'when the branch is master and is a production build' do
|
108
|
+
before(:each) do
|
109
|
+
repo.create_rc_tag
|
110
|
+
repo.create_production_tag
|
111
|
+
end
|
112
|
+
|
113
|
+
let(:version){Hillary::Repo::Version.new(repo, production: true)}
|
114
|
+
|
115
|
+
it 'returns last production tag' do
|
116
|
+
expect(version.tag).to eq(repo.last_production_tag.name)
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe '#sha' do
|
122
|
+
let(:version){Hillary::Repo::Version.new(repo)}
|
123
|
+
|
124
|
+
it 'returns the sha of the current branch' do
|
125
|
+
expect(version.sha).to eq(local_repo.commits.last.sha)
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
describe '#rc_tag' do
|
130
|
+
let(:version){Hillary::Repo::Version.new(repo)}
|
131
|
+
|
132
|
+
before(:each){repo.create_rc_tag}
|
133
|
+
|
134
|
+
context 'when current head matches latest rc tag' do
|
135
|
+
it 'returns the rc tag' do
|
136
|
+
expect(version.rc_tag).to eq(repo.last_rc_tag.name)
|
137
|
+
end
|
138
|
+
end
|
139
|
+
|
140
|
+
context 'when current head does not match the latest rc tag' do
|
141
|
+
before(:each) do
|
142
|
+
add_file_to_local('pizza.md', 'add pizza')
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'returns nil' do
|
146
|
+
expect(version.rc_tag).to be_nil
|
147
|
+
end
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe '#production_tag' do
|
152
|
+
let(:version){Hillary::Repo::Version.new(repo)}
|
153
|
+
|
154
|
+
before(:each) do
|
155
|
+
repo.create_rc_tag
|
156
|
+
repo.create_production_tag
|
157
|
+
end
|
158
|
+
|
159
|
+
context 'when lastest rc tag matches latest production tag' do
|
160
|
+
it 'returns the production tag' do
|
161
|
+
expect(version.production_tag).to eq(repo.last_production_tag.name)
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
context 'when latest rc tag does not match the latest production tag' do
|
166
|
+
before(:each) do
|
167
|
+
add_file_to_local('pizza.md', 'add pizza')
|
168
|
+
|
169
|
+
Timecop.freeze(Time.now + 30) do
|
170
|
+
repo.create_rc_tag
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'returns nil' do # HERE
|
175
|
+
expect(version.production_tag).to be_nil
|
176
|
+
end
|
177
|
+
end
|
178
|
+
end
|
179
|
+
|
180
|
+
describe '#sluggable?' do
|
181
|
+
let(:version){Hillary::Repo::Version.new(repo)}
|
182
|
+
|
183
|
+
context 'when the branch is dev' do
|
184
|
+
before(:each){local_repo.git.checkout({b: true}, 'dev')}
|
185
|
+
|
186
|
+
it 'is sluggable' do
|
187
|
+
expect(version).to be_sluggable
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
context 'when the branch is master' do
|
192
|
+
it 'is sluggable' do
|
193
|
+
expect(version).to be_sluggable
|
194
|
+
end
|
195
|
+
end
|
196
|
+
|
197
|
+
context 'when the branch is anything else' do
|
198
|
+
before(:each){local_repo.git.checkout({b: true}, 'anything_else')}
|
199
|
+
|
200
|
+
it 'is not sluggable' do
|
201
|
+
expect(version).to_not be_sluggable
|
202
|
+
end
|
203
|
+
end
|
204
|
+
end
|
205
|
+
|
206
|
+
describe '#master?' do
|
207
|
+
let(:version){Hillary::Repo::Version.new(repo)}
|
208
|
+
|
209
|
+
context 'when branch is master' do
|
210
|
+
it 'is true' do
|
211
|
+
expect(version).to be_master
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
context 'when branch is not master' do
|
216
|
+
before(:each){local_repo.git.checkout({b: true}, 'anything_else')}
|
217
|
+
|
218
|
+
it 'is false' do
|
219
|
+
expect(version).to_not be_master
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
|
224
|
+
describe '#dev?' do
|
225
|
+
let(:version){Hillary::Repo::Version.new(repo)}
|
226
|
+
|
227
|
+
context 'when branch is dev' do
|
228
|
+
before(:each){local_repo.git.checkout({b: true}, 'dev')}
|
229
|
+
|
230
|
+
it 'is true' do
|
231
|
+
expect(version).to be_dev
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
context 'when branch is not dev' do
|
236
|
+
it 'is false' do
|
237
|
+
expect(version).to_not be_dev
|
238
|
+
end
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
@@ -0,0 +1,135 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'grit'
|
3
|
+
require 'fileutils'
|
4
|
+
|
5
|
+
describe Hillary::Repo do
|
6
|
+
shared_context 'specific time' do
|
7
|
+
around(:each) do |example|
|
8
|
+
Timecop.freeze(Time.at(0)) do
|
9
|
+
example.call
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
describe '.rc_tag_name' do
|
15
|
+
include_context 'specific time'
|
16
|
+
|
17
|
+
it 'generates an RC tag name' do
|
18
|
+
expect(described_class.rc_tag_name).to eq('RC1969_12_31_19_00_00')
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'matches the RC tag format' do
|
22
|
+
expect(described_class.rc_tag_name).to match(described_class::RC_TAG_REGEX)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '.production_tag_name' do
|
27
|
+
include_context 'specific time'
|
28
|
+
|
29
|
+
it 'generates an production tag name' do
|
30
|
+
expect(described_class.production_tag_name).to eq('1969_12_31_19_00_00')
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'matches the production tag format' do
|
34
|
+
expect(described_class.production_tag_name).to match(described_class::PRODUCTION_TAG_REGEX)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#checkout' do
|
39
|
+
include_context 'git repository'
|
40
|
+
|
41
|
+
context 'when called with a branch that exists' do
|
42
|
+
before(:each) do
|
43
|
+
local_repo.git.branch({}, 'dev')
|
44
|
+
remote_repo.git.branch({}, 'dev')
|
45
|
+
add_file_to_remote('chicken.txt', 'chicken', 'dev')
|
46
|
+
repo.checkout('dev')
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'checks out the specified branch' do
|
50
|
+
expect(local_repo.head.name).to eq('dev')
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'updates the local branch from remote' do
|
54
|
+
expect(File.exist?('chicken.txt')).to eq(true)
|
55
|
+
end
|
56
|
+
|
57
|
+
it 'displays information about what is happening' do
|
58
|
+
expect(out.string).to eq("Checking out dev and updating from origin\n")
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'when called with a branch that does not exist' do
|
63
|
+
it 'raises MissingHeadError' do
|
64
|
+
expect{repo.checkout('dev')}.to raise_error(Hillary::Repo::MissingHeadError)
|
65
|
+
end
|
66
|
+
|
67
|
+
it 'displays information about what is happening' do
|
68
|
+
repo.checkout('dev') rescue nil
|
69
|
+
|
70
|
+
expect(out.string).to eq("Checking out dev and updating from origin\n")
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
context 'when called on a repository that is dirty' do
|
75
|
+
before(:each) do
|
76
|
+
FileUtils.touch('blah')
|
77
|
+
local_repo.add('blah')
|
78
|
+
end
|
79
|
+
|
80
|
+
it 'raises DirtyProjectError' do
|
81
|
+
expect{repo.checkout('dev')}.to raise_error(Hillary::Repo::DirtyProjectError)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
describe '#create_rc_tag' do
|
87
|
+
include_context 'git repository'
|
88
|
+
|
89
|
+
before(:each){repo.create_rc_tag('master', 'RC1969_12_31_19_00_00')}
|
90
|
+
let(:local_master){local_repo.get_head('master')}
|
91
|
+
let(:local_tag){local_repo.tags.first}
|
92
|
+
let(:remote_tag){remote_repo.tags.first}
|
93
|
+
|
94
|
+
it 'creates a tag pointing to the same commit as master' do
|
95
|
+
expect(local_tag.commit.sha).to eq(local_master.commit.sha)
|
96
|
+
end
|
97
|
+
|
98
|
+
it 'pushes the tag to origin' do
|
99
|
+
expect(remote_tag.commit.sha).to eq(local_master.commit.sha)
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'displays information about what is happening' do
|
103
|
+
expect(out.string).to match(
|
104
|
+
%r{Tagging origin/master \([\da-f]+\) as RC1969_12_31_19_00_00\nPushing RC1969_12_31_19_00_00 to origin\n}
|
105
|
+
)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe '#create_production_tag' do
|
110
|
+
include_context 'git repository'
|
111
|
+
|
112
|
+
before(:each) do
|
113
|
+
repo.create_rc_tag('master', 'RC1969_12_31_19_00_00')
|
114
|
+
repo.create_production_tag('2001_11_11_11_11_11')
|
115
|
+
end
|
116
|
+
|
117
|
+
let(:local_rc_tag){local_repo.tags.find{|tag| tag.name == 'RC1969_12_31_19_00_00'}}
|
118
|
+
let(:local_production_tag){local_repo.tags.find{|tag| tag.name == '2001_11_11_11_11_11'}}
|
119
|
+
let(:remote_production_tag){remote_repo.tags.find{|tag| tag.name == '2001_11_11_11_11_11'}}
|
120
|
+
|
121
|
+
it 'creates a tag pointing to the last RC' do
|
122
|
+
expect(local_production_tag.commit.sha).to eq(local_rc_tag.commit.sha)
|
123
|
+
end
|
124
|
+
|
125
|
+
it 'pushes the tag to origin' do
|
126
|
+
expect(remote_production_tag.commit.sha).to eq(local_rc_tag.commit.sha)
|
127
|
+
end
|
128
|
+
|
129
|
+
it 'displays information about what is happening' do
|
130
|
+
expect(out.string).to match(
|
131
|
+
%r{Tagging origin/master \([\da-f]+\) as RC1969_12_31_19_00_00\nPushing RC1969_12_31_19_00_00 to origin\nTagging RC1969_12_31_19_00_00 \([\da-f]+\) as 2001_11_11_11_11_11\nPushing 2001_11_11_11_11_11 to origin\n}
|
132
|
+
)
|
133
|
+
end
|
134
|
+
end
|
135
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Hillary::Slug::Bucket do
|
4
|
+
around(:each) do |example|
|
5
|
+
Fog.mock!
|
6
|
+
example.run
|
7
|
+
Fog.unmock!
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:access_key){'public'}
|
11
|
+
let(:secret_key){'secret'}
|
12
|
+
let(:storage){Fog::Storage.new(provider: 'AWS', aws_access_key_id: access_key, aws_secret_access_key: secret_key)}
|
13
|
+
let(:bucket_name){'slugbucket'}
|
14
|
+
let(:bucket){storage.directories.get(bucket_name)}
|
15
|
+
let(:slug_name){'g3_slug_RC2014_01_01_01_01_01.tar.gz'}
|
16
|
+
let(:canonical_slug_name){'g3_slug_b26206aaf36207304d4fa583ce9837d0bdb48966.tar.gz'}
|
17
|
+
let(:slug_path){'rc/' + slug_name}
|
18
|
+
let(:canonical_slug_path){'dev/' + canonical_slug_name}
|
19
|
+
let(:slug){bucket.files.get(slug_name)}
|
20
|
+
let(:canonical_slug){bucket.files.get(canonical_slug_name)}
|
21
|
+
let(:slug_file){Tempfile.new(slug_name)}
|
22
|
+
let(:slug_file_path){slug_file.path}
|
23
|
+
|
24
|
+
before(:each){storage.directories.create(key: bucket_name)}
|
25
|
+
|
26
|
+
subject{Hillary::Slug::Bucket.new(bucket_name, access_key, secret_key)}
|
27
|
+
|
28
|
+
describe '#write' do
|
29
|
+
it 'writes the file to the bucket with the given name' do
|
30
|
+
subject.write(canonical_slug_path, slug_file_path)
|
31
|
+
expect(bucket.files.get(canonical_slug_path).body).to eq('')
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#copy' do
|
36
|
+
it 'copies the specified file to the specified location' do
|
37
|
+
subject.write(canonical_slug_path, slug_file_path)
|
38
|
+
subject.copy(canonical_slug_path, slug_path)
|
39
|
+
|
40
|
+
expect(bucket.files.get(slug_path))
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
describe Hillary::Slug do
|
5
|
+
let(:version) do
|
6
|
+
double(
|
7
|
+
Hillary::Repo::Version,
|
8
|
+
sluggable?: true,
|
9
|
+
branch: 'dev',
|
10
|
+
name: 'b26206aaf36207304d4fa583ce9837d0bdb48966',
|
11
|
+
sha: 'b26206aaf36207304d4fa583ce9837d0bdb48966',
|
12
|
+
dev?: true,
|
13
|
+
master?: false,
|
14
|
+
production?: false
|
15
|
+
)
|
16
|
+
end
|
17
|
+
let(:out){StringIO.new}
|
18
|
+
let(:logger) do
|
19
|
+
Logger.new(out).tap do |logger|
|
20
|
+
end
|
21
|
+
end
|
22
|
+
let(:bucket){double(Hillary::Slug::Bucket, write: nil, copy: nil, name: 'gz-slugbucket')}
|
23
|
+
let(:path){File.expand_path('../../tmp/g3', __FILE__)}
|
24
|
+
|
25
|
+
describe '.build' do
|
26
|
+
context 'when the version is not sluggable' do
|
27
|
+
before(:each){allow(version).to receive(:sluggable?){false}}
|
28
|
+
|
29
|
+
it 'returns nil' do
|
30
|
+
slug = described_class.build(path, version, logger: logger, bucket: bucket)
|
31
|
+
expect(slug).to be_nil
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'when the version is sluggable' do
|
36
|
+
let(:slug){double(Hillary::Slug)}
|
37
|
+
|
38
|
+
it 'returns a slug' do
|
39
|
+
expect(Hillary::Slug).to receive(:new).with(path, version, logger: logger, bucket: bucket){slug}
|
40
|
+
expect(slug).to receive(:build)
|
41
|
+
|
42
|
+
described_class.build(path, version, logger: logger, bucket: bucket)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#build' do
|
48
|
+
context 'when branch is dev' do
|
49
|
+
subject(:slug){described_class.new(path, version, logger: logger, bucket: bucket)}
|
50
|
+
let(:slug_name){'g3_slug_b26206aaf36207304d4fa583ce9837d0bdb48966.tar.gz'}
|
51
|
+
let(:slug_path){Pathname.new(path).join('..', slug_name).expand_path}
|
52
|
+
|
53
|
+
describe 'when everything is successful' do
|
54
|
+
before(:each) do
|
55
|
+
FileUtils.mkdir_p(path)
|
56
|
+
allow(bucket).to receive(:write)
|
57
|
+
end
|
58
|
+
|
59
|
+
after(:each) do
|
60
|
+
FileUtils.rm_rf(slug_path)
|
61
|
+
FileUtils.rm_rf(path)
|
62
|
+
end
|
63
|
+
|
64
|
+
it 'creates the slug' do
|
65
|
+
slug.build
|
66
|
+
|
67
|
+
expect(File.exist?(slug_path)).to eq(true)
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'writes the slug to the bucket' do
|
71
|
+
expect(bucket).to receive(:write).with('dev/' + slug_name, slug_path)
|
72
|
+
|
73
|
+
slug.build
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'logs information about what is happening' do
|
77
|
+
slug.build
|
78
|
+
|
79
|
+
expect(out.string).to eq(
|
80
|
+
"Creating slug g3_slug_b26206aaf36207304d4fa583ce9837d0bdb48966.tar.gz\n"\
|
81
|
+
'Uploading g3_slug_b26206aaf36207304d4fa583ce9837d0bdb48966.tar.gz '\
|
82
|
+
"to gz-slugbucket:/dev/g3_slug_b26206aaf36207304d4fa583ce9837d0bdb48966.tar.gz\n"
|
83
|
+
)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe 'when archiving fails' do
|
88
|
+
it 'raises an error' do
|
89
|
+
expect{slug.build}.to raise_error(Hillary::Shellable::ExecutionError)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
context 'when branch is master, but not production build' do
|
95
|
+
let(:version) do
|
96
|
+
double(
|
97
|
+
Hillary::Repo::Version,
|
98
|
+
sluggable?: true,
|
99
|
+
branch: 'master',
|
100
|
+
name: 'RC2014_01_01_01_01_01',
|
101
|
+
sha: 'b26206aaf36207304d4fa583ce9837d0bdb48966',
|
102
|
+
dev?: false,
|
103
|
+
master?: true,
|
104
|
+
production?: false
|
105
|
+
)
|
106
|
+
end
|
107
|
+
|
108
|
+
subject(:slug){described_class.new(path, version, logger: logger, bucket: bucket)}
|
109
|
+
|
110
|
+
it 'copies the canonical slug to rc slug name' do
|
111
|
+
expect(bucket).to receive(:copy).with('dev/g3_slug_b26206aaf36207304d4fa583ce9837d0bdb48966.tar.gz', 'rc/g3_slug_RC2014_01_01_01_01_01.tar.gz')
|
112
|
+
|
113
|
+
slug.build
|
114
|
+
end
|
115
|
+
|
116
|
+
it 'logs information about what is happening' do
|
117
|
+
slug.build
|
118
|
+
|
119
|
+
expect(out.string).to eq('Copying gz-slugbucket:/dev/g3_slug_b26206aaf36207304d4fa583ce9837d0bdb48966.tar.gz '\
|
120
|
+
"to gz-slugbucket:/rc/g3_slug_RC2014_01_01_01_01_01.tar.gz\n"
|
121
|
+
)
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
context 'when branch is master and is a production build' do
|
126
|
+
let(:version) do
|
127
|
+
double(
|
128
|
+
Hillary::Repo::Version,
|
129
|
+
sluggable?: true,
|
130
|
+
branch: 'master',
|
131
|
+
name: '2014_01_01_01_01_01',
|
132
|
+
sha: 'b26206aaf36207304d4fa583ce9837d0bdb48966',
|
133
|
+
dev?: false,
|
134
|
+
master?: true,
|
135
|
+
production?: true
|
136
|
+
)
|
137
|
+
end
|
138
|
+
|
139
|
+
subject(:slug){described_class.new(path, version, logger: logger, bucket: bucket)}
|
140
|
+
|
141
|
+
it 'copies the canonical slug to production slug name' do
|
142
|
+
expect(bucket).to receive(:copy).with(
|
143
|
+
'dev/g3_slug_b26206aaf36207304d4fa583ce9837d0bdb48966.tar.gz',
|
144
|
+
'production/g3_slug_2014_01_01_01_01_01.tar.gz'
|
145
|
+
)
|
146
|
+
|
147
|
+
slug.build
|
148
|
+
end
|
149
|
+
|
150
|
+
it 'logs information about what is happening' do
|
151
|
+
slug.build
|
152
|
+
|
153
|
+
expect(out.string).to eq(
|
154
|
+
'Copying gz-slugbucket:/dev/g3_slug_b26206aaf36207304d4fa583ce9837d0bdb48966.tar.gz '\
|
155
|
+
"to gz-slugbucket:/production/g3_slug_2014_01_01_01_01_01.tar.gz\n"
|
156
|
+
)
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
shared_context 'git repository' do
|
2
|
+
subject(:repo){Hillary::Repo.new(local_repo_path, logger)}
|
3
|
+
let(:logger){Logger.new(out)}
|
4
|
+
let(:out){StringIO.new}
|
5
|
+
let(:local_repo_path){File.expand_path('../../tmp/local', __FILE__)}
|
6
|
+
let(:remote_repo_path){File.expand_path('../../tmp/remote.git', __FILE__)}
|
7
|
+
let!(:local_repo) do
|
8
|
+
Grit::Repo.init(local_repo_path).tap do |repo|
|
9
|
+
FileUtils.touch('taco.md')
|
10
|
+
repo.add('taco.md')
|
11
|
+
repo.commit_all('Initial commit')
|
12
|
+
|
13
|
+
repo.fork_bare(remote_repo_path)
|
14
|
+
repo.remote_add('origin', remote_repo_path)
|
15
|
+
repo.git.pull
|
16
|
+
end
|
17
|
+
end
|
18
|
+
let!(:remote_repo) do
|
19
|
+
Grit::Repo.init_bare(remote_repo_path)
|
20
|
+
end
|
21
|
+
|
22
|
+
around(:each) do |example|
|
23
|
+
FileUtils.mkdir_p(local_repo_path)
|
24
|
+
Dir.chdir(local_repo_path) do
|
25
|
+
example.call
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
after(:each) do
|
30
|
+
FileUtils.rm_rf(local_repo_path)
|
31
|
+
FileUtils.rm_rf(remote_repo_path)
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_file_to_remote(name, content, branch)
|
35
|
+
index = remote_repo.index
|
36
|
+
parent_commit = remote_repo.get_head(branch).commit
|
37
|
+
index.read_tree(branch)
|
38
|
+
index.add(name, content)
|
39
|
+
index.commit("Add #{name}", [parent_commit], nil, nil, branch)
|
40
|
+
end
|
41
|
+
|
42
|
+
def add_file_to_local(name, message)
|
43
|
+
FileUtils.touch(name)
|
44
|
+
local_repo.add(name)
|
45
|
+
local_repo.commit_all(message)
|
46
|
+
local_repo.git.push({u: true}, 'origin', 'head')
|
47
|
+
local_repo.git.pull
|
48
|
+
end
|
49
|
+
end
|