summaryrefslogtreecommitdiff
path: root/lib/gitlab/upgrader.rb
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-12-13 15:18:57 +0200
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2013-12-13 15:18:57 +0200
commit440f3f384f1ef03a8911b6d6ff3e4a21c3308adf (patch)
tree27976d1d87fd711a7e9a3394d323208ed4c2efab /lib/gitlab/upgrader.rb
parent2ca4e70894229d9a7920f7539b9390bc43159b73 (diff)
downloadgitlab-ce-440f3f384f1ef03a8911b6d6ff3e4a21c3308adf.tar.gz
Minor version upgrader
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Diffstat (limited to 'lib/gitlab/upgrader.rb')
-rw-r--r--lib/gitlab/upgrader.rb96
1 files changed, 96 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