summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Lopez <james@jameslopez.es>2017-08-24 10:18:01 +0200
committerRémy Coutable <remy@rymai.me>2017-10-05 10:48:25 +0200
commit149adcd1206ba3bebd20401bf45ef7e67ec690fb (patch)
treefb1d44683323ff5118d7ce40ca84b8cbec8d11c2
parentb7dda44ea5a9384d212e809de0cb4c7d666d7391 (diff)
downloadgitlab-ce-149adcd1206ba3bebd20401bf45ef7e67ec690fb.tar.gz
Fetch and map refs/pull to refs/merge-requests in the GH import
update MR diff
-rw-r--r--app/models/concerns/repository_mirroring.rb23
-rw-r--r--app/models/merge_request_diff.rb3
-rw-r--r--lib/github/import.rb6
-rw-r--r--lib/github/representation/pull_request.rb33
4 files changed, 34 insertions, 31 deletions
diff --git a/app/models/concerns/repository_mirroring.rb b/app/models/concerns/repository_mirroring.rb
index fed336c29d6..5758c52297f 100644
--- a/app/models/concerns/repository_mirroring.rb
+++ b/app/models/concerns/repository_mirroring.rb
@@ -1,17 +1,36 @@
module RepositoryMirroring
- def set_remote_as_mirror(name)
- config = raw_repository.rugged.config
+ IMPORT_REFS = %w[+refs/pull/*/head:refs/merge-requests/*/head +refs/heads/*:refs/heads/* +refs/tags/*:refs/tags/*].freeze
+ def set_remote_as_mirror(name)
# This is used to define repository as equivalent as "git clone --mirror"
config["remote.#{name}.fetch"] = 'refs/*:refs/*'
config["remote.#{name}.mirror"] = true
config["remote.#{name}.prune"] = true
end
+ def set_import_remote_as_mirror(name)
+ # Add first fetch with Rugged so it does not create its own.
+ config["remote.#{name}.fetch"] = IMPORT_REFS.first
+
+ IMPORT_REFS.drop(1).each do |ref|
+ run_git(%W[config --add remote.#{name}.fetch #{ref}])
+ end
+
+ config["remote.#{name}.mirror"] = true
+ config["remote.#{name}.prune"] = true
+ rescue Rugged::ConfigError
+ # Ignore multivar errors when the config already exist
+ # TODO: refactor/fix this
+ end
+
def fetch_mirror(remote, url)
add_remote(remote, url)
set_remote_as_mirror(remote)
fetch_remote(remote, forced: true)
remove_remote(remote)
end
+
+ def config
+ raw_repository.rugged.config
+ end
end
diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb
index 58050e1f438..cd20df8404a 100644
--- a/app/models/merge_request_diff.rb
+++ b/app/models/merge_request_diff.rb
@@ -55,7 +55,8 @@ class MergeRequestDiff < ActiveRecord::Base
end
def ensure_commit_shas
- merge_request.fetch_ref
+ merge_request.fetch_ref unless merge_request.source_branch_head
+
self.start_commit_sha ||= merge_request.target_branch_sha
self.head_commit_sha ||= merge_request.source_branch_sha
self.base_commit_sha ||= find_base_sha
diff --git a/lib/github/import.rb b/lib/github/import.rb
index c0cd8382875..47ed9acadc4 100644
--- a/lib/github/import.rb
+++ b/lib/github/import.rb
@@ -56,7 +56,7 @@ module Github
begin
project.ensure_repository
project.repository.add_remote('github', repo_url)
- project.repository.set_remote_as_mirror('github')
+ project.repository.set_import_remote_as_mirror('github')
project.repository.fetch_remote('github', forced: true)
rescue Gitlab::Git::Repository::NoRepository, Gitlab::Shell::Error => e
error(:project, repo_url, e.message)
@@ -140,7 +140,7 @@ module Github
response.body.each do |raw|
pull_request = Github::Representation::PullRequest.new(raw, options.merge(project: project))
merge_request = MergeRequest.find_or_initialize_by(iid: pull_request.iid, source_project_id: project.id)
- next unless merge_request.new_record? && pull_request.valid?
+ next unless merge_request.new_record? && pull_request.valid? && merge_request.source_branch_head
begin
pull_request.restore_branches!
@@ -173,8 +173,6 @@ module Github
fetch_comments(merge_request, :review_comment, review_comments_url, LegacyDiffNote)
rescue => e
error(:pull_request, pull_request.url, e.message)
- ensure
- pull_request.remove_restored_branches!
end
end
diff --git a/lib/github/representation/pull_request.rb b/lib/github/representation/pull_request.rb
index 55461097e8a..ec030ade38a 100644
--- a/lib/github/representation/pull_request.rb
+++ b/lib/github/representation/pull_request.rb
@@ -10,7 +10,9 @@ module Github
def source_branch_name
@source_branch_name ||=
- if cross_project? || !source_branch_exists?
+ if opened? && project.repository.branch_exists?(source_branch.ref)
+ source_branch.ref
+ elsif cross_project? && opened?
source_branch_name_prefixed
else
source_branch_ref
@@ -20,7 +22,7 @@ module Github
def source_branch_exists?
return @source_branch_exists if defined?(@source_branch_exists)
- @source_branch_exists = !cross_project? && source_branch.exists?
+ @source_branch_exists = project.repository.branch_exists?(source_branch_name)
end
def target_project
@@ -55,13 +57,6 @@ module Github
restore_target_branch!
end
- def remove_restored_branches!
- return if opened?
-
- remove_source_branch!
- remove_target_branch!
- end
-
private
def project
@@ -72,8 +67,12 @@ module Github
@source_branch ||= Representation::Branch.new(raw['head'], repository: project.repository)
end
+ def source_branch_ref
+ "refs/merge-requests/#{iid}/head"
+ end
+
def source_branch_name_prefixed
- "gh-#{target_branch_short_sha}/#{iid}/#{source_branch_user}/#{source_branch_ref}"
+ "gh-#{target_branch_short_sha}/#{iid}/#{source_branch_user}/#{source_branch.ref}"
end
def target_branch
@@ -101,20 +100,6 @@ module Github
target_branch.restore!(target_branch_name)
end
-
- def remove_source_branch!
- # We should remove the source/target branches only if they were
- # restored. Otherwise, we'll remove branches like 'master' that
- # target_branch_exists? returns true. In other words, we need
- # to clean up only the restored branches that (source|target)_branch_exists?
- # returns false for the first time it has been called, because of
- # this that is important to memoize these values.
- source_branch.remove!(source_branch_name) unless source_branch_exists?
- end
-
- def remove_target_branch!
- target_branch.remove!(target_branch_name) unless target_branch_exists?
- end
end
end
end