Scott Zawalski | 20a9b58 | 2011-11-21 11:49:40 -0800 | [diff] [blame] | 1 | #!/usr/bin/python |
| 2 | # Copyright (c) 2011 The Chromium OS Authors. All rights reserved. |
| 3 | # Use of this source code is governed by a BSD-style license that can be |
| 4 | # found in the LICENSE file. |
| 5 | |
| 6 | """Extract list of team members for the root individual.""" |
| 7 | |
| 8 | |
| 9 | import commands |
| 10 | import json |
| 11 | import logging |
| 12 | import optparse |
| 13 | import os |
| 14 | import sys |
| 15 | |
| 16 | |
| 17 | def ParseArgs(argv): |
| 18 | """Get input and output file.""" |
| 19 | base_dir = os.path.realpath(os.path.abspath(os.path.join( |
| 20 | os.getcwd(), os.path.dirname(__file__)))) |
| 21 | |
| 22 | parser = optparse.OptionParser() |
| 23 | parser.add_option('-r', '--root-person', help='initial person to follow', |
| 24 | dest='rootperson', default=None) |
| 25 | parser.add_option('-o', '--output-file', help='output file (json)', |
| 26 | dest='outputfile', default="kernel-team.json") |
| 27 | parser.add_option('-p', '--print-test', help='print the map as a test', |
| 28 | dest='printtest', action='store_true', default=False) |
| 29 | parser.add_option('-v', '--verbose', help='Show more output', |
| 30 | dest='verbose', action='store_true', default=False) |
| 31 | options, args = parser.parse_args() |
| 32 | |
| 33 | if not options.rootperson: |
| 34 | parser.error('--root-person must be supplied') |
| 35 | |
| 36 | logging_level = logging.INFO |
| 37 | if options.verbose: |
| 38 | logging_level = logging.DEBUG |
| 39 | |
| 40 | logging.basicConfig(level=logging_level) |
| 41 | |
| 42 | return options, args, base_dir |
| 43 | |
| 44 | |
| 45 | def SearchOnePerson(person): |
| 46 | """Run a command to get details for one person.""" |
| 47 | found = [] |
| 48 | if person: |
| 49 | command = 'f %s | grep Reportees' % person |
| 50 | logging.debug(command) |
| 51 | find_result = commands.getoutput(command) |
| 52 | if find_result: |
| 53 | found = find_result.split(' ')[2:] |
| 54 | logging.debug(found) |
| 55 | return found |
| 56 | |
| 57 | |
| 58 | def FindTeamMembers(root_person): |
| 59 | """Recursively iteratea through the list of team members until done. |
| 60 | |
| 61 | Expect the root_person to have at least 1 report but not needed. |
| 62 | """ |
| 63 | remaining = [root_person] |
| 64 | extracted = [root_person] |
| 65 | while remaining: |
| 66 | found = SearchOnePerson(remaining.pop(0)) |
| 67 | if found: |
| 68 | remaining += found |
| 69 | extracted += found |
| 70 | |
| 71 | return extracted |
| 72 | |
| 73 | |
| 74 | def WriteJson(outputfile, extracted): |
| 75 | """Write output in json format.""" |
| 76 | f = open(outputfile, 'w') |
| 77 | json.dump(extracted, f) |
| 78 | f.close() |
| 79 | |
| 80 | |
| 81 | def PrintJson(jsonfile): |
| 82 | """Read the json file and format-print its contents as a test.""" |
| 83 | f = open(jsonfile, 'r') |
| 84 | team_list = json.load(f) |
| 85 | f.close() |
| 86 | for t in sorted(team_list): |
| 87 | logging.info('%s', t) |
| 88 | |
| 89 | |
| 90 | def main(argv): |
| 91 | """Can generate tables, plots and email.""" |
| 92 | options, args, base_dir = ParseArgs(argv) |
| 93 | |
| 94 | logging.info('Using %s as root.', options.rootperson) |
| 95 | logging.info('Using output file: %s', options.outputfile) |
| 96 | |
| 97 | team = FindTeamMembers(options.rootperson) |
| 98 | if team: |
| 99 | WriteJson(options.outputfile, team) |
| 100 | if options.printtest: |
| 101 | PrintJson(options.outputfile) |
| 102 | |
| 103 | |
| 104 | if __name__ == '__main__': |
| 105 | main(sys.argv) |