[66048] trunk/base/src/port/port.tcl

jmr at macports.org jmr at macports.org
Mon Apr 5 05:32:02 PDT 2010


Revision: 66048
          http://trac.macports.org/changeset/66048
Author:   jmr at macports.org
Date:     2010-04-05 05:32:02 -0700 (Mon, 05 Apr 2010)
Log Message:
-----------
add 'rdependents' action (#22346)

Modified Paths:
--------------
    trunk/base/src/port/port.tcl

Modified: trunk/base/src/port/port.tcl
===================================================================
--- trunk/base/src/port/port.tcl	2010-04-05 12:29:08 UTC (rev 66047)
+++ trunk/base/src/port/port.tcl	2010-04-05 12:32:02 UTC (rev 66048)
@@ -2397,18 +2397,72 @@
         
         set deplist [registry::list_dependents $portname $iversion $irevision $ivariants]
         if { [llength $deplist] > 0 } {
-            set dl [list]
-            # Check the deps first
-            foreach dep $deplist {
-                set depport [lindex $dep 2]
-                if {![macports::ui_isset ports_verbose]} {
-                    ui_msg "$depport depends on $portname"
-                } else {
-                    ui_msg "$depport depends on $portname (by [lindex $dep 1]:)"
+            if {$action == "rdependents"} {
+                set toplist $deplist
+                while 1 {
+                    set newlist {}
+                    foreach dep $deplist {
+                        set depname [lindex $dep 2]
+                        if {![info exists seen($depname)]} {
+                            set seen($depname) 1
+                            set rdeplist [registry::list_dependents $depname]
+                            foreach rdep $rdeplist {
+                                lappend newlist $rdep
+                            }
+                            set dependentsof($depname) $rdeplist
+                        }
+                    }
+                    if {[llength $newlist] > 0} {
+                        set deplist $newlist
+                    } else {
+                        break
+                    }
                 }
+                set portstack [list $toplist]
+                set pos_stack [list 0]
+                array unset seen
+                ui_msg "The following ports are dependent on ${portname}:"
+                while 1 {
+                    set cur_portlist [lindex $portstack end]
+                    set cur_pos [lindex $pos_stack end]
+                    if {$cur_pos >= [llength $cur_portlist]} {
+                        set portstack [lreplace $portstack end end]
+                        set pos_stack [lreplace $pos_stack end end]
+                        if {[llength $portstack] <= 0} {
+                            break
+                        } else {
+                            continue
+                        }
+                    }
+                    set cur_port [lindex $cur_portlist $cur_pos]
+                    set cur_portname [lindex $cur_port 2]
+                    set spaces [string repeat " " [expr {[llength $pos_stack] * 2}]]
+                    if {![info exists seen($cur_portname)]} {
+                        puts "${spaces}${cur_portname}"
+                        set seen($cur_portname) 1
+                        incr cur_pos
+                        set pos_stack [lreplace $pos_stack end end $cur_pos]
+                        if {[info exists dependentsof($cur_portname)]} {
+                            lappend portstack $dependentsof($cur_portname)
+                            lappend pos_stack 0
+                        }
+                        continue
+                    }
+                    incr cur_pos
+                    set pos_stack [lreplace $pos_stack end end $cur_pos]
+                }
+            } else {
+                foreach dep $deplist {
+                    set depport [lindex $dep 2]
+                    if {![macports::ui_isset ports_verbose]} {
+                        ui_msg "$depport depends on $portname"
+                    } else {
+                        ui_msg "$depport depends on $portname (by [lindex $dep 1]:)"
+                    }
+                }
             }
         } else {
-            ui_msg "$portname has no dependents!"
+            ui_msg "$portname has no dependents."
         }
     }
     return $status
@@ -3377,6 +3431,7 @@
     outdated    [list action_outdated       [ACTION_ARGS_PORTS]] \
     contents    [list action_contents       [ACTION_ARGS_PORTS]] \
     dependents  [list action_dependents     [ACTION_ARGS_PORTS]] \
+    rdependents [list action_dependents     [ACTION_ARGS_PORTS]] \
     deps        [list action_info           [ACTION_ARGS_PORTS]] \
     variants    [list action_variants       [ACTION_ARGS_PORTS]] \
     \
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20100405/142c34c0/attachment.html>


More information about the macports-changes mailing list