OSDN Git Service

Minor version upgrader
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Fri, 13 Dec 2013 13:18:57 +0000 (15:18 +0200)
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
Fri, 13 Dec 2013 13:18:57 +0000 (15:18 +0200)
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
lib/gitlab/upgrader.rb [new file with mode: 0644]
script/upgrade.rb [new file with mode: 0644]
spec/lib/gitlab/upgrader_spec.rb [new file with mode: 0644]

diff --git a/lib/gitlab/upgrader.rb b/lib/gitlab/upgrader.rb
new file mode 100644 (file)
index 0000000..a7e07fc
--- /dev/null
@@ -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 (file)
index 0000000..a5caecf
--- /dev/null
@@ -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 (file)
index 0000000..2b254d6
--- /dev/null
@@ -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