From 34cf999f207d3ee76785d41876c202e7be03186d Mon Sep 17 00:00:00 2001 From: Dustin Rodrigues Date: Sun, 4 Oct 2020 14:43:32 -0400 Subject: [PATCH] version: support post versions --- Library/Homebrew/test/version_spec.rb | 10 +++++++++ Library/Homebrew/version.rb | 32 +++++++++++++++++++++++---- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/Library/Homebrew/test/version_spec.rb b/Library/Homebrew/test/version_spec.rb index 84200e31f3..04f4cdf3bc 100644 --- a/Library/Homebrew/test/version_spec.rb +++ b/Library/Homebrew/test/version_spec.rb @@ -170,6 +170,16 @@ describe Version do expect(described_class.create("1.2.3-p34")).to be > described_class.create("1.2.3") end + specify "comparing post-level versions" do + expect(described_class.create("1.2.3.post34")).to be > described_class.create("1.2.3.post33") + expect(described_class.create("1.2.3.post34")).to be < described_class.create("1.2.3.post35") + + expect(described_class.create("1.2.3.post34")).to be > described_class.create("1.2.3rc35") + expect(described_class.create("1.2.3.post34")).to be > described_class.create("1.2.3alpha35") + expect(described_class.create("1.2.3.post34")).to be > described_class.create("1.2.3beta35") + expect(described_class.create("1.2.3.post34")).to be > described_class.create("1.2.3") + end + specify "comparing unevenly-padded versions" do expect(described_class.create("2.1.0-p194")).to be < described_class.create("2.1-p195") expect(described_class.create("2.1-p195")).to be > described_class.create("2.1.0-p194") diff --git a/Library/Homebrew/version.rb b/Library/Homebrew/version.rb index d8e8ee6ff2..cb1edd4e74 100644 --- a/Library/Homebrew/version.rb +++ b/Library/Homebrew/version.rb @@ -25,6 +25,7 @@ class Version when /\A#{RCToken::PATTERN}\z/o then RCToken when /\A#{PreToken::PATTERN}\z/o then PreToken when /\A#{PatchToken::PATTERN}\z/o then PatchToken + when /\A#{PostToken::PATTERN}\z/o then PostToken when /\A#{NumericToken::PATTERN}\z/o then NumericToken when /\A#{StringToken::PATTERN}\z/o then StringToken end.new(val) @@ -173,7 +174,7 @@ class Version case other when AlphaToken rev <=> other.rev - when BetaToken, RCToken, PreToken, PatchToken + when BetaToken, RCToken, PreToken, PatchToken, PostToken -1 else super @@ -193,7 +194,7 @@ class Version rev <=> other.rev when AlphaToken 1 - when PreToken, RCToken, PatchToken + when PreToken, RCToken, PatchToken, PostToken -1 else super @@ -213,7 +214,7 @@ class Version rev <=> other.rev when AlphaToken, BetaToken 1 - when RCToken, PatchToken + when RCToken, PatchToken, PostToken -1 else super @@ -233,7 +234,7 @@ class Version rev <=> other.rev when AlphaToken, BetaToken, PreToken 1 - when PatchToken + when PatchToken, PostToken -1 else super @@ -259,12 +260,31 @@ class Version end end + # A token representing the part of a version designating it is a post release. + class PostToken < CompositeToken + PATTERN = /.post[0-9]+/i.freeze + + def <=>(other) + return unless other = Token.from(other) + + case other + when PostToken + rev <=> other.rev + when AlphaToken, BetaToken, RCToken, PreToken + 1 + else + super + end + end + end + SCAN_PATTERN = Regexp.union( AlphaToken::PATTERN, BetaToken::PATTERN, PreToken::PATTERN, RCToken::PATTERN, PatchToken::PATTERN, + PostToken::PATTERN, NumericToken::PATTERN, StringToken::PATTERN, ).freeze @@ -345,6 +365,10 @@ class Version m = /-((?:\d+\.)*\d+)$/.match(stem) return m.captures.first unless m.nil? + # e.g. foobar-4.5.1.post1 + m = /-((?:\d+\.)*\d+(.post\d+)?)$/.match(stem) + return m.captures.first unless m.nil? + # e.g. foobar-4.5.1b m = /-((?:\d+\.)*\d+(?:[abc]|rc|RC)\d*)$/.match(stem) return m.captures.first unless m.nil?