diff --git a/app/models/project_services/gitlab_ci_service.rb b/app/models/project_services/gitlab_ci_service.rb index edaeeffc22842cbc7f63c8861f1fdba2318e53eb..d66a133195164101ab78c627b494b129a052c18d 100644 --- a/app/models/project_services/gitlab_ci_service.rb +++ b/app/models/project_services/gitlab_ci_service.rb @@ -59,6 +59,26 @@ class GitlabCiService < CiService end end + def register_fork(new_project, user_token) + params = { + id: new_project.id, + name_with_namespace: new_project.name_with_namespace, + web_url: new_project.web_url, + default_branch: new_project.default_branch, + ssh_url_to_repo: new_project.ssh_url_to_repo + } + + HTTParty.post( + register_fork_path, + body: { + project_id: project.id, + project_token: token, + user_token: user_token, + data: params.to_yaml}, + verify: false + ) + end + def commit_coverage(sha, ref) response = get_ci_build(sha, ref) @@ -75,6 +95,10 @@ class GitlabCiService < CiService project_url + "?ref=" + project.default_branch end + def register_fork_path + project_url.sub(/projects\/\d*/, 'api/v1/forks') + end + def status_img_path project_url + "/status.png?ref=" + project.default_branch end diff --git a/app/services/projects/fork_service.rb b/app/services/projects/fork_service.rb index 6b0d4aca3e1a4c7ad63dad2f18bf462f28c571e2..b5150fefc4cc648bdc97ace1c791dc019bfcc529 100644 --- a/app/services/projects/fork_service.rb +++ b/app/services/projects/fork_service.rb @@ -40,12 +40,18 @@ module Projects if project.save project.team << [@current_user, :master] end + #Now fork the repo unless gitlab_shell.fork_repository(@from_project.path_with_namespace, project.namespace.path) raise 'forking failed in gitlab-shell' end + project.ensure_satellite_exists end + + if @from_project.gitlab_ci? + ForkRegistratorWorker.perform_async(@from_project.id, project.id, @current_user.private_token) + end rescue => ex project.errors.add(:base, 'Fork transaction failed.') project.destroy diff --git a/app/workers/fork_registrator_worker.rb b/app/workers/fork_registrator_worker.rb new file mode 100644 index 0000000000000000000000000000000000000000..49d040d65ee407eeeb4783e5811919582990081c --- /dev/null +++ b/app/workers/fork_registrator_worker.rb @@ -0,0 +1,12 @@ +class ForkRegistratorWorker + include Sidekiq::Worker + + sidekiq_options queue: :default + + def perform(from_project_id, to_project_id, private_token) + from_project = Project.find(from_project_id) + to_project = Project.find(to_project_id) + + from_project.gitlab_ci_service.register_fork(to_project, private_token) + end +end