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

<span style='display:block; white-space:pre;color:#404040;'>    portutil: use dict for vinfo etc
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Also use fully qualified names for infrequently used globals.
</span>---
 src/port1.0/portutil.tcl        | 180 ++++++++++++++++------------------------
 src/port1.0/tests/portutil.test |  29 ++++---
 2 files changed, 87 insertions(+), 122 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/portutil.tcl b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 68fcd79bf..75c79004b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/portutil.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -86,9 +86,9 @@ proc exists {option} {
</span> # @param option name of the option
 # @param args arguments
 proc handle_option {option args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global $option user_options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global $option
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![info exists user_options($option)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists ::user_options($option)]} {
</span>         set $option $args
     }
 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -99,9 +99,9 @@ proc handle_option {option args} {
</span> # @param option name of the option
 # @param args arguments
 proc handle_option-append {option args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global $option user_options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global $option
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![info exists user_options($option)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists ::user_options($option)]} {
</span>         lappend $option {*}$args
     }
 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -112,9 +112,9 @@ proc handle_option-append {option args} {
</span> # @param option name of the option
 # @param args arguments
 proc handle_option-prepend {option args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global $option user_options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global $option
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![info exists user_options($option)]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists ::user_options($option)]} {
</span>         if {[info exists $option]} {
             set $option [concat $args [set $option]]
         } else {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -129,9 +129,9 @@ proc handle_option-prepend {option args} {
</span> # @param option name of the option
 # @param args arguments
 proc handle_option-delete {option args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global $option user_options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global $option
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![info exists user_options($option)] && [info exists $option]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists ::user_options($option)] && [info exists $option]} {
</span>         foreach val $args {
             set $option [ldelete [set $option][set $option {}] $val]
         }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -144,9 +144,9 @@ proc handle_option-delete {option args} {
</span> # @param option name of the option
 # @param args arguments
 proc handle_option-strsed {option args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global $option user_options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global $option
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![info exists user_options($option)] && [info exists $option]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists ::user_options($option)] && [info exists $option]} {
</span>         foreach val $args {
             set $option [strsed [set $option][set $option {}] $val]
         }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -159,9 +159,9 @@ proc handle_option-strsed {option args} {
</span> # @param option name of the option
 # @param args arguments
 proc handle_option-replace {option args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global $option user_options
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global $option
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![info exists user_options($option)] && [info exists $option]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists ::user_options($option)] && [info exists $option]} {
</span>         foreach {old new} $args {
             set index [lsearch -exact [set $option] $old]
             if {$index != -1} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -258,9 +258,8 @@ proc get_deprecated_options {} {
</span> # @param option name of the option
 # @param newoption name of a superseding option
 proc option_deprecate {option {newoption ""} } {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global deprecated_options
</span>     # If a new option is specified, default the option to $newoption
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set deprecated_options($option) [list $newoption 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set ::deprecated_options($option) [list $newoption 0]
</span>     # Create a normal option for compatibility
     options $option
     # Register a proc for handling the deprecation
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -452,7 +451,7 @@ proc command_exec {args} {
</span>     # Call this command.
     # TODO: move that to the system native call?
     # Save the environment.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set saved_env [array get env]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set saved_env [array get env]
</span>     # Set the overridden variables from the portfile.
     array set env [array get ${varprefix}.env_array]
     # Call the command.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -468,7 +467,7 @@ proc command_exec {args} {
</span> 
     # Restore the environment.
     array unset env *
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set env [array get saved_env]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    array set env $saved_env
</span> 
     # Return as if system had been called directly.
     return -code $code -errorcode $errcode -errorinfo $errinfo $result
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -562,7 +561,7 @@ proc handle_option_string {option action args} {
</span> # variant <provides> [<provides> ...] [requires <requires> [<requires>]]
 # Portfile level procedure to provide support for declaring variants
 proc variant {args} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global all_variants PortInfo porturl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global PortInfo
</span> 
     # Each key in PortInfo(vinfo) maps to an array which contains the
     # following keys:
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -571,9 +570,8 @@ proc variant {args} {
</span>     #   * is_default: This key exists iff the variant is a default variant.
     #   * requires
     if {![info exists PortInfo(vinfo)]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        set PortInfo(vinfo) [list]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set PortInfo(vinfo) [dict create]
</span>     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set vinfo $PortInfo(vinfo)
</span> 
     set len [llength $args]
     if {$len < 2} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -618,16 +616,11 @@ proc variant {args} {
</span>         # This variant was already defined. Remove it from the dlist.
         variant_remove_ditem $variant_provides
     } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Create an array to contain the variant's information.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {![info exists vinfo($variant_provides)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set vinfo($variant_provides) [list]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set variant $vinfo($variant_provides)
</span> 
         # Set conflicts.
         set vconflicts [join [lsort [ditem_key $ditem conflicts]]]
         if {$vconflicts ne ""} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            array set variant [list conflicts $vconflicts]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict set PortInfo(vinfo) $variant_provides conflicts $vconflicts
</span>         }
 
         lappend PortInfo(variants) $variant_provides
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -635,25 +628,21 @@ proc variant {args} {
</span> 
         # read global variant description, if none given
         if {$vdesc eq ""} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set vdesc [variant_desc $porturl $variant_provides]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set vdesc [variant_desc $::porturl $variant_provides]
</span>         }
 
         # Set description.
         if {$vdesc ne ""} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            array set variant [list description $vdesc]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict set PortInfo(vinfo) $variant_provides description $vdesc
</span>         }
 
         # Set requires.
         set vrequires [join [lsort [ditem_key $ditem requires]]]
         if {$vrequires ne ""} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            array set variant [list requires $vrequires]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict set PortInfo(vinfo) $variant_provides requires $vrequires
</span>         }
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Add the variant (back) to PortInfo(vinfo).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set vinfo [list $variant_provides [array get variant]]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set PortInfo(vinfo) [array get vinfo]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span>     if {[variant_isset $variant_provides]} {
         # set variants that this one requires
         foreach req [ditem_key $ditem requires] {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -662,15 +651,13 @@ proc variant {args} {
</span>     }
 
     # Finally append the ditem to the dlist.
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    lappend all_variants $ditem
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    lappend ::all_variants $ditem
</span> }
 
 # variant_isset name
 # Returns 1 if variant name selected, otherwise 0
 proc variant_isset {name} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global variations
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[info exists variations($name)] && $variations($name) eq "+"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[info exists ::variations($name)] && $::variations($name) eq "+"} {
</span>         return 1
     }
     return 0
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -679,8 +666,7 @@ proc variant_isset {name} {
</span> # variant_set name
 # Sets variant to run for current portfile
 proc variant_set {name} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global variations
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set variations($name) +
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set ::variations($name) +
</span> }
 
 # variant_remove_ditem name
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -707,17 +693,14 @@ proc variant_delete {name} {
</span>         set ::PortInfo(variants) [ldelete $::PortInfo(variants) $name]
     }
     if {[info exists ::PortInfo(vinfo)]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set vinfo $::PortInfo(vinfo)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        unset -nocomplain vinfo($name)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set ::PortInfo(vinfo) [array get vinfo]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict unset ::PortInfo(vinfo) $name
</span>     }
 }
 
 # variant_exists name
 # determine if a variant exists.
 proc variant_exists {name} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global PortInfo
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[info exists PortInfo(variants)] && $name in $PortInfo(variants)} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[info exists ::PortInfo(variants)] && $name in $::PortInfo(variants)} {
</span>         return 1
     }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -731,29 +714,29 @@ proc variant_exists {name} {
</span> proc load_variant_desc_file {descfile} {
     global variant_descs_global
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {![info exists variant_descs_global($descfile)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set variant_descs_global($descfile) yes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[file exists $descfile]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui_debug "Reading variant descriptions from $descfile"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![info exists variant_descs_global]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set variant_descs_global [dict create]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {![dict exists $variant_descs_global $descfile] && [file exists $descfile]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        ui_debug "Reading variant descriptions from $descfile"
</span> 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {[catch {set fd [open $descfile r]} err]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                ui_warn "Could not open global variant description file: $err"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                return ""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set lineno 0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            while {[gets $fd line] >= 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                incr lineno
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set name [lindex $line 0]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set desc [lindex $line 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                if {$name ne "" && $desc ne ""} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    set variant_descs_global(${descfile}_$name) $desc
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    ui_warn "Invalid variant description in $descfile at line $lineno"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict set variant_descs_global $descfile [dict create]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[catch {set fd [open $descfile r]} err]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_warn "Could not open global variant description file: $err"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set lineno 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        while {[gets $fd line] >= 0} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            incr lineno
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set name [lindex $line 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            set desc [lindex $line 1]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {$name ne "" && $desc ne "" && ![dict exists $variant_descs_global $descfile $name]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                dict set variant_descs_global $descfile $name $desc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                ui_warn "Invalid variant description in $descfile at line $lineno"
</span>             }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            close $fd
</span>         }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        close $fd
</span>     }
 }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -769,14 +752,14 @@ proc variant_desc {porturl variant} {
</span>     set descfile [getportresourcepath $porturl "port1.0/variant_descriptions.conf" no]
     load_variant_desc_file $descfile
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[info exists variant_descs_global(${descfile}_${variant})]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        return $variant_descs_global(${descfile}_${variant})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict exists $variant_descs_global ${descfile} ${variant}]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        return [dict get $variant_descs_global ${descfile} ${variant}]
</span>     } else {
         set descfile [getdefaultportresourcepath "port1.0/variant_descriptions.conf"]
         load_variant_desc_file $descfile
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {[info exists variant_descs_global(${descfile}_${variant})]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            return $variant_descs_global(${descfile}_${variant})
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[dict exists $variant_descs_global ${descfile} ${variant}]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            return [dict get $variant_descs_global ${descfile} ${variant}]
</span>         }
 
         return ""
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1972,7 +1955,7 @@ proc check_statefile_variants {variations oldvariations fd} {
</span>     upvar $variations upvariations
     upvar $oldvariations upoldvariations
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set upoldvariations {}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set upoldvariations [dict create]
</span> 
     set variants_found no
     set targets_found no
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1981,7 +1964,7 @@ proc check_statefile_variants {variations oldvariations fd} {
</span>     seek $fd 0
     while {[gets $fd line] >= 0} {
         if {[regexp $variant_re $line match name]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            set upoldvariations([string range $name 1 end]) [string range $name 0 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict set upoldvariations [string range $name 1 end] [string range $name 0 0]
</span>             set variants_found yes
         }
         if {[regexp $target_re $line]} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1995,11 +1978,11 @@ proc check_statefile_variants {variations oldvariations fd} {
</span>     }
 
     set mismatch 0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {[array size upoldvariations] != [array size upvariations]} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {[dict size $upoldvariations] != [dict size $upvariations]} {
</span>         set mismatch 1
     } else {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        foreach key [array names upvariations *] {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {![info exists upoldvariations($key)] || $upvariations($key) ne $upoldvariations($key)} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        dict for {key val} $upvariations {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            if {![dict exists $upoldvariations $key] || $val ne [dict get $upoldvariations $key]} {
</span>                 set mismatch 1
                 break
             }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2075,11 +2058,10 @@ proc variant_run {ditem} {
</span>     # variants in a string in a standard order as +var1+var2 etc.
     # Can also do the same for -variants, for recording the negated list.
 proc canonicalize_variants {variants {sign "+"}} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set vara $variants
</span>     set result ""
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set vlist [lsort -ascii [array names vara]]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set vlist [lsort -ascii [dict keys $variants]]
</span>     foreach v $vlist {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {$vara($v) eq $sign} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        if {[dict get $variants $v] eq $sign} {
</span>             append result "${sign}${v}"
         }
     }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2087,12 +2069,10 @@ proc canonicalize_variants {variants {sign "+"}} {
</span> }
 
 proc eval_variants {variations} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global all_variants PortInfo requested_variations portvariants requested_variants
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set dlist $all_variants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    global PortInfo requested_variations portvariants
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set dlist $::all_variants
</span>     upvar $variations upvariations
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set chosen [choose_variants $dlist upvariations]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set negated [lindex $chosen 1]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set chosen [lindex $chosen 0]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    lassign [choose_variants $dlist upvariations] chosen negated
</span>     set portname [option subport]
 
     # Check to make sure the requested variations are available with this
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2168,7 +2148,7 @@ proc eval_variants {variations} {
</span>             lappend negated_list $thevar "-"
         }
     }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set requested_variants [canonicalize_variants $requested_list "+"][canonicalize_variants $negated_list "-"]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set ::requested_variants [canonicalize_variants $requested_list "+"][canonicalize_variants $negated_list "-"]
</span> 
     return 0
 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2176,7 +2156,7 @@ proc eval_variants {variations} {
</span> proc check_variants {target} {
     global targets ports_force ports_dryrun PortInfo
     set result 0
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set variations $PortInfo(active_variants)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set variations $PortInfo(active_variants)
</span> 
     # Make sure the variations match those stored in the statefile.
     # If they don't match, print an error indicating a 'port clean'
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2202,15 +2182,14 @@ proc check_variants {target} {
</span> 
         set state_fd [open_statefile]
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set oldvariations {}
</span>         if {![tbool ports_force] && [check_statefile_variants variations oldvariations $state_fd]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            ui_error "Requested variants \"[canonicalize_variants [array get variations]]\" do not match those the build was started with: \"[canonicalize_variants [array get oldvariations]]\"."
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ui_error "Requested variants \"[canonicalize_variants $variations]\" do not match those the build was started with: \"[canonicalize_variants $oldvariations]\"."
</span>             ui_error "Please use the same variants again, or run 'port clean [option subport]' first to remove the existing partially completed build."
             set result 1
         } elseif {![tbool ports_dryrun]} {
             # Write variations out to the statefile
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            foreach key [array names variations *] {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                write_statefile variant $variations($key)$key $state_fd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            dict for {key val} $variations {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                write_statefile variant ${val}${key} $state_fd
</span>             }
         }
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2249,13 +2228,12 @@ proc universal_setup {args} {
</span> 
 # constructor for target object
 proc target_new {name procedure} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    global targets
</span>     set ditem [ditem_create]
 
     ditem_key $ditem name $name
     ditem_key $ditem procedure $procedure
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    lappend targets $ditem
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    lappend ::targets $ditem
</span> 
     return $ditem
 }
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2357,33 +2335,21 @@ proc variant_new {name} {
</span> 
 proc handle_default_variants {option action {value ""}} {
     global PortInfo variations
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    switch -regex $action {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set|append {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # Retrieve the information associated with each variant.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            if {![info exists PortInfo(vinfo)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                set PortInfo(vinfo) [list]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            array set vinfo $PortInfo(vinfo)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    switch $action {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        append -
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        set {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            # Parse each value as a variant name and sign.
</span>             set re {([-+])([-A-Za-z0-9_.]+)}
             foreach v $value {
                 if {[regexp $re $v whole val variant]} {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    # Retrieve the information associated with this variant.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    if {![info exists vinfo($variant)]} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                        set vinfo($variant) {}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    array unset info
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    array set info $vinfo($variant)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    # Set is_default and update vinfo.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    set info(is_default) $val
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    array set vinfo [list $variant [array get info]]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # Set is_default in the associated vinfo.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    dict set PortInfo(vinfo) $variant is_default $val
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    # Add the default value to variations if not already set
</span>                     if {![info exists variations($variant)]} {
                         set variations($variant) $val
                     }
                 }
             }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-            # Update PortInfo(vinfo).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set PortInfo(vinfo) [array get vinfo]
</span>         }
         delete {
             # xxx
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/port1.0/tests/portutil.test b/src/port1.0/tests/portutil.test
</span><span style='display:block; white-space:pre;color:#808080;'>index fce070a75..8af7883a9 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/port1.0/tests/portutil.test
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/port1.0/tests/portutil.test
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -589,27 +589,25 @@ test write_statefile {
</span> test check_statefile_variants {
     Check statefile unit test.
 } -setup {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set variations {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    target org.macports.fetch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    target org.macports.checksum
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set oldvariations {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    target org.macports.fetch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    target org.macports.checksum
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    array set oldvariations_fail {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    target org.macports.patch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set fd [open $pwd/statefile r]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set variations [dict create \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        foo + \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        bar + \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    ]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set fd [open $pwd/test.statefile w+]
</span> 
 } -body {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    write_statefile variant +foo $fd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    write_statefile variant +bar $fd
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set res [check_statefile_variants variations oldvariations $fd]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$res != 0} {return "FAIL: non-matching variants: $oldvariations"}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    write_statefile variant +extra $fd
</span>     set res [check_statefile_variants variations oldvariations $fd]
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {$res != 0} {return "FAIL: invalid variant"}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set res [check_statefile_variants variations oldvariations_fail $fd]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {$res != 1} {return "FAIL: invalid variant"}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$res != 1} {return "FAIL: unexpectedly matching variants: $oldvariations"}
</span>     close $fd
     return "Check statefile successful."
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+} -cleanup {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    file delete -force $pwd/test.statefile
</span> } -result "Check statefile successful."
 
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -617,6 +615,7 @@ test choose_variants {
</span>     Choose variants unit test.
 } -setup {
     init_eval_targets
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    unset -nocomplain variations
</span>     array set variations { fondu + }
     array set variations_neg { fondu - }
     array set variations_not { fondu a }
</pre><pre style='margin:0'>

</pre>