[82947] trunk/base/src/port/port.tcl
jmr at macports.org
jmr at macports.org
Mon Aug 22 07:16:27 PDT 2011
Revision: 82947
http://trac.macports.org/changeset/82947
Author: jmr at macports.org
Date: 2011-08-22 07:16:25 -0700 (Mon, 22 Aug 2011)
Log Message:
-----------
uninstall and deactivate dependents before their dependencies (#8431)
Modified Paths:
--------------
trunk/base/src/port/port.tcl
Modified: trunk/base/src/port/port.tcl
===================================================================
--- trunk/base/src/port/port.tcl 2011-08-22 14:11:48 UTC (rev 82946)
+++ trunk/base/src/port/port.tcl 2011-08-22 14:16:25 UTC (rev 82947)
@@ -513,6 +513,43 @@
return [lsort -command portlist_compareint $list]
}
+# sort portlist so dependents come before their dependencies
+proc portlist_sortdependents { portlist } {
+ foreach p $portlist {
+ array set pvals $p
+ lappend entries($pvals(name)) $p
+ if {![info exists dependents($pvals(name))]} {
+ set dependents($pvals(name)) {}
+ foreach result [registry::list_dependents $pvals(name)] {
+ lappend dependents($pvals(name)) [lindex $result 2]
+ }
+ }
+ array unset pvals
+ }
+ set ret {}
+ foreach p $portlist {
+ portlist_sortdependents_helper $p entries dependents seen ret
+ }
+ return $ret
+}
+
+proc portlist_sortdependents_helper {p up_entries up_dependents up_seen up_retlist} {
+ upvar $up_seen seen
+ if {![info exists seen($p)]} {
+ set seen($p) 1
+ upvar $up_entries entries $up_dependents dependents $up_retlist retlist
+ array set pvals $p
+ foreach dependent $dependents($pvals(name)) {
+ if {[info exists entries($dependent)]} {
+ foreach entry $entries($dependent) {
+ portlist_sortdependents_helper $entry entries dependents seen retlist
+ }
+ }
+ }
+ lappend retlist $p
+ }
+}
+
proc regex_pat_sanitize { s } {
set sanitized [regsub -all {[\\(){}+$.^]} $s {\\&}]
return $sanitized
@@ -2336,6 +2373,7 @@
if {[require_portlist portlist] || [prefix_unwritable]} {
return 1
}
+ set portlist [portlist_sortdependents $portlist]
foreachport $portlist {
set composite_version [composite_version $portversion [array get variations]]
if {![info exists options(ports_deactivate_no-exec)]
@@ -2899,6 +2937,8 @@
return 1
}
+ set portlist [portlist_sortdependents $portlist]
+
foreachport $portlist {
if {![registry::entry_exists_for_name $portname]} {
ui_info "$portname is already uninstalled"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-changes/attachments/20110822/2ec555f6/attachment.html>
More information about the macports-changes
mailing list