diff options
| -rw-r--r-- | lib/gitlab/upgrader.rb | 96 | ||||
| -rw-r--r-- | script/upgrade.rb | 3 | ||||
| -rw-r--r-- | spec/lib/gitlab/upgrader_spec.rb | 24 | 
3 files changed, 123 insertions, 0 deletions
diff --git a/lib/gitlab/upgrader.rb b/lib/gitlab/upgrader.rb new file mode 100644 index 00000000000..a7e07fca351 --- /dev/null +++ b/lib/gitlab/upgrader.rb @@ -0,0 +1,96 @@ +require "colored" +require_relative "version_info" + +module Gitlab +  class Upgrader +    def execute +      puts "GitLab #{current_version.major} upgrade tool".yellow +      puts "Your version is #{current_version}" +      puts "Latest available version for GitLab #{current_version.major} is #{latest_version}" + +      if latest_version? +        puts "You use latest GitLab version" +      else +        puts "Newer GitLab version is available" +        answer = prompt("Do you want to upgrade (yes/no)? ".blue, %w{yes no}) + +        if answer == "yes" +          upgrade +        else +          exit 0 +        end +      end +    end + +    def latest_version? +      current_version >= latest_version +    end + +    def current_version +      @current_version ||= Gitlab::VersionInfo.parse(current_version_raw) +    end + +    def latest_version +      @latest_version ||= Gitlab::VersionInfo.parse(latest_version_raw) +    end + +    def current_version_raw +      File.read(File.join(gitlab_path, "VERSION")).strip +    end + +    def latest_version_raw +      git_tags = `git ls-remote --tags origin | grep tags\/v#{current_version.major}` +      git_tags = git_tags.lines.to_a.select { |version| version =~ /v\d\.\d\.\d\Z/ } +      last_tag = git_tags.last.match(/v\d\.\d\.\d/).to_s +    end + +    def git_las_tags +    end + +    def update_commands +      { +        "Stash changed files" => "git stash", +        "Get latest code" => "git fetch", +        "Switch to new version" => "git checkout v#{latest_version}", +        "Install gems" => "bundle", +        "Migrate DB" => "bundle exec rake db:migrate RAILS_ENV=production", +        "Recompile assets" => "bundle exec rake assets:clean assets:precompile RAILS_ENV=production", +        "Clear cache" => "bundle exec rake cache:clear RAILS_ENV=production" +      } +    end + +    def upgrade +      update_commands.each do |title, cmd| +        puts title.yellow +        puts " -> #{cmd}" +        if system(cmd) +          puts " -> OK".green +        else +          puts " -> FAILED".red +          puts "Failed to upgrade. Try to repeat task or proceed with upgrade manually " +          exit 1 +        end +      end + +      puts "Done" +    end + +    def gitlab_path +      File.expand_path(File.join(File.dirname(__FILE__), '../..')) +    end + +    # Prompt the user to input something +    # +    # message - the message to display before input +    # choices - array of strings of acceptable answers or nil for any answer +    # +    # Returns the user's answer +    def prompt(message, choices = nil) +      begin +        print(message) +        answer = STDIN.gets.chomp +      end while !choices.include?(answer) +      answer +    end +  end +end diff --git a/script/upgrade.rb b/script/upgrade.rb new file mode 100644 index 00000000000..a5caecf8526 --- /dev/null +++ b/script/upgrade.rb @@ -0,0 +1,3 @@ +require_relative "../lib/gitlab/upgrader" + +Gitlab::Upgrader.new.execute diff --git a/spec/lib/gitlab/upgrader_spec.rb b/spec/lib/gitlab/upgrader_spec.rb new file mode 100644 index 00000000000..2b254d6b3a6 --- /dev/null +++ b/spec/lib/gitlab/upgrader_spec.rb @@ -0,0 +1,24 @@ +require 'spec_helper' + +describe Gitlab::Upgrader do +  let(:upgrader) { Gitlab::Upgrader.new } +  let(:current_version) { Gitlab::VERSION } + +  describe 'current_version_raw' do +    it { upgrader.current_version_raw.should == current_version } +  end + +  describe 'latest_version?' do +    it 'should be true if newest version' do +      upgrader.stub(latest_version_raw: current_version) +      upgrader.latest_version?.should be_true +    end +  end + +  describe 'latest_version_raw' do +    it 'should be latest version for GitLab 5' do +      upgrader.stub(current_version_raw: "5.3.0") +      upgrader.latest_version_raw.should == "v5.4.2" +    end +  end +end  | 
