<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/229f4d4c71281a0e40d3f733872002712fceee75">https://github.com/macports/macports-base/commit/229f4d4c71281a0e40d3f733872002712fceee75</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 229f4d4c7 restore.tcl: use dict
</span>229f4d4c7 is described below

<span style='display:block; white-space:pre;color:#808000;'>commit 229f4d4c71281a0e40d3f733872002712fceee75
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Fri May 24 22:19:41 2024 +1000

<span style='display:block; white-space:pre;color:#404040;'>    restore.tcl: use dict
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Should greatly improve performance for `seen` in particular.
</span>---
 src/macports1.0/restore.tcl | 59 ++++++++++++++++++++++-----------------------
 1 file changed, 29 insertions(+), 30 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/restore.tcl b/src/macports1.0/restore.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index f000ebb1b..36748fb67 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/restore.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/restore.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -94,9 +94,9 @@ namespace eval restore {
</span> 
         ui_msg "$restore::ui_prefix Restoring snapshot '[$snapshot note]' created at [$snapshot created_at]"
         set snapshot_portlist [$snapshot ports]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set failed [restore_state [$snapshot ports]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set failed [restore_state [$snapshot ports]]
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[array size failed] > 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[dict size $failed] > 0} {
</span>             set note "Migration finished with errors.\n"
         } else {
             set note "Migration finished.\n"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -136,8 +136,8 @@ namespace eval restore {
</span>                 } else {
                     append note " - $name $requested_variants\n"
                 }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                if {[info exists failed($name)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    lassign $failed($name) type reason
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[dict exists $failed $name]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    lassign [dict get $failed $name] type reason
</span>                     switch $type {
                         skipped {
                             append note "   Skipped becuase its $reason\n"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -282,8 +282,8 @@ namespace eval restore {
</span>     #       The list in dependency-sorted order
     #       The dependency graph, to be destroyed by calling $dependencies destroy
     proc resolve_dependencies {portlist} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set ports {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set dep_ports {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set ports [dict create]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set dep_ports [dict create]
</span>         set dependencies [::struct::graph]
 
         set requested_counter 0
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -312,7 +312,7 @@ namespace eval restore {
</span> 
             # bool-ify active
             set active [expr {$active eq "installed"}]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set ports($name) [list $requested $active $variants]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict set ports $name [list $requested $active $variants]
</span> 
             if {$requested} {
                 incr requested_total
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -325,8 +325,8 @@ namespace eval restore {
</span>         # Use a worklist so that we can push items to the front to do
         # depth-first dependency resolution.
         set worklist [list]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set seen [list]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set seen_conflicts {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set seen [dict create]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set seen_conflicts [dict create]
</span>         foreach port $portlist {
             lassign $port name requested _ _ _
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -340,11 +340,10 @@ namespace eval restore {
</span>             set worklist [lassign $worklist portname]
 
             # If we've already seen this port, continue
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[lsearch -sorted -exact $seen $portname] != -1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[dict exists $seen $portname]} {
</span>                 continue
             }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            lappend seen $portname
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set seen [lsort -ascii $seen]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict set seen $portname 1
</span> 
             ui_debug "Dependency calculation for port $portname"
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -357,10 +356,10 @@ namespace eval restore {
</span>                 continue
             }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[info exists ports($portname)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                lassign $ports($portname) requested _ variants
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            } elseif {[info exists dep_ports($portname)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set variants $dep_ports($portname)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[dict exists $ports $portname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                lassign [dict get $ports $portname] requested _ variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            } elseif {[dict exists $dep_ports $portname]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set variants [dict get $dep_ports $portname]
</span>                 set requested 0
             } else {
                 set variants ""
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -398,7 +397,7 @@ namespace eval restore {
</span>                 set portinfo [mportinfo $dep_ditem]
                 if {[dict exists $portinfo conflicts] && [llength [dict get $portinfo conflicts]] > 0} {
                     foreach conflict [dict get $portinfo conflicts] {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        if {[info exists ports($conflict)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        if {[dict exists $ports $conflict]} {
</span>                             # The conflicting port was installed in the snapshot. Assume that this happened because the
                             # conflicting port is an alternative provider for this dependency (e.g., curl-ca-bundle and
                             # certsync, or a -devel port replacing its non-devel variant).
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -408,8 +407,8 @@ namespace eval restore {
</span>                             #
                             # Warn only once for every combination, otherwise users might see the same message multiple
                             # times.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                            if {![info exists seen_conflicts([dict get $portinfo name],$conflict)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                                set seen_conflicts([dict get $portinfo name],$conflict) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                            if {![dict exists $seen_conflicts [dict get $portinfo name] $conflict]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                                dict set seen_conflicts [dict get $portinfo name] $conflict 1
</span> 
                                 $progress intermission
                                 ui_warn "Snapshot contains $conflict, which conflicts with dependency [dict get $portinfo name]; assuming $conflict provides the functionality of [dict get $portinfo name]"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -436,7 +435,7 @@ namespace eval restore {
</span>                     $dependencies node insert $dependency
                 }
                 set dependency_requested_variants [[ditem_key $dep_ditem workername] eval {set requested_variants}]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                set dep_ports($dependency) $dependency_requested_variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set dep_ports $dependency $dependency_requested_variants
</span> 
                 $dependencies arc insert $provides $dependency
                 set worklist [linsert $worklist 0 $dependency]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -464,10 +463,10 @@ namespace eval restore {
</span> 
         foreach scc $portlist_sccs {
             foreach name $scc {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                if {[info exists ports($name)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    lappend operations [list $name {*}$ports($name)]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                } elseif {[info exists dep_ports($name)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    lappend operations [list $name 0 1 $dep_ports($name)]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[dict exists $ports $name]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    lappend operations [list $name {*}[dict get $ports $name]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                } elseif {[dict exists $dep_ports $name]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    lappend operations [list $name 0 1 [dict get $dep_ports $name]]
</span>                 } else {
                     lappend operations [list $name 0 1 {}]
                 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -480,7 +479,7 @@ namespace eval restore {
</span>     proc _handle_failure {failedName dependencies portname reason} {
         upvar $failedName failed
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set failed($portname) [list "failed" $reason]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict set failed $portname [list "failed" $reason]
</span> 
         set level "#[info level]"
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -491,7 +490,7 @@ namespace eval restore {
</span>             -command [lambda {level mode dependencies node} {
                 if {$mode eq "enter"} {
                     uplevel $level [subst -nocommands {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        set failed($node) [list "skipped" "dependency \$portname failed"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        dict set failed $node [list "skipped" "dependency \$portname failed"]
</span>                     }]
                 }
             } $level]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -502,7 +501,7 @@ namespace eval restore {
</span> 
         # map from port name to an entry describing why the port failed or was
         # skipped
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set failed {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set failed [dict create]
</span> 
         set index 0
         set length [llength $sorted_snapshot_portlist]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -516,8 +515,8 @@ namespace eval restore {
</span>                 ui_msg "$restore::ui_prefix Restoring port $index of $length: $name"
             }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[info exists failed($name)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                lassign $failed($name) type reason
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[dict exists $failed $name]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                lassign [dict get $failed $name] type reason
</span>                 switch $type {
                     skipped {
                         ui_msg "$macports::ui_prefix Skipping $name because its $reason"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -572,6 +571,6 @@ namespace eval restore {
</span> 
         $dependencies destroy
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        return [array get failed]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $failed
</span>     }
 }
</pre><pre style='margin:0'>

</pre>