class Autoproj::PackageManagers::DebianVersion

Attributes

debian_revision[R]
epoch[R]
upstream_version[R]
version[R]

Public Class Methods

compare(a, b) click to toggle source
# File lib/autoproj/package_managers/debian_version.rb, line 28
def self.compare(a, b)
    new(a) <=> new(b)
end
new(version) click to toggle source
# File lib/autoproj/package_managers/debian_version.rb, line 11
def initialize(version)
    @version = version
    parse_version
end

Public Instance Methods

<=>(b) click to toggle source
# File lib/autoproj/package_managers/debian_version.rb, line 20
def <=>(b)
    (0..2).inject(0) do |result, i|
        return result unless result == 0

        normalize(compare_fragments(split[i], b.split[i]))
    end
end
split() click to toggle source
# File lib/autoproj/package_managers/debian_version.rb, line 16
def split
    [epoch, upstream_version, debian_revision]
end

Private Instance Methods

alpha?(look_ahead) click to toggle source
# File lib/autoproj/package_managers/debian_version.rb, line 62
def alpha?(look_ahead)
    look_ahead =~ /[[:alpha:]]/
end
compare_fragments(a, b) click to toggle source

Ported from github.com/Debian/apt/blob/master/apt-pkg/deb/debversion.cc

# File lib/autoproj/package_managers/debian_version.rb, line 85
def compare_fragments(a, b)
    i = 0
    j = 0
    while i != a.size && j != b.size
        first_diff = 0
        while i != a.size && j != b.size && (!digit?(a[i]) || !digit?(b[j]))
            vc = order(a[i])
            rc = order(b[j])
            return vc - rc if vc != rc

            i += 1
            j += 1
        end

        i += 1 while a[i] == "0"
        j += 1 while b[j] == "0"
        while digit?(a[i]) && digit?(b[j])
            first_diff = a[i].ord - b[j].ord if first_diff == 0
            i += 1
            j += 1
        end

        return 1 if digit?(a[i])
        return -1 if digit?(b[j])
        return first_diff if first_diff != 0
    end

    return 0 if i == a.size && j == b.size

    if i == a.size
        return 1 if b[j] == "~"

        return -1
    end
    if j == b.size
        return -1 if a[i] == "~"

        1
    end
end
digit?(look_ahead) click to toggle source
# File lib/autoproj/package_managers/debian_version.rb, line 66
def digit?(look_ahead)
    look_ahead =~ /[[:digit:]]/
end
normalize(value) click to toggle source
# File lib/autoproj/package_managers/debian_version.rb, line 34
def normalize(value)
    return -1 if value < 0
    return 1 if value > 0
    return 0 if value == 0
end
order(c) click to toggle source
# File lib/autoproj/package_managers/debian_version.rb, line 70
def order(c)
    if digit?(c)
        0
    elsif alpha?(c)
        c.ord
    elsif c == "~"
        -1
    elsif c
        c.ord + 256
    else
        0
    end
end
parse_version() click to toggle source

Reference: www.debian.org/doc/debian-policy/ch-controlfields.html#version

# File lib/autoproj/package_managers/debian_version.rb, line 41
def parse_version
    @epoch = "0"
    @debian_revision = "0"

    @upstream_version = @version.split(":")
    if @upstream_version.size > 1
        @epoch = @upstream_version.first
        @upstream_version = @upstream_version[1..-1].join(":")
    else
        @upstream_version = @upstream_version.first
    end

    @upstream_version = @upstream_version.split("-")
    if @upstream_version.size > 1
        @debian_revision = @upstream_version.last
        @upstream_version = @upstream_version[0..-2].join("-")
    else
        @upstream_version = @upstream_version.first
    end
end