Commit 440f3f384f1ef03a8911b6d6ff3e4a21c3308adf
1 parent
2ca4e708
Exists in
master
and in
4 other branches
Minor version upgrader
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Showing
3 changed files
with
123 additions
and
0 deletions
Show diff stats
... | ... | @@ -0,0 +1,96 @@ |
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 = prompt("Do you want to upgrade (yes/no)? ".blue, %w{yes no}) | |
16 | + | |
17 | + if answer == "yes" | |
18 | + upgrade | |
19 | + else | |
20 | + exit 0 | |
21 | + end | |
22 | + end | |
23 | + end | |
24 | + | |
25 | + def latest_version? | |
26 | + current_version >= latest_version | |
27 | + end | |
28 | + | |
29 | + def current_version | |
30 | + @current_version ||= Gitlab::VersionInfo.parse(current_version_raw) | |
31 | + end | |
32 | + | |
33 | + def latest_version | |
34 | + @latest_version ||= Gitlab::VersionInfo.parse(latest_version_raw) | |
35 | + end | |
36 | + | |
37 | + def current_version_raw | |
38 | + File.read(File.join(gitlab_path, "VERSION")).strip | |
39 | + end | |
40 | + | |
41 | + def latest_version_raw | |
42 | + git_tags = `git ls-remote --tags origin | grep tags\/v#{current_version.major}` | |
43 | + git_tags = git_tags.lines.to_a.select { |version| version =~ /v\d\.\d\.\d\Z/ } | |
44 | + last_tag = git_tags.last.match(/v\d\.\d\.\d/).to_s | |
45 | + end | |
46 | + | |
47 | + def git_las_tags | |
48 | + end | |
49 | + | |
50 | + def update_commands | |
51 | + { | |
52 | + "Stash changed files" => "git stash", | |
53 | + "Get latest code" => "git fetch", | |
54 | + "Switch to new version" => "git checkout v#{latest_version}", | |
55 | + "Install gems" => "bundle", | |
56 | + "Migrate DB" => "bundle exec rake db:migrate RAILS_ENV=production", | |
57 | + "Recompile assets" => "bundle exec rake assets:clean assets:precompile RAILS_ENV=production", | |
58 | + "Clear cache" => "bundle exec rake cache:clear RAILS_ENV=production" | |
59 | + } | |
60 | + end | |
61 | + | |
62 | + def upgrade | |
63 | + update_commands.each do |title, cmd| | |
64 | + puts title.yellow | |
65 | + puts " -> #{cmd}" | |
66 | + if system(cmd) | |
67 | + puts " -> OK".green | |
68 | + else | |
69 | + puts " -> FAILED".red | |
70 | + puts "Failed to upgrade. Try to repeat task or proceed with upgrade manually " | |
71 | + exit 1 | |
72 | + end | |
73 | + end | |
74 | + | |
75 | + puts "Done" | |
76 | + end | |
77 | + | |
78 | + def gitlab_path | |
79 | + File.expand_path(File.join(File.dirname(__FILE__), '../..')) | |
80 | + end | |
81 | + | |
82 | + # Prompt the user to input something | |
83 | + # | |
84 | + # message - the message to display before input | |
85 | + # choices - array of strings of acceptable answers or nil for any answer | |
86 | + # | |
87 | + # Returns the user's answer | |
88 | + def prompt(message, choices = nil) | |
89 | + begin | |
90 | + print(message) | |
91 | + answer = STDIN.gets.chomp | |
92 | + end while !choices.include?(answer) | |
93 | + answer | |
94 | + end | |
95 | + end | |
96 | +end | ... | ... |
... | ... | @@ -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 | ... | ... |