<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/ae6cef73ce312baf8b98195ed7121ce19742147a">https://github.com/macports/macports-base/commit/ae6cef73ce312baf8b98195ed7121ce19742147a</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit ae6cef73ce312baf8b98195ed7121ce19742147a
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Wed Feb 21 07:07:45 2024 +1100

<span style='display:block; white-space:pre;color:#404040;'>    Precompute porturl prefix for each source
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    This saves doing it each loop iteration in mportsearch, mportlookup,
</span><span style='display:block; white-space:pre;color:#404040;'>    and mportlistall.
</span>---
 src/macports1.0/macports.tcl | 76 ++++++++++++++------------------------------
 1 file changed, 23 insertions(+), 53 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 97b0b4ecd..d7404398d 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;'>@@ -937,6 +937,8 @@ proc mportinit {{up_ui_options {}} {up_options {}} {up_variations {}}} {
</span>     if {![info exists sources_conf]} {
         return -code error "sources_conf must be set in ${macports_conf_path}/macports.conf or in your ${macports_user_dir}/macports.conf file"
     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Precompute mapping of source URLs to prefix to use for porturls (used in mportlookup etc)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set ::macports::porturl_prefix_map [dict create]
</span>     set sources_conf_comment_re {^\s*#|^$}
     set sources_conf_source_re {^([\w-]+://\S+)(?:\s+\[(\w+(?:,\w+)*)\])?$}
     set fd [open $sources_conf r]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -960,6 +962,18 @@ proc mportinit {{up_ui_options {}} {up_options {}} {up_variations {}}} {
</span>                     ui_warn "MacPorts is configured to use an unsigned source for the ports tree.\
 Please edit sources.conf and change '$url' to '[string range $url 0 end-6]tarballs/ports.tar'."
                 }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                switch -- [macports::getprotocol $url] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    rsync -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    https -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    http -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    ftp {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        # Rsync and snapshot tarballs create Portfiles in the local filesystem
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        dict set ::macports::porturl_prefix_map $url file://[macports::getsourcepath $url]
</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;'>+                        dict set ::macports::porturl_prefix_map $url $url
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span>                 lappend sources [concat [list $url] $flags]
             } else {
                 ui_warn "$sources_conf specifies invalid source '$line', ignored."
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3224,14 +3238,13 @@ proc mportsync {{options {}}} {
</span> #         <tt>array set</tt> to create an associate array where the port names
 #         are the keys and the lines from portindex are the values.
 proc mportsearch {pattern {case_sensitive yes} {matchstyle regexp} {field name}} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global macports::sources
</span>     set matches [list]
     set easy [expr {$field eq "name"}]
 
     set found 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>         set source [lindex $source 0]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set protocol [macports::getprotocol $source]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set porturl_prefix [dict get $::macports::porturl_prefix_map $source]
</span>         macports_try -pass_signal {
             set fd [open [macports::getindex $source] r]
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3280,23 +3293,8 @@ proc mportsearch {pattern {case_sensitive yes} {matchstyle regexp} {field name}}
</span>                     }
 
                     if {$matchres == 1} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        switch -- $protocol {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            rsync {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                # Rsync files are local
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                set source_url file://[macports::getsourcepath $source]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            https -
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            http -
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            ftp {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                # snapshot tarball
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                set source_url file://[macports::getsourcepath $source]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            default {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                set source_url $source
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        }
</span>                         if {[dict exists $portinfo portdir]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                            set porturl ${source_url}/[dict get $portinfo portdir]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            set porturl ${porturl_prefix}/[dict get $portinfo portdir]
</span>                             dict set portinfo porturl $porturl
                             ui_debug "Found port in $porturl"
                         } else {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3343,13 +3341,13 @@ proc mportlookup {name} {
</span>     set matches [list]
     set normname [string tolower $name]
     foreach source $::macports::sources {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set source [lindex $source 0]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set protocol [macports::getprotocol $source]
</span>         if {![dict exists $quick_index $sourceno $normname]} {
             # no entry in this source, advance to next source
             incr sourceno 1
             continue
         }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        set source [lindex $source 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set porturl_prefix [dict get $::macports::porturl_prefix_map $source]
</span>         # 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.
         set offset [dict get $quick_index $sourceno $normname]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3364,21 +3362,8 @@ proc mportlookup {name} {
</span>                 set len  [lindex $line 1]
                 set portinfo [read $fd $len]
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                switch -- $protocol {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    rsync {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        set source_url file://[macports::getsourcepath $source]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    https -
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    http -
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    ftp {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        set source_url file://[macports::getsourcepath $source]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    default {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        set source_url $source
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                }
</span>                 if {[dict exists $portinfo portdir]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    dict set portinfo porturl ${source_url}/[dict get $portinfo portdir]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    dict set portinfo porturl ${porturl_prefix}/[dict get $portinfo portdir]
</span>                 }
                 lappend matches $name $portinfo
             } on error {_ eOptions} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3407,13 +3392,11 @@ proc mportlookup {name} {
</span> #         info. See the return value of mportsearch().
 # @see mportsearch()
 proc mportlistall {} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global macports::sources
</span>     set matches [list]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span>     set found 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>         set source [lindex $source 0]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set protocol [macports::getprotocol $source]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set porturl_prefix [dict get $::macports::porturl_prefix_map $source]
</span>         macports_try -pass_signal {
             set fd [open [macports::getindex $source] r]
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3424,21 +3407,8 @@ proc mportlistall {} {
</span>                     set len  [lindex $line 1]
                     set portinfo [read $fd $len]
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    switch -- $protocol {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        rsync {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            set source_url file://[macports::getsourcepath $source]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        https -
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        http -
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        ftp {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            set source_url file://[macports::getsourcepath $source]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        default {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                            set source_url $source
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    }
</span>                     if {[dict exists $portinfo portdir]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        dict set portinfo porturl ${source_url}/[dict get $portinfo portdir]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        dict set portinfo porturl ${porturl_prefix}/[dict get $portinfo portdir]
</span>                     }
                     lappend matches $name $portinfo
                 }
</pre><pre style='margin:0'>

</pre>