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

</pre>
<p><a href="https://github.com/macports/macports-base/commit/2f3d072376361cf2933744117def44fee6f9c557">https://github.com/macports/macports-base/commit/2f3d072376361cf2933744117def44fee6f9c557</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 2f3d07237 Use dict for quick index, ping cache
</span>2f3d07237 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 2f3d072376361cf2933744117def44fee6f9c557
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Sun Feb 18 04:47:02 2024 +1100

<span style='display:block; white-space:pre;color:#404040;'>    Use dict for quick index, ping cache
</span>---
 src/macports1.0/macports.tcl | 83 +++++++++++++++++++++-----------------------
 src/port/portindex.tcl       |  2 +-
 2 files changed, 41 insertions(+), 44 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/macports.tcl b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 99e28a31d..890e96e8d 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/macports.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1487,9 +1487,9 @@ match macports.conf.default."
</span>     macports_try -pass_signal {
         set pingfile -1
         set pingfile [open ${macports::portdbpath}/pingtimes r]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set macports::ping_cache [gets $pingfile]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set macports::ping_cache [dict create {*}[gets $pingfile]]
</span>     } on error {} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set macports::ping_cache {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set macports::ping_cache [dict create]
</span>     } finally {
         if {$pingfile != -1} {
             close $pingfile
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1501,7 +1501,7 @@ match macports.conf.default."
</span>     if {![info exists macports::preferred_hosts]} {
         set macports::preferred_hosts {}
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set macports::host_cache {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set macports::host_cache [dict create]
</span> 
     # load the quick index unless told not to
     if {![macports::global_option_isset ports_no_load_quick_index]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1541,16 +1541,14 @@ match macports.conf.default."
</span> # call this just before you exit
 proc mportshutdown {} {
     # save ping times
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global macports::ping_cache macports::portdbpath
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[file writable $macports::portdbpath]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[file writable $::macports::portdbpath]} {
</span>         catch {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            foreach host [array names ping_cache] {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                # don't save expired entries
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if {[clock seconds] - [lindex $ping_cache($host) 1] < 86400} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    lappend pinglist_fresh $host $ping_cache($host)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set pingfile [open ${macports::portdbpath}/pingtimes w]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # don't save expired entries
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set now [clock seconds]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set pinglist_fresh [dict filter $::macports::ping_cache script {host entry} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                expr {$now - [lindex $entry 1] < 86400}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set pingfile [open ${::macports::portdbpath}/pingtimes w]
</span>             puts $pingfile $pinglist_fresh
             close $pingfile
         }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3349,21 +3347,21 @@ proc mportsearch {pattern {case_sensitive yes} {matchstyle regexp} {field name}}
</span> #         info. See the return value of mportsearch().
 # @see mportsearch()
 proc mportlookup {name} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global macports::sources macports::quick_index
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global macports::quick_index
</span> 
     set sourceno 0
     set matches [list]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach source $sources {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach source $::macports::sources {
</span>         set source [lindex $source 0]
         set protocol [macports::getprotocol $source]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {![info exists quick_index(${sourceno},[string tolower $name])]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {![dict exists $quick_index ${sourceno} [string tolower $name]]} {
</span>             # no entry in this source, advance to next source
             incr sourceno 1
             continue
         }
         # The quick index is keyed on the port name, and provides the offset in
         # the main PortIndex where the given port's PortInfo line can be found.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set offset $quick_index(${sourceno},[string tolower $name])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set offset [dict get $quick_index ${sourceno} [string tolower $name]]
</span>         incr sourceno 1
         if {[catch {set fd [open [macports::getindex $source] r]} result]} {
             ui_warn "Can't open index file for source: $source"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3481,12 +3479,12 @@ proc mportlistall {} {
</span> # first if necessary. Private API of macports1.0, do not use this from outside
 # macports1.0.
 proc _mports_load_quickindex {} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global macports::sources macports::quick_index
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global macports::quick_index
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    unset -nocomplain macports::quick_index
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set quick_index [dict create]
</span> 
     set sourceno 0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach source $sources {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    foreach source $::macports::sources {
</span>         unset -nocomplain quicklist
         # chop off any tags
         set source [lindex $source 0]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3513,13 +3511,11 @@ proc _mports_load_quickindex {} {
</span>                 incr sourceno
                 continue
             }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set quicklist [read $fd]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set quicklist [read -nonewline $fd]
</span>             close $fd
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        foreach entry [split $quicklist \n] {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set quick_index(${sourceno},[lindex $entry 0]) [lindex $entry 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        incr sourceno 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict set quick_index ${sourceno} [dict create {*}$quicklist]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        incr sourceno
</span>     }
     if {!$sourceno} {
         ui_warn "No index(es) found! Have you synced your port definitions? Try running 'port selfupdate'."
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5951,28 +5947,30 @@ proc macports::revupgrade_buildgraph {port stackname adjlistname revadjlistname
</span> 
 # get cached ping time for host, modified by blacklist and preferred list
 proc macports::get_pingtime {host} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global macports::ping_cache macports::host_cache \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-           macports::host_blacklist macports::preferred_hosts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global macports::ping_cache macports::host_cache
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[info exists host_cache($host)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return $host_cache($host)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach pattern $macports::host_blacklist {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[string match -nocase $pattern $host]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set host_cache($host) -1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return -1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![dict exists $host_cache $host]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach pattern $::macports::host_blacklist {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[string match -nocase $pattern $host]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set host_cache $host -1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                return -1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span>         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach pattern $macports::preferred_hosts {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[string match -nocase $pattern $host]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set host_cache($host) 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach pattern $::macports::preferred_hosts {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[string match -nocase $pattern $host]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set host_cache $host 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                return 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            }
</span>         }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict set host_cache $host 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict get $host_cache $host] != 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return [dict get $host_cache $host]
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[info exists ping_cache($host)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $ping_cache $host]} {
</span>         # expire entries after 1 day
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[clock seconds] - [lindex $ping_cache($host) 1] <= 86400} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return [lindex $ping_cache($host) 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[clock seconds] - [lindex [dict get $ping_cache $host] 1] <= 86400} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return [lindex [dict get $ping_cache $host] 0]
</span>         }
     }
     return {}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5980,8 +5978,7 @@ proc macports::get_pingtime {host} {
</span> 
 # cache a ping time of ms for host
 proc macports::set_pingtime {host ms} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global macports::ping_cache
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set ping_cache($host) [list $ms [clock seconds]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    dict set ::macports::ping_cache $host [list $ms [clock seconds]]
</span> }
 
 # get the version of a compiler (memoized)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port/portindex.tcl b/src/port/portindex.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index aa56bc9db..197c1f047 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port/portindex.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port/portindex.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -400,7 +400,7 @@ if {[file isfile $outpath]} {
</span>         if {![file isfile ${outpath}.quick]} {
             catch {set qindex [dict create {*}[mports_generate_quickindex ${outpath}]]}
         } elseif {![catch {open ${outpath}.quick r} quickfd]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            catch {set qindex [dict create {*}[read $quickfd]]}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            catch {set qindex [dict create {*}[read -nonewline $quickfd]]}
</span>             close $quickfd
         }
     }
</pre><pre style='margin:0'>

</pre>