Fetch and map refs/pull to refs/merge-requests in the GH import
update MR diff
This commit is contained in:
parent
b7dda44ea5
commit
149adcd120
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue