berktacular 1.1.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f7726b1582a4399d6a82bc73d9d9753b0e8d3943
4
- data.tar.gz: cd4f5d8b9fa377f6deecffeb9d39b01435f76dbe
3
+ metadata.gz: 2b550dd28f7c682c8659d022921d89a65785053a
4
+ data.tar.gz: c1c53aeeb4858818ccddb394229c2f38d8d3caa8
5
5
  SHA512:
6
- metadata.gz: 9410e6368a66220dd90f2464d5b1387085034e419fbb102a05d8fb7f4340fe877ef8b0fa7dabbc0aeb6019208ca4863cde123a06b4df6b7163320b5b90b59bd4
7
- data.tar.gz: 34893ffc90c76f9cd47980da97659bdb7c7a4a3f83d8c3e5304b6cc4ae47e58eae0c37e93eaf23f90d0e82d658e66bed8860e224a28c6c252dd70f8fab913ae6
6
+ metadata.gz: 638e0ef1f4a61e6754482c2b371dc1167a4671d27e4c297867ef2f1674fa82381e49f3cf37e2c3bdca30b8ad02fc9bd85a166c98d88276808f23d803272eeceb
7
+ data.tar.gz: 548d71a31fd89eb2781657a40fe85f075e0b3a0faf4956cdad663f3212ce77e538a111a4fcdd5d80f1b785fba75f17c5d5f3052f74822de32c800b5b1f69daaa
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.2.1
data/bin/berktacular CHANGED
@@ -118,12 +118,6 @@ unless env_file && File.exist?(env_file)
118
118
  exit 2
119
119
  end
120
120
 
121
- my_env = JSON.parse( File.read( env_file ) )
122
- if versions_only
123
- # Ignore cookbook locations. Only include versions in the generated Berksfile.
124
- my_env.delete('cookbook_locations')
125
- end
126
-
127
121
  unless github_token
128
122
  if File.exists? gtoken_path
129
123
  github_token = IO.read(gtoken_path).strip
@@ -162,7 +156,7 @@ puts "Using workdir: '#{workdir}'" if verbose
162
156
  # Create a new berksfile
163
157
  puts "Checking updates, this can take some time..." if check || upgrade
164
158
  b = Berktacular::Berksfile.new(
165
- my_env,
159
+ env_file,
166
160
  upgrade: upgrade,
167
161
  github_token: github_token,
168
162
  verbose: verbose,
@@ -1,5 +1,18 @@
1
1
  require 'ostruct'
2
2
  require 'json'
3
+ require 'solve'
4
+
5
+ # Taken from http://stackoverflow.com/a/25990044
6
+ class ::Hash
7
+ def deep_merge(second)
8
+ merger = proc { |key, v1, v2|
9
+ Hash === v1 && Hash === v2 ?
10
+ v1.merge(v2, &merger) :
11
+ [:undefined, nil, :nil].include?(v2) ? v1 : v2
12
+ }
13
+ self.merge(second, &merger)
14
+ end
15
+ end
3
16
 
4
17
  module Berktacular
5
18
 
@@ -25,19 +38,23 @@ module Berktacular
25
38
  # @option opts [True,False] :verbose (False) be more verbose.
26
39
  # @option opts [Array<String>] :source_list additional Berkshelf API sources to include in the
27
40
  # generated Berksfile.
28
- def initialize( environment, opts = {})
29
- @env_hash = environment # Save the whole thing so we can emit an updated version if needed.
30
- @name = environment['name'] || nil
31
- @description = environment['description'] || nil
32
- @cookbook_versions = environment['cookbook_versions'] || {}
33
- @cookbook_locations = environment['cookbook_locations'] || {}
41
+ def initialize( env_path, opts = {})
34
42
  @opts = {
35
- :upgrade => opts.has_key?(:upgrade) ? opts[:upgrade] : false,
36
- :github_token => opts.has_key?(:github_token) ? opts[:github_token] : nil,
37
- :verbose => opts.has_key?(:verbose) ? opts[:verbose] : false,
38
- :source_list => opts.has_key?(:source_list) ? opts[:source_list] : [],
39
- :multi_cookbook_dir => opts.has_key?(:multi_cookbook_dir) ? opts[:multi_cookbook_dir] : nil
43
+ upgrade: opts.has_key?(:upgrade) ? opts[:upgrade] : false,
44
+ github_token: opts.has_key?(:github_token) ? opts[:github_token] : nil,
45
+ verbose: opts.has_key?(:verbose) ? opts[:verbose] : false,
46
+ source_list: opts.has_key?(:source_list) ? opts[:source_list] : [],
47
+ multi_cookbook_dir: opts.has_key?(:multi_cookbook_dir) ? opts[:multi_cookbook_dir] : nil,
48
+ versions_only: opts.has_key?(:versions_only) ? opts[:versions_only] : false,
49
+ max_depth: opts.has_key?(:max_depth) ? opts[:max_depth] : 10
40
50
  }
51
+ @counter = 0
52
+ @env_hash = expand_env_file(env_path)
53
+
54
+ @name = @env_hash['name'] || nil
55
+ @description = @env_hash['description'] || nil
56
+ @cookbook_versions = @env_hash['cookbook_versions'] || {}
57
+ @cookbook_locations = @env_hash['cookbook_locations'] || {}
41
58
  @installed = {}
42
59
  # only connect once, pass the client to each cookbook. and only if needed
43
60
  connect_to_git if @opts[:upgrade]
@@ -225,6 +242,30 @@ module Berktacular
225
242
  )
226
243
  end
227
244
 
245
+ # recursively expand env_file @opts[:max_depth] times.
246
+ # @return [Hash] of merged env_file
247
+ def expand_env_file(env_file)
248
+ raise "Exceeded max depth!" if @counter > @opts[:max_depth]
249
+ @counter += 1
250
+ env = {}
251
+ if File.exists?(env_file)
252
+ env = JSON.parse( File.read(env_file) )
253
+ else
254
+ raise "Environment file '#{env_file}' does not exist!"
255
+ end
256
+ if env.has_key?("parent")
257
+ parent = env["parent"]
258
+ if !File.exists?(parent)
259
+ parent = File.join(
260
+ File.dirname(env_file),
261
+ parent
262
+ )
263
+ end
264
+ env = expand_env_file( parent ).deep_merge( env )
265
+ end
266
+ env
267
+ end
268
+
228
269
  def metadata_from_json(json_str)
229
270
  OpenStruct.new(JSON.parse(json_str))
230
271
  end
@@ -32,7 +32,8 @@ module Berktacular
32
32
  @version_solved = Semverse::Version.new(@version_number)
33
33
  @auto_upgrade = config && config['auto_upgrade'] || false
34
34
  @versions = config && config['versions'] || {}
35
- @config = config ? config.reject{ |k,v| k == 'auto_upgrade' || k == 'versions' } : nil
35
+ @location = config ? config.reject{ |k,v| k == 'auto_upgrade' || k == 'versions' } : nil
36
+ @version_only = opts.has_key?(:versions_only) ? opts[:versions_only] : false
36
37
  @upgrade = opts.has_key?(:upgrade) ? opts[:upgrade] : false
37
38
  @git_client = opts.has_key?(:git_client) ? opts[:git_client].dup : nil
38
39
  @verbose = opts.has_key?(:verbose) ? opts[:verbose] : false
@@ -58,15 +59,15 @@ module Berktacular
58
59
  # param upgrade [True,False] ('@upgrade') whether or not to force the lastest version when @auto_update is enabled
59
60
  # @return [String] a Berksfile line for this cookbook
60
61
  def line(upgrade = @upgrade)
61
- "cookbook \"#{@name}\", #{generate_conf_line(upgrade, @config )}"
62
+ "cookbook \"#{@name}\", #{generate_conf_line(upgrade, @location )}"
62
63
  end
63
64
 
64
65
  # @return [Array] a list of available cookbook version newer then we started with, with most recent first
65
66
  def check_updates
66
67
  tag_re = Regexp.new(
67
- "^#{ (@config || {})['tag'] || '%{version}' }$" % { :version => "(#{VERSION_RE.source})" }
68
+ "^#{ (@location || {})['tag'] || '%{version}' }$" % { version: "(#{VERSION_RE.source})" }
68
69
  )
69
- @candidates ||= if @config && @config['github']
70
+ @candidates ||= if @location && @location['github']
70
71
  get_tags_from_github
71
72
  else
72
73
  []
@@ -92,7 +93,7 @@ module Berktacular
92
93
  def generate_conf_line(upgrade, config)
93
94
  ver = (upgrade && @candidates && @candidates.first) || @version_number
94
95
  line = []
95
- if config
96
+ if config && ! @version_only
96
97
  # Allow using coobkooks residing in subdirectories of a "multi-cookbook directory"
97
98
  # (this can be e.g. the Chef repository) if the version matches.
98
99
  if config.has_key?('rel') && @multi_cookbook_dir
@@ -117,10 +118,10 @@ module Berktacular
117
118
  if @versions.has_key?(ver)
118
119
  line << "ref: \"#{@versions[ver]['ref']}\""
119
120
  else
120
- if !@config.has_key?('tag')
121
+ if !@location.has_key?('tag')
121
122
  line << "tag: \"#{ver}\""
122
123
  else
123
- line << "tag: \"#{@config['tag']}\""
124
+ line << "tag: \"#{@location['tag']}\""
124
125
  end
125
126
  end
126
127
  else
@@ -132,9 +133,9 @@ module Berktacular
132
133
  # return [Array] a list of tags from the github repository of this cookbook.
133
134
  def get_tags_from_github
134
135
  @@tags_cache ||= {}
135
- repo_path = @config['github']
136
+ repo_path = @location['github']
136
137
  return @@tags_cache[repo_path] if @@tags_cache[repo_path]
137
- tags = @git_client.tags(@config['github']).map { |obj| obj.name }
138
+ tags = @git_client.tags(@location['github']).map { |obj| obj.name }
138
139
  @@tags_cache[repo_path] = tags
139
140
  tags
140
141
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: berktacular
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jeff Harvey-Smith
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-15 00:00:00.000000000 Z
11
+ date: 2015-10-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: solve
@@ -90,14 +90,14 @@ dependencies:
90
90
  name: berkshelf
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
- - - "~>"
93
+ - - ">="
94
94
  - !ruby/object:Gem::Version
95
95
  version: '3.1'
96
96
  type: :runtime
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
- - - "~>"
100
+ - - ">="
101
101
  - !ruby/object:Gem::Version
102
102
  version: '3.1'
103
103
  - !ruby/object:Gem::Dependency
@@ -165,7 +165,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
165
165
  version: '0'
166
166
  requirements: []
167
167
  rubyforge_project:
168
- rubygems_version: 2.2.2
168
+ rubygems_version: 2.4.8
169
169
  signing_key:
170
170
  specification_version: 4
171
171
  summary: Parse chef env files, generates a Berksfile and verifies it.