lib/release_tools/versions.rb (36 lines of code) (raw):
# frozen_string_literal: true
require 'version_sorter'
module ReleaseTools
# Utility methods for dealing with version numbers and version.gitlab.com
class Versions
def self.current
ReleaseTools::VersionClient
.versions
.collect(&:version)
end
# Returns the last version for the given major version, or `nil` if none
# could be found.
def self.last_version_for_major(major)
# Filter versions that start with the major version
filtered_versions = current.select { |v| v.start_with?("#{major}.") }
# Sort them by semantic version and get the latest version (last in the sorted array)
sort(filtered_versions).last
end
# Given an Array of version numbers, return the next patch versions
#
# Example:
#
# next(['1.0.0', '1.1.0', '1.1.1', '1.2.3'])
# => ['1.0.1', '1.1.1', '1.1.2', '1.2.4']
def self.next(versions)
versions.map do |version|
ReleaseTools::Version.new(version).next_patch
end
end
# Given an Array of version strings, find the `count` latest by minor number
#
# versions - Array of version strings
# count - Number of versions to return (default: 3)
#
# Example:
#
# latest(['1.0.0', '1.1.0', '1.1.1', '1.2.3'], 3)
# => ['1.2.3', '1.1.1', '1.0.0']
def self.latest(versions, count = 3)
::VersionSorter.rsort(versions).uniq do |version|
version.split('.').take(2)
end.take(count)
end
# Get the next three patch versions
def self.next_versions
self.next(latest(current, 3))
end
def self.sort(versions)
::VersionSorter.sort(versions).uniq
end
def self.current_stable_branch
next_versions.first.stable_branch(ee: true)
end
def self.current_version
ReleaseTools::Version.new(next_versions.first.to_minor)
end
end
end