Module: Ra10ke::Dependencies

Included in:
RakeTask
Defined in:
lib/ra10ke/dependencies.rb

Constant Summary collapse

@@version_formats =
{}

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.register_version_format(name, &block) ⇒ Object

Registers a block that finds the latest version. The block will be called with a list of tags. If the block returns nil the next format will be tried.



7
8
9
# File 'lib/ra10ke/dependencies.rb', line 7

def self.register_version_format(name, &block)
  @@version_formats[name] = block
end

Instance Method Details

#define_task_dependencies(*_args) ⇒ Object



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/ra10ke/dependencies.rb', line 32

def define_task_dependencies(*_args)
  desc "Print outdated forge modules"
  task :dependencies do
    require 'r10k/puppetfile'
    require 'puppet_forge'

    PuppetForge.user_agent = "ra10ke/#{Ra10ke::VERSION}"
    puppetfile = get_puppetfile
    puppetfile.load!
    PuppetForge.host = puppetfile.forge if puppetfile.forge =~ /^http/

    # ignore file allows for "don't tell me about this"
    ignore_modules = []
    if File.exist?('.r10kignore')
      ignore_modules = File.readlines('.r10kignore').each {|l| l.chomp!}
    end

    puppetfile.modules.each do |puppet_module|
      next if ignore_modules.include? puppet_module.title
      if puppet_module.class == R10K::Module::Forge
        module_name = puppet_module.title.gsub('/', '-')
        forge_version = PuppetForge::Module.find(module_name).current_release.version
        installed_version = puppet_module.expected_version
        if installed_version != forge_version
          puts "#{puppet_module.title} is OUTDATED: #{installed_version} vs #{forge_version}"
        end
      end

      if puppet_module.class == R10K::Module::Git
        # use helper; avoid `desired_ref`
        # we do not want to deal with `:control_branch`
        ref = puppet_module.version
        next unless ref

        remote = puppet_module.instance_variable_get(:@remote)
        remote_refs = Git.ls_remote(remote)

        # skip if ref is a branch
        next if remote_refs['branches'].key?(ref)

        if remote_refs['tags'].key?(ref)
          # there are too many possible versioning conventions
          # we have to be be opinionated here
          # so semantic versioning (vX.Y.Z) it is for us
          # as well as support for skipping the leading v letter
          #
          # register own version formats with
          # Ra10ke::Dependencies.register_version_format(:name, &block)
          latest_ref = get_latest_ref(remote_refs)
        elsif ref.match(/^[a-z0-9]{40}$/)
          # for sha just assume head should be tracked
          latest_ref = remote_refs['head'][:sha]
        else
          raise "Unable to determine ref type for #{puppet_module.title}"
        end

        puts "#{puppet_module.title} is OUTDATED: #{ref} vs #{latest_ref}" if ref != latest_ref
      end
    end
  end
end

#get_latest_ref(remote_refs) ⇒ Object



24
25
26
27
28
29
30
# File 'lib/ra10ke/dependencies.rb', line 24

def get_latest_ref(remote_refs)
  tags = remote_refs['tags'].keys
  latest_ref = nil
  @@version_formats.detect { |_, block| latest_ref = block.call(tags) }
  latest_ref = 'undef (tags do not follow any known pattern)' if latest_ref.nil?
  latest_ref
end