Skip to content

Commit

Permalink
Merge pull request #10376 from SeekingMeaning/livecheck-multi-version
Browse files Browse the repository at this point in the history
livecheck: split cask versions into sub-versions
  • Loading branch information
SeekingMeaning committed Jan 25, 2021
2 parents 0a0f435 + feb45f1 commit a308c6d
Show file tree
Hide file tree
Showing 5 changed files with 107 additions and 17 deletions.
19 changes: 4 additions & 15 deletions Library/Homebrew/livecheck/livecheck.rb
Expand Up @@ -2,6 +2,7 @@
# frozen_string_literal: true

require "livecheck/error"
require "livecheck/livecheck_version"
require "livecheck/skip_conditions"
require "livecheck/strategy"
require "ruby-progressbar"
Expand Down Expand Up @@ -156,7 +157,7 @@ def run_checks(
end

current_str = current.to_s
current = actual_version(formula_or_cask, current)
current = LivecheckVersion.create(formula_or_cask, current)

latest = if formula&.head_only?
formula.head.downloader.fetch_last_commit
Expand All @@ -182,7 +183,7 @@ def run_checks(
end

latest_str = latest.to_s
latest = actual_version(formula_or_cask, latest)
latest = LivecheckVersion.create(formula_or_cask, latest)

is_outdated = if formula&.head_only?
# A HEAD-only formula is considered outdated if the latest upstream
Expand Down Expand Up @@ -546,7 +547,7 @@ def latest_version(formula_or_cask, json: false, full_name: false, verbose: fals
next if match_version_map.blank?

version_info = {
latest: Version.new(match_version_map.values.max_by { |v| actual_version(formula_or_cask, v) }),
latest: Version.new(match_version_map.values.max_by { |v| LivecheckVersion.create(formula_or_cask, v) }),
}

if json && verbose
Expand All @@ -570,17 +571,5 @@ def latest_version(formula_or_cask, json: false, full_name: false, verbose: fals

nil
end

sig { params(formula_or_cask: T.any(Formula, Cask::Cask), version: Version).returns(Version) }
def actual_version(formula_or_cask, version)
case formula_or_cask
when Formula
version
when Cask::Cask
Version.new(Cask::DSL::Version.new(version.to_s).before_comma)
else
T.absurd(formula_or_cask)
end
end
end
end
69 changes: 69 additions & 0 deletions Library/Homebrew/livecheck/livecheck_version.rb
@@ -0,0 +1,69 @@
# typed: strict
# frozen_string_literal: true

module Homebrew
module Livecheck
# A formula or cask version, split into its component sub-versions.
#
# @api private
class LivecheckVersion
extend T::Sig

include Comparable

sig { params(formula_or_cask: T.any(Formula, Cask::Cask), version: Version).returns(LivecheckVersion) }
def self.create(formula_or_cask, version)
versions = case formula_or_cask
when Formula
[version]
when Cask::Cask
version.to_s.split(/[,:]/).map { |s| Version.new(s) }
else
T.absurd(formula_or_cask)
end
new(versions)
end

sig { returns(T::Array[Version]) }
attr_reader :versions

sig { params(versions: T::Array[Version]).void }
def initialize(versions)
@versions = versions
end

sig { params(other: T.untyped).returns(T.nilable(Integer)) }
def <=>(other)
return unless other.is_a?(LivecheckVersion)

lversions = versions
rversions = other.versions
max = [lversions.count, rversions.count].max
l = r = 0

while l < max
a = lversions[l] || Version::NULL
b = rversions[r] || Version::NULL

if a == b
l += 1
r += 1
next
elsif !a.null? && b.null?
return 1 if a > Version::NULL

l += 1
elsif a.null? && !b.null?
return -1 if b > Version::NULL

r += 1
else
return a <=> b
end
end

0
end
end
end
end
2 changes: 1 addition & 1 deletion Library/Homebrew/test/livecheck/livecheck_spec.rb
@@ -1,5 +1,5 @@
# typed: false
# Frozen_string_literal: true
# frozen_string_literal: true

require "livecheck/livecheck"

Expand Down
32 changes: 32 additions & 0 deletions Library/Homebrew/test/livecheck/livecheck_version_spec.rb
@@ -0,0 +1,32 @@
# typed: false
# frozen_string_literal: true

require "livecheck/livecheck_version"

describe Homebrew::Livecheck::LivecheckVersion do
let(:formula) { instance_double(Formula) }
let(:cask) { instance_double(Cask::Cask) }

before do
# Case statements use #=== for case equality purposes
allow(Formula).to receive(:===).and_call_original
allow(Formula).to receive(:===).with(formula).and_return(true)
allow(Cask::Cask).to receive(:===).and_call_original
allow(Cask::Cask).to receive(:===).with(cask).and_return(true)
end

specify "::create" do
expect(described_class.create(formula, Version.new("1.1.6")).versions).to eq ["1.1.6"]
expect(described_class.create(formula, Version.new("2.19.0,1.8.0")).versions).to eq ["2.19.0,1.8.0"]
expect(described_class.create(formula, Version.new("1.0,100:1426778671")).versions).to eq ["1.0,100:1426778671"]
expect(described_class.create(formula, Version.new("0.17.0,20210111183933,226")).versions)
.to eq ["0.17.0,20210111183933,226"]

expect(described_class.create(cask, Version.new("1.1.6")).versions).to eq ["1.1.6"]
expect(described_class.create(cask, Version.new("2.19.0,1.8.0")).versions).to eq ["2.19.0", "1.8.0"]
expect(described_class.create(cask, Version.new("1.0,100:1426778671")).versions)
.to eq ["1.0", "100", "1426778671"]
expect(described_class.create(cask, Version.new("0.17.0,20210111183933,226")).versions)
.to eq ["0.17.0", "20210111183933", "226"]
end
end
2 changes: 1 addition & 1 deletion Library/Homebrew/test/livecheck/skip_conditions_spec.rb
@@ -1,5 +1,5 @@
# typed: false
# Frozen_string_literal: true
# frozen_string_literal: true

require "livecheck/skip_conditions"

Expand Down

0 comments on commit a308c6d

Please sign in to comment.