<pre style='margin:0'>
Joshua Root (jmroot) pushed a commit to branch master
in repository mpbb.

</pre>
<p><a href="https://github.com/macports/mpbb/commit/1e97a14531fc27423c51114270b3a735c9465798">https://github.com/macports/mpbb/commit/1e97a14531fc27423c51114270b3a735c9465798</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new 1e97a14  global cleanup
</span>1e97a14 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 1e97a14531fc27423c51114270b3a735c9465798
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Sun Mar 10 14:44:47 2024 +1100

<span style='display:block; white-space:pre;color:#404040;'>    global cleanup
</span>---
 tools/dependencies.tcl             | 118 ++++++++++++++++++++-----------------
 tools/failcache.tcl                |  24 ++++----
 tools/mirror-multi.tcl             |  52 +++++++++-------
 tools/sort-with-subports.tcl       |  51 ++++++++--------
 tools/uninstall-unneeded-ports.tcl |   2 +-
 5 files changed, 136 insertions(+), 111 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/tools/dependencies.tcl b/tools/dependencies.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index f1f3016..eabd751 100755
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/tools/dependencies.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/tools/dependencies.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -40,22 +40,22 @@ source [file join [file dirname [info script]] failcache.tcl]
</span> 
 set failcache_dir ""
 set logs_dir ""
<span style='display:block; white-space:pre;background:#ffe0e0;'>-while {[string range [lindex $::argv 0] 0 1] eq "--"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    switch -- [lindex $::argv 0] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+while {[string range [lindex $argv 0] 0 1] eq "--"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    switch -- [lindex $argv 0] {
</span>         --failcache_dir {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set failcache_dir [lindex $::argv 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set ::argv [lreplace $::argv 0 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set failcache_dir [lindex $argv 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set argv [lreplace $argv 0 0]
</span>         }
         --logs_dir {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set logs_dir [lindex $::argv 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set ::argv [lreplace $::argv 0 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set logs_dir [lindex $argv 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set argv [lreplace $argv 0 0]
</span>         }
         default {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui_error "unknown option: [lindex $::argv 0]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_error "unknown option: [lindex $argv 0]"
</span>             exit 2
         }
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set ::argv [lreplace $::argv 0 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set argv [lreplace $argv 0 0]
</span> }
 
 if {$logs_dir ne ""} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -66,7 +66,7 @@ if {$logs_dir ne ""} {
</span>     set log_subports_progress $log_status_dependencies
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-if {[llength $::argv] == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {[llength $argv] == 0} {
</span>     puts stderr "Usage: $argv0 <portname> \[(+|-)variant...\]"
     exit 2
 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -80,7 +80,7 @@ if {[catch {mportinit "" my_global_options ""} result]} {
</span> }
 
 # look up the path of the Portfile for the given port
<span style='display:block; white-space:pre;background:#ffe0e0;'>-set portname [lindex $::argv 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set portname [lindex $argv 0]
</span> #try -pass_signal {...}
 try {
     set result [mportlookup $portname]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -95,7 +95,7 @@ try {
</span> 
 # parse the given variants from the command line
 set variants [dict create]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-foreach item [lrange $::argv 1 end] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+foreach item [lrange $argv 1 end] {
</span>     foreach {_ sign variant} [regexp -all -inline -- {([-+])([[:alpha:]_]+[\w\.]*)} $item] {
         dict set variants $variant $sign
     }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -115,7 +115,7 @@ set portinfo [dict merge $portinfo [mportinfo $mport]]
</span> # Also checking for matching archive, in case supported_archs changed
 if {[registry::entry imaged $portname [dict get $portinfo version] [dict get $portinfo revision] [dict get $portinfo canonical_active_variants]] ne ""
         && [[ditem_key $mport workername] eval [list _archive_available]]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    puts "$::argv already installed, not installing or activating dependencies"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts "$argv already installed, not installing or activating dependencies"
</span>     exit 0
 }
 # Ensure build-time deps are always included for the top-level port,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -126,14 +126,11 @@ if {[registry::entry imaged $portname [dict get $portinfo version] [dict get $po
</span> # buildbot will exclude ports that have an archive deployed.
 [ditem_key $mport workername] eval [list set portutil::archive_available_result 0]
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-set toplevel_depstypes [list depends_fetch depends_extract depends_patch depends_build depends_lib depends_run]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-set recursive_depstypes [list depends_lib depends_run]
</span> foreach p [split $env(PATH) :] {
     if {![string match ${macports::prefix}* $p]} {
         lappend bin_search_path $p
     }
 }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-set lib_search_path [list /Library/Frameworks /System/Library/Frameworks /lib /usr/lib]
</span> 
 # check if depspec is fulfilled by a port, and if so, append its
 # name to the variable named by retvar
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -144,12 +141,13 @@ proc check_dep_needs_port {depspec retvar} {
</span>     set depregex [lindex $splitlist 1]
     switch [lindex $splitlist 0] {
         bin {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            global bin_search_path
</span>             set depregex \^$depregex\$
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set search_path $::bin_search_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set search_path $bin_search_path
</span>             set executable 1
         }
         lib {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set search_path $::lib_search_path
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set search_path {/Library/Frameworks /System/Library/Frameworks /lib /usr/lib}
</span>             set i [string first . $depregex]
             if {$i < 0} {set i [string length $depregex]}
             set depname [string range $depregex 0 ${i}-1]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -184,7 +182,8 @@ proc check_dep_needs_port {depspec retvar} {
</span> # Get the ports needed by a given port.
 proc collect_deps {portinfo retvar} {
     upvar $retvar ret
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach deptype $::recursive_depstypes {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Recursive deps are not being built, so only their runtime deps are needed.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach deptype {depends_lib depends_run} {
</span>         if {[dict exists $portinfo $deptype]} {
             foreach depspec [dict get $portinfo $deptype] {
                 check_dep_needs_port $depspec ret
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -237,8 +236,9 @@ proc open_port {portname} {
</span>     }
 
     set portinfo [dict merge $portinfo [mportinfo $mport]]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![dict exists $::mportinfo_array $mport]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        dict set ::mportinfo_array $mport $portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global mportinfo_array
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![dict exists $mportinfo_array $mport]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict set mportinfo_array $mport $portinfo
</span>     }
     return [list $mport $portinfo]
 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -262,12 +262,14 @@ proc deactivate_with_dependents {e} {
</span> }
 
 proc deactivate_unneeded {portinfo} {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    global mportinfo_array
</span>     # Unfortunately mportdepends doesn't have quite the right semantics
     # to be useful here. It's concerned with what is needed and not
     # present, whereas here we're concerned with removing what we can do
     # without. Future API opportunity?
     set deplist [list]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach deptype $::toplevel_depstypes {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # The top level port is being built, so all build time and run time deps are needed.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach deptype {depends_fetch depends_extract depends_patch depends_build depends_lib depends_run} {
</span>         if {[dict exists $portinfo $deptype]} {
             foreach depspec [dict get $portinfo $deptype] {
                 check_dep_needs_port $depspec deplist
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -304,7 +306,7 @@ proc deactivate_unneeded {portinfo} {
</span>         if {![dict exists $needed_array [$e name]]} {
             deactivate_with_dependents $e
         } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set entryinfo [dict get $::mportinfo_array [dict get $mports_array [$e name]]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set entryinfo [dict get $mportinfo_array [dict get $mports_array [$e name]]]
</span>             if {[dict get $entryinfo version] ne [$e version]
                     || [dict get $entryinfo revision] != [$e revision]
                     || [dict get $entryinfo canonical_active_variants] ne [$e variants]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -355,8 +357,9 @@ if {[catch {mportdepends $mport "activate" 1 1 0 dlist} result]} {
</span> 
 
 proc append_it {ditem} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    lappend ::dlist_sorted $ditem
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    dict set ::mportinfo_array $ditem [mportinfo $ditem]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global dlist_sorted mportinfo_array
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    lappend dlist_sorted $ditem
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    dict set mportinfo_array $ditem [mportinfo $ditem]
</span>     return 0
 }
 try {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -387,7 +390,8 @@ puts $log_status_dependencies ""
</span> 
 ## ensure dependencies are installed and active
 proc checkdep_failcache {ditem} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set depinfo [dict get $::mportinfo_array $ditem]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global mportinfo_array
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set depinfo [dict get $mportinfo_array $ditem]
</span> 
     if {[check_failcache [dict get $depinfo name] [ditem_key $ditem porturl] [dict get $depinfo canonical_active_variants]]} {
         tee "Dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' has previously failed and is required." $::log_status_dependencies stderr
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -414,7 +418,8 @@ if {$failcache_dir ne ""} {
</span> # clean up any work directories left over from earlier
 # (avoids possible errors with different variants in the statefile)
 proc clean_workdirs {} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set build_dir [file join $macports::portdbpath build]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global macports::portdbpath
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set build_dir [file join $portdbpath build]
</span>     foreach dir [glob -nocomplain -directory $build_dir *] {
         file delete -force -- $dir
     }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -422,14 +427,16 @@ proc clean_workdirs {} {
</span> 
 # Returns 0 if dep is installed, 1 if not
 proc install_dep_archive {ditem} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set depinfo [dict get $::mportinfo_array $ditem]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    incr ::dependencies_counter
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set msg "Installing dependency ($::dependencies_counter of $::dependencies_count) '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]'"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    puts -nonewline $::log_status_dependencies "$msg ... "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global mportinfo_array dependencies_counter dependencies_count \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           log_status_dependencies
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set depinfo [dict get $mportinfo_array $ditem]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    incr dependencies_counter
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set msg "Installing dependency ($dependencies_counter of $dependencies_count) '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]'"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts -nonewline $log_status_dependencies "$msg ... "
</span>     puts "----> ${msg}"
     if {[registry::entry imaged [dict get $depinfo name] [dict get $depinfo version] [dict get $depinfo revision] [dict get $depinfo canonical_active_variants]] ne ""} {
         puts "Already installed, nothing to do"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        puts $::log_status_dependencies {[OK]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $log_status_dependencies {[OK]}
</span>         return 0
     }
     clean_workdirs
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -447,13 +454,13 @@ proc install_dep_archive {ditem} {
</span>         # it's quick and easy to check and may save a build.
         if {[dict exists $depinfo known_fail] && [string is true -strict [dict get $depinfo known_fail]]} {
             puts stderr "Dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' is known to fail, aborting."
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            puts $::log_status_dependencies {[FAIL] (known_fail)}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts $log_status_dependencies {[FAIL] (known_fail)}
</span>             puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (dependency '[dict get $depinfo name]' known to fail) maintainers: [get_maintainers $::portname [dict get $depinfo name]]."
             exit 1
         }
         # This dep will have to be built, not just installed
         puts stderr "Fetching archive for dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' failed."
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        puts $::log_status_dependencies {[MISSING]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $log_status_dependencies {[MISSING]}
</span>         return 1
     }
     # Now install it
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -464,29 +471,32 @@ proc install_dep_archive {ditem} {
</span>     }
     if {$fail || $result > 0} {
         puts stderr "Installing from archive for dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' failed, aborting."
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        puts $::log_status_dependencies {[FAIL]}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (failed to install dependency '$depinfo(name)')."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $log_status_dependencies {[FAIL]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (failed to install dependency '[dict get $depinfo name]')."
</span>         exit 1
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    puts $::log_status_dependencies {[OK]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts $log_status_dependencies {[OK]}
</span>     return 0
 }
 
 # mportexec uses this global variable, so we have to clean up between
 # doing operations (that require deps) on different ports.
 proc close_open_mports {} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach mport $macports::open_mports {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global macports::open_mports
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach mport $open_mports {
</span>         catch {ditem_key $mport refcnt 1}
         catch {mportclose $mport}
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set macports::open_mports [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set open_mports [list]
</span> }
 
 proc install_dep_source {depinfo} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    incr ::build_counter
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set msg "Building dependency ($::build_counter of $::build_count) '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]'"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    puts -nonewline $::log_status_dependencies "$msg ... "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global build_counter build_count log_status_dependencies \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           mportinfo_array failcache_dir
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    incr build_counter
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set msg "Building dependency ($build_counter of $build_count) '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]'"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts -nonewline $log_status_dependencies "$msg ... "
</span>     puts "----> ${msg}"
 
     # Be quiet during the prep operations
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -494,7 +504,7 @@ proc install_dep_source {depinfo} {
</span>     set macports::channels(info) {}
     close_open_mports
     clean_workdirs
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set ::mportinfo_array [dict create]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set mportinfo_array [dict create]
</span>     set ditem [lindex [open_port [dict get $depinfo name]] 0]
     # Ensure archivefetch is not attempted at all
     set workername [ditem_key $ditem workername]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -521,7 +531,7 @@ proc install_dep_source {depinfo} {
</span>     }
     if {$fail || $result > 0} {
         puts stderr "Fetch of dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' failed, aborting."
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        puts $::log_status_dependencies {[FAIL] (fetch)}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $log_status_dependencies {[FAIL] (fetch)}
</span>         puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (failed to fetch dependency '[dict get $depinfo name]') maintainers: [get_maintainers $::portname [dict get $depinfo name]]."
         exit 1
     }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -532,7 +542,7 @@ proc install_dep_source {depinfo} {
</span>     }
     if {$fail || $result > 0} {
         puts stderr "Checksum of dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' failed, aborting."
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        puts $::log_status_dependencies {[FAIL] (checksum)}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $log_status_dependencies {[FAIL] (checksum)}
</span>         puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (failed to checksum dependency '[dict get $depinfo name]') maintainers: [get_maintainers $::portname [dict get $depinfo name]]."
         exit 1
     }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -545,24 +555,24 @@ proc install_dep_source {depinfo} {
</span>     }
     if {$fail || $result > 0} {
         puts stderr "Build of dependency '[dict get $depinfo name]' with variants '[dict get $depinfo canonical_active_variants]' failed, aborting."
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        puts $::log_status_dependencies {[FAIL]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        puts $log_status_dependencies {[FAIL]}
</span>         puts $::log_subports_progress "Building '$::portname' ... \[FAIL\] (failed to install dependency '[dict get $depinfo name]') maintainers: [get_maintainers $::portname [dict get $depinfo name]]."
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {$::failcache_dir ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$failcache_dir ne ""} {
</span>             failcache_update [dict get $depinfo name] [ditem_key $ditem porturl] [dict get $depinfo canonical_active_variants] 1
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui_debug "Open mports:"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        foreach mport $macports::open_mports {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui_debug [ditem_key $ditem]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #ui_debug "Open mports:"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #foreach mport $macports::open_mports {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #    ui_debug [ditem_key $ditem]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #}
</span>         exit 1
     }
 
     # Success. Clear any failcache entry.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {$::failcache_dir ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$failcache_dir ne ""} {
</span>         failcache_update [dict get $depinfo name] [ditem_key $ditem porturl] [dict get $depinfo canonical_active_variants] 0
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    puts $::log_status_dependencies {[OK]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    puts $log_status_dependencies {[OK]}
</span> }
 
 # Show all output for anything that gets installed
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -573,7 +583,7 @@ set missing_deps [list]
</span> try {
     foreach ditem $dlist_sorted {
         if {[install_dep_archive $ditem]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            lappend missing_deps [dict get $::mportinfo_array $ditem]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lappend missing_deps [dict get $mportinfo_array $ditem]
</span>         }
     }
 } on error {eMessage} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -605,7 +615,7 @@ if {$build_count > 0} {
</span>     set macports::channels(debug) {}
     set macports::channels(info) {}
     close_open_mports
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set ::mportinfo_array [dict create]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set mportinfo_array [dict create]
</span>     try {
         set mport [mportopen [dict get $portinfo porturl] [dict create subport $portname] $variants]
     } on error {eMessage} {
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/tools/failcache.tcl b/tools/failcache.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 3585cb5..7d91387 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/tools/failcache.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/tools/failcache.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -25,13 +25,14 @@ proc port_files_checksum {porturl} {
</span> }
 
 proc check_failcache {portname porturl canonical_variants {return_contents no}} {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    global failcache_dir
</span>     set hash [port_files_checksum $porturl]
     set key "$portname $canonical_variants $hash"
     set ret 0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach f [glob -directory $::failcache_dir -nocomplain -tails "${portname} *"] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach f [glob -directory $failcache_dir -nocomplain -tails "${portname} *"] {
</span>         if {$f eq $key} {
             if {$return_contents} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                set fd [open [file join $::failcache_dir $f] r]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set fd [open [file join $failcache_dir $f] r]
</span>                 set line [gets $fd]
                 close $fd
                 return $line
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -39,22 +40,24 @@ proc check_failcache {portname porturl canonical_variants {return_contents no}}
</span>             set ret 1
         } elseif {[lindex [split $f " "] end] ne $hash} {
             puts stderr "removing stale failcache entry: $f"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            file delete -force [file join $::failcache_dir $f]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            file delete -force [file join $failcache_dir $f]
</span>         }
     }
     return $ret
 }
 
 proc failcache_update {portname porturl canonical_variants failed} {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    global failcache_dir
</span>     set hash [port_files_checksum $porturl]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set entry_path [file join $::failcache_dir "$portname $canonical_variants $hash"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set entry_path [file join $failcache_dir "$portname $canonical_variants $hash"]
</span>     if {$failed} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        file mkdir $::failcache_dir
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        global env failcache_buildurl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        file mkdir $failcache_dir
</span>         set fd [open $entry_path w]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[info exists ::env(BUILDBOT_BUILDURL)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            puts $fd $::env(BUILDBOT_BUILDURL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        } elseif {[info exists ::failcache_buildurl]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            puts $fd $::failcache_buildurl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[info exists env(BUILDBOT_BUILDURL)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts $fd $env(BUILDBOT_BUILDURL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } elseif {[info exists failcache_buildurl]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts $fd $failcache_buildurl
</span>         } else {
             puts $fd "unknown"
         }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -66,7 +69,8 @@ proc failcache_update {portname porturl canonical_variants failed} {
</span> 
 # clear all entries for portname
 proc failcache_clear_all {portname} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach f [glob -directory $::failcache_dir -nocomplain "${portname} *"] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global failcache_dir
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach f [glob -directory $failcache_dir -nocomplain "${portname} *"] {
</span>         puts stderr "clearing failcache entry: [file tail $f]"
         file delete -force $f
     }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/tools/mirror-multi.tcl b/tools/mirror-multi.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index b9a9c90..aa31bd6 100755
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/tools/mirror-multi.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/tools/mirror-multi.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -63,10 +63,12 @@ set mirror_done [dict create]
</span> set distfiles_results [dict create]
 
 proc check_mirror_done {portname} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[dict exists $::mirror_done $portname]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return [dict get $::mirror_done $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global mirror_done
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $mirror_done $portname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return [dict get $mirror_done $portname]
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set cache_entry [file join $::mirrorcache_dir [string toupper [string index $portname 0]] $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global mirrorcache_dir
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set cache_entry [file join $mirrorcache_dir [string toupper [string index $portname 0]] $portname]
</span>     if {[file isfile $cache_entry]} {
         set result [mportlookup $portname]
         if {[llength $result] < 2} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -82,31 +84,33 @@ proc check_mirror_done {portname} {
</span>             close $fd
             if {$portfile_hash eq $entry_hash} {
                 if {$partial eq ""} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    dict set ::mirror_done $portname 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    dict set mirror_done $portname 1
</span>                     return 1
                 } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    dict set ::mirror_done $portname $partial
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    dict set mirror_done $portname $partial
</span>                     return $partial
                 }
             } else {
                 file delete -force $cache_entry
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                dict set ::mirror_done $portname 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set mirror_done $portname 0
</span>             }
         }
     } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        dict set ::mirror_done $portname 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict set mirror_done $portname 0
</span>     }
     return 0
 }
 
 proc set_mirror_done {portname value} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![dict exists $::mirror_done $portname] || [dict get $::mirror_done $portname] != 1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global mirror_done
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![dict exists $mirror_done $portname] || [dict get $mirror_done $portname] != 1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        global mirrorcache_dir
</span>         set result [mportlookup $portname]
         set portinfo [lindex $result 1]
         set portfile [file join [macports::getportdir [dict get $portinfo porturl]] Portfile]
         set portfile_hash [sha256 file $portfile]
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set cache_dir [file join $::mirrorcache_dir [string toupper [string index $portname 0]]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set cache_dir [file join $mirrorcache_dir [string toupper [string index $portname 0]]]
</span>         file mkdir $cache_dir
         set cache_entry [file join $cache_dir $portname]
         set fd [open $cache_entry w]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -115,13 +119,14 @@ proc set_mirror_done {portname value} {
</span>             puts $fd $value
         }
         close $fd
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        dict set ::mirror_done $portname 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict set mirror_done $portname 1
</span>     }
 }
 
 proc get_dep_list {portinfo} {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    global deptypes
</span>     set deps [list]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach deptype $::deptypes {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach deptype $deptypes {
</span>         if {[dict exists $portinfo $deptype]} {
             foreach dep [dict get $portinfo $deptype] {
                 lappend deps [lindex [split $dep :] end]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -151,10 +156,11 @@ proc save_distfiles_results {mport succeeded} {
</span>         # no distfiles, no problem
         return
     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    global distfiles_results
</span>     set distpath [_mportkey $mport distpath]
     foreach distfile $all_dist_files {
         set filepath [file join $distpath $distfile]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        dict set ::distfiles_results $filepath $succeeded
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict set distfiles_results $filepath $succeeded
</span>     }
 }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -179,6 +185,7 @@ proc skip_mirror {mport identifier} {
</span>         # no distfiles, no need to mirror
         return 1
     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    global distfiles_results
</span>     if {![info exists distfiles]} {
         set distfiles [list]
     }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -194,9 +201,9 @@ proc skip_mirror {mport identifier} {
</span>         }
         set distfile [getdistname $distfile]
         set filepath [file join $distpath $distfile]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {![dict exists $::distfiles_results $filepath]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![dict exists $distfiles_results $filepath]} {
</span>             set any_unmirrored 1
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        } elseif {[dict get $::distfiles_results $filepath] == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } elseif {[dict get $distfiles_results $filepath] == 0} {
</span>             ui_msg "Skipping ${identifier}: $distfile already failed checksum"
             return 2
         }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -210,9 +217,10 @@ proc skip_mirror {mport identifier} {
</span> 
 
 proc mirror_port {portinfo} {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    global processed platforms
</span>     set portname [dict get $portinfo name]
     set porturl [dict get $portinfo porturl]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    dict set ::processed $portname 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    dict set processed $portname 1
</span>     set do_mirror 1
     set attempted 0
     set succeeded 0
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -269,7 +277,7 @@ proc mirror_port {portinfo} {
</span>         mportclose $mport
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach {os_major os_arch} $::platforms {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach {os_major os_arch} $platforms {
</span>         ui_msg "$portname with platform 'darwin $os_major $os_arch'"
         if {[catch {mportopen $porturl [dict create subport $portname os_major $os_major os_arch $os_arch] {}} mport]} {
             ui_error "mportopen $porturl failed: $mport"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -295,7 +303,7 @@ proc mirror_port {portinfo} {
</span> 
     set dep_failed 0
     foreach dep [lsort -unique $deps] {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {![dict exists $::processed $dep] && [check_mirror_done $dep] == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![dict exists $processed $dep] && [check_mirror_done $dep] == 0} {
</span>             set result [mportlookup $dep]
             if {[llength $result] < 2} {
                 ui_error "No such port: $dep"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -320,14 +328,14 @@ proc mirror_port {portinfo} {
</span> }
 
 set mirrorcache_dir /tmp/mirrorcache
<span style='display:block; white-space:pre;background:#ffe0e0;'>-if {[lindex $::argv 0] eq "-c"} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set mirrorcache_dir [lindex $::argv 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set ::argv [lrange $::argv 2 end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+if {[lindex $argv 0] eq "-c"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set mirrorcache_dir [lindex $argv 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set argv [lrange $argv 2 end]
</span> }
 
 set exitval 0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-foreach portname $::argv {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[dict exists $::processed $portname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+foreach portname $argv {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $processed $portname]} {
</span>         ui_msg "skipping ${portname}, already processed"
         continue
     }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/tools/sort-with-subports.tcl b/tools/sort-with-subports.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 4c8f37d..dd82d9d 100755
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/tools/sort-with-subports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/tools/sort-with-subports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -48,60 +48,63 @@ proc ui_channels {priority} {
</span> 
 
 proc process_port_deps {portname} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set deplist [dict get $::portdepinfo $portname]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    dict unset ::portdepinfo $portname
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[dict exists $::portsoftdeps $portname]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        lappend deplist {*}[dict get $::portsoftdeps $portname]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        dict unset ::portsoftdeps $portname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global portdepinfo portsoftdeps portlist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set deplist [dict get $portdepinfo $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    dict unset portdepinfo $portname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $portsoftdeps $portname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend deplist {*}[dict get $portsoftdeps $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict unset portsoftdeps $portname
</span>     }
     foreach portdep $deplist {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[dict exists $::portdepinfo $portdep]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[dict exists $portdepinfo $portdep]} {
</span>             process_port_deps $portdep
         }
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    lappend ::portlist $portname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    lappend portlist $portname
</span> }
 
 proc check_failing_deps {portname} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[dict exists $::failingports $portname]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return [dict get $::failingports $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global failingports portdepinfo outputports requestedports \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           canonicalnames
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $failingports $portname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return [dict get $failingports $portname]
</span>     }
     # Protect against dependency cycles
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    dict set ::failingports $portname [list 3 $portname]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach portdep [dict get $::portdepinfo $portname] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    dict set failingports $portname [list 3 $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach portdep [dict get $portdepinfo $portname] {
</span>         set dep_ret [check_failing_deps $portdep]
         # 0 = ok, 1 = known_fail, 2 = failcache, 3 = dep cycle
         set status [lindex $dep_ret 0]
         if {$status != 0} {
             set failed_dep [lindex $dep_ret 1]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[dict get $::outputports $portname] == 1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[dict get $outputports $portname] == 1} {
</span>                 if {$status == 1} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if {[dict exists $::requestedports $portname]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        puts stderr "Excluding [dict get $::canonicalnames $portname] because its dependency '$failed_dep' is known to fail"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {[dict exists $requestedports $portname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        puts stderr "Excluding [dict get $canonicalnames $portname] because its dependency '$failed_dep' is known to fail"
</span>                     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    dict set ::outputports $portname 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                } elseif {$status == 2 && ![dict exists $::requestedports $portname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    dict set outputports $portname 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                } elseif {$status == 2 && ![dict exists $requestedports $portname]} {
</span>                     # Exclude deps that will fail due to their own dep being in the failcache.
                     # But still output requested ports so the failure will be reported.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    dict set ::outputports $portname 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    dict set outputports $portname 0
</span>                 } elseif {$status == 3} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if {[dict exists $::requestedports $portname]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        puts stderr "Warning: [dict get $::canonicalnames $portname] appears to have a cyclic dependency involving '$portdep'"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {[dict exists $requestedports $portname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        puts stderr "Warning: [dict get $canonicalnames $portname] appears to have a cyclic dependency involving '$portdep'"
</span>                     }
                     # Some cycles involving depends_test exist, which don't cause
                     # problems yet only because we don't run tests.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    #dict set ::outputports $portname 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    #dict set outputports $portname 0
</span>                 }
             }
             # keep processing other deps for now if there was a dep cycle
             if {$status != 3} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                dict set ::failingports $portname [list $status $failed_dep]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return [dict get $::failingports $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set failingports $portname [list $status $failed_dep]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                return [dict get $failingports $portname]
</span>             }
         }
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    dict set ::failingports $portname [list 0 ""]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return [dict get $::failingports $portname]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    dict set failingports $portname [list 0 ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [dict get $failingports $portname]
</span> }
 
 source [file join [file dirname [info script]] failcache.tcl]
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/tools/uninstall-unneeded-ports.tcl b/tools/uninstall-unneeded-ports.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 4cc052a..dc6595c 100755
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/tools/uninstall-unneeded-ports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/tools/uninstall-unneeded-ports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -54,7 +54,7 @@ foreach source $macports::sources {
</span>                 set portinfo [read $fd $len]
 
                 # depends_test is not included because mpbb doesn't run `port test'
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                foreach field [list depends_build depends_extract depends_fetch depends_lib depends_patch depends_run] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                foreach field {depends_build depends_extract depends_fetch depends_lib depends_patch depends_run} {
</span>                     if {[dict exists $portinfo $field]} {
                         foreach dependency [dict get $portinfo $field] {
                             set lowercase_dependency_name [string tolower [lindex [split $dependency :] end]]
</pre><pre style='margin:0'>

</pre>