<pre style='margin:0'>
Clemens Lang (neverpanic) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/32fde40ec67b5d12d7fa508b0da171118d0cad30">https://github.com/macports/macports-ports/commit/32fde40ec67b5d12d7fa508b0da171118d0cad30</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit 32fde40ec67b5d12d7fa508b0da171118d0cad30
</span>Author: Joshua Root <jmr@macports.org>
AuthorDate: Thu Jul 10 16:41:52 2025 +1000

<span style='display:block; white-space:pre;color:#404040;'>    mpstats: use tcllib's json::write
</span>---
 sysutils/mpstats/files/mpstats.tcl | 180 ++++++-------------------------------
 1 file changed, 27 insertions(+), 153 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/sysutils/mpstats/files/mpstats.tcl b/sysutils/mpstats/files/mpstats.tcl
</span><span style='display:block; white-space:pre;color:#808080;'>index 3c90fad847a..48ca8ea1ab5 100755
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/sysutils/mpstats/files/mpstats.tcl
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/sysutils/mpstats/files/mpstats.tcl
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -30,6 +30,7 @@
</span> 
 set prefix "@PREFIX@"
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+package require json::write
</span> package require macports
 if {[catch {mportinit} result]} {
     puts stderr "Error: $result"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -120,118 +121,19 @@ proc getcltinfo {} {
</span> 
 ###### JSON Encoding helper procs ######
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-##
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Return JSON encoding of a flat "key":"value" dictionary
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param data
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        the variable name of the dict to encode
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param indent
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        an optional indentation string that will be printed at the start of each new line
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @returns
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        the given dict, as JSON-formatted string
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc json_encode_dict {data {indent ""}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    upvar 1 $data db
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set size [dict size $db]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set i 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    # Initialize the JSON string string
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set json "\{"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    dict for {key values} $db {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set line "\n${indent}  \"$key\": \"[dict get $db $key]\""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Check if there are any subsequent items
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {$i < $size} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            append line ","
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Add line to the JSON string
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        append json $line
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        incr i
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {$size > 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        append json "\n${indent}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    append json "\}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return $json
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-##
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# Encodes a list of strings as a JSON array
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param data
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        the list to be encoded in JSON
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param indent
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        an optional indentation string that will be printed at the start of each new line
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @returns
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        the given list, as JSON-formatted string
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-proc json_encode_list {data {indent ""}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set size [llength $data]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set i 1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set json "\["
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach item $data {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        append json "\n  "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        append json $data
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Check if there are any subsequent items
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {$i < $size} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            append json ","
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        incr i
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {$size > 0} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        append json "\n${indent}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    append json "\]"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return $json
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> ##
 # Encode a port (from a portlist entry) as a JSON object
 #
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param data
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        the name of the portinfo variable for the port to be encoded
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param indent
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        an optional indentation string that will be printed at the start of each new line
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# @param port_info
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#        the portinfo dict for the port to be encoded
</span> # @returns
 #        the given port, represented as JSON object with the keys name, version and variants, if
 #        present
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc json_encode_port {port_info {indent ""}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    upvar 1 $port_info port
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set first true
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set json "\{"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach name {name version requested variants} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Skip empty strings
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {$port($name) eq ""} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            continue
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Prepend a comma if this isn't the first item that has been processed
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {!$first} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # Add a comma
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            append json ", "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set first false
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Format the entry as "name_string":"value"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        append json "\"$name\": \"$port($name)\""
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    append json "\}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return $json
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc json_encode_port {port_info} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set port_info [dict filter $port_info script {key val} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        expr {$val ne ""}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [json::write object-strings {*}$port_info]
</span> }
 
 ##
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -239,37 +141,11 @@ proc json_encode_port {port_info {indent ""}} {
</span> #
 # @param data
 #        the list of ports to be encoded in JSON
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param indent
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        an optional indentation string that will be printed at the start of each new line
</span> # @returns
 #        the given list of ports, encoded as JSON array of return values of json_encode_port
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc json_encode_portlist {portlist {indent ""}} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set json "\["
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set first true
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    foreach i $portlist {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        array set port $i
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        set encoded [json_encode_port port "${indent}  "]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Prepend a comma if this isn't the first item that has been processed
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        if {!$first} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            # Add a comma
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            append json ","
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        } else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-            set first false
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        # Append encoded json object
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        append json "\n${indent}  ${encoded}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    if {!$first} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-        append json "\n${indent}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    append json "\]"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return $json
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc json_encode_portlist {portlist} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set portlist [lmap i $portlist {json_encode_port $i}]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [json::write array {*}$portlist]
</span> }
 
 ##
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -277,23 +153,17 @@ proc json_encode_portlist {portlist {indent ""}} {
</span> #
 # @param id
 #        the statistics UUID for this installation
<span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param os_dict
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        the variable name of the dict holding statistics about the OS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-# @param ports_dict
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-#        the variable name of the dict holding statistics about the installed ports
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# @param os
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#        dict holding statistics about the OS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# @param ports
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#        dict holding statistics about the installed ports
</span> # @returns
 #        a JSON-encoded string in the format required by the statistics server ready for submission
<span style='display:block; white-space:pre;background:#ffe0e0;'>-proc json_encode_stats {id os_dict ports_dict} {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    upvar 1 $os_dict os
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    upvar 1 $ports_dict ports
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set json "\{"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    append json "\n  \"id\": \"$id\","
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    append json "\n  \"os\": [json_encode_dict os "  "],"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    append json "\n  \"active_ports\": [json_encode_portlist [dict get $ports "active"] "  "]"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    append json "\n\}"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    return $json
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+proc json_encode_stats {id os ports} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    return [json::write object \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            id [json::write string $id] \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            os [json::write object-strings {*}$os] \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            active_ports [json_encode_portlist [dict get $ports active]]]
</span> }
 
 ##
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -394,7 +264,7 @@ proc action_stats {subcommands} {
</span>     dict set os clt_version [getcltinfo]
 
     # Build dictionary of port information
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    dict set ports active   [get_installed_ports yes]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    dict set ports active [get_installed_ports yes]
</span> 
     # Make sure there aren't too many subcommands
     if {[llength $subcommands] > 1} {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -412,10 +282,14 @@ proc action_stats {subcommands} {
</span>         return 1
     }
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set json [json_encode_stats $stats_id os ports]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span>     # Get the subcommand
     set cmd [lindex $subcommands 0]
<span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Use compact form for submission.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    if {$cmd eq "submit"} {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+        json::write indented 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set json [json_encode_stats $stats_id $os $ports]
</span> 
     switch $cmd {
         submit {
</pre><pre style='margin:0'>

</pre>