class Chef::Provider::Package::Yum::RPMDependency

Simple implementation from rpm and ruby-rpm reference code

Attributes

flag[R]
name[R]
version[R]

Public Class Methods

new(*args) click to toggle source
# File lib/chef/provider/package/yum/rpm_utils.rb, line 421
def initialize(*args)
  if args.size == 3
    @name = args[0]
    @version = RPMVersion.new(args[1])
    # Our requirement to other dependencies
    @flag = args[2] || :==
  elsif args.size == 5
    @name = args[0]
    e = args[1].to_i
    v = args[2]
    r = args[3]
    @version = RPMVersion.new(e, v, r)
    @flag = args[4] || :==
  else
    raise ArgumentError, "Expecting either 'name, epoch-version-release, flag' or " \
      "'name, epoch, version, release, flag'"
  end
end
parse(string) click to toggle source

Parses 2 forms:

“mtr >= 2:0.71-3.0” “mta”

# File lib/chef/provider/package/yum/rpm_utils.rb, line 445
def self.parse(string)
  if /^(\S+)\s+(>|>=|=|==|<=|<)\s+(\S+)$/.match(string) # rubocop:disable Performance/RedundantMatch
    name = $1
    flag = if $2 == "="
             :==
           else
             :"#{$2}"
           end
    version = $3

    new(name, version, flag)
  else
    name = string
    new(name, nil, nil)
  end
end

Public Instance Methods

satisfy?(y) click to toggle source

Test if another RPMDependency satisfies our requirements

# File lib/chef/provider/package/yum/rpm_utils.rb, line 463
def satisfy?(y)
  unless y.is_a?(RPMDependency)
    raise ArgumentError, "Expecting an RPMDependency object"
  end

  x = self

  # Easy!
  if x.name != y.name
    return false
  end

  # Partial compare
  #
  # eg: x.version 2.3 == y.version 2.3-1
  sense = x.version.partial_compare(y.version)

  # Thanks to rpmdsCompare() rpmds.c
  if (sense < 0) && ((x.flag == :> || x.flag == :>=) || (y.flag == :<= || y.flag == :<))
    return true
  elsif (sense > 0) && ((x.flag == :< || x.flag == :<=) || (y.flag == :>= || y.flag == :>))
    return true
  elsif sense == 0 && (
    ((x.flag == :== || x.flag == :<= || x.flag == :>=) && (y.flag == :== || y.flag == :<= || y.flag == :>=)) ||
    (x.flag == :< && y.flag == :<) ||
    (x.flag == :> && y.flag == :>)
  )
    return true
  end

  false
end