[79522] branches/gsoc11-statistics/base/src/port/port.tcl
Derek Ingrouville
dergro at gmail.com
Thu Jun 16 11:31:06 PDT 2011
My previously reply wasn't sent to the list - here it is again.
On Thu, Jun 16, 2011 at 12:52 PM, Bradley Giesbrecht
<pixilla at macports.org> wrote:
> Active and inactive ports including ports installed from other then the
> MacPorts repository?
> Regards,
> Bradley Giesbrecht (pixilla)
I believe it does include all installed ports, including those from
outside the MacPorts repository.
The code gets a portlist by calling get_active_ports /
get_inactive_ports. These helper procs call get_installed_ports which
in turn calls registry::installed.
I am assuming that this would include ports installed from a local
repository as well as the main MacPorts repository.
- Derek
> 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
>
>
>
>
>
> _______________________________________________
> macports-dev mailing list
> macports-dev at lists.macosforge.org
> http://lists.macosforge.org/mailman/listinfo.cgi/macports-dev
>
>
--
Derek
More information about the macports-dev
mailing list