<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/8833b70dd95d2916f852b71c907263db524a85e3">https://github.com/macports/mpbb/commit/8833b70dd95d2916f852b71c907263db524a85e3</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 8833b70dd95d2916f852b71c907263db524a85e3
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Sun Nov 10 04:28:09 2019 +1100

<span style='display:block; white-space:pre;color:#404040;'>    mpbb list-subports: check for archives from Tcl
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    This has several performance benefits:
</span><span style='display:block; white-space:pre;color:#404040;'>     * MacPorts only has to be started up once
</span><span style='display:block; white-space:pre;color:#404040;'>     * Each portfile only has to be parsed at most once
</span><span style='display:block; white-space:pre;color:#404040;'>     * libcurl can keep the connection open and reuse it
</span>---
 README.md                    |  3 ++
 mpbb                         |  1 +
 mpbb-list-subports           | 51 ++-------------------------------
 tools/sort-with-subports.tcl | 68 ++++++++++++++++++++++++++++++++++++++++++--
 4 files changed, 73 insertions(+), 50 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/README.md b/README.md
</span><span style='display:block; white-space:pre;color:#808080;'>index 35e2441..932f06a 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/README.md
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/README.md
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -94,6 +94,9 @@ Subcommand scripts may use but not modify these global shell parameters:
</span> -   `$option_failcache_dir`:
       A directory for storing information about previously failed builds which
       saves time because builds that are known to fail will not be attempted.
<span style='display:block; white-space:pre;background:#e0ffe0;'>+-   `$option_license_db_dir`:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      A directory for storing information about port licenses used by the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+      port_binary_distributable.tcl script.
</span> 
 
 ## Runtime Requirements ##
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/mpbb b/mpbb
</span><span style='display:block; white-space:pre;color:#808080;'>index abda872..8d4d47c 100755
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/mpbb
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/mpbb
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -58,6 +58,7 @@ parseopt prefix:,work-dir: "$@" || exit
</span>     option_log_dir=${option_work_dir}/logs
 }
 option_failcache_dir=${option_work_dir}/failcache
<span style='display:block; white-space:pre;background:#e0ffe0;'>+option_license_db_dir=${option_work_dir}/license_db
</span> 
 # Inform the user if old repositories are still present.
 if [[ -d ${option_work_dir}/tools/.svn ]]; then
<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 b48946f..0606c01 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;'>@@ -31,60 +31,15 @@ print-subports() {
</span>     local archive_site_public=$1
     local archive_site_private=$2
     local portnames=$3
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    local port
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    local ports
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    local exclude
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    local exclude_reasons
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    local reason
</span> 
     # $option_prefix is set in mpbb
     # shellcheck disable=SC2154
     tclsh=${option_prefix}/bin/port-tclsh
     # $option_prefix is set in mpbb
     # shellcheck disable=SC2154
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    ports=$("${tclsh}" "${thisdir}/tools/sort-with-subports.tcl" ${portnames}) || return
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    for port in $ports; do
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        exclude=0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        exclude_reasons=()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if [[ -n "${archive_site_public}" || -n "${archive_site_private}" ]]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # FIXME: this doesn't take selected variants into account
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # $thisdir is set in mpbb
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # shellcheck disable=SC2154
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            archive_path=$("${tclsh}" "${thisdir}/tools/archive-path.tcl" "${port}")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            archive_basename=$(basename "${archive_path}")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # $option_jobs_dir is set in mpbb
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # shellcheck disable=SC2154
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if "${tclsh}" "${option_jobs_dir}/port_binary_distributable.tcl" "${port}"; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                archive_type=public
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                archive_distributable="distributable"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                archive_site="${archive_site_public}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                archive_type=private
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                archive_distributable="not distributable"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                archive_site="${archive_site_private}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if [[ -n "${archive_site}" ]] && curl -fIsL "${archive_site}/${port}/${archive_basename}" > /dev/null; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                exclude=1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                exclude_reasons+=("it is ${archive_distributable} and has already been built and uploaded to the ${archive_type} server")
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if [ $exclude -eq 0 ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            echo "$port"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if [ ${#exclude_reasons[@]} -eq 1 ]; then
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                echo >&2 "Excluding '${port}' because ${exclude_reasons[0]}."
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                echo >&2 "Excluding '${port}' for the following reasons:"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                for reason in "${exclude_reasons[@]}"; do
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    echo >&2 " - ${reason}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                done
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        fi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    done
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    "${tclsh}" "${thisdir}/tools/sort-with-subports.tcl" --jobs_dir "${option_jobs_dir}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        --license_db_dir "${option_license_db_dir}" --archive_site_public "${archive_site_public}" \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        --archive_site_private "${archive_site_private}" ${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 364cfe2..fc4761c 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;'>@@ -5,7 +5,7 @@
</span> # sub-ports of the specified ports.
 #
 # Copyright (c) 2006,2008 Bryan L Blackburn.  All rights reserved.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# Copyright (c) 2018 The MacPorts Project
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# Copyright (c) 2018-2019 The MacPorts Project
</span> #
 # Redistribution and use in source and binary forms, with or without
 # modification, are permitted provided that the following conditions
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -65,6 +65,42 @@ if {[catch {mportinit "" "" ""} result]} {
</span>    error "Failed to initialize ports system: $result"
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+set archive_site_private ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set archive_site_public ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set jobs_dir ""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+set license_db_dir ""
</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><span style='display:block; white-space:pre;background:#e0ffe0;'>+        --archive_site_private {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set archive_site_private [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><span style='display:block; white-space:pre;background:#e0ffe0;'>+        --archive_site_public {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set archive_site_public [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><span style='display:block; white-space:pre;background:#e0ffe0;'>+        --jobs_dir {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set jobs_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><span style='display:block; white-space:pre;background:#e0ffe0;'>+        --license_db_dir {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set license_db_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><span style='display:block; white-space:pre;background:#e0ffe0;'>+        default {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            error "unknown option: [lindex $::argv 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 ::argv [lrange $::argv 1 end]
</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 {$jobs_dir ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    source ${jobs_dir}/distributable_lib.tcl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$license_db_dir ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        init_license_db $license_db_dir
</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;'>+
</span> set is_64bit_capable [sysctl hw.cpu64bit_capable]
 
 array set portdepinfo {}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -114,6 +150,7 @@ while {$todo ne {}} {
</span>             }
         }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        set opened 0
</span>         if {[info exists outputports($p)] && $outputports($p) == 1} {
             if {[info exists portinfo(replaced_by)]} {
                 puts stderr "Excluding $portinfo(name) because it is replaced by $portinfo(replaced_by)"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -121,8 +158,31 @@ while {$todo ne {}} {
</span>             } elseif {[info exists portinfo(known_fail)] && [string is true -strict $portinfo(known_fail)]} {
                 puts stderr "Excluding $portinfo(name) because it is known to fail"
                 set outputports($p) 0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            } elseif {$::macports::os_major <= 10} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            } elseif {$archive_site_public ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                # FIXME: support non-default variants
</span>                 if {![catch {mportopen $portinfo(porturl) [list subport $portinfo(name)] ""} result]} {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set opened 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set workername [ditem_key $result workername]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set archive_name [$workername eval get_portimage_name]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {![catch {curl getsize ${archive_site_public}/$portinfo(name)/${archive_name}} size] && $size > 0} {
</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;'>+                        set outputports($p) 0
</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;'>+                    puts stderr "Excluding $portinfo(name) because it failed to open: $result"
</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;'>+                if {$outputports($p) == 1 && $archive_site_private ne "" && $jobs_dir ne ""} {
</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;'>+                    set results [check_licenses $portinfo(name) [list]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {[lindex $results 0] == 1 && ![catch {curl getsize ${archive_site_private}/$portinfo(name)/${archive_name}} size] && $size > 0} {
</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;'>+                        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;'>+            }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$outputports($p) == 1 && $::macports::os_major <= 10} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {$opened == 1 || ![catch {mportopen $portinfo(porturl) [list subport $portinfo(name)] ""} result]} {
</span>                     set supported_archs [_mportkey $result supported_archs]
                     if {$::macports::os_arch eq "i386" && !${is_64bit_capable} && $supported_archs ne "" && ("x86_64" ni $supported_archs || "i386" ni $supported_archs)} {
                         puts stderr "Excluding $portinfo(name) because the ${::macports::macosx_version}_x86_64 builder will build it"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -159,6 +219,10 @@ while {$todo ne {}} {
</span>     }
 }
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+if {$jobs_dir ne "" && $license_db_dir ne ""} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    write_license_db $license_db_dir
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> set portlist [list]
 foreach portname [lsort -dictionary [array names portdepinfo]] {
    if {[info exists portdepinfo($portname)]} {
</pre><pre style='margin:0'>

</pre>