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 @@ | @@ -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,39 +655,25 @@ namespace :gitlab do | ||
655 | end | 655 | end |
656 | 656 | ||
657 | def check_gitlab_shell | 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 | else | 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 | end | 666 | end |
666 | end | 667 | end |
667 | 668 | ||
668 | def check_git_version | 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 | print "Git version >= #{required_version} ? ... " | 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 | else | 677 | else |
692 | puts "no".red | 678 | puts "no".red |
693 | try_fixing_it( | 679 | try_fixing_it( |
@@ -0,0 +1,69 @@ | @@ -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 | + |