summaryrefslogtreecommitdiff
path: root/app/models/packages/sem_ver.rb
blob: b73d51b08b77394bd966f23a5a13b103b9109595 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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
# frozen_string_literal: true

class Packages::SemVer
  attr_accessor :major, :minor, :patch, :prerelease, :build

  def initialize(major = 0, minor = 0, patch = 0, prerelease = nil, build = nil, prefixed: false)
    @major = major
    @minor = minor
    @patch = patch
    @prerelease = prerelease
    @build = build
    @prefixed = prefixed
  end

  def prefixed?
    @prefixed
  end

  def ==(other)
    self.class == other.class &&
    self.major == other.major &&
    self.minor == other.minor &&
    self.patch == other.patch &&
    self.prerelease == other.prerelease &&
    self.build == other.build
  end

  def to_s
    s = "#{prefixed? ? 'v' : ''}#{major || 0}.#{minor || 0}.#{patch || 0}"
    s += "-#{prerelease}" if prerelease
    s += "+#{build}" if build

    s
  end

  def self.match(str, prefixed: false)
    return unless str&.start_with?('v') == prefixed

    str = str[1..] if prefixed

    Gitlab::Regex.semver_regex.match(str)
  end

  def self.match?(str, prefixed: false)
    !match(str, prefixed: prefixed).nil?
  end

  def self.parse(str, prefixed: false)
    m = match str, prefixed: prefixed
    return unless m

    new(m[1].to_i, m[2].to_i, m[3].to_i, m[4], m[5], prefixed: prefixed)
  end
end