Commit 2ddd6d952b48fd0bd3364d1a22c0a4fbb4ad56f7
Exists in
master
and in
4 other branches
Merge pull request #3880 from hiroponz/fix-check-git-version
Add Gitlab::VersionInfo class to fix and simplify version check.
Showing
3 changed files
with
133 additions
and
24 deletions
Show diff stats
| ... | ... | @@ -0,0 +1,54 @@ |
| 1 | +module Gitlab | |
| 2 | + class VersionInfo | |
| 3 | + include Comparable | |
| 4 | + | |
| 5 | + attr_reader :major, :minor, :patch | |
| 6 | + | |
| 7 | + def self.parse(str) | |
| 8 | + if m = str.match(/(\d+)\.(\d+)\.(\d+)/) | |
| 9 | + VersionInfo.new(m[1].to_i, m[2].to_i, m[3].to_i) | |
| 10 | + else | |
| 11 | + VersionInfo.new | |
| 12 | + end | |
| 13 | + end | |
| 14 | + | |
| 15 | + def initialize(major = 0, minor = 0, patch = 0) | |
| 16 | + @major = major | |
| 17 | + @minor = minor | |
| 18 | + @patch = patch | |
| 19 | + end | |
| 20 | + | |
| 21 | + def <=>(other) | |
| 22 | + return unless other.is_a? VersionInfo | |
| 23 | + return unless valid? && other.valid? | |
| 24 | + | |
| 25 | + if other.major < @major | |
| 26 | + 1 | |
| 27 | + elsif @major < other.major | |
| 28 | + -1 | |
| 29 | + elsif other.minor < @minor | |
| 30 | + 1 | |
| 31 | + elsif @minor < other.minor | |
| 32 | + -1 | |
| 33 | + elsif other.patch < @patch | |
| 34 | + 1 | |
| 35 | + elsif @patch < other.patch | |
| 36 | + -1 | |
| 37 | + else | |
| 38 | + 0 | |
| 39 | + end | |
| 40 | + end | |
| 41 | + | |
| 42 | + def to_s | |
| 43 | + if valid? | |
| 44 | + "%d.%d.%d" % [@major, @minor, @patch] | |
| 45 | + else | |
| 46 | + "Unknown" | |
| 47 | + end | |
| 48 | + end | |
| 49 | + | |
| 50 | + def valid? | |
| 51 | + @major >= 0 && @minor >= 0 && @patch >= 0 && @major + @minor + @patch > 0 | |
| 52 | + end | |
| 53 | + end | |
| 54 | +end | ... | ... |
lib/tasks/gitlab/check.rake
| ... | ... | @@ -655,39 +655,25 @@ namespace :gitlab do |
| 655 | 655 | end |
| 656 | 656 | |
| 657 | 657 | def check_gitlab_shell |
| 658 | - required_version = '1.4.0' | |
| 658 | + required_version = Gitlab::VersionInfo.new(1, 4, 0) | |
| 659 | + current_version = Gitlab::VersionInfo.parse(gitlab_shell_version) | |
| 659 | 660 | |
| 660 | - print "GitLab Shell version? ... " | |
| 661 | - if gitlab_shell_version.strip == required_version | |
| 662 | - puts "OK (#{required_version})".green | |
| 661 | + print "GitLab Shell version >= #{required_version} ? ... " | |
| 662 | + if required_version <= current_version | |
| 663 | + puts "OK (#{current_version})".green | |
| 663 | 664 | else |
| 664 | - puts "FAIL. Please update gitlab-shell to v#{required_version}".red | |
| 665 | + puts "FAIL. Please update gitlab-shell to #{required_version} from #{current_version}".red | |
| 665 | 666 | end |
| 666 | 667 | end |
| 667 | 668 | |
| 668 | 669 | def check_git_version |
| 669 | - required_version_major = 1 | |
| 670 | - required_version_minor = 7 | |
| 671 | - required_version_patch = 10 | |
| 672 | - | |
| 673 | - required_version = "%d.%d.%d" %[required_version_major, required_version_minor, required_version_patch] | |
| 670 | + required_version = Gitlab::VersionInfo.new(1, 7, 10) | |
| 671 | + current_version = Gitlab::VersionInfo.parse(run("git --version")) | |
| 674 | 672 | |
| 675 | 673 | print "Git version >= #{required_version} ? ... " |
| 676 | 674 | |
| 677 | - if m = run_and_match("git --version", /git version ((\d+)\.(\d+)\.(\d+))/) | |
| 678 | - current_version = m[1] | |
| 679 | - major = m[2].to_i | |
| 680 | - minor = m[3].to_i | |
| 681 | - patch = m[4].to_i | |
| 682 | - unless major <= required_version_major && minor <= required_version_minor && patch < required_version_patch | |
| 683 | - satisfying_git_version = true | |
| 684 | - end | |
| 685 | - else | |
| 686 | - current_version = "Unknown" | |
| 687 | - end | |
| 688 | - | |
| 689 | - if satisfying_git_version | |
| 690 | - puts "yes".green | |
| 675 | + if required_version <= current_version | |
| 676 | + puts "yes (#{current_version})".green | |
| 691 | 677 | else |
| 692 | 678 | puts "no".red |
| 693 | 679 | try_fixing_it( | ... | ... |
| ... | ... | @@ -0,0 +1,69 @@ |
| 1 | +require 'spec_helper' | |
| 2 | + | |
| 3 | +describe 'Gitlab::VersionInfo', no_db: true do | |
| 4 | + before do | |
| 5 | + @unknown = Gitlab::VersionInfo.new | |
| 6 | + @v0_0_1 = Gitlab::VersionInfo.new(0, 0, 1) | |
| 7 | + @v0_1_0 = Gitlab::VersionInfo.new(0, 1, 0) | |
| 8 | + @v1_0_0 = Gitlab::VersionInfo.new(1, 0, 0) | |
| 9 | + @v1_0_1 = Gitlab::VersionInfo.new(1, 0, 1) | |
| 10 | + @v1_1_0 = Gitlab::VersionInfo.new(1, 1, 0) | |
| 11 | + @v2_0_0 = Gitlab::VersionInfo.new(2, 0, 0) | |
| 12 | + end | |
| 13 | + | |
| 14 | + context '>' do | |
| 15 | + it { @v2_0_0.should > @v1_1_0 } | |
| 16 | + it { @v1_1_0.should > @v1_0_1 } | |
| 17 | + it { @v1_0_1.should > @v1_0_0 } | |
| 18 | + it { @v1_0_0.should > @v0_1_0 } | |
| 19 | + it { @v0_1_0.should > @v0_0_1 } | |
| 20 | + end | |
| 21 | + | |
| 22 | + context '>=' do | |
| 23 | + it { @v2_0_0.should >= Gitlab::VersionInfo.new(2, 0, 0) } | |
| 24 | + it { @v2_0_0.should >= @v1_1_0 } | |
| 25 | + end | |
| 26 | + | |
| 27 | + context '<' do | |
| 28 | + it { @v0_0_1.should < @v0_1_0 } | |
| 29 | + it { @v0_1_0.should < @v1_0_0 } | |
| 30 | + it { @v1_0_0.should < @v1_0_1 } | |
| 31 | + it { @v1_0_1.should < @v1_1_0 } | |
| 32 | + it { @v1_1_0.should < @v2_0_0 } | |
| 33 | + end | |
| 34 | + | |
| 35 | + context '<=' do | |
| 36 | + it { @v0_0_1.should <= Gitlab::VersionInfo.new(0, 0, 1) } | |
| 37 | + it { @v0_0_1.should <= @v0_1_0 } | |
| 38 | + end | |
| 39 | + | |
| 40 | + context '==' do | |
| 41 | + it { @v0_0_1.should == Gitlab::VersionInfo.new(0, 0, 1) } | |
| 42 | + it { @v0_1_0.should == Gitlab::VersionInfo.new(0, 1, 0) } | |
| 43 | + it { @v1_0_0.should == Gitlab::VersionInfo.new(1, 0, 0) } | |
| 44 | + end | |
| 45 | + | |
| 46 | + context '!=' do | |
| 47 | + it { @v0_0_1.should_not == @v0_1_0 } | |
| 48 | + end | |
| 49 | + | |
| 50 | + context 'unknown' do | |
| 51 | + it { @unknown.should_not be @v0_0_1 } | |
| 52 | + it { @unknown.should_not be Gitlab::VersionInfo.new } | |
| 53 | + it { expect{@unknown > @v0_0_1}.to raise_error(ArgumentError) } | |
| 54 | + it { expect{@unknown < @v0_0_1}.to raise_error(ArgumentError) } | |
| 55 | + end | |
| 56 | + | |
| 57 | + context 'parse' do | |
| 58 | + it { Gitlab::VersionInfo.parse("1.0.0").should == @v1_0_0 } | |
| 59 | + it { Gitlab::VersionInfo.parse("1.0.0.1").should == @v1_0_0 } | |
| 60 | + it { Gitlab::VersionInfo.parse("git 1.0.0b1").should == @v1_0_0 } | |
| 61 | + it { Gitlab::VersionInfo.parse("git 1.0b1").should_not be_valid } | |
| 62 | + end | |
| 63 | + | |
| 64 | + context 'to_s' do | |
| 65 | + it { @v1_0_0.to_s.should == "1.0.0" } | |
| 66 | + it { @unknown.to_s.should == "Unknown" } | |
| 67 | + end | |
| 68 | +end | |
| 69 | + | ... | ... |