[79522] branches/gsoc11-statistics/base/src/port/port.tcl
Bradley Giesbrecht
pixilla at macports.org
Thu Jun 16 09:52:37 PDT 2011
Active and inactive ports including ports installed from other then the MacPorts repository?
Regards,
Bradley Giesbrecht (pixilla)
On Jun 16, 2011, at 9:37 AM, derek at macports.org wrote:
> Revision
> 79522
> Author
> derek at macports.org
> Date
> 2011-06-16 09:37:15 -0700 (Thu, 16 Jun 2011)
> Log Message
>
> - Collect list of active and inactive ports all other relevant data included in the portlist
> - JSON encode all information that is to be submitted (OS data as well as ports)
> - Submit data using curl post
> Modified Paths
>
> branches/gsoc11-statistics/base/src/port/port.tcl
> Diff
>
> Modified: branches/gsoc11-statistics/base/src/port/port.tcl (79521 => 79522)
>
> --- branches/gsoc11-statistics/base/src/port/port.tcl 2011-06-16 16:25:42 UTC (rev 79521)
> +++ branches/gsoc11-statistics/base/src/port/port.tcl 2011-06-16 16:37:15 UTC (rev 79522)
> @@ -2478,42 +2478,184 @@
> }
>
> proc action_stats { action portlist opts } {
> -
> + # Build dictionary of os information
> + dict set os macports_version [macports::version]
> + dict set os osx_version ${macports::macosx_version}
> + dict set os os_arch ${macports::os_arch}
> + dict set os os_platform ${macports::os_platform}
> + dict set os build_arch ${macports::build_arch}
> + dict set os gcc_version ${macports::gccversion}
> + dict set os xcode_version ${macports::xcodeversion}
> +
> + # Build dictionary of port information
> + dict set ports active [get_active_ports]
> + dict set ports inactive [get_inactive_ports]
> +
> # If no subcommands are given (portlist is empty) print out OS information
> if {$portlist == ""} {
> - # Print information
> - puts "Build Information"
> - puts "- MacPorts Version [macports::version]"
> - puts "- Mac OS X Version ${macports::macosx_version}"
> - puts "- Platform ${macports::os_arch} ${macports::os_platform}"
> - puts "- Build Arch is ${macports::build_arch}"
> - puts "- XCode Version ${macports::xcodeversion}"
> + # Print information from os dictionary
> + dict for {key values} $os {
> + puts "$key: [dict get $os $key]"
> + }
> return 0
> }
> -
> +
> # Make sure there aren't too many subcommands
> if {[llength $portlist] > 1} {
> - puts "Please select only one subcommand. See port help stats"
> + ui_error "Please select only one subcommand. See port help stats"
> return 0
> }
>
> - # Get the command
> + # Get the subcommand
> set cmd [lindex $portlist 0]
> -
> +
> + ###### JSON Encoding helper procs ######
> +
> + # Return JSON encoding of a flat "key":"value" dictionary
> + proc json_encode_dict { data } {
> + upvar 1 $data db
> +
> + set size [dict size $db]
> + set i 1
> +
> + # Initialize the JSON string string
> + set json "\{"
> +
> + dict for {key values} $db {
> + set line "\"$key\":\"[dict get $db $key]\""
> +
> + # Check if there are any subsequent items
> + if {$i < $size} {
> + set line "$line, "
> + }
> +
> + # Add line to the JSON string
> + set json "$json$line"
> +
> + incr i
> + }
> +
> + set json "$json\}"
> +
> + return $json
> + }
> +
> + # Encodes a list of strings as a JSON array
> + proc json_encode_list { data } {
> + set size [llength $data]
> + set i 1
> +
> + set json "\["
> +
> + foreach item $data {
> + set json "$json$data"
> +
> + # Check if there are any subsequent items
> + if {$i < $size} {
> + set json "$json, "
> + }
> +
> + incr i
> + }
> +
> + set json "$json \]"
> +
> + return $json
> + }
> +
> + # Encode a port (from a portlist entry) as a JSON object
> + proc json_encode_port { port_info } {
> + upvar 1 $port_info port
> +
> + set first true
> +
> + set json "\{"
> + foreach name [array names port] {
> +
> + # Skip fullname and empty strings
> + if {$name == "fullname" || $port($name) == ""} {
> + continue
> + }
> +
> + # Prepend a comma if this isn't the first item that has been processed
> + if {!$first} {
> + # Add a comma
> + set json "$json, "
> + } else {
> + set first false
> + }
> +
> + # Format the entry as "name_string":"value"
> + set entry "\"$name\":\"$port($name)\""
> + set json "$json$entry"
> +
> +
> + }
> +
> + set json "$json\}"
> +
> + return $json
> + }
> +
> + # Encode portlist as a JSON array of port objects
> + proc json_encode_portlist { portlist } {
> + set json "\["
> + set first true
> +
> + foreach i $portlist {
> + array set port $i
> +
> + set encoded [json_encode_port port]
> +
> + # Prepend a comma if this isn't the first item that has been processed
> + if {!$first} {
> + # Add a comma
> + set json "$json, "
> + } else {
> + set first false
> + }
> +
> + # Append encoded json object
> + set json "$json$encoded"
> + }
> +
> + set json "$json\]"
> +
> + return $json
> + }
> +
> + # Top level container for os and port data
> + # Returns a JSON Object with three
> + proc json_encode_stats {os_dict ports_dict} {
> + upvar 1 $os_dict os
> + upvar 1 $ports_dict ports
> +
> + set os_json [json_encode_dict os]
> + set active_ports_json [json_encode_portlist [dict get $ports "active"]]
> + set inactive_ports_json [json_encode_portlist [dict get $ports "inactive"]]
> +
> + set json "\{"
> + set json "$json \"os\":$os_json,"
> + set json "$json \"active_ports\":$active_ports_json,"
> + set json "$json \"inactive_ports\":$inactive_ports_json"
> + set json "$json\}"
> +
> + return $json
> + }
> +
> switch $cmd {
> "submit" {
> - # Only submit if the user is participating
> - if {[string equal ${macports::stats_participate} "yes"]} {
> - # TODO: proc call which will submit data
> - puts "Will submit collected data"
> - }
> + # TODO: Get URL from a configuration variable
> + set url "http://127.0.0.1/cgi-bin/data.py"
> + set json [json_encode_stats os ports]
> + curl post "data=$json" $url
> }
> default {
> puts "Unknown subcommand. See port help stats"
> }
> }
> -
> - return 0
> +
> + return 0
> }
>
> proc action_dependents { action portlist opts } {
> _______________________________________________
> macports-changes mailing list
> macports-changes at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macports-changes
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macports-dev/attachments/20110616/ec469125/attachment.html>
More information about the macports-dev
mailing list