bosh-workspace 0.9.0.rc4 → 0.9.0.rc5

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7a974316196c63756eb13d118715adee4cb23a54
4
- data.tar.gz: f683bafb845d0d1f6fe837f0c99d3d9508c9d445
3
+ metadata.gz: 3c7b969ed0420ed359c4b818cc406ba9da51da12
4
+ data.tar.gz: e18975e40f8822effa0e4a38116779dd38831d3a
5
5
  SHA512:
6
- metadata.gz: 94646d03fe1942ca890a41f1e43487d6f7fedcecb6fb16605f48d6fd34abbc78d3771bf6d5cc9750066ca5a4cbd6804d25d9bb736a7b7e4d111a47c7a2168df9
7
- data.tar.gz: d88d409fdc34da7cc2b8bcf3112f89fd9e0a7871512e33a7f6f8f85f512b678a263dcd51051032bc2bdac9c437b835483d54fae58d3c703c942bc5ab8eeb2c6d
6
+ metadata.gz: 3a962465f8afd6ec0d9165db2e6b2907208709b014ddd21051e82f62c3084ec0e963b5696ca56d343578521c82aa41873abf08daaf8af621174111178ae7faca
7
+ data.tar.gz: d0564bb1504d5492a362a1cf548aa746afa80db5d4ee2080edef5d8db47bb84b5299a3749e3520e8868f3334b58120c8c21b0858e8d638b61ce131cbde505cad
@@ -3,7 +3,7 @@ require "bosh/workspace"
3
3
  module Bosh::Cli::Command
4
4
  class DeploymentPatch < Base
5
5
  include Bosh::Workspace::ProjectDeploymentHelper
6
- include Bosh::Workspace::GitCredenialsHelper
6
+ include Bosh::Workspace::GitCredentialsHelper
7
7
 
8
8
  usage "create deployment patch"
9
9
  desc "Extract patch from the current directory and optionally writes to file"
@@ -5,7 +5,7 @@ module Bosh::Cli::Command
5
5
  include Bosh::Cli::Validation
6
6
  include Bosh::Workspace
7
7
  include ProjectDeploymentHelper
8
- include GitCredenialsHelper
8
+ include GitCredentialsHelper
9
9
  include ReleaseHelper
10
10
  include StemcellHelper
11
11
 
@@ -30,6 +30,10 @@ module Bosh::Cli::Command
30
30
  say "Fetching release '#{release.name.make_green}' to satisfy template references"
31
31
  fetch_or_clone_repo(release.repo_dir, release.git_url)
32
32
  release.update_repo
33
+ release.required_submodules.each do |submodule|
34
+ fetch_or_clone_repo(File.join(release.repo_dir, submodule.path), submodule.url)
35
+ release.update_submodule(submodule)
36
+ end
33
37
  msg = "Version '#{release.version.to_s.make_green}'"
34
38
  msg = "Ref '#{release.ref.make_green}'" if release.ref
35
39
  say "#{msg} has been checkout into:"
@@ -54,7 +58,7 @@ module Bosh::Cli::Command
54
58
  say "Skipping upload"
55
59
  else
56
60
  say "Uploading '#{release.name_version.make_green}'"
57
- release_upload(release.manifest_file, release.repo_dir)
61
+ release_upload(release.manifest_file, release.release_dir)
58
62
  end
59
63
  end
60
64
 
@@ -1,9 +1,9 @@
1
1
  module Bosh::Workspace
2
- module GitCredenialsHelper
2
+ module GitCredentialsHelper
3
3
  REFSPEC = ['HEAD:refs/remotes/origin/HEAD']
4
4
 
5
5
  def fetch_or_clone_repo(dir, url)
6
- repo = File.exist?(dir) ? open_repo(dir) : init_repo(dir, url)
6
+ repo = File.exist?(File.join(dir, '.git')) ? open_repo(dir) : init_repo(dir, url)
7
7
  fetch_and_checkout(repo)
8
8
  end
9
9
 
@@ -24,7 +24,7 @@ module Bosh::Workspace
24
24
  return {} if check_connection(repo, url)
25
25
  validate_url_protocol_support!(url)
26
26
 
27
- options = { credentials: require_credetials_for(url) }
27
+ options = { credentials: require_credentials_for(url) }
28
28
  unless check_connection(repo, url, options)
29
29
  say "Using credentials from: #{git_credentials_file}"
30
30
  err "Invalid credentials for: #{url}"
@@ -51,7 +51,7 @@ module Bosh::Workspace
51
51
  @git_credentials ||= Credentials.new(git_credentials_file)
52
52
  end
53
53
 
54
- def require_credetials_for(url)
54
+ def require_credentials_for(url)
55
55
  unless File.exist? git_credentials_file
56
56
  say("Authentication is required for: #{url}".make_red)
57
57
  err("Credentials file does not exist: #{git_credentials_file}".make_red)
@@ -15,6 +15,21 @@ module Bosh::Workspace
15
15
  repo.checkout ref || release[:commit], strategy: :force
16
16
  end
17
17
 
18
+ def update_submodule(submodule)
19
+ submodule.repository.checkout submodule.head_oid, strategy: :force
20
+ end
21
+
22
+ def required_submodules
23
+ required = []
24
+ symlink_templates.each do |template|
25
+ submodule = submodule_for(template)
26
+ if submodule
27
+ required.push(submodule)
28
+ end
29
+ end
30
+ required
31
+ end
32
+
18
33
  def manifest_file
19
34
  File.join(repo_dir, manifest)
20
35
  end
@@ -35,6 +50,10 @@ module Bosh::Workspace
35
50
  @ref && repo.lookup(@ref).oid
36
51
  end
37
52
 
53
+ def release_dir
54
+ @path ? File.join(@repo_dir, @path) : @repo_dir
55
+ end
56
+
38
57
  private
39
58
 
40
59
  def repo
@@ -42,7 +61,8 @@ module Bosh::Workspace
42
61
  end
43
62
 
44
63
  def new_style_repo
45
- dir = File.join(repo_dir, "releases", @name)
64
+ base = @path ? File.join(@path, 'releases') : 'releases'
65
+ dir = File.join(repo_dir, base, @name)
46
66
  File.directory?(dir) && !File.symlink?(dir)
47
67
  end
48
68
 
@@ -61,6 +81,7 @@ module Bosh::Workspace
61
81
  @final_releases ||= begin
62
82
  final_releases = {}
63
83
  releases_tree.walk_blobs(:preorder) do |_, entry|
84
+ next if entry[:filemode] == 40960 # Skip symlinks
64
85
  path = File.join(releases_dir, entry[:name])
65
86
  blame = Rugged::Blame.new(repo, path)[0]
66
87
  time = blame[:final_signature][:time]
@@ -85,5 +106,38 @@ module Bosh::Workspace
85
106
  end
86
107
  release
87
108
  end
109
+
110
+ def templates_dir
111
+ File.join(repo.workdir, "templates")
112
+ end
113
+
114
+ def symlink_target(file)
115
+ if File.readlink(file).start_with?("/")
116
+ return File.readlink(file)
117
+ else
118
+ return File.expand_path(File.join(File.dirname(file), File.readlink(file)))
119
+ end
120
+ end
121
+
122
+ def submodule_for(file)
123
+ repo.submodules.each do |submodule|
124
+ if file.start_with?(File.join(repo.workdir, submodule.path))
125
+ return submodule
126
+ end
127
+ end
128
+ false
129
+ end
130
+
131
+ def symlink_templates
132
+ templates = []
133
+ if FileTest.exists?(templates_dir)
134
+ Find.find(templates_dir) do |file|
135
+ if FileTest.symlink?(file)
136
+ templates.push(symlink_target(file))
137
+ end
138
+ end
139
+ end
140
+ templates
141
+ end
88
142
  end
89
143
  end
@@ -1,5 +1,5 @@
1
1
  module Bosh
2
2
  module Manifests
3
- VERSION = "0.9.0.rc4"
3
+ VERSION = "0.9.0.rc5"
4
4
  end
5
5
  end
@@ -6,7 +6,8 @@ describe Bosh::Cli::Command::Prepare do
6
6
  let(:release) do
7
7
  instance_double("Bosh::Workspace::Release",
8
8
  name: "foo", version: "1", repo_dir: ".releases/foo", git_url: "/.git",
9
- name_version: "foo/1", manifest_file: "releases/foo-1.yml")
9
+ release_dir: '.releases/foo/sub', name_version: "foo/1",
10
+ manifest_file: "releases/foo-1.yml")
10
11
  end
11
12
  let(:stemcell) do
12
13
  instance_double("Bosh::Workspace::Stemcell",
@@ -25,12 +26,16 @@ describe Bosh::Cli::Command::Prepare do
25
26
 
26
27
  describe "prepare_release(s/_repos)" do
27
28
  let(:releases) { [release] }
29
+ let(:subrepos) { [] }
28
30
  let(:stemcells) { [] }
29
31
  let(:ref) { nil }
30
32
 
31
- context "releasewith git " do
33
+ context "release with git " do
32
34
  before do
35
+ allow(release).to receive(:required_submodules).and_return(subrepos)
36
+
33
37
  expect(release).to receive(:update_repo)
38
+ expect(release).to_not receive(:update_submodule)
34
39
  expect(release).to receive(:ref).and_return(ref)
35
40
  expect(command).to receive(:release_uploaded?)
36
41
  .with(release.name, release.version).and_return(release_uploaded)
@@ -54,7 +59,7 @@ describe Bosh::Cli::Command::Prepare do
54
59
  it "does upload the release" do
55
60
  expect(release).to receive(:ref).and_return(ref)
56
61
  expect(command).to receive(:release_upload)
57
- .with(release.manifest_file, release.repo_dir)
62
+ .with(release.manifest_file, release.release_dir)
58
63
  command.prepare
59
64
  end
60
65
  end
@@ -1,7 +1,7 @@
1
1
  module Bosh::Workspace
2
- describe GitCredenialsHelper do
3
- class GitCredenialsHelperTester
4
- include Bosh::Workspace::GitCredenialsHelper
2
+ describe GitCredentialsHelper do
3
+ class GitCredentialsHelperTester
4
+ include Bosh::Workspace::GitCredentialsHelper
5
5
 
6
6
  attr_reader :work_dir
7
7
 
@@ -20,7 +20,7 @@ module Bosh::Workspace
20
20
 
21
21
  before do
22
22
  allow(Rugged::Repository).to receive(:new).with(dir).and_return(repo)
23
- allow(File).to receive(:exist?).with(dir).and_return(dir_exist)
23
+ allow(File).to receive(:exist?).with(File.join(dir, '.git')).and_return(dir_exist)
24
24
  allow(repo).to receive_message_chain("remotes.[]").and_return(remote)
25
25
  allow(repo).to receive_message_chain("remotes.create_anonymous")
26
26
  .with(url).and_return(remote)
@@ -42,7 +42,7 @@ module Bosh::Workspace
42
42
 
43
43
  describe "fetch_repo" do
44
44
  subject do
45
- GitCredenialsHelperTester.new(work_dir).fetch_repo(dir)
45
+ GitCredentialsHelperTester.new(work_dir).fetch_repo(dir)
46
46
  end
47
47
 
48
48
  context "with existing repo" do
@@ -55,7 +55,7 @@ module Bosh::Workspace
55
55
 
56
56
  describe "fetch_or_clone_repo" do
57
57
  subject do
58
- GitCredenialsHelperTester.new(work_dir).fetch_or_clone_repo(dir, url)
58
+ GitCredentialsHelperTester.new(work_dir).fetch_or_clone_repo(dir, url)
59
59
  end
60
60
 
61
61
  context "with existing repo" do
@@ -1,5 +1,5 @@
1
1
  describe Bosh::Workspace::Release do
2
- include Bosh::Workspace::GitCredenialsHelper
2
+ include Bosh::Workspace::GitCredentialsHelper
3
3
  let(:name) { "foo" }
4
4
  let(:release) { load_release(release_data) }
5
5
  let(:version) { "3" }
@@ -48,6 +48,7 @@ describe Bosh::Workspace::Release do
48
48
  its(:name) { should eq name }
49
49
  its(:git_url) { should eq repo }
50
50
  its(:repo_dir) { should match(/\/#{name}$/) }
51
+ its(:release_dir) { should match(/\/#{name}$/) }
51
52
  its(:manifest) { should match "releases/#{name}/#{name}-#{version}.yml$" }
52
53
  its(:name_version) { should eq "#{name}/#{version}" }
53
54
  its(:version) { should eq version }
@@ -57,6 +58,88 @@ describe Bosh::Workspace::Release do
57
58
  end
58
59
  end
59
60
 
61
+ context "given a release with submodule templates" do
62
+ let(:repo) { extracted_asset_dir("supermodule", "supermodule-boshrelease-repo.zip") }
63
+ let(:subrepo) { extracted_asset_dir("submodule-boshrelease", "submodule-boshrelease-repo.zip") }
64
+ let(:name) { "supermodule" }
65
+
66
+ describe "#update_repo" do
67
+ subject { Rugged::Repository.new(File.join(releases_dir, name)) }
68
+ context "with templates in submodules" do
69
+ before do
70
+ system("rm -rf #{releases_dir}")
71
+ allow_any_instance_of(Rugged::Submodule).to receive(:url).and_return(subrepo)
72
+
73
+ release = load_release("name" => name, "version" => 1, "git" => repo)
74
+ release.update_repo
75
+ release.required_submodules.each do |submodule|
76
+ fetch_or_clone_repo(File.join(release.repo_dir, submodule.path), submodule.url)
77
+ release.update_submodule(submodule)
78
+ end
79
+ end
80
+
81
+ it "clones + checks out required submodules" do
82
+ expect(subject.submodules["src/submodule"].workdir_oid)
83
+ .to eq "2244c436777f7c305fb81a8a6e29079c92a2ab9d"
84
+ end
85
+ it "doesn't clone/checkout extraneous submodules" do
86
+ expect(subject.submodules["src/other"].workdir_oid).to eq nil
87
+ end
88
+ end
89
+ context "with templates in submodules" do
90
+ before do
91
+ system("rm -rf #{releases_dir}")
92
+ allow_any_instance_of(Rugged::Submodule).to receive(:url).and_return(subrepo)
93
+
94
+ release = load_release("name" => name, "version" => 2, "git" => repo)
95
+ release.update_repo
96
+ release.required_submodules.each do |submodule|
97
+ fetch_or_clone_repo(File.join(release.repo_dir, submodule.path), submodule.url)
98
+ release.update_submodule(submodule)
99
+ end
100
+ end
101
+
102
+ it "clones + checks out required submodules" do
103
+ expect(subject.submodules["src/submodule"].workdir_oid)
104
+ .to eq "95eed8c967af969d659a766b0551a75a729a7b65"
105
+ end
106
+ it "doesn't clone/checkout extraneous submodules" do
107
+ expect(subject.submodules["src/other"].workdir_oid).to eq nil
108
+ end
109
+ end
110
+
111
+ context "from v1 to v2" do
112
+ before do
113
+ system("rm -rf #{releases_dir}")
114
+ allow_any_instance_of(Rugged::Submodule).to receive(:url).and_return(subrepo)
115
+ end
116
+
117
+ it "updates the submodules appropriately" do
118
+ release = load_release("name" => name, "version" => 1, "git" => repo)
119
+ release.update_repo
120
+ release.required_submodules.each do |submodule|
121
+ fetch_or_clone_repo(File.join(release.repo_dir, submodule.path), submodule.url)
122
+ release.update_submodule(submodule)
123
+ end
124
+ expect(subject.submodules["src/submodule"].workdir_oid)
125
+ .to eq "2244c436777f7c305fb81a8a6e29079c92a2ab9d"
126
+ expect(subject.submodules["src/other"].workdir_oid).to eq nil
127
+
128
+ # Now move to v2 on existing repo
129
+ release = load_release("name" => name, "version" => 2, "git" => repo)
130
+ release.update_repo
131
+ release.required_submodules.each do |submodule|
132
+ fetch_or_clone_repo(File.join(release.repo_dir, submodule.path), submodule.url)
133
+ release.update_submodule(submodule)
134
+ end
135
+ expect(subject.submodules["src/submodule"].workdir_oid)
136
+ .to eq "95eed8c967af969d659a766b0551a75a729a7b65"
137
+ expect(subject.submodules["src/other"].workdir_oid).to eq nil
138
+ end
139
+ end
140
+ end
141
+ end
142
+
60
143
  context "given a release with deprecated structure within 'releases' folder" do
61
144
  let(:repo) { extracted_asset_dir("foo", "foo-boshrelease-repo.zip") }
62
145
 
@@ -69,7 +152,7 @@ describe Bosh::Workspace::Release do
69
152
  let(:version) { "latest" }
70
153
 
71
154
  it "checks out repo" do
72
- expect(subject).to match(/foo-11.yml/)
155
+ expect(subject).to match(/foo-12.yml/)
73
156
  end
74
157
 
75
158
  it "does not include templates from master" do
@@ -78,7 +161,7 @@ describe Bosh::Workspace::Release do
78
161
  end
79
162
 
80
163
  context "specific version" do
81
- let(:version) { "11" }
164
+ let(:version) { "12" }
82
165
  before { release.update_repo }
83
166
 
84
167
  it "checks out repo" do
@@ -121,7 +204,7 @@ describe Bosh::Workspace::Release do
121
204
  end
122
205
 
123
206
  context "non existing version " do
124
- let(:version) { "12" }
207
+ let(:version) { "13" }
125
208
 
126
209
  it "raises an error" do
127
210
  expect { release.update_repo }.
@@ -198,7 +281,7 @@ describe Bosh::Workspace::Release do
198
281
  end
199
282
 
200
283
  context "non existing version " do
201
- let(:version) { "12" }
284
+ let(:version) { "13" }
202
285
 
203
286
  it "raises an error" do
204
287
  expect { release.version }.
@@ -251,6 +334,7 @@ describe Bosh::Workspace::Release do
251
334
  its(:name) { should eq name }
252
335
  its(:git_url) { should eq repo }
253
336
  its(:repo_dir) { should match(/\/#{name}$/) }
337
+ its(:release_dir) { should match(/\/#{name}$/) }
254
338
  its(:manifest_file) { should match(/\/#{name}-#{version}.yml$/) }
255
339
  its(:manifest) { should match "releases/#{name}-#{version}.yml$" }
256
340
  its(:name_version) { should eq "#{name}/#{version}" }
@@ -286,6 +370,7 @@ describe Bosh::Workspace::Release do
286
370
  its(:name) { should eq name }
287
371
  its(:git_url) { should eq repo }
288
372
  its(:repo_dir) { should match(/\/#{name}$/) }
373
+ its(:release_dir) { should match(/\/#{name}\/release$/) }
289
374
  its(:manifest) { should match "release/releases/#{name}-#{version}.yml$" }
290
375
  its(:name_version) { should eq "#{name}/#{version}" }
291
376
  its(:version) { should eq version }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bosh-workspace
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.0.rc4
4
+ version: 0.9.0.rc5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ruben Koster
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-09 00:00:00.000000000 Z
11
+ date: 2015-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bosh_cli
@@ -227,6 +227,8 @@ files:
227
227
  - spec/assets/manifests-repo/deployments/bar.yml
228
228
  - spec/assets/manifests-repo/deployments/foo.yml
229
229
  - spec/assets/manifests-repo/templates/foo/bar.yml
230
+ - spec/assets/submodule-boshrelease-repo.zip
231
+ - spec/assets/supermodule-boshrelease-repo.zip
230
232
  - spec/commands/deployment_patch_spec.rb
231
233
  - spec/commands/prepare_spec.rb
232
234
  - spec/commands/project_deployment_spec.rb
@@ -275,7 +277,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
275
277
  version: 1.3.1
276
278
  requirements: []
277
279
  rubyforge_project:
278
- rubygems_version: 2.2.2
280
+ rubygems_version: 2.4.6
279
281
  signing_key:
280
282
  specification_version: 4
281
283
  summary: Manage your bosh workspace
@@ -296,6 +298,8 @@ test_files:
296
298
  - spec/assets/manifests-repo/deployments/bar.yml
297
299
  - spec/assets/manifests-repo/deployments/foo.yml
298
300
  - spec/assets/manifests-repo/templates/foo/bar.yml
301
+ - spec/assets/submodule-boshrelease-repo.zip
302
+ - spec/assets/supermodule-boshrelease-repo.zip
299
303
  - spec/commands/deployment_patch_spec.rb
300
304
  - spec/commands/prepare_spec.rb
301
305
  - spec/commands/project_deployment_spec.rb