class NuGetVersions::VersionComparer

Public Class Methods

compare(a, b) click to toggle source
# File lib/nuget_versions/version_comparer.rb, line 4
def compare(a, b)
  return 0 if a.equal? b
  return 1 if b.nil?
  return -1 if a.nil?

  result = 0
  return result if (result = a.major <=> b.major) != 0
  return result if (result = a.minor <=> b.minor) != 0
  return result if (result = a.patch <=> b.patch) != 0

  if a.kind_of?(NuGetVersion) && b.kind_of?(NuGetVersion)
    return result if (result = a.revision <=> b.revision) != 0
  else
    return +1 if a.kind_of?(NuGetVersion) && (a.revision > 0)
    return -1 if b.kind_of?(NuGetVersion) && (b.revision > 0)
  end

  a_labels = a.release_labels || []
  b_labels = b.release_labels || []

  count = [a_labels.length, b_labels.length].max

  for i in 0..(count - 1)
    return +1 if i >= a_labels.length
    return -1 if i >= b_labels.length

    a_release = a_labels[i].to_s
    b_release = b_labels[i].to_s

    a_release_int = Integer(a_release, 10) rescue nil
    b_release_int = Integer(b_release, 10) rescue nil

    if !(a_release_int.nil? || b_release_int.nil?)
      return result if (result = a_release_int <=> b_release_int) != 0
    end

    return +1 if !a_release_int.nil? && b_release_int.nil?
    return -1 if a_release_int.nil? && !b_release_int.nil?

    return result if (result = a_release.casecmp(b_release)) != 0
  end

  return (a.metadata || "").casecmp(b.metadata || "")
end