diff options
author | James Lopez <james@jameslopez.es> | 2017-08-24 10:18:01 +0200 |
---|---|---|
committer | Rémy Coutable <remy@rymai.me> | 2017-10-05 10:48:25 +0200 |
commit | 149adcd1206ba3bebd20401bf45ef7e67ec690fb (patch) | |
tree | fb1d44683323ff5118d7ce40ca84b8cbec8d11c2 | |
parent | b7dda44ea5a9384d212e809de0cb4c7d666d7391 (diff) | |
download | gitlab-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.rb | 23 | ||||
-rw-r--r-- | app/models/merge_request_diff.rb | 3 | ||||
-rw-r--r-- | lib/github/import.rb | 6 | ||||
-rw-r--r-- | lib/github/representation/pull_request.rb | 33 |
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 |