Class: Chef::Provider::Package::Yum::RPMDependency

Inherits:
Object
  • Object
show all
Defined in:
lib/chef/provider/package/yum/rpm_utils.rb

Overview

Simple implementation from rpm and ruby-rpm reference code

Direct Known Subclasses

RPMProvide, RPMRequire

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*args) ⇒ RPMDependency

Returns a new instance of RPMDependency.



412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
# File 'lib/chef/provider/package/yum/rpm_utils.rb', line 412

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

Instance Attribute Details

#flagObject (readonly)

Returns the value of attribute flag.



430
431
432
# File 'lib/chef/provider/package/yum/rpm_utils.rb', line 430

def flag
  @flag
end

#nameObject (readonly)

Returns the value of attribute name.



430
431
432
# File 'lib/chef/provider/package/yum/rpm_utils.rb', line 430

def name
  @name
end

#versionObject (readonly)

Returns the value of attribute version.



430
431
432
# File 'lib/chef/provider/package/yum/rpm_utils.rb', line 430

def version
  @version
end

Class Method Details

.parse(string) ⇒ Object

Parses 2 forms:

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



436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
# File 'lib/chef/provider/package/yum/rpm_utils.rb', line 436

def self.parse(string)
  if %r{^(\S+)\s+(>|>=|=|==|<=|<)\s+(\S+)$}.match(string) # rubocop:disable Performance/RedundantMatch
    name = $1
    if $2 == "="
      flag = :==
    else
      flag = :"#{$2}"
    end
    version = $3

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

Instance Method Details

#satisfy?(y) ⇒ Boolean

Test if another RPMDependency satisfies our requirements

Returns:

  • (Boolean)


454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
# File 'lib/chef/provider/package/yum/rpm_utils.rb', line 454

def satisfy?(y)
  unless y.kind_of?(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

  return false
end