diff options
-rw-r--r-- | CHANGELOG | 3 | ||||
-rw-r--r-- | README.md | 6 | ||||
-rw-r--r-- | VERSION | 2 | ||||
-rw-r--r-- | lib/gitlab_projects.rb | 20 | ||||
-rw-r--r-- | spec/gitlab_projects_spec.rb | 37 |
5 files changed, 57 insertions, 11 deletions
@@ -1,3 +1,6 @@ +v1.8.3 + - Add timeout option for repository import + v1.8.2 - Fix broken 1.8.1 @@ -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 @@ -1 +1 @@ -1.8.2 +1.8.3 diff --git a/lib/gitlab_projects.rb b/lib/gitlab_projects.rb index a0063aa..38a3a7d 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,26 @@ 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) + + pid = Process.spawn(*cmd) + + begin + Timeout.timeout(timeout) do + Process.wait(pid) + end + rescue Timeout::Error + Process.kill('KILL', pid) + $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..c60febb 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://github.com/gitlabhq/gitlabhq.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://github.com/gitlabhq/gitlabhq.git> failed due to timeout." + $logger.should_receive(:error).with(message) + gl_projects.exec + end end end |