<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>