From c96423fb318a4949a9a1e432b039aa96489aa928 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrian=20Schr=C3=B6ter?= Date: Wed, 22 Jan 2025 11:27:46 +0100 Subject: [PATCH] [api] fix forking of scmsync projects --- src/api/app/models/branch_package.rb | 14 +++--- src/api/app/models/project.rb | 2 +- .../test/functional/source_controller_test.rb | 44 +++++++++++++++++++ 3 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/api/app/models/branch_package.rb b/src/api/app/models/branch_package.rb index ec406b51c8a1..62dcb19efc24 100644 --- a/src/api/app/models/branch_package.rb +++ b/src/api/app/models/branch_package.rb @@ -141,9 +141,12 @@ def check_for_update_project(package_hash) # would be just the cosmetic parts like title and description. Other elemnts should # not be used anyway for scmsync packages. def create_fork(project) - package = project.packages.find_or_initialize_by(name: params[:package]) - package.scmsync = @scmsync - package.store + package = nil + unless params[:package] == '_project' + package = project.packages.find_or_initialize_by(name: params[:package]) + package.scmsync = @scmsync + package.store + end # add repositories opts = {} @@ -152,9 +155,10 @@ def create_fork(project) source_project = Project.get_by_name(params[:project]) project.branch_to_repositories_from(source_project, package, opts) project.sync_repository_pathes - + project.scmsync = @scmsync if params[:package] == '_project' project.store - { targetproject: package.project.name, targetpackage: package.name, sourceproject: params[:project], sourcepackage: params[:package] } + return { targetproject: project.name, sourceproject: params[:project] } if params[:package] == '_project' + { targetproject: project.name, targetpackage: package.name, sourceproject: params[:project], sourcepackage: params[:package] } end def create_branch_packages(tprj) diff --git a/src/api/app/models/project.rb b/src/api/app/models/project.rb index e6a5ecee90a5..1da249bf0266 100644 --- a/src/api/app/models/project.rb +++ b/src/api/app/models/project.rb @@ -938,7 +938,7 @@ def branch_local_repositories(project, pkg_to_enable, opts = {}) branch_copy_flags(project) - return unless pkg_to_enable.is_channel? + return unless pkg_to_enable && pkg_to_enable.is_channel? # explicit call for a channel package, so create the repos for it pkg_to_enable.channels.each do |channel| diff --git a/src/api/test/functional/source_controller_test.rb b/src/api/test/functional/source_controller_test.rb index b2a5392e427c..626ff7535aad 100644 --- a/src/api/test/functional/source_controller_test.rb +++ b/src/api/test/functional/source_controller_test.rb @@ -2801,6 +2801,50 @@ def test_fork_simple_package assert_response :success end + def test_fork_project + login_adrian + put '/source/home:adrian:IMAGES/_meta', params: " <description/> + <scmsync>http://localhost</scmsync> + <repository name='images'> + <arch>i586</arch> + <arch>x86_64</arch> + </repository> + </project>" + assert_response :success + + login_tom + post '/source/home:adrian:IMAGES/_project', params: { cmd: 'fork' } + assert_response :bad_request + assert_xml_tag(tag: 'status', attributes: { code: 'missing_parameter' }) + + post '/source/home:adrian:IMAGES/_project', params: { cmd: 'fork', scmsync: 'http://127.0.0.1' } + assert_response :success + + post '/source/home:adrian:IMAGES/_project', params: { cmd: 'fork', scmsync: 'http://127.0.0.1', + target_project: 'home:adrian:SOMEWHERE' } + assert_response :forbidden + + get '/source/home:tom:branches:home:adrian:IMAGES/_project/_history' + assert_response :success + + get '/source/home:tom:branches:home:adrian:IMAGES/_meta' + assert_response :success + assert_xml_tag(tag: 'repository', attributes: { name: 'images' }) + assert_xml_tag(tag: 'scmsync', content: 'http://127.0.0.1') + assert_no_xml_tag(tag: 'path') + + get '/source/home:tom:branches:home:adrian:IMAGES/_project/_meta' + assert_response :success + assert_xml_tag(tag: 'scmsync', content: 'http://127.0.0.1') + + # cleanup + delete '/source/home:tom:branches:home:adrian:IMAGES' + assert_response :success + login_adrian + delete '/source/home:adrian:IMAGES' + assert_response :success + end + def test_release_package login_adrian # define manual release target