)]}'
{"bin/cinder-manage":[{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"7bf8d3423049f7ac16872d851d39eec1fbdf540c","unresolved":false,"context_lines":[{"line_number":207,"context_line":"            \"\"\" Runs a Python script"},{"line_number":208,"context_line":"            :param path: the python script to be executed"},{"line_number":209,"context_line":"            \"\"\""},{"line_number":210,"context_line":"            exec compile(open(path).read(), path, \u0027exec\u0027) in globals(), \\"},{"line_number":211,"context_line":"                locals()"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        sub_cmd \u003d [\u0027bpython\u0027, \u0027ipython\u0027, \u0027python\u0027, \u0027run\u0027, \u0027script\u0027]"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAM3%2F%2F%2Brk%3D","line":210,"updated":"2012-12-18 00:30:59.000000000","message":"maybe its best to remove the line continuation slash.","commit_id":"bac6c29abf98d3f3e4d67c7a17871f0179adf18d"},{"author":{"_account_id":1994,"name":"Zhongyue Luo","email":"zhongyue.luo@gmail.com","username":"zyluo"},"change_message_id":"7bf8d3423049f7ac16872d851d39eec1fbdf540c","unresolved":false,"context_lines":[{"line_number":218,"context_line":"            \u0027run\u0027: run,"},{"line_number":219,"context_line":"            \u0027script\u0027: script,"},{"line_number":220,"context_line":"        }"},{"line_number":221,"context_line":"        request \u003d [x for x in sub_cmd if x in FLAGS._args]"},{"line_number":222,"context_line":"        if request[0] \u003d\u003d \u0027script\u0027:"},{"line_number":223,"context_line":"            CMD_MAP.get(request[0])(FLAGS.command.path)"},{"line_number":224,"context_line":"        elif request[0] \u003d\u003d \u0027run\u0027:"}],"source_content_type":"application/octet-stream","patch_set":1,"id":"AAAAM3%2F%2F%2BsI%3D","line":221,"updated":"2012-12-18 00:30:59.000000000","message":"How about:\n\ncmd \u003d [x for x in sub_cmd if x in FLAGS._args][0]\nif cmd \u003d\u003d \u0027script\u0027:\n    CMD_MAP.get(cmd)(FLAGS.command.path)\n...\n...","commit_id":"bac6c29abf98d3f3e4d67c7a17871f0179adf18d"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"1ace1d285b3e13c050b1a8e540cae4866a80bc68","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                readline.parse_and_bind(\"tab:complete\")"},{"line_number":165,"context_line":"            code.interact()"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    @args(\u0027--path\u0027, required\u003dTrue, help\u003d\u0027Script path\u0027)"},{"line_number":168,"context_line":"    def script(self, path):"},{"line_number":169,"context_line":"        \"\"\"Runs the script from the specifed path with flags set properly."},{"line_number":170,"context_line":"        arguments: path\"\"\""}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7UY%3D","line":167,"updated":"2012-12-20 12:26:49.000000000","message":"Why is this change required? We didn\u0027t make this change in Nova","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"e16a65efda818e9fa8953248feaca7f69fd833fc","unresolved":false,"context_lines":[{"line_number":164,"context_line":"                readline.parse_and_bind(\"tab:complete\")"},{"line_number":165,"context_line":"            code.interact()"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    @args(\u0027--path\u0027, required\u003dTrue, help\u003d\u0027Script path\u0027)"},{"line_number":168,"context_line":"    def script(self, path):"},{"line_number":169,"context_line":"        \"\"\"Runs the script from the specifed path with flags set properly."},{"line_number":170,"context_line":"        arguments: path\"\"\""}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7JA%3D","line":167,"in_reply_to":"AAAAM3%2F%2F7UY%3D","updated":"2012-12-20 17:05:13.000000000","message":"Because \u0027path\u0027 is actually a required parameter (\u0027script\u0027 can\u0027t run without this argument).  Having \u0027-\u0027 prefix in front of it, in argparse\u0027s language, it means it\u0027s a optional argument, but it is not.  That\u0027s why I made this change, it remains compatibility with previous optparse version (end user don\u0027t have to change the way they use cinder-manage) while able to warn user when \u0027path\u0027 is missing instead of pop out failure message when running.\n\nSee this bug report for nova: https://bugs.launchpad.net/nova/+bug/1092605","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"1ace1d285b3e13c050b1a8e540cae4866a80bc68","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    \"\"\"List hosts.\"\"\""},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @args(\u0027zone\u0027, nargs\u003d\u0027?\u0027, default\u003dNone,"},{"line_number":186,"context_line":"          help\u003d\u0027Availability Zone (default: %(default)s)\u0027)"},{"line_number":187,"context_line":"    def list(self, zone\u003dNone):"},{"line_number":188,"context_line":"        \"\"\"Show a list of all physical hosts. Filter by zone."},{"line_number":189,"context_line":"        args: [zone]\"\"\""}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7UU%3D","line":186,"updated":"2012-12-20 12:26:49.000000000","message":"Same here, we didn\u0027t make this change in Nova","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"e16a65efda818e9fa8953248feaca7f69fd833fc","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    \"\"\"List hosts.\"\"\""},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    @args(\u0027zone\u0027, nargs\u003d\u0027?\u0027, default\u003dNone,"},{"line_number":186,"context_line":"          help\u003d\u0027Availability Zone (default: %(default)s)\u0027)"},{"line_number":187,"context_line":"    def list(self, zone\u003dNone):"},{"line_number":188,"context_line":"        \"\"\"Show a list of all physical hosts. Filter by zone."},{"line_number":189,"context_line":"        args: [zone]\"\"\""}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7I8%3D","line":186,"in_reply_to":"AAAAM3%2F%2F7UU%3D","updated":"2012-12-20 17:05:13.000000000","message":"This is a perfect example of Nova\u0027s way of doing it is wrong.  How would Nova end user learn to know that they actually able to specify the availability zone when listing hosts without looking at the source code?  And if each sub action is able to put optional arguments into @args, there will be nice help message and no need to add \u0027parser.add_argument(\u0027action_args\u0027, nargs\u003d\u0027*\u0027)\u0027 into add_command_parsers() function, because we have every possible argument added explicitly.","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"1ace1d285b3e13c050b1a8e540cae4866a80bc68","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    def __init__(self):"},{"line_number":209,"context_line":"        pass"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    @args(\u0027version\u0027, nargs\u003d\u0027?\u0027, default\u003dNone,"},{"line_number":212,"context_line":"          help\u003d\u0027Database version\u0027)"},{"line_number":213,"context_line":"    def sync(self, version\u003dNone):"},{"line_number":214,"context_line":"        \"\"\"Sync the database up to the most recent version.\"\"\""}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7UQ%3D","line":211,"updated":"2012-12-20 12:26:49.000000000","message":"Same here, we didn\u0027t make this change in Nova","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"e16a65efda818e9fa8953248feaca7f69fd833fc","unresolved":false,"context_lines":[{"line_number":208,"context_line":"    def __init__(self):"},{"line_number":209,"context_line":"        pass"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    @args(\u0027version\u0027, nargs\u003d\u0027?\u0027, default\u003dNone,"},{"line_number":212,"context_line":"          help\u003d\u0027Database version\u0027)"},{"line_number":213,"context_line":"    def sync(self, version\u003dNone):"},{"line_number":214,"context_line":"        \"\"\"Sync the database up to the most recent version.\"\"\""}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7I0%3D","line":211,"in_reply_to":"AAAAM3%2F%2F7UQ%3D","updated":"2012-12-20 17:05:13.000000000","message":"same reason as above.","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"1ace1d285b3e13c050b1a8e540cae4866a80bc68","unresolved":false,"context_lines":[{"line_number":684,"context_line":"                parser.add_argument(*args, **kwargs)"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"            parser.set_defaults(action_fn\u003daction_fn)"},{"line_number":687,"context_line":"            parser.set_defaults(action_kwargs\u003daction_kwargs)"},{"line_number":688,"context_line":""},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"category_opt \u003d cfg.SubCommandOpt(\u0027category\u0027,"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7UI%3D","line":687,"updated":"2012-12-20 12:26:49.000000000","message":"You\u0027re not using action_kwargs here\n\nLooks like you\u0027ve dropped a bunch of logic from the Nova version. Why?","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"e16a65efda818e9fa8953248feaca7f69fd833fc","unresolved":false,"context_lines":[{"line_number":684,"context_line":"                parser.add_argument(*args, **kwargs)"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"            parser.set_defaults(action_fn\u003daction_fn)"},{"line_number":687,"context_line":"            parser.set_defaults(action_kwargs\u003daction_kwargs)"},{"line_number":688,"context_line":""},{"line_number":689,"context_line":""},{"line_number":690,"context_line":"category_opt \u003d cfg.SubCommandOpt(\u0027category\u0027,"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7Iw%3D","line":687,"in_reply_to":"AAAAM3%2F%2F7UI%3D","updated":"2012-12-20 17:05:13.000000000","message":"Because those logic are not needed.  The way Nova did it is imexplict and hard for end user to understand.  Having magical positional \u0027action_args\u0027 for every sub-action is confusing and not needed if we took care of @args.","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"1ace1d285b3e13c050b1a8e540cae4866a80bc68","unresolved":false,"context_lines":[{"line_number":691,"context_line":"                                 title\u003d\u0027Command categories\u0027,"},{"line_number":692,"context_line":"                                 handler\u003dadd_command_parsers)"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"def get_arg_string(args):"},{"line_number":695,"context_line":"    arg \u003d None"},{"line_number":696,"context_line":"    if args[0] \u003d\u003d \u0027-\u0027:"},{"line_number":697,"context_line":"    # (Note)zhiteng: args starts with FLAGS.oparser.prefix_chars"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7UE%3D","line":694,"updated":"2012-12-20 12:26:49.000000000","message":"We didn\u0027t need this in Nova","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"e16a65efda818e9fa8953248feaca7f69fd833fc","unresolved":false,"context_lines":[{"line_number":691,"context_line":"                                 title\u003d\u0027Command categories\u0027,"},{"line_number":692,"context_line":"                                 handler\u003dadd_command_parsers)"},{"line_number":693,"context_line":""},{"line_number":694,"context_line":"def get_arg_string(args):"},{"line_number":695,"context_line":"    arg \u003d None"},{"line_number":696,"context_line":"    if args[0] \u003d\u003d \u0027-\u0027:"},{"line_number":697,"context_line":"    # (Note)zhiteng: args starts with FLAGS.oparser.prefix_chars"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7Hg%3D","line":694,"in_reply_to":"AAAAM3%2F%2F7UE%3D","updated":"2012-12-20 17:05:13.000000000","message":"Because I didn\u0027t use Nova\u0027s imexplict way to store/fetch action arguments.","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"1ace1d285b3e13c050b1a8e540cae4866a80bc68","unresolved":false,"context_lines":[{"line_number":729,"context_line":"        print _(\"Available categories:\")"},{"line_number":730,"context_line":"        for category in CATEGORIES:"},{"line_number":731,"context_line":"            print \"\\t%s\" % category"},{"line_number":732,"context_line":"        sys.exit(2)"},{"line_number":733,"context_line":""},{"line_number":734,"context_line":"    try:"},{"line_number":735,"context_line":"        flags.parse_args(sys.argv)"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7UA%3D","line":732,"updated":"2012-12-20 12:26:49.000000000","message":"This is basically duplicating what argparse does if you don\u0027t specify an action ... it seems a little pointless to me","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"e16a65efda818e9fa8953248feaca7f69fd833fc","unresolved":false,"context_lines":[{"line_number":729,"context_line":"        print _(\"Available categories:\")"},{"line_number":730,"context_line":"        for category in CATEGORIES:"},{"line_number":731,"context_line":"            print \"\\t%s\" % category"},{"line_number":732,"context_line":"        sys.exit(2)"},{"line_number":733,"context_line":""},{"line_number":734,"context_line":"    try:"},{"line_number":735,"context_line":"        flags.parse_args(sys.argv)"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7Hs%3D","line":732,"in_reply_to":"AAAAM3%2F%2F7UA%3D","updated":"2012-12-20 17:05:13.000000000","message":"Right, I only added them here because the format is prettier than argparse\u0027s usage/help message.  I have no problem removing it.","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":1247,"name":"Mark McLoughlin","email":"markmc@redhat.com","username":"markmc"},"change_message_id":"1ace1d285b3e13c050b1a8e540cae4866a80bc68","unresolved":false,"context_lines":[{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    fn \u003d FLAGS.category.action_fn"},{"line_number":751,"context_line":""},{"line_number":752,"context_line":"    fn_args \u003d fetch_func_args(fn)"},{"line_number":753,"context_line":"    fn(*fn_args)"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7T4%3D","line":752,"updated":"2012-12-20 12:26:49.000000000","message":"I think the way we did this in Nova is more straightforward","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"e16a65efda818e9fa8953248feaca7f69fd833fc","unresolved":false,"context_lines":[{"line_number":749,"context_line":""},{"line_number":750,"context_line":"    fn \u003d FLAGS.category.action_fn"},{"line_number":751,"context_line":""},{"line_number":752,"context_line":"    fn_args \u003d fetch_func_args(fn)"},{"line_number":753,"context_line":"    fn(*fn_args)"},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"application/octet-stream","patch_set":5,"id":"AAAAM3%2F%2F7HY%3D","line":752,"in_reply_to":"AAAAM3%2F%2F7T4%3D","updated":"2012-12-20 17:05:13.000000000","message":"TBH, I don\u0027t think so.","commit_id":"a89028aa39c6750276b1d2ca7743c0d288a8db6b"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"5decc489bcf8b3fbe3eadfc62f7c56e5b58e6e4d","unresolved":false,"context_lines":[{"line_number":694,"context_line":""},{"line_number":695,"context_line":"def get_arg_string(args):"},{"line_number":696,"context_line":"    arg \u003d None"},{"line_number":697,"context_line":"    if args[0] \u003d\u003d \u0027-\u0027:"},{"line_number":698,"context_line":"    # (Note)zhiteng: args starts with FLAGS.oparser.prefix_chars"},{"line_number":699,"context_line":"    # is optional args. Notice that cfg module takes care of"},{"line_number":700,"context_line":"    # actual ArgParser so prefix_chars is always \u0027-\u0027."}],"source_content_type":"application/octet-stream","patch_set":7,"id":"AAAAM3%2F%2F5rk%3D","line":697,"updated":"2012-12-22 00:54:35.000000000","message":"what if args is None ?","commit_id":"a4c89d55772f7a49d0abfd8cdf1291e3b6b6e5fb"}]}
