<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/bb4a1f6089ee09fc20d00d3556311c3b0e7d2d99">https://github.com/macports/mpbb/commit/bb4a1f6089ee09fc20d00d3556311c3b0e7d2d99</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 bb4a1f6  mpbb: preprocessing improvements
</span>bb4a1f6 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit bb4a1f6089ee09fc20d00d3556311c3b0e7d2d99
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Mon Jan 4 23:31:46 2021 +1100

<span style='display:block; white-space:pre;color:#404040;'>    mpbb: preprocessing improvements
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    * Start separate builds for unbuilt dependencies.
</span><span style='display:block; white-space:pre;color:#404040;'>    * gather-archives can therefore consider only the port being built and
</span><span style='display:block; white-space:pre;color:#404040;'>      not worry about its deps.
</span><span style='display:block; white-space:pre;color:#404040;'>    * Exclude ports that have any dependency that sets 'known_fail yes'.
</span><span style='display:block; white-space:pre;color:#404040;'>    * Exclude dependencies that have a failcache entry or have a recursive
</span><span style='display:block; white-space:pre;color:#404040;'>      dependency that does. The ports that the build was actually requested
</span><span style='display:block; white-space:pre;color:#404040;'>      for are still built even if a dep is in the failcache, so that the
</span><span style='display:block; white-space:pre;color:#404040;'>      failure will be reported to maintainers.
</span><span style='display:block; white-space:pre;color:#404040;'>    * Delete stale entries from the failcache for relevant ports while
</span><span style='display:block; white-space:pre;color:#404040;'>      we're at it.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Fixes: https://trac.macports.org/ticket/60935
</span>---
 functions                    |   6 --
 mpbb-gather-archives         |   2 +-
 mpbb-install-dependencies    |   5 +-
 mpbb-install-port            |   6 +-
 mpbb-list-subports           |   6 +-
 tools/sort-with-subports.tcl | 156 ++++++++++++++++++++++++++++++++++++++-----
 6 files changed, 150 insertions(+), 31 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/functions b/functions
</span><span style='display:block; white-space:pre;color:#808080;'>index 47d6c73..d3fd13f 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/functions
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/functions
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -178,12 +178,6 @@ failcache_test() {
</span>         return 1
     fi
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Delete stale entries first
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if ! failcache_cleanup $(echo "${key}" | cut -d ' ' -f1) $(echo "${key}" | cut -d ' ' -f3); then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Nothing in the cache for this port, no need to check further
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span>     if [ -f "${option_failcache_dir}/${key}" ]; then
         printf "port %s previously failed in build %s\n" "${key}" "$(<"${option_failcache_dir}/${key}")"
         return 1
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/mpbb-gather-archives b/mpbb-gather-archives
</span><span style='display:block; white-space:pre;color:#808080;'>index c0e1968..6d69128 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/mpbb-gather-archives
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/mpbb-gather-archives
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -64,7 +64,7 @@ gather-archives() {
</span>     mkdir -p "${option_staging_dir}"/public "${option_staging_dir}"/private || return
 
     status=0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    for archive_path in $("${option_prefix}/bin/port" -q location installed and \( $(cat "${option_work_dir}/all_ports") \)); do
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    for archive_path in $("${option_prefix}/bin/port" -q location installed and \( $(cat "${option_work_dir}/requested_port") \)); do
</span>         archive_port=$(basename "$(dirname "${archive_path}")")
         archive_basename=$(basename "${archive_path}")
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/mpbb-install-dependencies b/mpbb-install-dependencies
</span><span style='display:block; white-space:pre;color:#808080;'>index d7527b6..2324cba 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/mpbb-install-dependencies
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/mpbb-install-dependencies
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -38,6 +38,9 @@ install-dependencies() {
</span>     mkdir -p "${option_log_dir}"
     > "$log_status_dependencies"
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    # clear the port list
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    rm -f "${option_work_dir}/all_ports"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>     # calculate list of dependencies in-order
     # $option_prefix and $thisdir are set in mpbb
     # shellcheck disable=SC2154
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -90,8 +93,6 @@ install-dependencies() {
</span>         return 1
     fi
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    rm -f "${option_work_dir}/all_ports"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span>     while read -r dependency; do
         # Split portname +variant1+variant2 into portname and active and
         # requested variants, where the variants are optional.
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/mpbb-install-port b/mpbb-install-port
</span><span style='display:block; white-space:pre;color:#808080;'>index a3303aa..b73e377 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/mpbb-install-port
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/mpbb-install-port
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -48,13 +48,15 @@ install-port() {
</span>     #> "$log_port_contents"
     > "$log_port_stats"
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    rm -f "${option_work_dir}/requested_port"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>     # $option_prefix and $thisdir are set in mpbb
     # shellcheck disable=SC2154
     if [[ -f $("${option_prefix}/bin/port-tclsh" "${thisdir}/tools/archive-path.tcl" "$@") ]]; then
         echo "$* already installed, nothing to do"
         # log: summary for the portwatcher
         echo "Building '$port' ... [OK]" >> "$log_subports_progress"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        echo "$@" >> "${option_work_dir}/all_ports"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        echo "$@" >> "${option_work_dir}/requested_port"
</span>         return 0
     fi
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -139,5 +141,5 @@ install-port() {
</span>         cp -f "$port_mainlog" "$log_port_main"
     fi
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    echo "$@" >> "${option_work_dir}/all_ports"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    echo "$@" >> "${option_work_dir}/requested_port"
</span> }
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/mpbb-list-subports b/mpbb-list-subports
</span><span style='display:block; white-space:pre;color:#808080;'>index 0606c01..074b9c6 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/mpbb-list-subports
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/mpbb-list-subports
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -38,8 +38,10 @@ print-subports() {
</span>     # $option_prefix is set in mpbb
     # shellcheck disable=SC2154
     "${tclsh}" "${thisdir}/tools/sort-with-subports.tcl" --jobs_dir "${option_jobs_dir}" \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        --license_db_dir "${option_license_db_dir}" --archive_site_public "${archive_site_public}" \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        --archive_site_private "${archive_site_private}" ${portnames} || return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        --license_db_dir "${option_license_db_dir}" --failcache_dir "${option_failcache_dir}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        --archive_site_public "${archive_site_public}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        --archive_site_private "${archive_site_private}" --include_deps \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ${portnames} || return
</span> }
 
 list-subports() {
<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 df2d0c4..8307843 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;'>@@ -34,6 +34,7 @@
</span> #
 
 package require macports
<span style='display:block; white-space:pre;background:#e0ffe0;'>+package require sha256
</span> 
 
 proc ui_prefix {priority} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -59,6 +60,71 @@ proc process_port_deps {portname portdeps_in portlist_in} {
</span>     lappend portlist $portname
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+proc check_failing_deps {portname} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[info exists ::failingports($portname)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $::failingports($portname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists ::portdepinfo($portname)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set ::failingports($portname) [list 0 ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $::failingports($portname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach portdep $::portdepinfo($portname) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set dep_ret [check_failing_deps $portdep]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        # 0 = ok, 1 = known_fail, 2 = failcache
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set status [lindex $dep_ret 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$status != 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set failed_dep [lindex $dep_ret 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[info exists ::outputports($portname)] && $::outputports($portname) == 1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {$status == 1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {[info exists ::requestedports($portname)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        puts stderr "Excluding $::canonicalnames($portname) because its dependency '$failed_dep' is known to fail"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set ::outputports($portname) 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                } elseif {$status == 2 && ![info exists ::requestedports($portname)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # Exclude deps that will fail due to their own dep being in the failcache.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # But still output requested ports so the failure will be reported.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set ::outputports($portname) 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set ::failingports($portname) [list $status $failed_dep]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return $::failingports($portname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set ::failingports($portname) [list 0 ""]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return $::failingports($portname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc canonical_variants {mport} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set info [mportinfo $mport]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return $info(canonical_active_variants)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# slightly odd method as per mpbb's compute_failcache_hash
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc port_files_checksum {porturl} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set portdir [macports::getportdir $porturl]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach f [list ${portdir}/Portfile {*}[glob -nocomplain -directory ${portdir}/files -types f *]] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        lappend hashlist [::sha2::sha256 -hex -file $f]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach hash [lsort $hashlist] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        append compound_hash "${hash}\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [::sha2::sha256 -hex $compound_hash]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc check_failcache {portname porturl mport} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set hash [port_files_checksum $porturl]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set key "$portname [canonical_variants $mport] $hash"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set ret 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach f [glob -directory $::failcache_dir -nocomplain -tails "${portname} *"] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {$f eq $key} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set ret 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        } elseif {[lindex [split $f " "] end] ne $hash} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts stderr "removing stale failcache entry: $f"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            file delete -force $f
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return $ret
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span> 
 if {[catch {mportinit "" "" ""} result]} {
    puts stderr "$errorInfo"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -67,8 +133,10 @@ if {[catch {mportinit "" "" ""} result]} {
</span> 
 set archive_site_private ""
 set archive_site_public ""
<span style='display:block; white-space:pre;background:#e0ffe0;'>+set failcache_dir ""
</span> set jobs_dir ""
 set license_db_dir ""
<span style='display:block; white-space:pre;background:#e0ffe0;'>+set include_deps no
</span> while {[string range [lindex $::argv 0] 0 1] eq "--"} {
     switch -- [lindex $::argv 0] {
         --archive_site_private {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -79,6 +147,10 @@ while {[string range [lindex $::argv 0] 0 1] eq "--"} {
</span>             set archive_site_public [lindex $::argv 1]
             set ::argv [lrange $::argv 1 end]
         }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        --failcache_dir {
</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 [lrange $::argv 1 end]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span>         --jobs_dir {
             set jobs_dir [lindex $::argv 1]
             set ::argv [lrange $::argv 1 end]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -87,6 +159,9 @@ while {[string range [lindex $::argv 0] 0 1] eq "--"} {
</span>             set license_db_dir [lindex $::argv 1]
             set ::argv [lrange $::argv 1 end]
         }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        --include_deps {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set include_deps yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span>         default {
             error "unknown option: [lindex $::argv 0]"
         }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -119,10 +194,11 @@ if {[lindex $argv 0] eq "-"} {
</span> foreach p $todo {
     set inputports($p) 1
     set outputports($p) 1
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    set requestedports($p) 1
</span> }
 # process all recursive deps
<span style='display:block; white-space:pre;background:#ffe0e0;'>-set depstypes {depends_fetch depends_extract depends_patch depends_build depends_lib depends_run}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-while {$todo ne {}} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set depstypes [list depends_fetch depends_extract depends_patch depends_build depends_lib depends_run]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+while {[llength $todo] > 0} {
</span>     set p [lindex $todo 0]
     set todo [lrange $todo 1 end]
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -144,8 +220,9 @@ while {$todo ne {}} {
</span>                 if {![info exists portdepinfo($splower)]} {
                     lappend todo $splower
                 }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                if {![info exists outputports($splower)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {![info exists requestedports($splower)]} {
</span>                     set outputports($splower) 1
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set requestedports($splower) 1
</span>                 }
             }
         }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -153,37 +230,69 @@ while {$todo ne {}} {
</span>         set opened 0
         if {[info exists outputports($p)] && $outputports($p) == 1} {
             if {[info exists portinfo(replaced_by)]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                puts stderr "Excluding $portinfo(name) because it is replaced by $portinfo(replaced_by)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[info exists requestedports($p)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    puts stderr "Excluding $portinfo(name) because it is replaced by $portinfo(replaced_by)"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span>                 set outputports($p) 0
             } elseif {[info exists portinfo(known_fail)] && [string is true -strict $portinfo(known_fail)]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                puts stderr "Excluding $portinfo(name) because it is known to fail"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[info exists requestedports($p)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    puts stderr "Excluding $portinfo(name) because it is known to fail"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span>                 set outputports($p) 0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            } elseif {$archive_site_public ne ""} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # FIXME: support non-default variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set failingports($p) [list 1 $portinfo(name)]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            } elseif {$failcache_dir ne "" && ![info exists requestedports($p)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # exclude dependencies with a failcache entry
</span>                 if {![catch {mportopen $portinfo(porturl) [list subport $portinfo(name)] ""} result]} {
                     set opened 1
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    set workername [ditem_key $result workername]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set mport $result
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {[check_failcache $portinfo(name) $portinfo(porturl) $mport] != 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        set outputports($p) 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        set failingports($p) [list 2 $portinfo(name)]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set outputports($p) 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$archive_site_public ne "" && [info exists outputports($p)] && $outputports($p) == 1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # FIXME: support non-default variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {$opened == 1 || ![catch {mportopen $portinfo(porturl) [list subport $portinfo(name)] ""} result]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {$opened != 1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        set opened 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        set mport $result
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set workername [ditem_key $mport workername]
</span>                     set archive_name [$workername eval {portfetch::percent_encode [get_portimage_name]}]
                     if {![catch {curl getsize ${archive_site_public}/$portinfo(name)/${archive_name}} size] && $size > 0} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        puts stderr "Excluding $portinfo(name) because it has already been built and uploaded to the public server"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        if {[info exists requestedports($p)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            puts stderr "Excluding $portinfo(name) because it has already been built and uploaded to the public server"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        }
</span>                         set outputports($p) 0
                     }
                 } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    puts stderr "Excluding $portinfo(name) because it failed to open: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {[info exists requestedports($p)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        puts stderr "Excluding $portinfo(name) because it failed to open: $result"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    }
</span>                     set outputports($p) 0
                 }
                 if {$outputports($p) == 1 && $archive_site_private ne "" && $jobs_dir ne ""} {
                     # FIXME: support non-default variants
                     set results [check_licenses $portinfo(name) [list]]
                     if {[lindex $results 0] == 1 && ![catch {curl getsize ${archive_site_private}/$portinfo(name)/${archive_name}} size] && $size > 0} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        puts stderr "Excluding $portinfo(name) because it is not distributable and it has already been built and uploaded to the private server"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        if {[info exists requestedports($p)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            puts stderr "Excluding $portinfo(name) because it is not distributable and it has already been built and uploaded to the private server"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        }
</span>                         set outputports($p) 0
                     }
                 }
             }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {$outputports($p) == 1 && ($::macports::os_major <= 10 || $::macports::os_major >= 20)} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[info exists requestedports($p)] && ($::macports::os_major <= 10 || $::macports::os_major >= 20) &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                $outputports($p) == 1} {
</span>                 if {$opened == 1 || ![catch {mportopen $portinfo(porturl) [list subport $portinfo(name)] ""} result]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    set supported_archs [_mportkey $result supported_archs]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {$opened != 1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        set opened 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        set mport $result
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set supported_archs [_mportkey $mport supported_archs]
</span>                     switch $::macports::os_arch {
                         arm {
                             if {$supported_archs eq "noarch"} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -213,9 +322,10 @@ while {$todo ne {}} {
</span>                     set outputports($p) 0
                 }
             }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {$outputports($p) == 1} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set canonicalnames($p) $portinfo(name)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[info exists outputports($p)] && $outputports($p) == 1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set canonicalnames($p) $portinfo(name)
</span>         }
 
         if {![info exists outputports($p)] || $outputports($p) == 1} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -225,7 +335,12 @@ while {$todo ne {}} {
</span>                     foreach onedep $portinfo($depstype) {
                         set depname [string tolower [lindex [split [lindex $onedep 0] :] end]]
                         lappend deplist $depname
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lappend todo $depname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        if {![info exists portdepinfo($depname)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            lappend todo $depname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        if {$include_deps && ![info exists outputports($depname)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            set outputports($depname) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        }
</span>                     }
                 }
             }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -240,8 +355,13 @@ if {$jobs_dir ne "" && $license_db_dir ne "" && $archive_site_public ne "" && $a
</span>     write_license_db $license_db_dir
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+set sorted_portnames [lsort -dictionary [array names portdepinfo]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+foreach portname $sorted_portnames {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    check_failing_deps $portname
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> set portlist [list]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-foreach portname [lsort -dictionary [array names portdepinfo]] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+foreach portname $sorted_portnames {
</span>    if {[info exists portdepinfo($portname)]} {
       process_port_deps $portname portdepinfo portlist
    }
</pre><pre style='margin:0'>

</pre>