Commit ee53b73986ba4c9dd2f0c726a44718acb8febaf8

Authored by Dmitriy Zaporozhets
2 parents b1eb3d46 c638ef33

Merge branch 'feature/minor_update_script' of /home/git/repositories/gitlab/gitlabhq

lib/gitlab/upgrader.rb 0 → 100644
... ... @@ -0,0 +1,97 @@
  1 +require "colored"
  2 +require_relative "version_info"
  3 +
  4 +module Gitlab
  5 + class Upgrader
  6 + def execute
  7 + puts "GitLab #{current_version.major} upgrade tool".yellow
  8 + puts "Your version is #{current_version}"
  9 + puts "Latest available version for GitLab #{current_version.major} is #{latest_version}"
  10 +
  11 + if latest_version?
  12 + puts "You use latest GitLab version"
  13 + else
  14 + puts "Newer GitLab version is available"
  15 + answer = if ARGV.first == "-y"
  16 + "yes"
  17 + else
  18 + prompt("Do you want to upgrade (yes/no)? ".blue, %w{yes no})
  19 + end
  20 +
  21 + if answer == "yes"
  22 + upgrade
  23 + else
  24 + exit 0
  25 + end
  26 + end
  27 + end
  28 +
  29 + def latest_version?
  30 + current_version >= latest_version
  31 + end
  32 +
  33 + def current_version
  34 + @current_version ||= Gitlab::VersionInfo.parse(current_version_raw)
  35 + end
  36 +
  37 + def latest_version
  38 + @latest_version ||= Gitlab::VersionInfo.parse(latest_version_raw)
  39 + end
  40 +
  41 + def current_version_raw
  42 + File.read(File.join(gitlab_path, "VERSION")).strip
  43 + end
  44 +
  45 + def latest_version_raw
  46 + git_tags = `git ls-remote --tags origin | grep tags\/v#{current_version.major}`
  47 + git_tags = git_tags.lines.to_a.select { |version| version =~ /v\d\.\d\.\d\Z/ }
  48 + last_tag = git_tags.last.match(/v\d\.\d\.\d/).to_s
  49 + end
  50 +
  51 + def update_commands
  52 + {
  53 + "Stash changed files" => "git stash",
  54 + "Get latest code" => "git fetch",
  55 + "Switch to new version" => "git checkout -b v#{latest_version}",
  56 + "Install gems" => "bundle",
  57 + "Migrate DB" => "bundle exec rake db:migrate RAILS_ENV=production",
  58 + "Recompile assets" => "bundle exec rake assets:clean assets:precompile RAILS_ENV=production",
  59 + "Clear cache" => "bundle exec rake cache:clear RAILS_ENV=production"
  60 + }
  61 + end
  62 +
  63 + def upgrade
  64 + update_commands.each do |title, cmd|
  65 + puts title.yellow
  66 + puts " -> #{cmd}"
  67 + if system(cmd)
  68 + puts " -> OK".green
  69 + else
  70 + puts " -> FAILED".red
  71 + puts "Failed to upgrade. Try to repeat task or proceed with upgrade manually "
  72 + exit 1
  73 + end
  74 + end
  75 +
  76 + puts "Done"
  77 + end
  78 +
  79 + def gitlab_path
  80 + File.expand_path(File.join(File.dirname(__FILE__), '../..'))
  81 + end
  82 +
  83 + # Prompt the user to input something
  84 + #
  85 + # message - the message to display before input
  86 + # choices - array of strings of acceptable answers or nil for any answer
  87 + #
  88 + # Returns the user's answer
  89 + def prompt(message, choices = nil)
  90 + begin
  91 + print(message)
  92 + answer = STDIN.gets.chomp
  93 + end while !choices.include?(answer)
  94 + answer
  95 + end
  96 + end
  97 +end
... ...
script/upgrade.rb 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +require_relative "../lib/gitlab/upgrader"
  2 +
  3 +Gitlab::Upgrader.new.execute
... ...
spec/lib/gitlab/upgrader_spec.rb 0 → 100644
... ... @@ -0,0 +1,24 @@
  1 +require 'spec_helper'
  2 +
  3 +describe Gitlab::Upgrader do
  4 + let(:upgrader) { Gitlab::Upgrader.new }
  5 + let(:current_version) { Gitlab::VERSION }
  6 +
  7 + describe 'current_version_raw' do
  8 + it { upgrader.current_version_raw.should == current_version }
  9 + end
  10 +
  11 + describe 'latest_version?' do
  12 + it 'should be true if newest version' do
  13 + upgrader.stub(latest_version_raw: current_version)
  14 + upgrader.latest_version?.should be_true
  15 + end
  16 + end
  17 +
  18 + describe 'latest_version_raw' do
  19 + it 'should be latest version for GitLab 5' do
  20 + upgrader.stub(current_version_raw: "5.3.0")
  21 + upgrader.latest_version_raw.should == "v5.4.2"
  22 + end
  23 + end
  24 +end
... ...