From 489d4319db26c1ef472cbfbc9648ca5b89a98b07 Mon Sep 17 00:00:00 2001 From: Charlie Sharpsteen Date: Thu, 16 Jul 2026 12:57:38 -0500 Subject: [PATCH] Anchor pre-release regex on end of string This commit makes a small change to the regex for determining when to build a pre-release to anchor on the end of the string. This means that only full git tags, such as `9.0.0-beta1`, will be matched and not git describe output for releases between tags, like: `9.0.0-beta1-9-g347642bbe` Proper test coverage for version munging is also added. Signed-off-by: Charlie Sharpsteen --- lib/vanagon/project/dsl.rb | 2 +- spec/lib/vanagon/project/dsl_spec.rb | 58 +++++++++++++++++----------- 2 files changed, 37 insertions(+), 23 deletions(-) diff --git a/lib/vanagon/project/dsl.rb b/lib/vanagon/project/dsl.rb index 97fec349..9d473e56 100644 --- a/lib/vanagon/project/dsl.rb +++ b/lib/vanagon/project/dsl.rb @@ -199,7 +199,7 @@ def version_from_git # beta, or RC identifier. Substitute "-" for "~" so that dpkg and # rpm treat this as a pre-release and will upgrade packages to the # final version. - when /\A\d+\.\d+\.\d+-(?:alpha|beta|rc)\d+/ + when /\A\d+\.\d+\.\d+-(?:alpha|beta|rc)\d+\z/ version(git_version.sub('-', '~')) else version(git_version.split('-').reject(&:empty?).join('.')) diff --git a/spec/lib/vanagon/project/dsl_spec.rb b/spec/lib/vanagon/project/dsl_spec.rb index 603e92df..859fcf86 100644 --- a/spec/lib/vanagon/project/dsl_spec.rb +++ b/spec/lib/vanagon/project/dsl_spec.rb @@ -13,44 +13,58 @@ end describe '#version_from_git' do - it 'sets the version based on the git describe' do - proj = Vanagon::Project::DSL.new('test-fixture', configdir, platform) - proj.instance_eval(project_block) + let(:project) { Vanagon::Project::DSL.new('test-fixture', configdir, platform) } + let(:repo) { double('repo') } + subject { project._project } + + before(:each) do + project.instance_eval(project_block) - # Lying is bad. You shouldn't lie. But sometimes when you're - # working with gross abstractions piled into the shape of - # an indescribable cyclopean obelisk, you might have to lie - # a little bit. Instead of trying to mock an entire Git instance, - # we'll just instantiate a Double and allow it to receive calls - # to .describe like it was a valid Git instance. - repo = double("repo") expect(::Git) .to receive(:open) .and_return(repo) + end + it 'sets the version based on the git describe' do allow(repo) .to receive(:describe) .and_return('1.2.3-1234') - proj.version_from_git - expect(proj._project.version).to eq('1.2.3.1234') + project.version_from_git + + expect(subject.version).to eq('1.2.3.1234') end + it 'sets the version based on the git describe with multiple dashes' do - proj = Vanagon::Project::DSL.new('test-fixture', configdir, platform) - proj.instance_eval(project_block) + expect(repo) + .to receive(:describe) + .and_return('1.2.3---1234') - # See previous description of "indescribable cyclopean obelisk" - repo = double("repo") - expect(::Git) - .to receive(:open) - .and_return(repo) + project.version_from_git + + expect(subject.version).to eq('1.2.3.1234') + end + + %w[alpha1 beta2 rc0].each do |pre_release| + it "munges tagged #{pre_release} pre-release versions to include a tilde" do + expect(repo) + .to receive(:describe) + .and_return("1.2.3-#{pre_release}") + project.version_from_git + + expect(subject.version).to eq("1.2.3~#{pre_release}") + end + end + + it "does not munge a tilde into un-tagged pre-release versions" do expect(repo) .to receive(:describe) - .and_return('1.2.3---1234') + .and_return("1.2.3-beta10-42-gabcdef123") + + project.version_from_git - proj.version_from_git - expect(proj._project.version).to eq('1.2.3.1234') + expect(subject.version).to eq("1.2.3.beta10.42.gabcdef123") end end