Skip to content

Instantly share code, notes, and snippets.

@johanek
Created January 10, 2019 16:28
Show Gist options
  • Save johanek/cda7e2059c5aa123051aae0e64f72386 to your computer and use it in GitHub Desktop.
Save johanek/cda7e2059c5aa123051aae0e64f72386 to your computer and use it in GitHub Desktop.

Revisions

  1. Johan van den Dorpe created this gist Jan 10, 2019.
    71 changes: 71 additions & 0 deletions puppetfile.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,71 @@
    #!/usr/bin/env ruby

    require 'pry'
    require 'puppet_forge'

    PuppetForge.user_agent = 'puppetfile/0.9.0'

    Module_Regex = Regexp.new("mod ['\"]([a-z0-9_]+\/[a-z0-9_]+)['\"](, ['\"](\\d\.\\d\.\\d)['\"])?", Regexp::IGNORECASE)

    def cleanname(name)
    name.gsub(/\//, '-')
    end

    def read_puppetfile(puppetfile)
    puppetfile_contents = {
    modules: []
    }

    File.foreach(puppetfile) do |line|
    if Module_Regex.match(line)
    name = cleanname(Regexp.last_match(1))
    version = Regexp.last_match(3)
    puppetfile_contents[:modules].push({name: name, version: version, parents: [ { name: 'Puppetfile', version: version } ] })
    end
    end

    puppetfile_contents
    end

    puppetfile = read_puppetfile('Puppetfile')
    modules = puppetfile[:modules]

    modules.each do |mod|
    modname = cleanname(mod[:name])
    modversion = mod[:version]

    puts "Processing #{modname} #{modversion}"

    begin
    forgemod = PuppetForge::Module.find(modname)
    if modversion.nil?
    release = forgemod.releases.first
    else
    release = forgemod.releases.select { |r| r.version == modversion }.first
    end

    release.metadata[:dependencies].each do |dep|
    name = cleanname(dep[:name])

    puts "dep #{name}"

    # Need to get the correct version here
    modules.push({name: name, version: nil, parents: []}) unless modules.select { |m| m[:name] == name }.length > 0
    modules.select { |m| m[:name] == name }.map { |m| m[:parents] << { name: modname, version: dep[:version_requirement] } }
    end
    rescue Faraday::ResourceNotFound
    puts "#{modname} not found on the forge!"
    end
    end

    modules.each do |mod|
    puts "#{mod[:name]} has the following version requirements :"
    mod[:parents].each do |parent|
    puts " - #{parent[:version]} from #{parent[:name]}" if parent[:name] == 'Puppetfile' or parent.has_key?(:version)
    end
    puts ""
    end

    binding.pry

    # This works, but we need to get the correct version of modules resolved, rather than just the latest...