Commit 3d22504d authored by Sean McGivern's avatar Sean McGivern

Merge branch 'adds-timeout-to-push-branches' into 'master'

adds timeout option to push branches and respective test suite

See merge request !124
parents 6acaaa58 9e41159a
v5.0.2
- Adds timeout option to push branches
v5.0.1 v5.0.1
- Fetch repositories with `--quiet` option by default - Fetch repositories with `--quiet` option by default
......
...@@ -113,16 +113,21 @@ class GitlabProjects ...@@ -113,16 +113,21 @@ class GitlabProjects
def push_branches def push_branches
remote_name = ARGV.shift remote_name = ARGV.shift
# timeout for push
timeout = (ARGV.shift || 120).to_i
$logger.info "Pushing branches from #{full_path} to remote #{remote_name}: #{ARGV}" $logger.info "Pushing branches from #{full_path} to remote #{remote_name}: #{ARGV}"
cmd = %W(git --git-dir=#{full_path} push -- #{remote_name}).concat(ARGV) cmd = %W(git --git-dir=#{full_path} push -- #{remote_name}).concat(ARGV)
pid = Process.spawn(*cmd) pid = Process.spawn(*cmd)
begin begin
Timeout.timeout(timeout) do
Process.wait(pid) Process.wait(pid)
end
$?.exitstatus.zero? $?.exitstatus.zero?
rescue => exception rescue => exception
$logger.error "Pushing branches to remote #{remote_name} failed due to: #{exception.message}" $logger.error "Pushing branches to remote #{remote_name} failed due to: #{exception.message}."
Process.kill('KILL', pid) Process.kill('KILL', pid)
Process.wait Process.wait
...@@ -204,10 +209,8 @@ class GitlabProjects ...@@ -204,10 +209,8 @@ class GitlabProjects
tags_option = ARGV.include?('--no-tags') ? '--no-tags' : '--tags' tags_option = ARGV.include?('--no-tags') ? '--no-tags' : '--tags'
$logger.info "Fetching remote #{@name} for project #{@project_name}." $logger.info "Fetching remote #{@name} for project #{@project_name}."
cmd = %W(git --git-dir=#{full_path} fetch #{@name}) cmd = %W(git --git-dir=#{full_path} fetch #{@name} --prune --quiet)
cmd << '--prune'
cmd << '--force' if forced cmd << '--force' if forced
cmd << '--quiet'
cmd << tags_option cmd << tags_option
pid = Process.spawn(*cmd) pid = Process.spawn(*cmd)
...@@ -217,8 +220,8 @@ class GitlabProjects ...@@ -217,8 +220,8 @@ class GitlabProjects
end end
$?.exitstatus.zero? $?.exitstatus.zero?
rescue Timeout::Error rescue => exception
$logger.error "Fetching remote #{@name} for project #{@project_name} failed due to timeout." $logger.error "Fetching remote #{@name} for project #{@project_name} failed due to: #{exception.message}."
Process.kill('KILL', pid) Process.kill('KILL', pid)
Process.wait Process.wait
......
...@@ -287,6 +287,86 @@ describe GitlabProjects do ...@@ -287,6 +287,86 @@ describe GitlabProjects do
end end
end end
describe :push_branches do
let(:repos_path) { 'current/storage' }
let(:project_name) { 'project/path.git' }
let(:full_path) { File.join(repos_path, project_name) }
let(:remote_name) { 'new/storage' }
let(:pid) { 1234 }
let(:branch_name) { 'master' }
let(:cmd) { %W(git --git-dir=#{full_path} push -- #{remote_name} #{branch_name}) }
let(:gl_projects) { build_gitlab_projects('push-branches', repos_path, project_name, remote_name, '600', 'master') }
it 'executes the command' do
expect(Process).to receive(:spawn).with(*cmd).and_return(pid)
expect(Process).to receive(:wait).with(pid)
expect(gl_projects.exec).to be true
end
it 'raises timeout' do
expect(Timeout).to receive(:timeout).with(600).and_raise(Timeout::Error)
expect(Process).to receive(:spawn).with(*cmd).and_return(pid)
expect(Process).to receive(:wait)
expect(Process).to receive(:kill).with('KILL', pid)
expect(gl_projects.exec).to be false
end
end
describe :fetch_remote do
let(:repos_path) { 'current/storage' }
let(:project_name) { 'project.git' }
let(:full_path) { File.join(repos_path, project_name) }
let(:remote_name) { 'new/storage' }
let(:pid) { 1234 }
let(:branch_name) { 'master' }
describe 'with default args' do
let(:gl_projects) { build_gitlab_projects('fetch-remote', repos_path, project_name, remote_name, '600') }
let(:cmd) { %W(git --git-dir=#{full_path} fetch #{remote_name} --prune --quiet --tags) }
it 'executes the command' do
expect(Process).to receive(:spawn).with(*cmd).and_return(pid)
expect(Process).to receive(:wait).with(pid)
expect(gl_projects.exec).to be true
end
it 'raises timeout' do
expect(Timeout).to receive(:timeout).with(600).and_raise(Timeout::Error)
expect(Process).to receive(:spawn).with(*cmd).and_return(pid)
expect(Process).to receive(:wait)
expect(Process).to receive(:kill).with('KILL', pid)
expect(gl_projects.exec).to be false
end
end
describe 'with --force' do
let(:gl_projects) { build_gitlab_projects('fetch-remote', repos_path, project_name, remote_name, '600', '--force') }
let(:cmd) { %W(git --git-dir=#{full_path} fetch #{remote_name} --prune --quiet --force --tags) }
it 'executes the command with forced option' do
expect(Process).to receive(:spawn).with(*cmd).and_return(pid)
expect(Process).to receive(:wait).with(pid)
expect(gl_projects.exec).to be true
end
end
describe 'with --no-tags' do
let(:gl_projects) { build_gitlab_projects('fetch-remote', repos_path, project_name, remote_name, '600', '--no-tags') }
let(:cmd) { %W(git --git-dir=#{full_path} fetch #{remote_name} --prune --quiet --no-tags) }
it 'executes the command' do
expect(Process).to receive(:spawn).with(*cmd).and_return(pid)
expect(Process).to receive(:wait).with(pid)
expect(gl_projects.exec).to be true
end
end
end
describe :import_project do describe :import_project do
context 'success import' do context 'success import' do
let(:gl_projects) { build_gitlab_projects('import-project', tmp_repos_path, repo_name, 'https://github.com/randx/six.git') } let(:gl_projects) { build_gitlab_projects('import-project', tmp_repos_path, repo_name, 'https://github.com/randx/six.git') }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment