summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-03-12 11:03:07 +0200
committerDmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>2014-03-12 11:03:07 +0200
commitc8a713cbde5c9149539bba51917bd094ef2b5189 (patch)
tree12bfe1042f16aeaf4f444543e6b239f6d440b183
parent3df553676aca6f07864c3c7bbd4422e4d70b454c (diff)
downloadgitlab-shell-c8a713cbde5c9149539bba51917bd094ef2b5189.tar.gz
Add support for import repo timeout
Signed-off-by: Dmitriy Zaporozhets <dmitriy.zaporozhets@gmail.com>
-rw-r--r--README.md6
-rw-r--r--lib/gitlab_projects.rb17
-rw-r--r--spec/gitlab_projects_spec.rb37
3 files changed, 50 insertions, 10 deletions
diff --git a/README.md b/README.md
index fee7b53..b194039 100644
--- a/README.md
+++ b/README.md
@@ -36,7 +36,11 @@ Remove repo
Import repo
- ./bin/gitlab-projects import-project randx/six.git https://github.com/randx/six.git
+ # Default timeout is 2 minutes
+ ./bin/gitlab-projects import-project randx/six.git https://github.com/randx/six.git
+
+ # Override timeout in seconds
+ ./bin/gitlab-projects import-project randx/six.git https://github.com/randx/six.git 90
Fork repo
diff --git a/lib/gitlab_projects.rb b/lib/gitlab_projects.rb
index a0063aa..d761026 100644
--- a/lib/gitlab_projects.rb
+++ b/lib/gitlab_projects.rb
@@ -1,4 +1,5 @@
require 'fileutils'
+require 'timeout'
require_relative 'gitlab_config'
require_relative 'gitlab_logger'
@@ -92,9 +93,23 @@ class GitlabProjects
# URL must be publicly cloneable
def import_project
@source = ARGV.shift
+
+ # timeout for clone
+ timeout = (ARGV.shift || 120).to_i
$logger.info "Importing project #{@project_name} from <#{@source}> to <#{full_path}>."
cmd = %W(git clone --bare -- #{@source} #{full_path})
- system(*cmd) && self.class.create_hooks(full_path)
+
+ begin
+ Timeout.timeout(timeout) do
+ system(*cmd)
+ end
+ rescue
+ $logger.error "Importing project #{@project_name} from <#{@source}> failed due to timeout."
+ FileUtils.rm_rf(full_path)
+ false
+ else
+ self.class.create_hooks(full_path)
+ end
end
# Move repository from one directory to another
diff --git a/spec/gitlab_projects_spec.rb b/spec/gitlab_projects_spec.rb
index dbdbfd9..ac0af4f 100644
--- a/spec/gitlab_projects_spec.rb
+++ b/spec/gitlab_projects_spec.rb
@@ -196,17 +196,38 @@ describe GitlabProjects do
end
describe :import_project do
- let(:gl_projects) { build_gitlab_projects('import-project', repo_name, 'https://github.com/randx/six.git') }
+ context 'success import' do
+ let(:gl_projects) { build_gitlab_projects('import-project', repo_name, 'https://github.com/randx/six.git') }
- it "should import a repo" do
- gl_projects.exec
- File.exists?(File.join(tmp_repo_path, 'HEAD')).should be_true
+ it { gl_projects.exec.should be_true }
+
+ it "should import a repo" do
+ gl_projects.exec
+ File.exists?(File.join(tmp_repo_path, 'HEAD')).should be_true
+ end
+
+ it "should log an import-project event" do
+ message = "Importing project #{repo_name} from <https://github.com/randx/six.git> to <#{tmp_repo_path}>."
+ $logger.should_receive(:info).with(message)
+ gl_projects.exec
+ end
end
- it "should log an import-project event" do
- message = "Importing project #{repo_name} from <https://github.com/randx/six.git> to <#{tmp_repo_path}>."
- $logger.should_receive(:info).with(message)
- gl_projects.exec
+ context 'timeout' do
+ let(:gl_projects) { build_gitlab_projects('import-project', repo_name, 'https://dev.gitlab.org/samples/private.git', '1') }
+
+ it { gl_projects.exec.should be_false }
+
+ it "should not import a repo" do
+ gl_projects.exec
+ File.exists?(File.join(tmp_repo_path, 'HEAD')).should be_false
+ end
+
+ it "should log an import-project event" do
+ message = "Importing project #{repo_name} from <https://dev.gitlab.org/samples/private.git> failed due to timeout."
+ $logger.should_receive(:error).with(message)
+ gl_projects.exec
+ end
end
end