ManageIQ/polisher

View on GitHub
lib/polisher/gem/state.rb

Summary

Maintainability
A
3 hrs
Test Coverage
# Polisher Gem State Mixin
#
# Licensed under the MIT license
# Copyright (C) 2014 Red Hat, Inc.

require 'polisher/util/tag_mapper'

module Polisher
  module GemState
    def koji_tags
      Koji.tagged_version_for(name)
    end

    def koji_state(args = {})
      check_dep = args.key?(:check)

      return :missing   if koji_tags.empty?
      return :available unless check_dep

      koji_tags.each do |_tag, version|
        return :available if !version.nil? && args[:check].match?(name, version)
      end

      return :missing
    end

    def distgit
      @distgit ||= Git::Pkg.new :name => name
    end

    def distgit_branches
      tags = []

      koji_tags.each do |tag, _version|
        tag = TagMapper.map(tag)
        tags << tag unless tag.nil?
      end

      tags.empty? ? distgit.valid_branches : tags
    end

    def distgit_versions
      distgit_branches.collect do |branch|
        distgit.fetch branch
        distgit.spec.version if distgit.spec?
      end.compact
    end

    def distgit_state(args = {})
      check_dep = args.key?(:check)

      begin
        distgit.clone
      rescue
        return :missing_repo
      end

      return :missing_branch if distgit.valid_branches.empty?
      return :missing_spec   if distgit_versions.empty?
      return :available      unless check_dep

      distgit_versions.each do |version|
        return :available if args[:check].match?(name, version)
      end

      return :missing
    end

    # Return the 'state' of the gem as inferred by
    # the targets which there are versions for.
    #
    # If optional :check argument is specified, version
    # analysis will be restricted to targets satisfying
    # the specified gem dependency requirements
    def state(args = {})
      return :available if koji_state(args) == :available

      state = distgit_state(args)
      return :needs_repo   if state == :missing_repo
      return :needs_branch if state == :missing_branch
      return :needs_spec   if state == :missing_spec
      return :needs_build  if state == :available
      return :needs_update
    end
  end
end