Skip to content

Commit

Permalink
[backend] noservice project copy: try to reuse the old servicemark
Browse files Browse the repository at this point in the history
  • Loading branch information
mlschroe committed Dec 12, 2013
1 parent 2af5ad3 commit b2c98ea
Showing 1 changed file with 55 additions and 33 deletions.
88 changes: 55 additions & 33 deletions src/backend/bs_srcserver
Original file line number Diff line number Diff line change
Expand Up @@ -1067,34 +1067,62 @@ sub updatelinkinfodb {

# ugly hack to support 'noservice' uploads. we fake a service run
# result and strip all files from the commit that look like they
# were generated by a service run
# were generated by a service run.

sub can_reuse_oldservicemark {
my ($projid, $packid, $files, $oldservicemark) = @_;

my $treedir = $BSConfig::nosharedtrees ? "$treesdir/$projid/$packid" : "$treesdir/$packid";
return 0 if -e "$treedir/$oldservicemark-_serviceerror";
my $oldmeta = readstr("$treedir/$oldservicemark-MD5SUMS", 1);
# does not exist -> reuse it and hope for the best
return 1 if !$oldmeta;
# be extra carful here and make sure our data matches
# calculate LSRCMD5 from file list
my $nfiles = { %$files };
delete $nfiles->{$_} for grep {/^_service[:_]/} keys %$nfiles;
$nfiles->{'/SERVICE'} = $oldservicemark;
my $meta = '';
$meta .= "$nfiles->{$_} $_\n" for sort keys %$nfiles;
my $nsrcmd5 = Digest::MD5::md5_hex($meta);
# calculate new meta
$meta = '';
$meta .= "$files->{$_} $_\n" for grep {$_ ne '/SERVICE' && $_ ne '/LSERVICE'} sort keys %$files;
$meta .= "$nsrcmd5 /LSERVICE\n";
return 1 if $oldmeta eq $meta;
return 0;
}

sub servicemark_noservice {
my ($cgi, $projid, $packid, $files, $target, $servicemark) = @_;
my ($cgi, $projid, $packid, $files, $target, $oldservicemark) = @_;

if (!exists($cgi->{'servicemark'})) {
my $servicemark;
if (exists($cgi->{'servicemark'})) {
$servicemark = $cgi->{'servicemark'};
} else {
# if not given via cgi, autodetect
if ($files->{'_service'} || grep {/^_service[:_]/} keys %$files) {
if (!$servicemark && !$files->{'_service'}) {
$servicemark = genservicemark($projid, $packid, $files, $target, 1);
}
if ($oldservicemark && can_reuse_oldservicemark($projid, $packid, $files, $oldservicemark)) {
$servicemark = $oldservicemark;
} else {
undef $servicemark;
if ($files->{'_service'} || grep {/^_service[:_]/} keys %$files) {
$servicemark = genservicemark($projid, $packid, $files, $target, 1);
}
}
}
if ($servicemark) {
my $nfiles = { %$files };
delete $nfiles->{$_} for grep {/^_service[:_]/} keys %$nfiles;
$files->{'/SERVICE'} = $servicemark;
$nfiles->{'/SERVICE'} = $servicemark;
my $meta = '';
$meta .= "$nfiles->{$_} $_\n" for sort keys %$nfiles;
my $nsrcmd5 = Digest::MD5::md5_hex($meta); # hopefully matches addmeta()
addrev_service({}, {'project' => $projid, 'package' => $packid, 'srcmd5' => $nsrcmd5}, $files);
delete $files->{'/SERVICE'};
delete $nfiles->{'/SERVICE'};
$files = $nfiles;
}
return ($servicemark, $files);
return (undef, $files) unless $servicemark;

# ok, fake a service run
my $nfiles = { %$files };
delete $nfiles->{$_} for grep {/^_service[:_]/} keys %$nfiles;
$files->{'/SERVICE'} = $servicemark;
$nfiles->{'/SERVICE'} = $servicemark;
my $meta = '';
$meta .= "$nfiles->{$_} $_\n" for sort keys %$nfiles;
my $nsrcmd5 = Digest::MD5::md5_hex($meta); # hopefully matches addmeta()
addrev_service({}, {'project' => $projid, 'package' => $packid, 'srcmd5' => $nsrcmd5}, $files);
delete $files->{'/SERVICE'};
delete $nfiles->{'/SERVICE'};
return ($servicemark, $nfiles);
}

#
Expand All @@ -1118,18 +1146,12 @@ sub addrev {
my $servicemark;
delete $files->{'/SERVICE'}; # just in case...
if (!$BSConfig::old_style_services && $packid ne '_project') {
if (!$cgi->{'noservice'}) {
if ($cgi->{'noservice'}) {
($servicemark, $files) = servicemark_noservice($cgi, $projid, $packid, $files, $target);
} else {
# we do not want any generated files in the commit!
delete $files->{$_} for grep {/^_service[:_]/} keys %$files;
}
# see if we have to run a service
if (exists($cgi->{'servicemark'})) {
$servicemark = $cgi->{'servicemark'}; # use given value
} else {
$servicemark = genservicemark($projid, $packid, $files, $target);
}
if ($cgi->{'noservice'}) {
($servicemark, $files) = servicemark_noservice($cgi, $projid, $packid, $files, $target, $servicemark);
$servicemark = exists($cgi->{'servicemark'}) ? $cgi->{'servicemark'} : genservicemark($projid, $packid, $files, $target);
}
}
if ($packid eq '_pattern' && ! -e "$projectsdir/$projid.pkg/$packid.xml") {
Expand Down Expand Up @@ -5395,7 +5417,7 @@ sub copyproject {
$servicemark = genservicemark($projid, $packid, $files, undef, 1);
} else {
copyfiles($projid, $packid, $oprojid, $packid, $files);
($servicemark, $files) = servicemark_noservice($cgi, $projid, $packid, $files);
($servicemark, $files) = servicemark_noservice($cgi, $projid, $packid, $files, undef, $linkinfo->{'xservicemd5'});
}
} else {
$servicemark = genservicemark($projid, $packid, $files, undef, 1);
Expand Down

0 comments on commit b2c98ea

Please sign in to comment.