my $reverse_on = 1; #enable reverse dependency
my $export_only = 0; # only export, not building
my $tarfile = 0; # generate tar file for dependence & reverse dependence xml file
-my $preordered_list = "";
-my $profiling_reference = "";
+my $preordered_list = ""; # List of ordered packages to support user defined build order calculation
+my $profiling = ""; # Reference profiling report location. If set reports will be generated
GetOptions (
"repository=s" => \@repos,
"export-only" => \$export_only,
"tarfile" => \$tarfile,
"preordered-list=s" => \$preordered_list,
- "profiling-reference=s" => \$profiling_reference,
+ "profiling=s" => \$profiling,
);
if ( $help ) {
sub update_pkgdeps
{
my $rev_flag = shift;
+ my $force_flag = shift;
%tmp_expansion_errors = ();
foreach my $name (keys %to_build) {
#skip package which has been processed
- if( (grep $_ eq $name, @done) ||
+ if( $force_flag == 0 && ((grep $_ eq $name, @done) ||
(grep $_ eq $name, @skipped) ||
- (grep $_ eq $name, @running)) {
+ (grep $_ eq $name, @running))) {
next;
}
if(! (grep $_ eq $name, @skipped)) {
info("build logs can be found in:\n $localrepo/$dist/$arch/logs");
info("build roots located in:\n $scratch_dir.*");
if (%errors || %expansion_errors || @export_errors || ($succeeded_packages == 0 && @skipped == 0)) {
- return 1;
+ exit 1;
}
- return 0;
+
}
#---------------------------------------------------------------------
}
sub generate_depends_xmlfile() {
- #if there is no dependence relation, skip!
info("start generate packages depends from: " . $package_path . " ($style)");
my_system("rm -rf $depends_dir");
+ update_pkgdeps($reverse_on, 1);
+ update_pkgrdeps();
+
+ #if there is no dependence relation, skip!
if (0 == scalar (keys %pkgdeps))
{
return;
}
+sub generate_depends() {
+ ($_, $start_time) = my_system("date +\"%Y-%m-%d %H:%M %z\"");
+ ($_, $gbs_version) = my_system("gbs -V");
+ $gbs_version =~ s!gbs !!;
+
+ if ($style eq 'git') {
+ File::Find::find({wanted => \&git_wanted}, $package_path );
+ if (@pre_packs > 1 && $commit ne "HEAD"){
+ error("--commit option can't be specified with multiple packages");
+ }
+ if (@pre_packs == 0) {
+ error("No source package found at $package_path");
+ }
+ 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"};
+ $new_p->{"filename"} = $spec;
+ push @packs, $new_p;
+ }
+ }
+ } elsif ($style eq 'tar') {
+ File::Find::find({wanted => \&dir_wanted}, $package_path );
+ if (@packs == 0) {
+ error("No source package found at $package_path");
+ }
+ } else {
+ @packs = @ARGV;
+ if (@packs == 0) {
+ File::Find::find({wanted => \&obs_wanted}, $package_path );
+ }
+ }
+
+ info("retrieving repo metadata...");
+ my $repos_setup = 1;
+ my_system("> '$order_dir'/.repo.cache.local");
+ if (-d "$rpm_repo_path") {
+ my_system("$build_dir/createdirdeps '$rpm_repo_path' >> '$order_dir'/.repo.cache.local");
+ my_system("echo D: >> '$order_dir'/.repo.cache.local");
+ }
+ my_system("> '$order_dir'/.repo.cache.remote");
+ foreach my $repo (@package_repos) {
+ my $cmd = "";
+ if ($repo =~ /^\// && ! -e "$repo/repodata/repomd.xml") {
+ $cmd = "$build_dir/createdirdeps '$repo' >> '$order_dir'/.repo.cache.remote ";
+ } else {
+ $cmd = "$build_dir/createrepomddeps --cachedir='$cache_dir' '$repo' >> '$order_dir'/.repo.cache.remote ";
+ }
+ debug($cmd);
+ if ( my_system($cmd) == 0 ) {
+ my_system("echo D: >> '$order_dir'/.repo.cache.remote");
+ } else {
+ $repos_setup = 0;
+ }
+ }
+ # Merge local repo cache and remote repo cache
+ my_system("cat '$order_dir'/.repo.cache.local '$order_dir'/.repo.cache.remote >'$order_dir'/.repo.cache");
+
+ if ($repos_setup == 0 ) {
+ error("repo cache creation failed...");
+ }
+
+ info("parsing package data...");
+ my %packs = parse_packs($config, @packs);
+
+ if ($depends_local_only) {
+ my @local_packs = get_pack_list_from_local_repo();
+ foreach my $p (sort keys %packs) {
+ if (grep $_ eq $p, @local_packs) {
+ $to_build{$p} = $packs{$p};
+ }
+ }
+ } else {
+ %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();
+
+ generate_depends_xmlfile();
+
+}
+
#use pre-export source to analyse
sub fill_packs_from_dir {
my $name = shift;
sub prepare_preorder_list {
- my_system("rm -rf bsr_profiling_report");
- my_system("rm -rf $localrepo/$dist/$arch/bsr_profiling_report");
-
- if ($dryrun) {
- return;
- }
-
my @preview_orders = ();
+ my_system("rm -rf bsr_profiling_report");
+
if ($preordered_list ne "") {
@preview_orders = split /[:,\s\/]+/, $preordered_list;
+ info("Preordered list given");
}
my $preview_command = "";
-
- if ($profiling_reference ne "") {
- $preview_command = "bsr reorder -j $profiling_reference ";
- } elsif (@preview_orders <= 0) {
- generate_depends_xmlfile();
- my $dep_xml_file = "$depends_dir/$dist/$arch/$dist\_$arch\_pkgdepends.xml";
- if (-e $dep_xml_file) {
- $preview_command = "bsr preview -a $arch --depsnumbersort ";
- $preview_command = $preview_command . " -x \"$dep_xml_file\" ";
- my $candidate_ref = "";
- foreach my $r (@package_repos) {
- if (index($r, "base") != -1 || (index($r, "/debug") != -1)) {
- next;
- }
- $candidate_ref = $r;
- }
- if ($candidate_ref ne "") {
- $preview_command = $preview_command . " -r \"$candidate_ref\" --criticalsort ";
- }
- }
- } else {
- $preview_command = "bsr reorder -j non/exists/path ";
- }
-
- if ($preview_command ne "") {
+ if ($profiling ne "") {
+ $preview_command = "bsr reorder -j $profiling --verbose ";
+ info($preview_command);
my_system($preview_command);
my $preview_config = "";
&& $preview_config->{preview}
&& $preview_config->{preview}->{packages}
&& @{$preview_config->{preview}->{packages}} > 0) {
+
+ info("We have preview orders... " . @{$preview_config->{preview}->{packages}});
+
foreach my $p (@{$preview_config->{preview}->{packages}}) {
if ( !(grep $_ eq $p, @preview_orders) ) {
push @preview_orders, $p;
}
} else {
$preview_config = "";
+ info("No .bsr.preview.yaml file found");
}
}
if (@preview_orders) {
$preordered_list = join ",", @preview_orders;
}
-
- my_system("rm -rf $depends_dir");
}
sub profiling_report {
- # Create depends xml file to use in reporting
- generate_depends_xmlfile();
- # Call BSR
+ if ($profiling eq "") {
+ return;
+ }
+
+ generate_depends_xmlfile();
my $report_command = "bsr report -a $arch --verbose --depsnumbersort ";
- if ($profiling_reference ne "") {
- $report_command = $report_command . " -j $profiling_reference ";
- }
my $dep_xml_file = "$depends_dir/$dist/$arch/$dist\_$arch\_pkgdepends.xml";
if (-e $dep_xml_file) {
$report_command = $report_command . " -x \"$dep_xml_file\" ";
}
- $report_command = $report_command . " -k \"$localrepo/$dist/$arch/logs/\" ";
-
- # Get candidate repos
- my $candidate_ref = "";
- foreach my $r (@package_repos) {
- if (index($r, "base") != -1 || (index($r, "/debug") != -1)) {
- next;
- }
- $candidate_ref = $r;
- }
- if ($candidate_ref ne "") {
- $report_command = $report_command . " -r \"$candidate_ref\" --criticalsort ";
- }
+ $report_command = $report_command . " -k \"$success_logs_path\" ";
- info("");
info($report_command);
- info("");
-
my_system($report_command);
my_system("mv bsr_profiling_report $localrepo/$dist/$arch/");
}
# MAIN
+if ($depends) {
+ info("start generate packages depends from: " . $package_path . " ($style)");
+ generate_depends();
+ exit 0;
+}
info("start building packages from: " . $package_path . " ($style)");
($_, $start_time) = my_system("date +\"%Y-%m-%d %H:%M %z\"");
}
info("package dependency resolving ...");
-update_pkgdeps($reverse_on);
-update_pkgrdeps();
-
-if ($depends) {
- generate_depends_xmlfile();
- exit 0;
-}
+update_pkgdeps($reverse_on, 0);
+update_pkgddeps();
prepare_preorder_list();
-update_pkgddeps();
-
my @bins = get_binary_list();
if (@bins) {
my @tobuild = ();
resolve_skipped_packages();
}
$get_order = 0;
- update_pkgdeps($reverse_on);
+ update_pkgdeps($reverse_on, 0);
update_pkgddeps();
}
last;
}
update_repo();
- profiling_report();
build_report();
exit $ret;
}
}
}
-
# Main process loop
# Every loop, first update package information
# include dependencies if there is new package
sleep(1);
}
update_repo();
+build_report();
profiling_report();
-exit build_report();
+exit 0