Changeset 79522
- Timestamp:
- 06/16/11 09:37:15 (4 years ago)
- File:
-
- 1 edited
-
branches/gsoc11-statistics/base/src/port/port.tcl (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/gsoc11-statistics/base/src/port/port.tcl
r78936 r79522 2479 2479 2480 2480 proc action_stats { action portlist opts } { 2481 2481 # Build dictionary of os information 2482 dict set os macports_version [macports::version] 2483 dict set os osx_version ${macports::macosx_version} 2484 dict set os os_arch ${macports::os_arch} 2485 dict set os os_platform ${macports::os_platform} 2486 dict set os build_arch ${macports::build_arch} 2487 dict set os gcc_version ${macports::gccversion} 2488 dict set os xcode_version ${macports::xcodeversion} 2489 2490 # Build dictionary of port information 2491 dict set ports active [get_active_ports] 2492 dict set ports inactive [get_inactive_ports] 2493 2482 2494 # If no subcommands are given (portlist is empty) print out OS information 2483 2495 if {$portlist == ""} { 2484 # Print information 2485 puts "Build Information" 2486 puts "- MacPorts Version [macports::version]" 2487 puts "- Mac OS X Version ${macports::macosx_version}" 2488 puts "- Platform ${macports::os_arch} ${macports::os_platform}" 2489 puts "- Build Arch is ${macports::build_arch}" 2490 puts "- XCode Version ${macports::xcodeversion}" 2496 # Print information from os dictionary 2497 dict for {key values} $os { 2498 puts "$key: [dict get $os $key]" 2499 } 2491 2500 return 0 2492 2501 } 2493 2502 2494 2503 # Make sure there aren't too many subcommands 2495 2504 if {[llength $portlist] > 1} { 2496 puts"Please select only one subcommand. See port help stats"2505 ui_error "Please select only one subcommand. See port help stats" 2497 2506 return 0 2498 2507 } 2499 2508 2500 # Get the command2509 # Get the subcommand 2501 2510 set cmd [lindex $portlist 0] 2502 2511 2512 ###### JSON Encoding helper procs ###### 2513 2514 # Return JSON encoding of a flat "key":"value" dictionary 2515 proc json_encode_dict { data } { 2516 upvar 1 $data db 2517 2518 set size [dict size $db] 2519 set i 1 2520 2521 # Initialize the JSON string string 2522 set json "\{" 2523 2524 dict for {key values} $db { 2525 set line "\"$key\":\"[dict get $db $key]\"" 2526 2527 # Check if there are any subsequent items 2528 if {$i < $size} { 2529 set line "$line, " 2530 } 2531 2532 # Add line to the JSON string 2533 set json "$json$line" 2534 2535 incr i 2536 } 2537 2538 set json "$json\}" 2539 2540 return $json 2541 } 2542 2543 # Encodes a list of strings as a JSON array 2544 proc json_encode_list { data } { 2545 set size [llength $data] 2546 set i 1 2547 2548 set json "\[" 2549 2550 foreach item $data { 2551 set json "$json$data" 2552 2553 # Check if there are any subsequent items 2554 if {$i < $size} { 2555 set json "$json, " 2556 } 2557 2558 incr i 2559 } 2560 2561 set json "$json \]" 2562 2563 return $json 2564 } 2565 2566 # Encode a port (from a portlist entry) as a JSON object 2567 proc json_encode_port { port_info } { 2568 upvar 1 $port_info port 2569 2570 set first true 2571 2572 set json "\{" 2573 foreach name [array names port] { 2574 2575 # Skip fullname and empty strings 2576 if {$name == "fullname" || $port($name) == ""} { 2577 continue 2578 } 2579 2580 # Prepend a comma if this isn't the first item that has been processed 2581 if {!$first} { 2582 # Add a comma 2583 set json "$json, " 2584 } else { 2585 set first false 2586 } 2587 2588 # Format the entry as "name_string":"value" 2589 set entry "\"$name\":\"$port($name)\"" 2590 set json "$json$entry" 2591 2592 2593 } 2594 2595 set json "$json\}" 2596 2597 return $json 2598 } 2599 2600 # Encode portlist as a JSON array of port objects 2601 proc json_encode_portlist { portlist } { 2602 set json "\[" 2603 set first true 2604 2605 foreach i $portlist { 2606 array set port $i 2607 2608 set encoded [json_encode_port port] 2609 2610 # Prepend a comma if this isn't the first item that has been processed 2611 if {!$first} { 2612 # Add a comma 2613 set json "$json, " 2614 } else { 2615 set first false 2616 } 2617 2618 # Append encoded json object 2619 set json "$json$encoded" 2620 } 2621 2622 set json "$json\]" 2623 2624 return $json 2625 } 2626 2627 # Top level container for os and port data 2628 # Returns a JSON Object with three 2629 proc json_encode_stats {os_dict ports_dict} { 2630 upvar 1 $os_dict os 2631 upvar 1 $ports_dict ports 2632 2633 set os_json [json_encode_dict os] 2634 set active_ports_json [json_encode_portlist [dict get $ports "active"]] 2635 set inactive_ports_json [json_encode_portlist [dict get $ports "inactive"]] 2636 2637 set json "\{" 2638 set json "$json \"os\":$os_json," 2639 set json "$json \"active_ports\":$active_ports_json," 2640 set json "$json \"inactive_ports\":$inactive_ports_json" 2641 set json "$json\}" 2642 2643 return $json 2644 } 2645 2503 2646 switch $cmd { 2504 2647 "submit" { 2505 # Only submit if the user is participating 2506 if {[string equal ${macports::stats_participate} "yes"]} { 2507 # TODO: proc call which will submit data 2508 puts "Will submit collected data" 2509 } 2648 # TODO: Get URL from a configuration variable 2649 set url "http://127.0.0.1/cgi-bin/data.py" 2650 set json [json_encode_stats os ports] 2651 curl post "data=$json" $url 2510 2652 } 2511 2653 default { … … 2513 2655 } 2514 2656 } 2515 2516 return 02657 2658 return 0 2517 2659 } 2518 2660
Note: See TracChangeset
for help on using the changeset viewer.

