use File::Temp qw/ tempfile tempdir /;
use Build;
use Build::Rpm;
+use BSSolv;
use Data::Dumper;
use File::Basename;
my $vmswapsize = "";
my $disable_debuginfo = 0;#disable debuginfo when using build cmd
my $depends = 0; #depends subcommand to put reverse dependency
+my $reverse_off = 0; #disable reverse dependency
+my $reverse_on = 1; #enable reverse dependency
GetOptions (
"repository=s" => \@repos,
# to the whole package-depends
#---------------------------------------------------------------------
sub expand_deps {
- my $spec = shift;
+ my ($spec, $rev_flag) = @_;
my ($packname, $packvers, $subpacks, @packdeps);
$subpacks = [];
$packvers = $d->{'version'};
$subpacks = $d->{'subpacks'};
@packdeps = @{$d->{'deps'} || []};
- if ($d->{'prereqs'}) {
- my %deps = map {$_ => 1} (@packdeps, @{$d->{'subpacks'} || []});
- push @packdeps, grep {!$deps{$_} && !/^%/} @{$d->{'prereqs'}};
+ if ($rev_flag == $reverse_off) {
+ if ($d->{'prereqs'}) {
+ my %deps = map {$_ => 1} (@packdeps, @{$d->{'subpacks'} || []});
+ push @packdeps, grep {!$deps{$_} && !/^%/} @{$d->{'prereqs'}};
+ }
}
}
#---------------------------------------------------------------------
sub update_pkgdeps
{
+ my $rev_flag = shift;
%tmp_expansion_errors = ();
foreach my $name (keys %to_build) {
#skip package which has been processed
if(! (grep $_ eq $name, @skipped)) {
my $fn = $to_build{$name}->{filename};
debug("Checking dependencies for $name");
- my @bdeps = expand_deps($fn);
+ my @bdeps = expand_deps($fn, $rev_flag);
if (!shift @bdeps ) {
#first value means if package has
#expansion error and ignore it
foreach my $name (%tmp_expansion_errors) {
next if(! defined($to_build{$name}) );
my $fn = $to_build{$name}->{filename};
- my @bdeps = expand_deps($fn);
+ my @bdeps = expand_deps($fn, $reverse_off);
if (!shift @bdeps ) {
$new_expansion_errors{$name} = [@bdeps];
}
return @bins;
}
+sub update_pkgrdeps {
+ my @packs;
+ my %pdeps;
+ %pkgrdeps = ();
+
+ foreach my $p (keys %to_build) {
+ push @packs, $p;
+ $pdeps{$p} = \@{$pkgdeps{$p}};
+ }
+ @packs = BSSolv::depsort(\%pdeps, undef, undef, @packs);
+
+ my %notready;
+ foreach my $pkid (keys %to_build) {
+ %notready = ();
+ $notready{$pkid} = 1;
+ for my $p (@packs) {
+ my @blocked = grep {$notready{$_}} @{$pkgdeps{$p}};
+ if (@blocked) {
+ push @{$pkgrdeps{$pkid}}, $p;
+ $notready{$p} = 1;
+ }
+ }
+ my %uniq_deps = map {$_,1} @{$pkgrdeps{$pkid}};
+ $pkgrdeps{$pkid} = [keys(%uniq_deps)];
+ }
+}
+
sub generate_depends() {
($_, $start_time) = my_system("date +\"%Y-%m-%d %H:%M %z\"");
($_, $gbs_version) = my_system("gbs -V");
}
foreach my $p (@pre_packs) {
my $specs = $p->{"filename"};
+ my @spec_list = split(",", $specs);
+ foreach my $spec (@spec_list) {
my $new_p;
$new_p->{"project_base_path"} = $p->{"project_base_path"};
$new_p->{"packaging_dir"} = $p->{"packaging_dir"};
$new_p->{"upstream_branch"} = $p->{"upstream_branch"};
$new_p->{"upstream_tag"} = $p->{"upstream_tag"};
- my @spec_list = split(",", $specs);
- foreach my $spec (@spec_list) {
$new_p->{"filename"} = $spec;
push @packs, $new_p;
}
my %packs = parse_packs($config, @packs);
%to_build = %packs;
+ if (scalar (keys %to_build) == 0) {
+ warning("no available packages to generate depends.");
+ return;
+ }
+
# Create & Update package dependency
info("building repo metadata ...");
refresh_repo();
info("package dependency resolving ...");
- update_pkgdeps();
- update_pkgddeps();
-
- if (scalar (keys %to_build) == 0) {
- warning("no available packages to generate depends.");
- return;
- }
+ update_pkgdeps($reverse_on);
+ update_pkgrdeps();
my $out = "$depends_dir/$dist/$arch/";
mkdir_p($out);
}
info("package dependency resolving ...");
-update_pkgdeps();
+update_pkgdeps($reverse_off);
update_pkgddeps();
my @bins = get_binary_list();
resolve_skipped_packages();
}
$get_order = 0;
- update_pkgdeps();
+ update_pkgdeps($reverse_off);
update_pkgddeps();
}