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