ra10ke 1.2.0 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,37 +1,146 @@
1
+ require 'semverse'
2
+ require 'r10k/puppetfile'
3
+ require 'puppet_forge'
4
+ require 'table_print'
5
+ require 'git'
6
+
1
7
  module Ra10ke::Dependencies
2
- @@version_formats = {}
8
+ GOOD_EMOJI = ENV['GOOD_EMOJI'] || '👍'
9
+ BAD_EMOJI = ENV['BAD_EMOJI'] || '😨'
3
10
 
4
- # Registers a block that finds the latest version.
5
- # The block will be called with a list of tags.
6
- # If the block returns nil the next format will be tried.
7
- def self.register_version_format(name, &block)
8
- @@version_formats[name] = block
9
- end
11
+ class Verification
12
+ def self.version_formats
13
+ @version_formats ||= {}
14
+ end
10
15
 
11
- # semver is the default version format.
12
- register_version_format(:semver) do |tags|
13
- latest_tag = tags.map do |tag|
14
- begin
16
+ # Registers a block that finds the latest version.
17
+ # The block will be called with a list of tags.
18
+ # If the block returns nil the next format will be tried.
19
+ def self.register_version_format(name, &block)
20
+ version_formats[name] = block
21
+ end
22
+
23
+ Ra10ke::Dependencies::Verification.register_version_format(:semver) do |tags|
24
+ latest_tag = tags.map do |tag|
15
25
  Semverse::Version.new tag[/\Av?(.*)\Z/, 1]
16
26
  rescue Semverse::InvalidVersionFormat
17
27
  # ignore tags that do not comply to semver
18
28
  nil
29
+ end.select { |tag| !tag.nil? }.sort.last.to_s.downcase
30
+ latest_ref = tags.detect { |tag| tag[/\Av?(.*)\Z/, 1] == latest_tag }
31
+ end
32
+ attr_reader :puppetfile
33
+
34
+ def initialize(pfile)
35
+ @puppetfile = pfile
36
+ # semver is the default version format.
37
+
38
+ puppetfile.load!
39
+ end
40
+
41
+ def get_latest_ref(remote_refs)
42
+ tags = remote_refs['tags'].keys
43
+ latest_ref = nil
44
+ self.class.version_formats.detect { |_, block| latest_ref = block.call(tags) }
45
+ latest_ref = 'undef (tags do not follow any known pattern)' if latest_ref.nil?
46
+ latest_ref
47
+ end
48
+
49
+ def ignored_modules
50
+ # ignore file allows for "don't tell me about this"
51
+ @ignored_modules ||= begin
52
+ File.readlines('.r10kignore').each { |l| l.chomp! } if File.exist?('.r10kignore')
53
+ end || []
54
+ end
55
+
56
+ # @summary creates an array of module hashes with version info
57
+ # @param {Object} supplied_puppetfile - the parsed puppetfile object
58
+ # @returns {Array} array of version info for each module
59
+ # @note does not include ignored modules or modules up2date
60
+ def processed_modules(supplied_puppetfile = puppetfile)
61
+ threads = []
62
+ threads = supplied_puppetfile.modules.map do |puppet_module|
63
+ Thread.new do
64
+ next if ignored_modules.include? puppet_module.title
65
+
66
+ if puppet_module.instance_of?(::R10K::Module::Forge)
67
+ module_name = puppet_module.title.tr('/', '-')
68
+ forge_version = ::PuppetForge::Module.find(module_name).current_release.version
69
+ installed_version = puppet_module.expected_version
70
+ {
71
+ name: puppet_module.title,
72
+ installed: installed_version,
73
+ latest: forge_version,
74
+ type: 'forge',
75
+ message: (installed_version == forge_version) ? :current : :outdated,
76
+ }
77
+
78
+ elsif puppet_module.instance_of?(R10K::Module::Git)
79
+ # use helper; avoid `desired_ref`
80
+ # we do not want to deal with `:control_branch`
81
+ ref = puppet_module.version
82
+ next unless ref
83
+
84
+ remote = puppet_module.instance_variable_get(:@remote)
85
+ remote_refs = Git.ls_remote(remote)
86
+
87
+ # skip if ref is a branch
88
+ next if remote_refs['branches'].key?(ref)
89
+
90
+ if remote_refs['tags'].key?(ref)
91
+ # there are too many possible versioning conventions
92
+ # we have to be be opinionated here
93
+ # so semantic versioning (vX.Y.Z) it is for us
94
+ # as well as support for skipping the leading v letter
95
+ #
96
+ # register own version formats with
97
+ # Ra10ke::Dependencies.register_version_format(:name, &block)
98
+ latest_ref = get_latest_ref(remote_refs)
99
+ elsif /^[a-z0-9]{40}$/.match?(ref)
100
+ ref = ref.slice(0, 8)
101
+ # for sha just assume head should be tracked
102
+ latest_ref = remote_refs['head'][:sha].slice(0, 8)
103
+ else
104
+ raise "Unable to determine ref type for #{puppet_module.title}"
105
+ end
106
+ {
107
+ name: puppet_module.title,
108
+ installed: ref,
109
+ latest: latest_ref,
110
+ type: 'git',
111
+ message: (ref == latest_ref) ? :current : :outdated,
112
+ }
113
+
114
+ end
115
+ rescue R10K::Util::Subprocess::SubprocessError => e
116
+ {
117
+ name: puppet_module.title,
118
+ installed: nil,
119
+ latest: nil,
120
+ type: :error,
121
+ message: e.message,
122
+ }
123
+ end
19
124
  end
20
- end.select { |tag| !tag.nil? }.sort.last.to_s.downcase
21
- latest_ref = tags.detect { |tag| tag[/\Av?(.*)\Z/, 1] == latest_tag }
22
- end
125
+ threads.map { |th| th.join.value }.compact
126
+ end
23
127
 
24
- def get_latest_ref(remote_refs)
25
- tags = remote_refs['tags'].keys
26
- latest_ref = nil
27
- @@version_formats.detect { |_, block| latest_ref = block.call(tags) }
28
- latest_ref = 'undef (tags do not follow any known pattern)' if latest_ref.nil?
29
- latest_ref
128
+ def outdated(_supplied_puppetfile = puppetfile)
129
+ processed_modules.find_all do |mod|
130
+ mod[:message] == :outdated
131
+ end
132
+ end
133
+
134
+ def print_table(mods)
135
+ puts
136
+ tp mods, { name: { width: 50 } }, :installed, :latest, :type, :message
137
+ end
30
138
  end
31
139
 
32
- def define_task_dependencies(*_args)
33
- desc "Print outdated forge modules"
34
- task :dependencies do
140
+ def define_task_print_git_conversion(*_args)
141
+ desc 'Convert and print forge modules to git format'
142
+ task :print_git_conversion do
143
+ require 'ra10ke/git_repo'
35
144
  require 'r10k/puppetfile'
36
145
  require 'puppet_forge'
37
146
 
@@ -42,51 +151,48 @@ module Ra10ke::Dependencies
42
151
 
43
152
  # ignore file allows for "don't tell me about this"
44
153
  ignore_modules = []
45
- if File.exist?('.r10kignore')
46
- ignore_modules = File.readlines('.r10kignore').each {|l| l.chomp!}
154
+ ignore_modules = File.readlines('.r10kignore').each { |l| l.chomp! } if File.exist?('.r10kignore')
155
+ forge_mods = puppetfile.modules.find_all do |mod|
156
+ mod.instance_of?(R10K::Module::Forge) && mod.v3_module.homepage_url?
47
157
  end
48
158
 
49
- puppetfile.modules.each do |puppet_module|
50
- next if ignore_modules.include? puppet_module.title
51
- if puppet_module.class == R10K::Module::Forge
52
- module_name = puppet_module.title.gsub('/', '-')
53
- forge_version = PuppetForge::Module.find(module_name).current_release.version
54
- installed_version = puppet_module.expected_version
55
- if installed_version != forge_version
56
- puts "#{puppet_module.title} is OUTDATED: #{installed_version} vs #{forge_version}"
159
+ threads = forge_mods.map do |mod|
160
+ Thread.new do
161
+ source_url = mod.v3_module.attributes.dig(:current_release, :metadata, :source) || mod.v3_module.homepage_url
162
+ # git:// does not work with ls-remote command, convert to https
163
+ source_url = source_url.gsub('git://', 'https://')
164
+ source_url = source_url.gsub(/\Agit@(.*):(.*)/) do
165
+ "https://#{::Regexp.last_match(1)}/#{::Regexp.last_match(2)}"
57
166
  end
167
+ repo = ::Ra10ke::GitRepo.new(source_url)
168
+ ref = repo.get_ref_like(mod.expected_version)
169
+ ref_name = ref ? ref[:name] : "bad url or tag #{mod.expected_version} is missing"
170
+ <<~EOF
171
+ mod '#{mod.name}',
172
+ :git => '#{source_url}',
173
+ :ref => '#{ref_name}'
174
+
175
+ EOF
58
176
  end
177
+ end
178
+ output = threads.map { |th| th.join.value }
179
+ puts output
180
+ end
181
+ end
59
182
 
60
- if puppet_module.class == R10K::Module::Git
61
- # use helper; avoid `desired_ref`
62
- # we do not want to deal with `:control_branch`
63
- ref = puppet_module.version
64
- next unless ref
65
-
66
- remote = puppet_module.instance_variable_get(:@remote)
67
- remote_refs = Git.ls_remote(remote)
68
-
69
- # skip if ref is a branch
70
- next if remote_refs['branches'].key?(ref)
71
-
72
- if remote_refs['tags'].key?(ref)
73
- # there are too many possible versioning conventions
74
- # we have to be be opinionated here
75
- # so semantic versioning (vX.Y.Z) it is for us
76
- # as well as support for skipping the leading v letter
77
- #
78
- # register own version formats with
79
- # Ra10ke::Dependencies.register_version_format(:name, &block)
80
- latest_ref = get_latest_ref(remote_refs)
81
- elsif ref.match(/^[a-z0-9]{40}$/)
82
- # for sha just assume head should be tracked
83
- latest_ref = remote_refs['head'][:sha]
84
- else
85
- raise "Unable to determine ref type for #{puppet_module.title}"
86
- end
183
+ def define_task_dependencies(*_args)
184
+ desc 'Print outdated forge modules'
185
+ task :dependencies do
186
+ PuppetForge.user_agent = "ra10ke/#{Ra10ke::VERSION}"
187
+ puppetfile = get_puppetfile
188
+ PuppetForge.host = puppetfile.forge if /^http/.match?(puppetfile.forge)
189
+ dependencies = Ra10ke::Dependencies::Verification.new(puppetfile)
190
+ dependencies.print_table(dependencies.outdated)
87
191
 
88
- puts "#{puppet_module.title} is OUTDATED: #{ref} vs #{latest_ref}" if ref != latest_ref
89
- end
192
+ if dependencies.outdated.any?
193
+ abort(BAD_EMOJI + ' Not all modules in the Puppetfile are up2date. '.red + BAD_EMOJI)
194
+ else
195
+ puts(GOOD_EMOJI + ' All modules in the Puppetfile are up2date. '.green + GOOD_EMOJI)
90
196
  end
91
197
  end
92
198
  end
@@ -5,7 +5,7 @@ require 'ra10ke/puppetfile_parser'
5
5
 
6
6
  module Ra10ke::Duplicates
7
7
  def define_task_duplicates(*_args)
8
- desc "Check Puppetfile for duplicates"
8
+ desc 'Check Puppetfile for duplicates'
9
9
  task :duplicates do
10
10
  duplicates = Ra10ke::Duplicates::Verification.new(get_puppetfile.puppetfile_path).duplicates
11
11
  exit_code = 0
@@ -82,20 +82,31 @@ module Ra10ke
82
82
  # :sha=>"fcc0532bbc5a5b65f3941738339e9cc7e3d767ce", :ref=>"refs/pull/249/head", :type=>:pull, :subtype=>:head, :name=>"249"},
83
83
  # :sha=>"8d54891fa5df75890ee15d53080c2a81b4960f92", :ref=>"refs/pull/267/head", :type=>:pull, :subtype=>:head, :name=>"267"}]
84
84
  def all_refs
85
- @all_refs ||= begin
86
- remote_refs.each_with_object([]) do |line, refs|
87
- sha, ref = line.split("\t")
88
- next refs if sha.eql?('ref: refs/heads/master')
89
-
90
- _, type, name, subtype = ref.chomp.split('/')
91
- next refs unless name
92
-
93
- type = :tag if type.eql?('tags')
94
- type = type.to_sym
95
- subtype = subtype.to_sym if subtype
96
- type = :branch if type.eql?(:heads)
97
- refs << { sha: sha, ref: ref.chomp, type: type, subtype: subtype, name: name }
98
- end
85
+ @all_refs ||= remote_refs.each_with_object([]) do |line, refs|
86
+ sha, ref = line.split("\t")
87
+ next refs if line.include?('redirecting')
88
+ next refs if sha.eql?('ref: refs/heads/master')
89
+
90
+ _, type, name, subtype = ref.chomp.split('/')
91
+ next refs unless name
92
+
93
+ type = :tag if type.eql?('tags')
94
+ type = type.to_sym
95
+ subtype = subtype.to_sym if subtype
96
+ type = :branch if type.eql?(:heads)
97
+ refs << { sha: sha, ref: ref.chomp, type: type, subtype: subtype, name: name }
98
+ end
99
+ end
100
+
101
+ # @summary searches all the refs for a ref similar to the name provided
102
+ # This is useful when looking for tags if a v or not a v
103
+ # @param ref_name [String]
104
+ # @return [String] the matching ref_name or nil
105
+ def get_ref_like(ref_name)
106
+ return nil unless valid_url?
107
+
108
+ all_refs.find do |ref|
109
+ ref[:name].include?(ref_name)
99
110
  end
100
111
  end
101
112
 
@@ -1,27 +1,27 @@
1
1
  module Ra10ke::Install
2
2
  def define_task_install(*_args)
3
- desc "Install modules specified in Puppetfile"
3
+ desc 'Install modules specified in Puppetfile'
4
4
  task :install do
5
5
  require 'r10k/puppetfile'
6
6
 
7
7
  puppetfile = get_puppetfile
8
8
  puppetfile.load!
9
9
 
10
- puts "Processing Puppetfile for fixtures"
10
+ puts 'Processing Puppetfile for fixtures'
11
11
  puppetfile.modules.each do |mod|
12
12
  if mod.status == :insync
13
13
  puts "Skipping #{mod.name} (#{mod.version}) already in sync"
14
14
  else
15
- if mod.status == :absent
16
- msg = "installed #{mod.name}"
17
- else
18
- msg = "updated #{mod.name} from #{mod.version} to"
19
- end
15
+ msg = if mod.status == :absent
16
+ "installed #{mod.name}"
17
+ else
18
+ "updated #{mod.name} from #{mod.version} to"
19
+ end
20
20
  mod.sync
21
- if mod.status != :insync
22
- puts "Failed to sync #{mod.name}".red
23
- else
21
+ if mod.status == :insync
24
22
  puts "Successfully #{msg} #{mod.version}".green
23
+ else
24
+ puts "Failed to sync #{mod.name}".red
25
25
  end
26
26
  end
27
27
  end
@@ -18,7 +18,7 @@ class String
18
18
  colorize(33)
19
19
  end
20
20
 
21
- # removes specified markes from string.
21
+ # removes specified markes from string.
22
22
  # @return [String] - the string with markers removed
23
23
  def strip_comment(markers = ['#', "\n"])
24
24
  re = Regexp.union(markers)
@@ -1,90 +1,90 @@
1
- # it might be desirable to parse the Puppetfile as a string instead of evaling it.
1
+ # it might be desirable to parse the Puppetfile as a string instead of evaling it.
2
2
  # this module allows you to do just that.
3
3
  require 'ra10ke/monkey_patches'
4
4
 
5
5
  module Ra10ke
6
- module PuppetfileParser
7
-
8
- # @return [Array] - returns a array of hashes that contain modules with a git source
9
- def git_modules(file = puppetfile)
10
- modules(file).find_all do |mod|
11
- mod[:args].key?(:git)
12
- end
6
+ module PuppetfileParser
7
+ # @return [Array] - returns a array of hashes that contain modules with a git source
8
+ def git_modules(file = puppetfile)
9
+ modules(file).find_all do |mod|
10
+ mod[:args].key?(:git)
13
11
  end
12
+ end
14
13
 
15
- # @return [Array] - returns a array of hashes that contain modules from the Forge
16
- def forge_modules(file = puppetfile)
17
- modules(file).reject do |mod|
18
- mod[:args].key?(:git)
19
- end
14
+ # @return [Array] - returns a array of hashes that contain modules from the Forge
15
+ def forge_modules(file = puppetfile)
16
+ modules(file).reject do |mod|
17
+ mod[:args].key?(:git)
20
18
  end
19
+ end
21
20
 
22
- # @param puppetfile [String] - the absolute path to the puppetfile
23
- # @return [Array] - returns an array of module hashes that represent the puppetfile
24
- # @example
25
- # [{:namespace=>"puppetlabs", :name=>"stdlib", :args=>[]},
26
- # {:namespace=>"petems", :name=>"swap_file", :args=>["'4.0.0'"]}]
27
- def modules(puppetfile)
28
- @modules ||= begin
29
- return [] unless File.exist?(puppetfile)
21
+ # @param puppetfile [String] - the absolute path to the puppetfile
22
+ # @return [Array] - returns an array of module hashes that represent the puppetfile
23
+ # @example
24
+ # [{:namespace=>"puppetlabs", :name=>"stdlib", :args=>[]},
25
+ # {:namespace=>"petems", :name=>"swap_file", :args=>["'4.0.0'"]}]
26
+ def modules(puppetfile)
27
+ @modules ||= begin
28
+ return [] unless File.exist?(puppetfile)
30
29
 
31
- all_lines = File.read(puppetfile).lines.map(&:strip_comment)
32
- # remove comments from all the lines
33
- lines_without_comments = all_lines.reject { |line| line.match(/#.*\n/) }.join("\n")
34
- lines_without_comments.split(/^mod/).map do |line|
35
- next nil if line =~ /^forge/
36
- next nil if line.empty?
30
+ all_lines = File.read(puppetfile).lines.map(&:strip_comment)
31
+ # remove comments from all the lines
32
+ lines_without_comments = all_lines.reject { |line| line.match(/#.*\n/) || line.empty? }.join("\n")
33
+ lines_without_comments.split(/^mod/).map do |line|
34
+ next nil if /^forge/.match?(line)
35
+ next nil if line.empty?
37
36
 
38
- parse_module_args(line)
39
- end.compact.uniq
40
- end
37
+ parse_module_args(line)
38
+ end.compact.uniq
41
39
  end
40
+ end
42
41
 
43
- # @param data [String] - the string to parse the puppetfile args out of
44
- # @return [Array] - an array of arguments in hash form
45
- # @example
46
- # {:namespace=>"puppetlabs", :name=>"stdlib", :args=>[]}
47
- # {:namespace=>"petems", :name=>"swap_file", :args=>["'4.0.0'"]}
48
- def parse_module_args(data)
49
- return {} if data.empty?
50
- args = data.split(',').map(&:strip)
51
- # we can't guarantee that there will be a namespace when git is used
52
- # remove quotes and dash and slash
53
- namespace, name = args.shift.gsub(/'|"/, '').split(%r{-|/})
54
- name ||= namespace
55
- namespace = nil if namespace == name
56
- {
57
- namespace: namespace,
58
- name: name,
59
- args: process_args(args)
60
- }
61
- end
42
+ # @param data [String] - the string to parse the puppetfile args out of
43
+ # @return [Array] - an array of arguments in hash form
44
+ # @example
45
+ # {:namespace=>"puppetlabs", :name=>"stdlib", :args=>[]}
46
+ # {:namespace=>"petems", :name=>"swap_file", :args=>["'4.0.0'"]}
47
+ def parse_module_args(data)
48
+ return {} if data.empty?
49
+
50
+ args = data.split(',').map(&:strip)
51
+ # we can't guarantee that there will be a namespace when git is used
52
+ # remove quotes and dash and slash
53
+ namespace, name = args.shift.gsub(/'|"/, '').split(%r{-|/})
54
+ name ||= namespace
55
+ namespace = nil if namespace == name
56
+ {
57
+ namespace: namespace,
58
+ name: name,
59
+ args: process_args(args),
60
+ }
61
+ end
62
62
 
63
- # @return [Array] - returns an array of hashes with the args in key value pairs
64
- # @param [Array] - the arguments processed from each entry in the puppetfile
65
- # @example
66
- # [{:args=>[], :name=>"razor", :namespace=>"puppetlabs"},
67
- # {:args=>[{:version=>"0.0.3"}], :name=>"ntp", :namespace=>"puppetlabs"},
68
- # {:args=>[], :name=>"inifile", :namespace=>"puppetlabs"},
69
- # {:args=>
70
- # [{:git=>"https://github.com/nwops/reportslack.git"}, {:ref=>"1.0.20"}],
71
- # :name=>"reportslack",
72
- # :namespace=>"nwops"},
73
- # {:args=>{:git=>"git://github.com/puppetlabs/puppetlabs-apt.git"},
74
- # :name=>"apt",
75
- # :namespace=>nil}
76
- # ]
77
- def process_args(args)
78
- results = {}
79
- args.each do |arg|
80
- a = arg.gsub(/'|"/, '').split(/\A\:|\:\s|\=\>/).map(&:strip).reject(&:empty?)
81
- if a.count < 2
82
- results[:version] = a.first
83
- else
84
- results[a.first.to_sym] = a.last
85
- end
63
+ # @return [Array] - returns an array of hashes with the args in key value pairs
64
+ # @param [Array] - the arguments processed from each entry in the puppetfile
65
+ # @example
66
+ # [{:args=>[], :name=>"razor", :namespace=>"puppetlabs"},
67
+ # {:args=>[{:version=>"0.0.3"}], :name=>"ntp", :namespace=>"puppetlabs"},
68
+ # {:args=>[], :name=>"inifile", :namespace=>"puppetlabs"},
69
+ # {:args=>
70
+ # [{:git=>"https://github.com/nwops/reportslack.git"}, {:ref=>"1.0.20"}],
71
+ # :name=>"reportslack",
72
+ # :namespace=>"nwops"},
73
+ # {:args=>{:git=>"git://github.com/puppetlabs/puppetlabs-apt.git"},
74
+ # :name=>"apt",
75
+ # :namespace=>nil}
76
+ # ]
77
+ def process_args(args)
78
+ results = {}
79
+ args.each do |arg|
80
+ a = arg.gsub(/'|"/, '').split(/\A:|:\s|=>/).map(&:strip).reject(&:empty?)
81
+ if a.count < 2
82
+ results[:version] = a.first
83
+ else
84
+ results[a.first.to_sym] = a.last
86
85
  end
87
- results
88
86
  end
87
+ results
89
88
  end
89
+ end
90
90
  end
data/lib/ra10ke/solve.rb CHANGED
@@ -6,6 +6,7 @@ require 'set'
6
6
  require 'solve'
7
7
  require 'yaml/store'
8
8
  require 'semverse/version'
9
+ require 'fileutils'
9
10
 
10
11
  # How many versions to fetch from the Forge, at most
11
12
  FETCH_LIMIT = 3
@@ -26,15 +27,16 @@ module Ra10ke::Solve
26
27
  PuppetForge.user_agent = "ra10ke/#{Ra10ke::VERSION}"
27
28
  puppetfile = get_puppetfile
28
29
  puppetfile.load!
29
- PuppetForge.host = puppetfile.forge if puppetfile.forge =~ /^http/
30
+ PuppetForge.host = puppetfile.forge if /^http/.match?(puppetfile.forge)
30
31
 
31
32
  # ignore file allows for "don't tell me about this"
32
33
  ignore_modules = []
33
- if File.exist?('.r10kignore')
34
- ignore_modules = File.readlines('.r10kignore').each(&:chomp!)
35
- end
34
+ ignore_modules = File.readlines('.r10kignore').each(&:chomp!) if File.exist?('.r10kignore')
36
35
  # Actual new logic begins here:
37
36
  cache = (ENV['XDG_CACHE_DIR'] || File.expand_path('~/.cache'))
37
+
38
+ FileUtils.mkdir_p(cache)
39
+
38
40
  # Metadata cache, since the Forge is slow:
39
41
  @metadata_cache = YAML::Store.new File.join(cache, 'ra10ke.metadata_cache')
40
42
  # The graph of available module versions
@@ -50,7 +52,8 @@ module Ra10ke::Solve
50
52
 
51
53
  puppetfile.modules.each do |puppet_module|
52
54
  next if ignore_modules.include? puppet_module.title
53
- if puppet_module.class == R10K::Module::Forge
55
+
56
+ if puppet_module.instance_of?(R10K::Module::Forge)
54
57
  module_name = puppet_module.title.tr('/', '-')
55
58
  installed_version = puppet_module.expected_version
56
59
  puts "Processing Forge module #{module_name}-#{installed_version}"
@@ -77,7 +80,8 @@ module Ra10ke::Solve
77
80
  add_reqs_to_graph(mod, meta)
78
81
  end
79
82
 
80
- next unless puppet_module.class == R10K::Module::Git
83
+ next unless puppet_module.instance_of?(R10K::Module::Git)
84
+
81
85
  # This downloads the git module to modules/modulename
82
86
  meta = fetch_git_metadata(puppet_module)
83
87
  version = get_key_or_sym(meta, :version)
@@ -93,9 +97,7 @@ module Ra10ke::Solve
93
97
  end
94
98
  puts
95
99
  puts 'Resolving dependencies...'
96
- if allow_major_bump
97
- puts 'WARNING: Potentially breaking updates are allowed for this resolution'
98
- end
100
+ puts 'WARNING: Potentially breaking updates are allowed for this resolution' if allow_major_bump
99
101
  result = Solve.it!(@graph, @demands, sorted: true)
100
102
  puts
101
103
  print_module_diff(@current_modules, result)
@@ -126,7 +128,7 @@ module Ra10ke::Solve
126
128
  return {
127
129
  version: '0.0.0',
128
130
  name: puppet_module.title,
129
- dependencies: []
131
+ dependencies: [],
130
132
  }
131
133
  end
132
134
  metadata = R10K::Module::MetadataFile.new(metadata_path)
@@ -134,7 +136,7 @@ module Ra10ke::Solve
134
136
  {
135
137
  version: metadata.version,
136
138
  name: metadata.name,
137
- dependencies: metadata.dependencies
139
+ dependencies: metadata.dependencies,
138
140
  }
139
141
  end
140
142
 
@@ -146,7 +148,7 @@ module Ra10ke::Solve
146
148
  # At least puppet-extlib has malformed metadata
147
149
  def get_version_req(dep)
148
150
  req = get_key_or_sym(dep, :version_requirement)
149
- req = get_key_or_sym(dep, :version_range) unless req
151
+ req ||= get_key_or_sym(dep, :version_range)
150
152
  req
151
153
  end
152
154
 
@@ -182,17 +184,14 @@ module Ra10ke::Solve
182
184
  # actually ask the solver for the versioned thing
183
185
  @demands.add(name) unless no_demands
184
186
  ver = get_version_req(dep)
185
- unless ver
186
- # no version specified, so anything will do
187
- ver = '>=0.0.0'
188
- end
189
- ver.split(/(?=[<])/).each do |bound|
187
+ ver ||= '>=0.0.0'
188
+ ver.split(/(?=<)/).each do |bound|
190
189
  bound.strip!
191
190
  v = begin
192
- Semverse::Constraint.new(bound)
193
- rescue
194
- nil
195
- end
191
+ Semverse::Constraint.new(bound)
192
+ rescue StandardError
193
+ nil
194
+ end
196
195
  if v
197
196
  artifact.depends(name, v.to_s)
198
197
  else
@@ -202,14 +201,16 @@ module Ra10ke::Solve
202
201
  # Find the dependency in the forge, unless it's already been processed
203
202
  # and add its releases to the global graph
204
203
  next unless @processed_modules.add?(name)
204
+
205
205
  puts "Fetching module info for #{name}"
206
206
  mod = begin
207
- PuppetForge::Module.find(name)
208
- rescue
209
- # It's probably a git module
210
- nil
211
- end
207
+ PuppetForge::Module.find(name)
208
+ rescue StandardError
209
+ # It's probably a git module
210
+ nil
211
+ end
212
212
  next unless mod # Git module, or non-forge dependency. Skip to next for now.
213
+
213
214
  # Fetching metadata for all releases takes ages (which is weird, since it's mostly static info)
214
215
  mod.releases.take(FETCH_LIMIT).each do |rel|
215
216
  meta = get_release_metadata(name, rel)