summaryrefslogtreecommitdiff
path: root/lib/gitlab/github_import/importer.rb
diff options
context:
space:
mode:
authorDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-04-21 17:16:22 -0300
committerDouglas Barbosa Alexandre <dbalexandre@gmail.com>2016-05-13 16:49:27 -0500
commit8532dc0d774d43e2e23ab169d5af0c2ab12c139c (patch)
treedb08a8bf8eb68b38945f4596e64c9aa0c9384e18 /lib/gitlab/github_import/importer.rb
parent61756ecca91b2aaed0a29fcc796e50f55cceab9e (diff)
downloadgitlab-ce-8532dc0d774d43e2e23ab169d5af0c2ab12c139c.tar.gz
Import pull requests from GitHub where the source branch was removed
Diffstat (limited to 'lib/gitlab/github_import/importer.rb')
-rw-r--r--lib/gitlab/github_import/importer.rb48
1 files changed, 30 insertions, 18 deletions
diff --git a/lib/gitlab/github_import/importer.rb b/lib/gitlab/github_import/importer.rb
index 0f9e3ee14ee..a3f27891784 100644
--- a/lib/gitlab/github_import/importer.rb
+++ b/lib/gitlab/github_import/importer.rb
@@ -3,12 +3,15 @@ module Gitlab
class Importer
include Gitlab::ShellAdapter
- attr_reader :project, :client
+ attr_reader :client, :project, :repo, :repo_url
def initialize(project)
@project = project
- if import_data_credentials
- @client = Client.new(import_data_credentials[:user])
+ @repo = project.import_source
+ @repo_url = project.import_url
+
+ if credentials
+ @client = Client.new(credentials[:user])
@formatter = Gitlab::ImportFormatter.new
else
raise Projects::ImportService::Error, "Unable to find project import data credentials for project ID: #{@project.id}"
@@ -22,8 +25,8 @@ module Gitlab
private
- def import_data_credentials
- @import_data_credentials ||= project.import_data.credentials if project.import_data
+ def credentials
+ @credentials ||= project.import_data.credentials if project.import_data
end
def import_labels
@@ -68,22 +71,31 @@ module Gitlab
end
def import_pull_requests
- client.pull_requests(project.import_source, state: :all,
- sort: :created,
- direction: :asc).each do |raw_data|
- pull_request = PullRequestFormatter.new(project, raw_data)
-
- if pull_request.valid?
- merge_request = MergeRequest.new(pull_request.attributes)
-
- if merge_request.save
- apply_labels(pull_request.number, merge_request)
- import_comments(pull_request.number, merge_request)
- import_comments_on_diff(pull_request.number, merge_request)
- end
+ pull_requests = client.pull_requests(repo, state: :all, sort: :created, direction: :asc)
+ .map { |raw| PullRequestFormatter.new(project, raw) }
+ .reject(&:cross_project?)
+
+ source_branches_removed = pull_requests.reject(&:source_branch_exists?)
+ source_branches_removed.each do |pull_request|
+ client.create_ref(repo, "refs/heads/#{pull_request.source_branch}", pull_request.source_sha)
+ end
+
+ project.repository.fetch_ref(repo_url, '+refs/heads/*', 'refs/heads/*')
+
+ pull_requests.each do |pull_request|
+ merge_request = MergeRequest.new(pull_request.attributes)
+
+ if merge_request.save
+ apply_labels(pull_request.number, merge_request)
+ import_comments(pull_request.number, merge_request)
+ import_comments_on_diff(pull_request.number, merge_request)
end
end
+ source_branches_removed.each do |pull_request|
+ client.delete_ref(repo, "heads/#{pull_request.source_branch}")
+ end
+
true
rescue ActiveRecord::RecordInvalid => e
raise Projects::ImportService::Error, e.message