diff options
Diffstat (limited to 'lib/gitlab/database/migrations/version.rb')
-rw-r--r-- | lib/gitlab/database/migrations/version.rb | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/lib/gitlab/database/migrations/version.rb b/lib/gitlab/database/migrations/version.rb new file mode 100644 index 00000000000..27c4c7d0746 --- /dev/null +++ b/lib/gitlab/database/migrations/version.rb @@ -0,0 +1,76 @@ +# frozen_string_literal: true + +module Gitlab + module Database + module Migrations + class Version + InvalidTypeError = Class.new(StandardError) + + include Comparable + + TYPE_VALUES = { + regular: 0, + post: 1 + }.freeze + + attr_reader :timestamp, :milestone, :type_value + + def initialize(timestamp, milestone, type) + @timestamp = timestamp + @milestone = milestone + self.type = type + end + + def type + TYPE_VALUES.key(@type_value) + end + + def type=(value) + @type_value = TYPE_VALUES.fetch(value.to_sym) { raise InvalidTypeError } + end + + def regular? + @type_value == TYPE_VALUES[:regular] + end + + def post_deployment? + @type_value == TYPE_VALUES[:post] + end + + def <=>(other) + return 1 unless other.is_a?(self.class) + + return milestone <=> other.milestone if milestone != other.milestone + + return @type_value <=> other.type_value if @type_value != other.type_value + + @timestamp <=> other.timestamp + end + + def to_s + @timestamp.to_s + end + + def to_i + @timestamp.to_i + end + + def coerce(_other) + [-1, timestamp.to_i] + end + + def eql?(other) + (self <=> other) == 0 + end + + def ==(other) + eql?(other) + end + + def hash + [timestamp, milestone, @type_value].hash + end + end + end + end +end |