my @running :shared = (); # threads shared, store all running workers
my @done :shared = (); # threads shared, store all packages already build done
my @skipped = (); # store packages skipped
+my %left_pkg= (); #store package caused circle
my @cleaned : shared = ();# affect on --clean-once specified, store cleaned threads
my %errors :shared; # threads shared, store packages build error
$visit{$pkg} = 0;
}
};
- for $pkg (keys %pkgddeps) {
+ for $pkg (keys %left_pkg) {
my @visit_stack;
&$reset_visit();
push (@visit_stack, $pkg);
# according to BFS to solve topological sorting issue
#---------------------------------------------------------------------
sub get_top_order {
+ my @all_queue=();
my @queue = ();
my @top_order = ();
my %ref_build_complete = ();
my $pkg_number = 0;
for my $pack (sort keys %pkgddeps) {
+ push @all_queue, $pack;
$pkg_number++;
$ref_build_complete{$pack} = 0;
my $pack_in_degree = 0;
}
}
}
- if($pkg_number == @top_order) {
+
+ #---------------------------------------------------------------------
+ # get packages that may cause circle
+ #---------------------------------------------------------------------
+ %left_pkg=();
+ @left_pkg{@all_queue}=();
+ delete @left_pkg{@top_order};
+
+ if(check_circle() == 0) {
info("there is no circle in $pkg_number packages");
return @top_order;
}