From d1d3d8488e4ab643aa3ea6d3dc7a32572faa45e5 Mon Sep 17 00:00:00 2001 From: "yan11.meng" Date: Fri, 10 Apr 2020 18:53:52 +0800 Subject: [PATCH] fix depanneur about check_circle Change-Id: I74bb0ed825573e2284e006e3967fa92855cd6432 Signed-off-by: yan11.meng --- depanneur | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/depanneur b/depanneur index 59768c7..b83b5f6 100755 --- a/depanneur +++ b/depanneur @@ -164,6 +164,7 @@ my %visit = (); # visit dict for resolving circles 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 @@ -1389,7 +1390,7 @@ sub check_circle { $visit{$pkg} = 0; } }; - for $pkg (keys %pkgddeps) { + for $pkg (keys %left_pkg) { my @visit_stack; &$reset_visit(); push (@visit_stack, $pkg); @@ -1406,11 +1407,13 @@ sub check_circle { # 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; @@ -1432,7 +1435,15 @@ sub get_top_order { } } } - 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; } -- 2.34.1