Commit 862e0ff6b846d9207c3adf9e86b5b84420595935

Authored by Sato Hiroyuki
1 parent 2e9599b7

Add Gitlab::VersionInfo class to fix and simplify version check.

It returns "yes" if required version is "1.7.10" and current version is "1.6.10",
because the patch version of current version equals to that of required version.
lib/gitlab/version_info.rb 0 → 100644
... ... @@ -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(
... ...
spec/lib/gitlab/version_info_spec.rb 0 → 100644
... ... @@ -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 +
... ...