diff --git a/src/api/test/functional/maintenance_test.rb b/src/api/test/functional/maintenance_test.rb index e1f67de6fc3..e65657efe52 100644 --- a/src/api/test/functional/maintenance_test.rb +++ b/src/api/test/functional/maintenance_test.rb @@ -2284,27 +2284,41 @@ def test_copy_project_for_release def test_copy_project_with_history_and_binaries login_tom - post '/source/home:tom:CopyOfBaseDistro?cmd=copy&oproject=BaseDistro&withbinaries=1' + post '/source/home:tom:CopyOfBaseDistro3?cmd=copy&oproject=BaseDistro3&withbinaries=1' assert_response 403 assert_xml_tag :tag => 'status', :attributes => { code: 'project_copy_no_permission' } # as admin login_king + + # not needed for runnning this test case alone, but another test case might have triggered + # a build job, so we need to be sure to have no reason to schedule a build + get '/build/BaseDistro3/BaseDistro3_repo/i586/pack2/_history' + xml = Xmlhash.parse(@response.body) + md5 = xml['entry']['srcmd5'] + post "/source/BaseDistro3/pack2?cmd=copy&orev=#{md5}&oproject=BaseDistro3&opackage=pack2" + assert_response :success + run_scheduler('i586') + + get '/build/BaseDistro3/_result' + assert_response :success + assert_xml_tag :tag => 'status', :attributes => { package: 'pack2', code: 'succeeded' } + sleep 1 # to ensure that the timestamp becomes newer - post '/source/CopyOfBaseDistro?cmd=copy&oproject=BaseDistro&withhistory=1&withbinaries=1&nodelay=1' + post '/source/CopyOfBaseDistro3?cmd=copy&oproject=BaseDistro3&withhistory=1&withbinaries=1&nodelay=1' assert_response :success - get '/source/CopyOfBaseDistro/_meta' + get '/source/CopyOfBaseDistro3/_meta' assert_response :success - get '/source/BaseDistro' + get '/source/BaseDistro3' assert_response :success opackages = ActiveXML::Node.new(@response.body) - get '/source/CopyOfBaseDistro' + get '/source/CopyOfBaseDistro3' assert_response :success packages = ActiveXML::Node.new(@response.body) assert_equal opackages.to_s, packages.to_s # compare revisions - get '/source/BaseDistro/pack2/_history' + get '/source/BaseDistro3/pack2/_history' assert_response :success history = ActiveXML::Node.new(@response.body) srcmd5 = last_revision(history).value(:srcmd5) @@ -2312,7 +2326,7 @@ def test_copy_project_with_history_and_binaries time = last_revision(history).value(:time) vrev = last_revision(history).value(:vrev) assert_not_nil srcmd5 - get '/source/CopyOfBaseDistro/pack2/_history' + get '/source/CopyOfBaseDistro3/pack2/_history' assert_response :success copyhistory = ActiveXML::Node.new(@response.body) copysrcmd5 = last_revision(copyhistory).value(:srcmd5) @@ -2328,15 +2342,23 @@ def test_copy_project_with_history_and_binaries # compare binaries run_scheduler('i586') - get '/build/BaseDistro/BaseDistro_repo/i586/pack2' + get '/build/BaseDistro3/BaseDistro3_repo/i586/pack2' assert_response :success assert_xml_tag :tag => 'binary', :attributes => { filename: 'package-1.0-1.i586.rpm' } orig = @response.body - get '/build/CopyOfBaseDistro/BaseDistro_repo/i586/pack2' + get '/build/CopyOfBaseDistro3/BaseDistro3_repo/i586/pack2' assert_response :success assert_equal orig, @response.body - delete '/source/CopyOfBaseDistro' + # verify scheduler state + get '/build/BaseDistro3/_result' + assert_response :success + assert_xml_tag :tag => 'status', :attributes => { package: 'pack2', code: 'succeeded' } + get '/build/CopyOfBaseDistro3/_result' + assert_response :success + assert_xml_tag :tag => 'status', :attributes => { package: 'pack2', code: 'succeeded' } + + delete '/source/CopyOfBaseDistro3' assert_response :success end diff --git a/src/backend/bs_repserver b/src/backend/bs_repserver index 1005d7eb795..948a91273e3 100755 --- a/src/backend/bs_repserver +++ b/src/backend/bs_repserver @@ -2050,7 +2050,7 @@ sub copybuild { mkdir_p($dir); my $delayed_linking; my $needsign; - for my $bin (grep {$_ ne 'status' && $_ ne 'reason' && $_ ne 'history' && !/^\./} ls($odir)) { + for my $bin (grep {$_ ne 'status' && $_ ne 'reason' && $_ ne 'history' && $_ ne 'meta' && !/^\./} sort(ls($odir))) { if ($bin eq "updateinfo.xml" && $cgi->{'setupdateinfoid'}) { my $updateinfo = readxml("$odir/$bin", $BSXML::updateinfo); for (@{$updateinfo->{'update'} || []}) { @@ -2058,6 +2058,7 @@ sub copybuild { } writexml("$dir/$bin", undef, $updateinfo, $BSXML::updateinfo); } else { + next if $bin =~ /^::import::/; # can't copy those yet $needsign = 1 if $bin =~ /\.(?:d?rpm|sha256|iso)$/; my $nbin = $bin; my $setrelease = $cgi->{'setrelease'}; @@ -2079,6 +2080,7 @@ sub copybuild { } } } + link("$odir/.meta.success", "$dir/meta") if -e "$odir/.meta.success"; # we run the linking of directory trees in background, since it can take a long time # for simple files it happened already diff --git a/src/backend/bs_sched b/src/backend/bs_sched index bea6a05b53c..50f3e201631 100755 --- a/src/backend/bs_sched +++ b/src/backend/bs_sched @@ -4538,12 +4538,18 @@ sub uploadbuildevent { my $gdst = "$reporoot/$prp/$myarch"; my $dst = "$gdst/$packid"; mkdir_p($dst); + my $meta; + $meta = "$jobdatadir/meta" if -e "$jobdatadir/meta"; print " - $prp: $packid uploaded\n"; my $useforbuildenabled = 1; $useforbuildenabled = enabled($repoid, $projpacks->{$projid}->{'useforbuild'}, $useforbuildenabled); $useforbuildenabled = enabled($repoid, $pdata->{'useforbuild'}, $useforbuildenabled); - update_dst_full($prp, $packid, $jobdatadir, undef, $useforbuildenabled, $prpsearchpath{$prp}); + update_dst_full($prp, $packid, $jobdatadir, $meta, $useforbuildenabled, $prpsearchpath{$prp}); $changed->{$prp} = 2 if $useforbuildenabled; + if ($meta) { + mkdir_p("$gdst/:meta"); + rename($meta, "$gdst/:meta/$packid"); + } delete $repounchanged{$prp} if $useforbuildenabled; $repounchanged{$prp} = 2 if $repounchanged{$prp}; $changed->{$prp} ||= 1;