$NetBSD$

--- ../FreeBSD/lib/Tinderbox/TinderboxDS.pm	2011-10-16 00:52:55.000000000 +0000
+++ lib/Tinderbox/TinderboxDS.pm
@@ -753,6 +753,96 @@ sub clearDependenciesForPort {
         return $rc;
 }
 
+sub getDependencyCascades_search {
+        my $self      = shift;
+        my $build_id  = shift;
+        my $port_id   = shift;
+        my $typelimit = shift;
+
+        my @results = ();
+        my @params = ($build_id, $port_id);
+        my $query = "SELECT build_port_id " . 
+                    "FROM build_ports " .
+                    "WHERE build_id=? AND port_id=?";
+        my $rc = $self->_doQueryHashRef($query, \@results, @params);
+        if (!$rc) {
+                return undef;
+        }
+        my $build_port_id = $results[0]->{'build_port_id'};
+
+        @results = ();
+        @params = ($build_port_id);
+        $query = "SELECT port_id " . 
+                 "FROM port_dependencies " .
+                 "WHERE build_port_id=? "; 
+
+        if ($typelimit) {
+                $query .= "AND dependency_type IN " . 
+                          "('DEPENDS','RUN_DEPENDS','LIB_DEPENDS')";
+        }
+
+        $rc = $self->_doQueryHashRef($query, \@results, @params);
+        if (!$rc) {
+                return undef;
+        }
+
+        my @deps = ();
+        foreach my $result (@results) {
+                push @deps, $result->{'port_id'};
+        }
+        return @deps;
+}
+
+sub getDependencyCascades {
+        my $self    = shift;
+        my $port    = shift;
+        my $build   = shift;
+
+        $self->verifyType(1, $port,  'Port');
+        $self->verifyType(2, $build, 'Build');
+
+        my $pkg;
+        my @CascadeSet = ();
+        my %CheckList = ($port->getId(), 1);
+        my @FirstList = $self->getDependencyCascades_search (
+                               $build->getId(), $port->getId(), 0);
+        foreach $pkg(@FirstList) {
+                $CheckList{$pkg} = 0;
+        }
+        my $cascadePkg;
+        my @NextList;
+        my @mandate = @FirstList;
+        my $advance = (scalar keys %CheckList > 0);
+        while ($advance) {
+                foreach $pkg (@mandate) {
+                        $CheckList{$pkg} = 1;
+                        @NextList = $self->getDependencyCascades_search (
+                                           $build->getId(), $pkg, 1);
+                        foreach $cascadePkg (@NextList) {
+                                if (!exists $CheckList{$cascadePkg}) {
+                                        $CheckList{$cascadePkg} = 0;
+                                        push @CascadeSet, $cascadePkg;
+                                }
+                        }
+                }
+                @mandate = ();
+                $advance = 0;
+                foreach $pkg (keys %CheckList) {
+                        if ($CheckList{$pkg} == 0) {
+                                push @mandate, $pkg;
+                                $advance = 1;
+                        }
+                }
+        }
+
+        my @deps = ();
+        foreach $pkg (@CascadeSet) {
+                my $pCls = $self->getPortById($pkg);
+                push @deps, $pCls if (defined($pCls));
+        }
+        return @deps;
+}
+
 sub getDependenciesForPort {
         my $self    = shift;
         my $port    = shift;
