winci-updater 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/History.txt +4 -0
- data/README.txt +90 -0
- data/Rakefile +7 -0
- data/features/development.feature +13 -0
- data/features/fixtures/files.git/HEAD +1 -0
- data/features/fixtures/files.git/config +7 -0
- data/features/fixtures/files.git/description +1 -0
- data/features/fixtures/files.git/hooks/applypatch-msg.sample +15 -0
- data/features/fixtures/files.git/hooks/commit-msg.sample +24 -0
- data/features/fixtures/files.git/hooks/post-commit.sample +8 -0
- data/features/fixtures/files.git/hooks/post-receive.sample +15 -0
- data/features/fixtures/files.git/hooks/post-update.sample +8 -0
- data/features/fixtures/files.git/hooks/pre-applypatch.sample +14 -0
- data/features/fixtures/files.git/hooks/pre-commit.sample +46 -0
- data/features/fixtures/files.git/hooks/pre-rebase.sample +169 -0
- data/features/fixtures/files.git/hooks/prepare-commit-msg.sample +36 -0
- data/features/fixtures/files.git/hooks/update.sample +128 -0
- data/features/fixtures/files.git/info/exclude +6 -0
- data/features/fixtures/files.git/objects/03/6fa7341563be59c8a77d97cb9491fa5cf45ceb +0 -0
- data/features/fixtures/files.git/objects/05/0a491267bf39675b8299b4a58bf0969b042074 +0 -0
- data/features/fixtures/files.git/objects/05/79c80f1bded5c888e4c5d0db0a620a9d862d43 +1 -0
- data/features/fixtures/files.git/objects/07/51c79876ff4eb8815818b9272343e3c7e33dea +0 -0
- data/features/fixtures/files.git/objects/0f/c94ca3dd1c6b88de8a3cf14f4dcceed8e09660 +0 -0
- data/features/fixtures/files.git/objects/11/90f934e40b4f046fcf85ea78db9fee8093abec +0 -0
- data/features/fixtures/files.git/objects/15/4cedd3733da97c11bdb7a117d1fae8b518bf34 +1 -0
- data/features/fixtures/files.git/objects/1f/71c1a207e09add411a5cecf69c10f55445b469 +0 -0
- data/features/fixtures/files.git/objects/20/b002ac4d646c229034cef829ff18624c977eb5 +0 -0
- data/features/fixtures/files.git/objects/21/a215f731df78dbd19f996206d7f767eee1b693 +0 -0
- data/features/fixtures/files.git/objects/23/9285087a6b72507556d4d3cc112c5fd31d53e0 +0 -0
- data/features/fixtures/files.git/objects/2b/9535c8e56553adb9aebb20ad1912e931716150 +0 -0
- data/features/fixtures/files.git/objects/2c/4581b957e00fabb337d4721ac5f2e2926c3789 +0 -0
- data/features/fixtures/files.git/objects/2c/a3daa8b8f25df70098f4a70841ab6388efa359 +0 -0
- data/features/fixtures/files.git/objects/2e/61d627945bcd38b8f9ddf859a74c2b2d02b7b2 +0 -0
- data/features/fixtures/files.git/objects/33/cc6691aba73113aa445e3f84a3366f4e98e3e0 +2 -0
- data/features/fixtures/files.git/objects/37/cc011ba9639bd5061d6f7b1a3a5dce82cd1f71 +0 -0
- data/features/fixtures/files.git/objects/3b/14857a8e7cb009f90cfcd066043031a282db00 +0 -0
- data/features/fixtures/files.git/objects/3b/369d6d123b120b39aa8948454bcc37253b5959 +0 -0
- data/features/fixtures/files.git/objects/44/a6ee1a915804490c0ad5dffb5ea23e5aa5b812 +0 -0
- data/features/fixtures/files.git/objects/69/1ed3b65603a0d0dabfb66720e7163664be78f5 +0 -0
- data/features/fixtures/files.git/objects/6a/9904979668a9990f0cf02351422a7236667d47 +2 -0
- data/features/fixtures/files.git/objects/6a/b5d1f20357490f4c88e43933c369ec7c70a5c2 +0 -0
- data/features/fixtures/files.git/objects/71/eb640bd5dc79c14a3526aef009579548ec98c8 +0 -0
- data/features/fixtures/files.git/objects/72/cb06bbb46845dac41abe5c43850b8776713462 +0 -0
- data/features/fixtures/files.git/objects/89/e4b6c7d553678c64ce2ca045e9fc9a4361d690 +0 -0
- data/features/fixtures/files.git/objects/8d/e9e3b959ac8c2dffe3b7515be1d4956b8baf49 +0 -0
- data/features/fixtures/files.git/objects/92/e2e7031fb99e9167e322894d63fc8e0507c2c4 +2 -0
- data/features/fixtures/files.git/objects/94/87e688ef97be0548a786bda7950d037c20bbbb +0 -0
- data/features/fixtures/files.git/objects/a9/10b1bd4a24ad1b2d62605c857f84c79013b977 +2 -0
- data/features/fixtures/files.git/objects/ac/e379a6acc4ab141c97572504a5b9d93f0ddcb1 +0 -0
- data/features/fixtures/files.git/objects/b7/5117ab9cc4c4216d06c018bb020df581c2c30d +0 -0
- data/features/fixtures/files.git/objects/c9/ca14ae5fd726fe7513f14d51889e48f5adbc3f +0 -0
- data/features/fixtures/files.git/objects/d0/925b51ab3408d6fef51d5a40d39ae093fb6540 +2 -0
- data/features/fixtures/files.git/objects/da/da52d59d000dacf2495252a374d4cbc3868789 +0 -0
- data/features/fixtures/files.git/objects/df/d10fbf3f8b159f9385988b7deb386604598afc +0 -0
- data/features/fixtures/files.git/objects/fd/b794eac9712eab2c12866319af6767b8b9e556 +0 -0
- data/features/fixtures/files.git/refs/heads/master +1 -0
- data/features/step_definitions/common_steps.rb +183 -0
- data/features/step_definitions/jenkins_steps.rb +113 -0
- data/features/support/common.rb +37 -0
- data/features/support/env.rb +20 -0
- data/features/support/matchers.rb +9 -0
- data/features/works_with_continuous_delivery.feature +18 -0
- data/lib/winci-updater.rb +6 -0
- data/lib/winci-updater/const.rb +57 -0
- data/lib/winci-updater/core_ext/string.rb +9 -0
- data/lib/winci-updater/git.rb +134 -0
- data/lib/winci-updater/git_ext/base.rb +30 -0
- data/lib/winci-updater/git_ext/git.rb +15 -0
- data/lib/winci-updater/git_ext/lib.rb +120 -0
- data/lib/winci-updater/gui.rb +47 -0
- data/lib/winci-updater/logger.rb +54 -0
- data/lib/winci-updater/version.rb +5 -0
- data/spec/fixtures/files.git/HEAD +1 -0
- data/spec/fixtures/files.git/config +10 -0
- data/spec/fixtures/files.git/description +1 -0
- data/spec/fixtures/files.git/hooks/applypatch-msg.sample +15 -0
- data/spec/fixtures/files.git/hooks/commit-msg.sample +24 -0
- data/spec/fixtures/files.git/hooks/post-commit.sample +8 -0
- data/spec/fixtures/files.git/hooks/post-receive.sample +15 -0
- data/spec/fixtures/files.git/hooks/post-update.sample +8 -0
- data/spec/fixtures/files.git/hooks/pre-applypatch.sample +14 -0
- data/spec/fixtures/files.git/hooks/pre-commit.sample +46 -0
- data/spec/fixtures/files.git/hooks/pre-rebase.sample +169 -0
- data/spec/fixtures/files.git/hooks/prepare-commit-msg.sample +36 -0
- data/spec/fixtures/files.git/hooks/update.sample +128 -0
- data/spec/fixtures/files.git/info/exclude +6 -0
- data/spec/fixtures/files.git/objects/0d/6b60095e8ee0e285b63964392a346f1a484c76 +0 -0
- data/spec/fixtures/files.git/objects/92/2951e4b5e9b3539344ac83aed95005ddc64c7e +0 -0
- data/spec/fixtures/files.git/objects/c3/c88adeec62fc2b3cc3494f1a0a34bfb66f2fbe +2 -0
- data/spec/fixtures/files.git/refs/heads/master +1 -0
- data/spec/fixtures/files_changed.git/HEAD +1 -0
- data/spec/fixtures/files_changed.git/config +10 -0
- data/spec/fixtures/files_changed.git/description +1 -0
- data/spec/fixtures/files_changed.git/hooks/applypatch-msg.sample +15 -0
- data/spec/fixtures/files_changed.git/hooks/commit-msg.sample +24 -0
- data/spec/fixtures/files_changed.git/hooks/post-commit.sample +8 -0
- data/spec/fixtures/files_changed.git/hooks/post-receive.sample +15 -0
- data/spec/fixtures/files_changed.git/hooks/post-update.sample +8 -0
- data/spec/fixtures/files_changed.git/hooks/pre-applypatch.sample +14 -0
- data/spec/fixtures/files_changed.git/hooks/pre-commit.sample +46 -0
- data/spec/fixtures/files_changed.git/hooks/pre-rebase.sample +169 -0
- data/spec/fixtures/files_changed.git/hooks/prepare-commit-msg.sample +36 -0
- data/spec/fixtures/files_changed.git/hooks/update.sample +128 -0
- data/spec/fixtures/files_changed.git/info/exclude +6 -0
- data/spec/fixtures/files_changed.git/objects/0d/6b60095e8ee0e285b63964392a346f1a484c76 +0 -0
- data/spec/fixtures/files_changed.git/objects/2f/a2b556695fb8a023d191859153686e2cb04545 +0 -0
- data/spec/fixtures/files_changed.git/objects/49/9050cfcb971c6c684a5f2a2d6638406d8f0865 +0 -0
- data/spec/fixtures/files_changed.git/objects/80/e133724c1eb772ee56359c5e71fd200bfb20cc +0 -0
- data/spec/fixtures/files_changed.git/objects/92/2951e4b5e9b3539344ac83aed95005ddc64c7e +0 -0
- data/spec/fixtures/files_changed.git/objects/c3/c88adeec62fc2b3cc3494f1a0a34bfb66f2fbe +2 -0
- data/spec/fixtures/files_changed.git/refs/heads/master +1 -0
- data/spec/fixtures/key +27 -0
- data/spec/git_spec.rb +49 -0
- data/spec/spec_helper.rb +9 -0
- data/tasks/cucumber.rake +23 -0
- data/tasks/rspec.rake +9 -0
- data/winci-updater.gemspec +28 -0
- metadata +280 -0
@@ -0,0 +1,113 @@
|
|
1
|
+
Given /^I have WinCI\-server installed in "([^\"]*)"$/ do |winci_server_path|
|
2
|
+
@winci_server_path = winci_server_path
|
3
|
+
|
4
|
+
# below file gets created after running winci-server/install.bat
|
5
|
+
File.exists?(File.join(winci_server_path, "ruby/bin/ruby.exe")).should == true
|
6
|
+
end
|
7
|
+
|
8
|
+
When /^I have a Jenkins server running$/ do
|
9
|
+
require 'socket'
|
10
|
+
require 'net/http'
|
11
|
+
begin
|
12
|
+
print "."; $stdout.flush
|
13
|
+
Net::HTTP.start("localhost", "3010") { |http| http.get('/') }
|
14
|
+
rescue Exception => e
|
15
|
+
system "rake --rakefile #{File.join(@winci_server_path, "restart_jenkins.rake")} restart_jenkins"
|
16
|
+
ensure
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
When /^there exist job named "([^\"]*)" that pushes successful build to "([^\"]*)" repo$/ do |project_name, production_repo|
|
21
|
+
@project_name = project_name
|
22
|
+
|
23
|
+
FileUtils.rm_rf File.expand_path('var/')
|
24
|
+
FileUtils.mkdir File.expand_path('var/')
|
25
|
+
FileUtils.cp_r(File.expand_path('features/fixtures/files.git'), File.expand_path('var/'))
|
26
|
+
|
27
|
+
# TODO move to separate step
|
28
|
+
# prepare production repo
|
29
|
+
FileUtils.mkdir File.expand_path(File.dirname(production_repo))
|
30
|
+
FileUtils.cp_r(File.expand_path('features/fixtures/files.git'), File.expand_path(production_repo))
|
31
|
+
|
32
|
+
# create job config
|
33
|
+
cfg = Jenkins::JobConfigBuilder.new(:ruby) do |c|
|
34
|
+
c.scm = File.expand_path('var/files.git') #"C:/repos/#{@project_name}.git"
|
35
|
+
c.steps = [
|
36
|
+
# below makes sense when your Rakefile run rspec/cucumber by default
|
37
|
+
[:build_bat_step, "bundle exec rake"],
|
38
|
+
# this will send current code to production repo only after rspec/cucumber passed
|
39
|
+
[:build_bat_step, "git push #{File.expand_path(production_repo)} HEAD:master"]
|
40
|
+
]
|
41
|
+
end
|
42
|
+
|
43
|
+
job = WinCI::Job.new @project_name, cfg
|
44
|
+
|
45
|
+
|
46
|
+
print "waiting for at most 30 seconds for the server to create the job"
|
47
|
+
tries = 0
|
48
|
+
begin
|
49
|
+
print "."; $stdout.flush
|
50
|
+
tries += 1
|
51
|
+
|
52
|
+
# by default creates job on localhost:3010
|
53
|
+
@job_creation_res = job.create
|
54
|
+
raise if not @job_creation_res =~ /.*project created on jenkins.*/
|
55
|
+
|
56
|
+
sleep(10)
|
57
|
+
puts ""
|
58
|
+
rescue Exception => e
|
59
|
+
if tries <= 3
|
60
|
+
sleep 2
|
61
|
+
retry
|
62
|
+
end
|
63
|
+
ensure
|
64
|
+
end
|
65
|
+
|
66
|
+
@job_creation_res.should =~ /.*project created on jenkins.*/
|
67
|
+
end
|
68
|
+
|
69
|
+
When /^the job has at least one successful build$/ do
|
70
|
+
job = WinCI::Job.new @project_name
|
71
|
+
sha = nil
|
72
|
+
begin
|
73
|
+
sha = job.last_successful_build_sha
|
74
|
+
rescue
|
75
|
+
Jenkins::Api.build_job(@project_name)
|
76
|
+
puts "waiting 40 seconds for the server to build the job"
|
77
|
+
sleep 40
|
78
|
+
sha = job.last_successful_build_sha
|
79
|
+
end
|
80
|
+
sha.should_not be_empty
|
81
|
+
end
|
82
|
+
|
83
|
+
When /^I run updater with "([^\"]*)" in config$/ do |production_repo|
|
84
|
+
File.open('var/_config.yaml', 'w') do |f|
|
85
|
+
f.puts ":SCMs:"
|
86
|
+
f.puts "- \"#{File.expand_path(production_repo)}\""
|
87
|
+
end
|
88
|
+
|
89
|
+
@git = WinCI::Updater::Git.new "var/_config.yaml"
|
90
|
+
@git.setup_ssh_key "spec/fixtures/key"
|
91
|
+
|
92
|
+
@updater_res = @git.provide File.expand_path('var/'), 'files_cloned', false
|
93
|
+
end
|
94
|
+
|
95
|
+
When /^I run updater with "([^\"]*)" in config and target dir "([^\"]*)" as parameter$/ do |production_repo, target_dir|
|
96
|
+
File.open(File.expand_path('var/_config.yaml'), 'w') do |f|
|
97
|
+
f.puts ":SCMs:"
|
98
|
+
f.puts "- \"#{File.expand_path(production_repo)}\""
|
99
|
+
end
|
100
|
+
|
101
|
+
@git = WinCI::Updater::Git.new "var/_config.yaml"
|
102
|
+
@git.setup_ssh_key "spec/fixtures/key"
|
103
|
+
|
104
|
+
@updater_res = @git.provide File.expand_path('var/'), 'files_cloned', false
|
105
|
+
end
|
106
|
+
|
107
|
+
Then /^I should see this$/ do |text|
|
108
|
+
@updater_res.strip.upcase.should contain(text.strip.upcase)
|
109
|
+
end
|
110
|
+
|
111
|
+
When /^directory named "([^\"]*)" is created$/ do |arg1|
|
112
|
+
File.exists?(File.expand_path('var/files_cloned/.git/')).should be_true
|
113
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module CommonHelpers
|
2
|
+
def get_command_output
|
3
|
+
strip_color_codes(File.read(@stdout)).chomp
|
4
|
+
end
|
5
|
+
|
6
|
+
def strip_color_codes(text)
|
7
|
+
text.gsub(/\e\[\d+m/, '')
|
8
|
+
end
|
9
|
+
|
10
|
+
def in_tmp_folder(&block)
|
11
|
+
FileUtils.chdir(@tmp_root, &block)
|
12
|
+
end
|
13
|
+
|
14
|
+
def in_project_folder(&block)
|
15
|
+
project_folder = @active_project_folder || @tmp_root
|
16
|
+
FileUtils.chdir(project_folder, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
def in_home_folder(&block)
|
20
|
+
FileUtils.chdir(@home_path, &block)
|
21
|
+
end
|
22
|
+
|
23
|
+
def force_local_lib_override(project_name = @project_name)
|
24
|
+
rakefile = File.read(File.join(project_name, 'Rakefile'))
|
25
|
+
File.open(File.join(project_name, 'Rakefile'), "w+") do |f|
|
26
|
+
f << "$:.unshift('#{@lib_path}')\n"
|
27
|
+
f << rakefile
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def setup_active_project_folder project_name
|
32
|
+
@active_project_folder = File.join(@tmp_root, project_name)
|
33
|
+
@project_name = project_name
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
World(CommonHelpers)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
$:.unshift(File.expand_path(File.dirname(__FILE__) + "/../../lib"))
|
2
|
+
require 'winci-updater.rb'
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'jenkins'
|
5
|
+
require 'winci'
|
6
|
+
|
7
|
+
Before do
|
8
|
+
@tmp_root = File.dirname(__FILE__) + "/../../tmp"
|
9
|
+
@home_path = File.expand_path(File.join(@tmp_root, "home"))
|
10
|
+
@lib_path = File.expand_path(File.dirname(__FILE__) + "/../../lib")
|
11
|
+
FileUtils.rm_rf @tmp_root
|
12
|
+
FileUtils.mkdir_p @home_path
|
13
|
+
ENV['HOME'] = @home_path
|
14
|
+
ENV['CUCUMBER_RUNNING'] = 'oooh yes'
|
15
|
+
end
|
16
|
+
|
17
|
+
After do
|
18
|
+
ENV.delete('JENKINS_HOST')
|
19
|
+
ENV.delete('JENKINS_PORT')
|
20
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
Feature: Works with WinCI continuous delivery process
|
2
|
+
In order to enhance provisioning in continuous delivery process
|
3
|
+
As a project developer
|
4
|
+
I want to fully integrate updater with WinCI continuous delivery process
|
5
|
+
|
6
|
+
Background:
|
7
|
+
Given I have WinCI-server installed in "C:/winci-server"
|
8
|
+
And I have a Jenkins server running
|
9
|
+
And there exist job named "files" that pushes successful build to "var/production/files.git" repo
|
10
|
+
And the job has at least one successful build
|
11
|
+
|
12
|
+
Scenario: Download last successful build
|
13
|
+
When I run updater with "var/production/files.git" in config and target dir "files_cloned" as parameter
|
14
|
+
Then I should see this
|
15
|
+
"""
|
16
|
+
Update successful!
|
17
|
+
"""
|
18
|
+
And directory named "files_cloned" is created
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require "logger"
|
2
|
+
|
3
|
+
module WinCI
|
4
|
+
module Updater
|
5
|
+
|
6
|
+
UPDATER_WINDOW_TITLE = 'Updater'
|
7
|
+
|
8
|
+
LOG_FILE = 'git_responses.log' # file used to log git command responses
|
9
|
+
LOGGER_LEVEL = Logger::DEBUG # possible values: Logger::DEBUG, Logger::INFO, Logger::WARN, Logger::ERROR, Logger::FATAL
|
10
|
+
|
11
|
+
TOLERATED_STASH_MESSAGES = [\
|
12
|
+
'No local changes to save', \
|
13
|
+
'Saved working directory .*HEAD is now at .*',\
|
14
|
+
]
|
15
|
+
|
16
|
+
# actually they are not messages from 'pull' but from 'merge' which is part of 'pull' command
|
17
|
+
TOLERATED_PULL_MESSAGES = [\
|
18
|
+
'Already up-to-date.', \
|
19
|
+
'Updating .*', \
|
20
|
+
'Merge made by recursive..*',\
|
21
|
+
]
|
22
|
+
|
23
|
+
TOLERATED_CLONE_MESSAGES = [\
|
24
|
+
'Already up-to-date.',\
|
25
|
+
]
|
26
|
+
|
27
|
+
# button constants
|
28
|
+
MB_OK = 0x00000000
|
29
|
+
MB_OKCANCEL = 0x00000001
|
30
|
+
MB_ABORTRETRYIGNORE = 0x00000002
|
31
|
+
MB_YESNOCANCEL = 0x00000003
|
32
|
+
MB_YESNO = 0x00000004
|
33
|
+
MB_RETRYCANCEL = 0x00000005
|
34
|
+
MB_SETFOREGROUND = 0x00010000
|
35
|
+
MB_TOPMOST = 0x00040000
|
36
|
+
MB_ICONEXCLAMATION = 0x00000030
|
37
|
+
MB_CANCELTRYCONTINUE = 0x00000006
|
38
|
+
MB_ICONHAND = 0x00000010
|
39
|
+
MB_ICONQUESTION = 0x00000020
|
40
|
+
MB_ICONASTERISK = 0x00000040
|
41
|
+
MB_USERICON = 0x00000080
|
42
|
+
MB_ICONWARNING = MB_ICONEXCLAMATION
|
43
|
+
MB_ICONERROR = MB_ICONHAND
|
44
|
+
MB_ICONINFORMATION = MB_ICONASTERISK
|
45
|
+
MB_ICONSTOP = MB_ICONHAND
|
46
|
+
|
47
|
+
# return code constants
|
48
|
+
CLICKED_OK = 1
|
49
|
+
CLICKED_CANCEL = 2
|
50
|
+
CLICKED_ABORT = 3
|
51
|
+
CLICKED_RETRY = 4
|
52
|
+
CLICKED_IGNORE = 5
|
53
|
+
CLICKED_YES = 6
|
54
|
+
CLICKED_NO = 7
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'dl'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
require "optparse"
|
6
|
+
require "date"
|
7
|
+
require "pathname"
|
8
|
+
require "fileutils"
|
9
|
+
require "git"
|
10
|
+
|
11
|
+
require 'winci-updater/git_ext/git'
|
12
|
+
require 'winci-updater/git_ext/lib'
|
13
|
+
require 'winci-updater/git_ext/base'
|
14
|
+
require 'winci-updater/core_ext/string'
|
15
|
+
require 'winci-updater/const'
|
16
|
+
require 'winci-updater/logger'
|
17
|
+
|
18
|
+
module WinCI
|
19
|
+
module Updater
|
20
|
+
class Git
|
21
|
+
def initialize config_path="_config.yaml"
|
22
|
+
@config = YAML.load_file(config_path)
|
23
|
+
|
24
|
+
# create new log file periodically -- each month/week/day
|
25
|
+
$log = TLogger.new(LOG_FILE, 'monthly', STDOUT, true) # possible values: 'monthly', 'weekly', 'daily'
|
26
|
+
# limit the output
|
27
|
+
$log.level = LOGGER_LEVEL
|
28
|
+
|
29
|
+
$log.info("\r\n\r\n\r\nStarting script...\r\n\r\n")
|
30
|
+
|
31
|
+
ensure_git_available
|
32
|
+
end
|
33
|
+
|
34
|
+
def ensure_git_available
|
35
|
+
if File.exists?("../PortableGit/bin/git.exe")
|
36
|
+
git_dir = File.expand_path('../PortableGit/bin', File.dirname(__FILE__))
|
37
|
+
ENV['PATH'] = ENV['PATH'] + ';' + git_dir
|
38
|
+
else
|
39
|
+
# check if git.exe is on PATH
|
40
|
+
begin
|
41
|
+
`git status`
|
42
|
+
rescue
|
43
|
+
raise "Cannot find Git installation! Please reinstall using Git-1.7.0.2-preview20100309.exe or simmilar file!\r\n" +
|
44
|
+
"The file can be obtained from here: http://code.google.com/p/msysgit/downloads"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def setup_ssh_key key_path="key"
|
50
|
+
res = ::Git.setup_ssh_key key_path
|
51
|
+
if not res
|
52
|
+
res = 'Error while creating ssh-agent or adding ssh key!'
|
53
|
+
end
|
54
|
+
raise res if not res['Identity added']
|
55
|
+
@ssh_agent_enabled = true
|
56
|
+
end
|
57
|
+
|
58
|
+
def provide_scm scm, localPath
|
59
|
+
if File.directory?(localPath)
|
60
|
+
$log.info("\r\nUpdating '#{localPath}' repository")
|
61
|
+
g = ::Git.open(localPath, :log => $log)
|
62
|
+
# before overwriting with pull, here we do backup of any user made changes to files in the repo
|
63
|
+
res = g.stash(:save => true, :message => 'Changes made by user')
|
64
|
+
if not res.match_any? TOLERATED_STASH_MESSAGES then
|
65
|
+
@not_tolerated_messages << res
|
66
|
+
return
|
67
|
+
end
|
68
|
+
|
69
|
+
# update the repo
|
70
|
+
# Note: this command can return 'Already up to date' message
|
71
|
+
res = g.pull("origin", "origin/master")
|
72
|
+
if not res.match_any? TOLERATED_PULL_MESSAGES then
|
73
|
+
@not_tolerated_messages << res
|
74
|
+
return
|
75
|
+
end
|
76
|
+
else # we clone it if it doesnt exist yet
|
77
|
+
$log.info("\r\nCloning '#{localPath}' repository")
|
78
|
+
opts = {}
|
79
|
+
opts[:depth] = 1
|
80
|
+
g = ::Git.clone(scm, localPath, opts)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def provide target_dir = "./", target_repo_name = nil, handle_failure = true
|
85
|
+
@not_tolerated_messages = []
|
86
|
+
|
87
|
+
begin
|
88
|
+
|
89
|
+
@config[:SCMs].each do |scm|
|
90
|
+
begin
|
91
|
+
target_repo_name = File.basename(scm, '.*') if not target_repo_name
|
92
|
+
provide_scm(scm, File.join(target_dir, target_repo_name))
|
93
|
+
rescue ::Git::GitExecuteError => e
|
94
|
+
@not_tolerated_messages << e
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
msg = ''
|
99
|
+
buttons = MB_SETFOREGROUND | MB_OK
|
100
|
+
if @not_tolerated_messages.length > 0
|
101
|
+
msg = "Unknown message received while updating, please consult developement team.\r\n"+
|
102
|
+
"It is possible that the message means success.\r\n"+"DETAILS:\r\n" + @not_tolerated_messages.join("\r\n")
|
103
|
+
buttons = MB_ICONERROR | buttons
|
104
|
+
else
|
105
|
+
msg = "Update Successful!"
|
106
|
+
end
|
107
|
+
|
108
|
+
$log.info("\r\n\r\nSUMMARY:\r\n")
|
109
|
+
$log.info(msg)
|
110
|
+
if handle_failure
|
111
|
+
puts msg
|
112
|
+
message_box(msg, UPDATER_WINDOW_TITLE, buttons)
|
113
|
+
else
|
114
|
+
return msg
|
115
|
+
end
|
116
|
+
|
117
|
+
rescue => e
|
118
|
+
msg = e.message.gsub('uncaught throw ', '')
|
119
|
+
$log.error(msg)
|
120
|
+
if handle_failure
|
121
|
+
puts msg
|
122
|
+
message_box("Update Failed! #{msg}", UPDATER_WINDOW_TITLE, buttons=MB_OK | MB_SETFOREGROUND | MB_ICONERROR)
|
123
|
+
else
|
124
|
+
raise
|
125
|
+
end
|
126
|
+
ensure
|
127
|
+
::Git.kill_ssh_agent if @ssh_agent_enabled
|
128
|
+
@ssh_agent_enabled = nil
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Git
|
2
|
+
|
3
|
+
class Base
|
4
|
+
|
5
|
+
def self.setup_ssh_key(ssh_key_path)
|
6
|
+
Git::Lib.new.setup_ssh_key(ssh_key_path)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.kill_ssh_agent
|
10
|
+
Git::Lib.new.kill_ssh_agent
|
11
|
+
end
|
12
|
+
|
13
|
+
def show_head_names
|
14
|
+
self.lib.show_head_names
|
15
|
+
end
|
16
|
+
|
17
|
+
# cleans a git repository locally
|
18
|
+
def clean(opts = {})
|
19
|
+
# run git-clone
|
20
|
+
self.lib.clean(opts)
|
21
|
+
end
|
22
|
+
|
23
|
+
def stash(opts = {})
|
24
|
+
# run git-stash
|
25
|
+
self.lib.stash(opts)
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|