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

<span style='display:block; white-space:pre;color:#404040;'>    reclaim: use dict for options, variations, portinfo
</span>---
 src/macports1.0/reclaim.tcl | 113 +++++++++++++++++++++-----------------------
 1 file changed, 55 insertions(+), 58 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/macports1.0/reclaim.tcl b/src/macports1.0/reclaim.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index aac542bc3..a80c0d075 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/macports1.0/reclaim.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/macports1.0/reclaim.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -61,13 +61,12 @@ namespace eval reclaim {
</span>         # Returns:
         #           None
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set options $opts
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[info exists options(ports_reclaim_enable-reminders)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[dict exists $opts ports_reclaim_enable-reminders]} {
</span>             ui_info "Enabling port reclaim reminders."
             update_last_run
             return
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[info exists options(ports_reclaim_disable-reminders)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[dict exists $opts ports_reclaim_disable-reminders]} {
</span>             ui_info "Disabling port reclaim reminders."
             write_last_run_file disabled
             return
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -221,21 +220,18 @@ namespace eval reclaim {
</span>     # return the variations that would be used when upgrading a port
     # installed with the given requested variants
     proc get_variations {installed_variants} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set vararray {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        foreach v [array names macports::global_variations] {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set vararray($v) $macports::global_variations($v)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set vararray [dict create {*}[array get macports::global_variations]]
</span>         set splitvariant [split $installed_variants -]
         set minusvariant [lrange $splitvariant 1 end]
         set splitvariant [split [lindex $splitvariant 0] +]
         set plusvariant [lrange $splitvariant 1 end]
         foreach v $plusvariant {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set vararray($v) +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict set vararray $v +
</span>         }
         foreach v $minusvariant {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set vararray($v) -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict set vararray $v -
</span>         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        return [array get varray]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return $vararray
</span>     }
 
     proc load_distfile_cache {varname} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -244,27 +240,31 @@ namespace eval reclaim {
</span>             set fd [open |[list $macports::autoconf::gzip_path -d < [file join $macports::portdbpath reclaim distfiles.gz]] r]
             set data [gets $fd]
             close $fd
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            array set var $data
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {$var(:global_variations) ne [array get macports::global_variations]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                array unset var
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                array set var [list]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                unset var(:global_variations)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set var [dict create {*}$data]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set cached_gv [dict get $var :global_variations]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set allkeys [lsort -unique [concat [dict keys $cached_gv] [array names macports::global_variations]]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach key $allkeys {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {![dict exists $cached_gv $key] || ![info exists macports::global_variations($key)]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        || [dict get $cached_gv $key] ne $macports::global_variations($key)} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # global variations changed, so cache is invalidated
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set var [dict create]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    break
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                }
</span>             }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict unset var :global_variations
</span>         } on error {eMessage} {
             ui_debug "Failed to load distfiles cache: $eMessage"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            array set var [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set var [dict create]
</span>             catch {close $fd}
         }
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    proc save_distfile_cache {varname} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        upvar $varname var
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    proc save_distfile_cache {cache} {
</span>         macports_try -pass_signal {
             file mkdir [file join $macports::portdbpath reclaim]
             set fd [open |[list $macports::autoconf::gzip_path > [file join $macports::portdbpath reclaim distfiles.gz]] w]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set var(:global_variations) [array get macports::global_variations]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            puts $fd [array get var]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict set cache :global_variations [array get macports::global_variations]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            puts $fd [dict get $cache]
</span>             close $fd
         } on error {eMessage} {
             ui_debug "Failed to save distfiles cache: $eMessage"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -279,12 +279,9 @@ namespace eval reclaim {
</span>         # Returns:
         #               0 on successful execution
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        global macports::portdbpath
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        global macports::user_home
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span>         # The root and home distfile folder locations, respectively. 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set root_dist       [file join ${macports::portdbpath} distfiles]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set home_dist       ${macports::user_home}/.macports$root_dist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set root_dist       [file join ${::macports::portdbpath} distfiles]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set home_dist       ${::macports::user_home}/.macports$root_dist
</span> 
         set files_in_use [list]
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -301,6 +298,7 @@ namespace eval reclaim {
</span> 
         ui_msg "$macports::ui_prefix Building list of distfiles still in use"
         load_distfile_cache distfile_cache_prev
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        set distfile_cache_new [dict create]
</span>         set installed_ports [registry::entry imaged]
         set port_count [llength $installed_ports]
         set i 1
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -309,34 +307,34 @@ namespace eval reclaim {
</span>         foreach port $installed_ports {
             # skip additional versions installed with the same variants
             set cache_key [$port name],[$port requested_variants]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[info exists distfile_cache_new($cache_key)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[dict exists $distfile_cache_new $cache_key]} {
</span>                 continue
             }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            array unset cacheinfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            array unset portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set cacheinfo [dict create]
</span>             if {[catch {mportlookup [$port name]} lookup_result] || [llength $lookup_result] < 2} {
                 ui_warn [msgcat::mc "Port %s not found: %s" [$port name] $lookup_result]
                 continue
             }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            array set portinfo [lindex $lookup_result 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            lassign $lookup_result portname portinfo
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set porturl [dict get $portinfo porturl]
</span> 
             set parse_needed yes
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set portfile_hash [sha256 file [file join [macports::getportdir $portinfo(porturl)] Portfile]]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set fingerprint $portinfo(version)_$portinfo(revision)_${portfile_hash}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[info exists distfile_cache_prev($cache_key)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                array set cacheinfo $distfile_cache_prev($cache_key)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if {$cacheinfo(fingerprint) eq $fingerprint} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set portfile_hash [sha256 file [file join [macports::getportdir $porturl] Portfile]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set fingerprint [dict get $portinfo version]_[dict get $portinfo revision]_${portfile_hash}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[dict exists $distfile_cache_prev $cache_key]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set cacheinfo [dict get $distfile_cache_prev $cache_key]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[dict get $cacheinfo fingerprint] eq $fingerprint} {
</span>                     set parse_needed no
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    set distfile_cache_new($cache_key) $distfile_cache_prev($cache_key)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    dict set distfile_cache_new $cache_key [dict get $distfile_cache_prev $cache_key]
</span>                 }
             }
 
             if {$parse_needed} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                set cacheinfo(fingerprint) $fingerprint
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set cacheinfo fingerprint $fingerprint
</span>                 # Get mport reference
                 macports_try -pass_signal {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    set mport [mportopen $portinfo(porturl) [list subport $portinfo(name)] [get_variations [$port requested_variants]]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set mport [mportopen $porturl [dict create subport $portname] [get_variations [$port requested_variants]]]
</span>                 } on error {eMessage} {
                     $progress intermission
                     ui_warn [msgcat::mc "Failed to open port %s %s: %s" [$port name] [$port requested_variants] $eMessage]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -348,28 +346,28 @@ namespace eval reclaim {
</span>                 set workername [ditem_key $mport workername]
 
                 # Append that port's distfiles to the list
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                set cacheinfo(dist_subdir) [$workername eval [list set dist_subdir]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set cacheinfo dist_subdir [$workername eval [list set dist_subdir]]
</span>                 set distfiles [$workername eval [list set distfiles]]
                 if {[catch {$workername eval [list set patchfiles]} patchfiles]} {
                     set patchfiles [list]
                 }
                 set filespath [$workername eval [list set filespath]]
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                set cacheinfo(distfiles) [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set cacheinfo distfiles [list]
</span>                 foreach file [concat $distfiles $patchfiles] {
                     # get filename without any tag
                     set distfile [$workername eval [list getdistname $file]]
                     if {![file exists [file join $filespath $distfile]]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        lappend cacheinfo(distfiles) $distfile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        dict lappend cacheinfo distfiles $distfile
</span>                     }
                 }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                set distfile_cache_new($cache_key) [array get cacheinfo]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set distfile_cache_new $cache_key $cacheinfo
</span>                 mportclose $mport
             }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            foreach distfile $cacheinfo(distfiles) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set root_path [file join $root_dist $cacheinfo(dist_subdir) $distfile]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set home_path [file join $home_dist $cacheinfo(dist_subdir) $distfile]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach distfile [dict get $cacheinfo distfiles] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set root_path [file join $root_dist [dict get $cacheinfo dist_subdir] $distfile]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                set home_path [file join $home_dist [dict get $cacheinfo dist_subdir] $distfile]
</span> 
                 # Add the full file path to the list, depending where it's located.
                 if {[file isfile $root_path]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -386,9 +384,7 @@ namespace eval reclaim {
</span>             #registry::entry close $port
             incr i
         }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        array unset distfile_cache_prev
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        save_distfile_cache distfile_cache_new
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        array unset distfile_cache_new
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        save_distfile_cache $distfile_cache_new
</span> 
         $progress finish
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -657,10 +653,11 @@ namespace eval reclaim {
</span>             if {${retval} == 0 && [macports::global_option_isset ports_dryrun]} {
                 ui_msg "Skipping uninstall of inactive ports (dry run)"
             } elseif {${retval} == 0} {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+                set options [dict create ports_force true]
</span>                 foreach port $inactive_ports {
                     # Note: 'uninstall' takes a name, version, revision, variants and an options list.
                     macports_try -pass_signal {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        registry_uninstall::uninstall [$port name] [$port version] [$port revision] [$port variants] {ports_force true}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        registry_uninstall::uninstall [$port name] [$port version] [$port revision] [$port variants] $options
</span>                     } on error {eMessage} {
                         ui_error "Error uninstalling $name: $eMessage"
                     }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -690,26 +687,26 @@ namespace eval reclaim {
</span>         set unnecessary_names  [list]
         set unnecessary_count  0
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set isrequested {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set isrequested [dict create]
</span> 
         ui_msg "$macports::ui_prefix Checking for unnecessary unrequested ports"
 
         foreach port [sort_portlist_by_dependendents [registry::entry imaged]] {
             set portname [$port name]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {![info exists isrequested($portname)] || $isrequested($portname) == 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set isrequested($portname) [$port requested]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![dict exists $isrequested $portname] || [dict get $isrequested $portname] == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set isrequested $portname [$port requested]
</span>             }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {$isrequested($portname) == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {[dict get $isrequested $portname] == 0} {
</span>                 set dependents [$port dependents]
                 foreach dependent $dependents {
                     set dname [$dependent name]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if {![info exists isrequested($dname)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {![dict exists $isrequested $dname]} {
</span>                         ui_debug "$portname appears to have a circular dependency involving $dname"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        set isrequested($portname) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        dict set isrequested $portname 1
</span>                         break
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    } elseif {$isrequested($dname) != 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    } elseif {[dict get $isrequested $dname] != 0} {
</span>                         ui_debug "$portname is requested by $dname"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        set isrequested($portname) 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        dict set isrequested $portname 1
</span>                         break
                     }
                 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -717,7 +714,7 @@ namespace eval reclaim {
</span>                 #    registry::entry close $dependent
                 #}
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                if {$isrequested($portname) == 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {[dict get $isrequested $portname] == 0} {
</span>                     lappend unnecessary_ports $port
                     lappend unnecessary_names "$portname @[$port version]_[$port revision][$port variants]"
                     incr unnecessary_count
</pre><pre style='margin:0'>

</pre>