Module: Beaker::Shared::Semvar

Included in:
Beaker::Shared
Defined in:
lib/beaker/shared/semvar.rb

Instance Method Summary collapse

Instance Method Details

#max_version(versions, default = nil) ⇒ String?

Note:

nil values will be skipped

Note:

versions parameter will be copied so that the original won’t be tampered with

Gets the max semver version from a list of them

Parameters:

  • versions (Array<String>)

    List of versions to get max from

  • default (String) (defaults to: nil)

    Default version if list is nil or empty

Returns:

  • (String, nil)

    the max string out of the versions list or the default value if the list is faulty, which can either be set or nil



81
82
83
84
85
86
87
88
89
90
# File 'lib/beaker/shared/semvar.rb', line 81

def max_version(versions, default=nil)
  return default if !versions || versions.empty?
  versions_copy = versions.dup
  highest = versions_copy.shift
  versions_copy.each do |version|
    next if !version
    highest = version if version_is_less(highest, version)
  end
  highest
end

#version_is_less(a, b) ⇒ Boolean

Note:

This has been updated for our current versioning scheme.

Note:

2019.5.0 is greater than 2019.5.0-rc0

Note:

2019.5.0-rc0-1-gabc1234 is greater than 2019.5.0-rc0

Note:

2019.5.0-rc1 is greater than 2019.5.0-rc0-1-gabc1234

Note:

2019.5.0-1-gabc1234 is greater than 2019.5.0

Is semver-ish version a less than semver-ish version b

Parameters:

  • a (String)

    A version of the from ‘d.d.d.*’

  • b (String)

    A version of the form ‘d.d.d.*’

Returns:

  • (Boolean)

    true if a is less than b, otherwise return false



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
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
# File 'lib/beaker/shared/semvar.rb', line 15

def version_is_less a, b
  a_nums = a.split('-')[0].split('.')
  b_nums = b.split('-')[0].split('.')
  (0...a_nums.length).each do |i|
    if i < b_nums.length
      if a_nums[i].to_i < b_nums[i].to_i
        return true
      elsif a_nums[i].to_i > b_nums[i].to_i
        return false
      end
    else
      return false
    end
  end
  #checks all dots, they are equal so examine the rest
  a_rest = a.split('-').drop(1)
  a_is_release = a_rest.empty?
  a_is_rc = !a_is_release && !!(a_rest[0] =~ /rc\d+/)
  b_rest = b.split('-').drop(1)
  b_is_release = b_rest.empty?
  b_is_rc = !b_is_release && !!(b_rest[0] =~ /rc\d+/)

  if a_is_release && b_is_release
    # They are equal
    return false
  elsif !a_is_release && !b_is_release
    a_next = a_rest.shift
    b_next = b_rest.shift
    if a_is_rc && b_is_rc
      a_rc = a_next.gsub('rc','').to_i
      b_rc = b_next.gsub('rc','').to_i
      if a_rc < b_rc
        return true
      elsif a_rc > b_rc
        return false
      else
        a_next = a_rest.shift
        b_next = b_rest.shift
        if a_next && b_next
          return a_next.to_i < b_next.to_i
        else
          # If a has nothing after -rc#, it is a tagged RC and 
          # b must be a later build after this tag.
          return a_next.nil?
        end
      end
    else
      # If one of them is not an rc (and also not a release), 
      # that one is a post-release build. So if a is the RC, it is less.
      return a_is_rc
    end
  else
    return (b_is_release && a_is_rc) || (a_is_release && !b_is_rc)
  end
end