Commit 149adcd1 authored by James Lopez's avatar James Lopez Committed by Rémy Coutable

Fetch and map refs/pull to refs/merge-requests in the GH import

update MR diff
parent b7dda44e
module RepositoryMirroring module RepositoryMirroring
def set_remote_as_mirror(name) IMPORT_REFS = %w[+refs/pull/*/head:refs/merge-requests/*/head +refs/heads/*:refs/heads/* +refs/tags/*:refs/tags/*].freeze
config = raw_repository.rugged.config
def set_remote_as_mirror(name)
# This is used to define repository as equivalent as "git clone --mirror" # This is used to define repository as equivalent as "git clone --mirror"
config["remote.#{name}.fetch"] = 'refs/*:refs/*' config["remote.#{name}.fetch"] = 'refs/*:refs/*'
config["remote.#{name}.mirror"] = true config["remote.#{name}.mirror"] = true
config["remote.#{name}.prune"] = true config["remote.#{name}.prune"] = true
end 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) def fetch_mirror(remote, url)
add_remote(remote, url) add_remote(remote, url)
set_remote_as_mirror(remote) set_remote_as_mirror(remote)
fetch_remote(remote, forced: true) fetch_remote(remote, forced: true)
remove_remote(remote) remove_remote(remote)
end end
def config
raw_repository.rugged.config
end
end end
...@@ -55,7 +55,8 @@ class MergeRequestDiff < ActiveRecord::Base ...@@ -55,7 +55,8 @@ class MergeRequestDiff < ActiveRecord::Base
end end
def ensure_commit_shas 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.start_commit_sha ||= merge_request.target_branch_sha
self.head_commit_sha ||= merge_request.source_branch_sha self.head_commit_sha ||= merge_request.source_branch_sha
self.base_commit_sha ||= find_base_sha self.base_commit_sha ||= find_base_sha
......
...@@ -56,7 +56,7 @@ module Github ...@@ -56,7 +56,7 @@ module Github
begin begin
project.ensure_repository project.ensure_repository
project.repository.add_remote('github', repo_url) 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) project.repository.fetch_remote('github', forced: true)
rescue Gitlab::Git::Repository::NoRepository, Gitlab::Shell::Error => e rescue Gitlab::Git::Repository::NoRepository, Gitlab::Shell::Error => e
error(:project, repo_url, e.message) error(:project, repo_url, e.message)
...@@ -140,7 +140,7 @@ module Github ...@@ -140,7 +140,7 @@ module Github
response.body.each do |raw| response.body.each do |raw|
pull_request = Github::Representation::PullRequest.new(raw, options.merge(project: project)) 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) 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 begin
pull_request.restore_branches! pull_request.restore_branches!
...@@ -173,8 +173,6 @@ module Github ...@@ -173,8 +173,6 @@ module Github
fetch_comments(merge_request, :review_comment, review_comments_url, LegacyDiffNote) fetch_comments(merge_request, :review_comment, review_comments_url, LegacyDiffNote)
rescue => e rescue => e
error(:pull_request, pull_request.url, e.message) error(:pull_request, pull_request.url, e.message)
ensure
pull_request.remove_restored_branches!
end end
end end
......
...@@ -10,7 +10,9 @@ module Github ...@@ -10,7 +10,9 @@ module Github
def source_branch_name def source_branch_name
@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 source_branch_name_prefixed
else else
source_branch_ref source_branch_ref
...@@ -20,7 +22,7 @@ module Github ...@@ -20,7 +22,7 @@ module Github
def source_branch_exists? def source_branch_exists?
return @source_branch_exists if defined?(@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 end
def target_project def target_project
...@@ -55,13 +57,6 @@ module Github ...@@ -55,13 +57,6 @@ module Github
restore_target_branch! restore_target_branch!
end end
def remove_restored_branches!
return if opened?
remove_source_branch!
remove_target_branch!
end
private private
def project def project
...@@ -72,8 +67,12 @@ module Github ...@@ -72,8 +67,12 @@ module Github
@source_branch ||= Representation::Branch.new(raw['head'], repository: project.repository) @source_branch ||= Representation::Branch.new(raw['head'], repository: project.repository)
end end
def source_branch_ref
"refs/merge-requests/#{iid}/head"
end
def source_branch_name_prefixed 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 end
def target_branch def target_branch
...@@ -101,20 +100,6 @@ module Github ...@@ -101,20 +100,6 @@ module Github
target_branch.restore!(target_branch_name) target_branch.restore!(target_branch_name)
end 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 end
end end
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment