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