78 lines
2.6 KiB
Ruby
78 lines
2.6 KiB
Ruby
![]() |
# frozen_string_literal: true
|
||
|
|
||
|
FactoryBot.define do
|
||
|
factory :go_module_version, class: 'Packages::Go::ModuleVersion' do
|
||
|
skip_create
|
||
|
|
||
|
initialize_with do
|
||
|
p = attributes[:params]
|
||
|
s = Packages::SemVer.parse(p.semver, prefixed: true)
|
||
|
|
||
|
raise ArgumentError.new("invalid sematic version: '#{p.semver}''") if !s && p.semver
|
||
|
|
||
|
new(p.mod, p.type, p.commit, name: p.name, semver: s, ref: p.ref)
|
||
|
end
|
||
|
|
||
|
mod { create :go_module }
|
||
|
type { :commit }
|
||
|
commit { mod.project.repository.head_commit }
|
||
|
name { nil }
|
||
|
semver { nil }
|
||
|
ref { nil }
|
||
|
|
||
|
params { OpenStruct.new(mod: mod, type: type, commit: commit, name: name, semver: semver, ref: ref) }
|
||
|
|
||
|
trait :tagged do
|
||
|
ref { mod.project.repository.find_tag(name) }
|
||
|
commit { ref.dereferenced_target }
|
||
|
name do
|
||
|
# This provides a sane default value, but in reality the caller should
|
||
|
# specify `name:`
|
||
|
|
||
|
# Find 'latest' semver tag (does not actually use semver precedence rules)
|
||
|
mod.project.repository.tags
|
||
|
.filter { |t| Packages::SemVer.match?(t.name, prefixed: true) }
|
||
|
.map { |t| Packages::SemVer.parse(t.name, prefixed: true) }
|
||
|
.max { |a, b| "#{a}" <=> "#{b}" }
|
||
|
.to_s
|
||
|
end
|
||
|
|
||
|
params { OpenStruct.new(mod: mod, type: :ref, commit: commit, semver: name, ref: ref) }
|
||
|
end
|
||
|
|
||
|
trait :pseudo do
|
||
|
transient do
|
||
|
prefix do
|
||
|
# This provides a sane default value, but in reality the caller should
|
||
|
# specify `prefix:`
|
||
|
|
||
|
# This does not take into account that `commit` may be before the
|
||
|
# latest tag.
|
||
|
|
||
|
# Find 'latest' semver tag (does not actually use semver precedence rules)
|
||
|
v = mod.project.repository.tags
|
||
|
.filter { |t| Packages::SemVer.match?(t.name, prefixed: true) }
|
||
|
.map { |t| Packages::SemVer.parse(t.name, prefixed: true) }
|
||
|
.max { |a, b| "#{a}" <=> "#{b}" }
|
||
|
|
||
|
# Default if no semver tags exist
|
||
|
next 'v0.0.0' unless v
|
||
|
|
||
|
# Valid pseudo-versions are:
|
||
|
# vX.0.0-yyyymmddhhmmss-sha1337beef0, when no earlier tagged commit exists for X
|
||
|
# vX.Y.Z-pre.0.yyyymmddhhmmss-sha1337beef0, when most recent prior tag is vX.Y.Z-pre
|
||
|
# vX.Y.(Z+1)-0.yyyymmddhhmmss-sha1337beef0, when most recent prior tag is vX.Y.Z
|
||
|
|
||
|
v = v.with(patch: v.patch + 1) unless v.prerelease
|
||
|
"#{v}.0"
|
||
|
end
|
||
|
end
|
||
|
|
||
|
type { :pseudo }
|
||
|
name { "#{prefix}#{commit.committed_date.strftime('%Y%m%d%H%M%S')}-#{commit.sha[0..11]}" }
|
||
|
|
||
|
params { OpenStruct.new(mod: mod, type: :pseudo, commit: commit, name: name, semver: name) }
|
||
|
end
|
||
|
end
|
||
|
end
|