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

<span style='display:block; white-space:pre;color:#404040;'>    portimage: use dict for options, portinfo, precious_dirs
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Also use a list for todeactivate since it's only ever iterated through,
</span><span style='display:block; white-space:pre;color:#404040;'>    and use fully qualified names for infrequently used globals.
</span>---
 src/registry2.0/portimage.tcl | 66 +++++++++++++++++++------------------------
 1 file changed, 29 insertions(+), 37 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/registry2.0/portimage.tcl b/src/registry2.0/portimage.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 7a1cbbed5..641ebae62 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/registry2.0/portimage.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/registry2.0/portimage.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -76,25 +76,23 @@ proc activate_composite {name {v ""} {optionslist ""}} {
</span> }
 
 # Activate a "Port Image"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc activate {name {version ""} {revision ""} {variants 0} {optionslist ""}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global macports::registry.path registry_open UI_PREFIX
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set options $optionslist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc activate {name {version ""} {revision ""} {variants 0} {options ""}} {
</span>     variable force
     variable noexec
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[info exists options(ports_force)] && [string is true -strict $options(ports_force)] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $options ports_force] && [string is true -strict [dict get $options ports_force]] } {
</span>         set force 1
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[info exists options(ports_activate_no-exec)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set noexec $options(ports_activate_no-exec)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $options ports_activate_no-exec]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set noexec [dict get $options ports_activate_no-exec]
</span>     }
     set rename_list [list]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[info exists options(portactivate_rename_files)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set rename_list $options(portactivate_rename_files)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $options portactivate_rename_files]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set rename_list [dict get $options portactivate_rename_files]
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![info exists registry_open]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        registry::open [::file join ${macports::registry.path} registry registry.db]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set registry_open yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists ::registry_open]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        registry::open [::file join ${::macports::registry.path} registry registry.db]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set ::registry_open yes
</span>     }
     set todeactivate [list]
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -143,7 +141,7 @@ proc activate {name {version ""} {revision ""} {variants 0} {optionslist ""}} {
</span>             }
         }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        ui_msg "$UI_PREFIX [format [msgcat::mc "Activating %s @%s"] $name $specifier]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_msg "$::UI_PREFIX [format [msgcat::mc "Activating %s @%s"] $name $specifier]"
</span> 
         _activate_contents $requested $rename_list
     } finally {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -165,11 +163,9 @@ proc deactivate_composite {name {v ""} {optionslist ""}} {
</span>     throw registry::invalid "Registry error: Invalid version '$v' specified for ${name}. Please specify a version as recorded in the port registry."
 }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc deactivate {name {version ""} {revision ""} {variants 0} {optionslist ""}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    global UI_PREFIX macports::registry.path registry_open
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set options $optionslist
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc deactivate {name {version ""} {revision ""} {variants 0} {options ""}} {
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[info exists options(ports_force)] && [string is true -strict $options(ports_force)] } {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $options ports_force] && [string is true -strict [dict get $options ports_force]] } {
</span>         # this not using the namespace variable is correct, since activate
         # needs to be able to force deactivate independently of whether
         # the activation is being forced
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -177,9 +173,9 @@ proc deactivate {name {version ""} {revision ""} {variants 0} {optionslist ""}}
</span>     } else {
         set force 0
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![info exists registry_open]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        registry::open [::file join ${macports::registry.path} registry registry.db]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set registry_open yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists ::registry_open]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        registry::open [::file join ${::macports::registry.path} registry registry.db]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set ::registry_open yes
</span>     }
 
     if {$name eq ""} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -250,7 +246,7 @@ proc deactivate {name {version ""} {revision ""} {variants 0} {optionslist ""}}
</span>         return -code error "Image error: ${name} @${specifier} is not active."
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![info exists options(ports_nodepcheck)] || ![string is true -strict $options(ports_nodepcheck)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![dict exists $options ports_nodepcheck] || ![string is true -strict [dict get $options ports_nodepcheck]]} {
</span>         set retvalue [registry::check_dependents $requested $force "deactivate"]
         if {$retvalue eq "quit"} {
             #registry::entry close $requested
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -258,7 +254,7 @@ proc deactivate {name {version ""} {revision ""} {variants 0} {optionslist ""}}
</span>         }
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    ui_msg "$UI_PREFIX [format [msgcat::mc "Deactivating %s @%s"] $name $specifier]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ui_msg "$::UI_PREFIX [format [msgcat::mc "Deactivating %s @%s"] $name $specifier]"
</span> 
     try {
         _deactivate_contents $requested [$requested files] $force
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -268,7 +264,6 @@ proc deactivate {name {version ""} {revision ""} {variants 0} {optionslist ""}}
</span> }
 
 proc _check_registry {name version revision variants {return_all 0}} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global UI_PREFIX
</span> 
     set searchkeys $name
     set composite_spec ""
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -291,7 +286,7 @@ proc _check_registry {name version revision variants {return_all 0}} {
</span>         set portilist [list]
         set msg "The following versions of $name are currently installed:"
         if {[macports::ui_isset ports_noninteractive]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui_msg "$UI_PREFIX [msgcat::mc $msg]"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_msg "$::UI_PREFIX [msgcat::mc $msg]"
</span>         }
         foreach i $ilist {
             set portstr [format "%s @%s_%s%s" [$i name] [$i version] [$i revision] [$i variants]]
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -302,7 +297,7 @@ proc _check_registry {name version revision variants {return_all 0}} {
</span>             if {[info exists macports::ui_options(questions_singlechoice)]} {
                 lappend portilist "$portstr"
             } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui_msg "$UI_PREFIX     $portstr"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_msg "$::UI_PREFIX     $portstr"
</span>             }
         }
         if {[info exists macports::ui_options(questions_singlechoice)]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -433,13 +428,12 @@ proc extract_archive_to_tmpdir {location} {
</span>                 }
             }
             t(ar|bz|lz|xz|gz) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                global macports::hfscompression
</span>                 # Opportunistic HFS compression. bsdtar will automatically
                 # disable this if filesystem does not support compression.
                 # Don't use if not running as root, due to bugs:
                 # The system bsdtar on 10.15 suffers from https://github.com/libarchive/libarchive/issues/497
                 # Later versions fixed that problem but another remains: https://github.com/libarchive/libarchive/issues/1415 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                if {${macports::hfscompression} && [getuid] == 0 &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                if {${::macports::hfscompression} && [getuid] == 0 &&
</span>                         ![catch {macports::binaryInPath bsdtar}] &&
                         ![catch {exec bsdtar -x --hfsCompression < /dev/null >& /dev/null}]} {
                     ui_debug "Using bsdtar with HFS+ compression (if valid)"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -559,7 +553,7 @@ proc _activate_contents {port {rename_list {}}} {
</span>     # Last, if the file exists, and belongs to another port, and force is set
     #  we remove the file from the file_map, take ownership of it, and
     #  clobber it
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set todeactivate {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set todeactivate [list]
</span>     try {
         registry::write {
             foreach file $imagefiles {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -577,11 +571,10 @@ proc _activate_contents {port {rename_list {}}} {
</span>                 if {$owner ne {} && $owner ne $port} {
                     # deactivate conflicting port if it is replaced_by this one
                     set result [mportlookup [$owner name]]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    array unset portinfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    array set portinfo [lindex $result 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if {[info exists portinfo(replaced_by)] && [lsearch -regexp $portinfo(replaced_by) $replaced_by_re] != -1} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    set portinfo [lindex $result 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    if {[dict exists $portinfo replaced_by] && [lsearch -regexp [dict get $portinfo replaced_by] $replaced_by_re] != -1} {
</span>                         # we'll deactivate the owner later, but before activating our files
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                        set todeactivate($owner) yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                        lappend todeactivate $owner
</span>                         set owner "replaced"
                     }
                 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -639,7 +632,7 @@ proc _activate_contents {port {rename_list {}}} {
</span>         }
 
         # deactivate ports replaced_by this one
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        foreach owner [array names todeactivate] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foreach owner $todeactivate {
</span>             if {$noexec || ![registry::run_target $owner deactivate [list ports_nodepcheck 1]]} {
                 deactivate [$owner name] "" "" 0 [list ports_nodepcheck 1]
             }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -728,7 +721,7 @@ proc _activate_contents {port {rename_list {}}} {
</span>                 ::file rename -force -- "${file}${baksuffix}" $file
             }
             # reactivate deactivated ports
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            foreach entry [array names todeactivate] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            foreach entry $todeactivate {
</span>                 if {[$entry state] eq "imaged" && ($noexec || ![registry::run_target $entry activate ""])} {
                     activate [$entry name] [$entry version] [$entry revision] [$entry variants] [list ports_activate_no-exec $noexec]
                 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -741,7 +734,7 @@ proc _activate_contents {port {rename_list {}}} {
</span> 
         throw [dict get $eOptions -errorcode] [dict get $eOptions -errorinfo]
     } finally {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        #foreach entry [array names todeactivate] {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        #foreach entry $todeactivate {
</span>         #    registry::entry close $entry
         #}
         # remove temp image dir
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -751,8 +744,7 @@ proc _activate_contents {port {rename_list {}}} {
</span> 
 # These directories should not be removed during deactivation even if they are empty.
 # TODO: look into what other dirs should go here
<span style='display:block; white-space:pre;background:#ffe0e0;'>-variable precious_dirs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-array set precious_dirs { /Library/LaunchDaemons 1 /Library/LaunchAgents 1 }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+variable precious_dirs [dict create /Library/LaunchDaemons 1 /Library/LaunchAgents 1]
</span> 
 proc _deactivate_file {dstfile} {
     if {[catch {::file type $dstfile} filetype]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -766,7 +758,7 @@ proc _deactivate_file {dstfile} {
</span>         # 0 item means empty.
         if { [llength [readdir $dstfile]] == 0 } {
             variable precious_dirs
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {![info exists precious_dirs($dstfile)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![dict exists $precious_dirs $dstfile]} {
</span>                 ui_debug "deactivating directory: $dstfile"
                 ::file delete -- $dstfile
             } else {
</pre><pre style='margin:0'>

</pre>