)]}'
{"bin/swift-ring-composer":[{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"107dd7d1be7fb5582d4da6d4c1f098f79883867f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"# Copyright (c) 2017 OpenStack Foundation"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"7f231b9d_cbbd9503","line":1,"updated":"2017-06-19 22:26:59.000000000","message":"this file isn\u0027t saved with +x permissions","commit_id":"fdbb1d459bcfec94eec496b904c7ff4c39f8386c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07797bf68f55c630da1734e2f9c26d7f9d6220dd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env python"},{"line_number":2,"context_line":"# Copyright (c) 2017 OpenStack Foundation"},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"}],"source_content_type":"application/octet-stream","patch_set":10,"id":"7f231b9d_2a1d190f","line":1,"in_reply_to":"7f231b9d_cbbd9503","updated":"2017-06-20 10:24:43.000000000","message":"Doh!\n\nBefore you say \"did you ever run this\"*, I *did* run this ... the installed /usr/local/bin/swift-ring-composer doesn\u0027t require swift/bin/swift-ring-composer to have executable permission.\n\n* oh, you did already say that :(","commit_id":"fdbb1d459bcfec94eec496b904c7ff4c39f8386c"}],"swift/cli/ringcomposer.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"59f53e77bcf79b17a91232d9ef211c118d046062","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                        nargs\u003d1, type\u003dstr, help\u003dhelp_)"},{"line_number":61,"context_line":"    help_ \u003d (\u0027Name of component ring builder file to include in composite \u0027"},{"line_number":62,"context_line":"             \u0027ring; must be in current working directory.\u0027)"},{"line_number":63,"context_line":"    # argparse has no way of requiring \u00272 or more\u0027 args so use this trick..."},{"line_number":64,"context_line":"    parser.add_argument("},{"line_number":65,"context_line":"        \u0027builder_files\u0027, metavar\u003d\u0027builder_file\u0027, nargs\u003d1, type\u003dstr, help\u003dhelp_)"},{"line_number":66,"context_line":"    parser.add_argument("}],"source_content_type":"text/x-python","patch_set":2,"id":"dfeb2761_8984cfb2","line":63,"updated":"2017-04-04 03:32:31.000000000","message":"that\u0027s too bad:\n\nhttps://docs.python.org/3/library/argparse.html#nargs","commit_id":"5fd2fd18ddc3e6bce13ee64abab67cee359f7e78"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"59f53e77bcf79b17a91232d9ef211c118d046062","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        # intended to ensure that the \u0027source\u0027 attributes of the loaded"},{"line_number":83,"context_line":"        # builders have just a file name without any path, since that attribute"},{"line_number":84,"context_line":"        # is used by composite_builder to verify that we are using the same"},{"line_number":85,"context_line":"        # builder files when repeating a ring composition."},{"line_number":86,"context_line":"        if os.path.dirname(f):"},{"line_number":87,"context_line":"            print(\u0027ERROR: file is not in current working directory: \u0027 + f)"},{"line_number":88,"context_line":"            return EXIT_ERROR"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfeb2761_a97793d4","line":85,"updated":"2017-04-04 03:32:31.000000000","message":"oh... interesting","commit_id":"5fd2fd18ddc3e6bce13ee64abab67cee359f7e78"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"59f53e77bcf79b17a91232d9ef211c118d046062","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            print(\u0027ERROR: file is not in current working directory: \u0027 + f)"},{"line_number":88,"context_line":"            return EXIT_ERROR"},{"line_number":89,"context_line":"    try:"},{"line_number":90,"context_line":"        builders \u003d [RingBuilder.load(f) for f in args.builder_files]"},{"line_number":91,"context_line":"        write_composite_ring(builders, composite_ring_file)"},{"line_number":92,"context_line":"    except (SwiftException, ValueError) as err:"},{"line_number":93,"context_line":"        print(\u0027ERROR: \u0027 + err.message)"}],"source_content_type":"text/x-python","patch_set":2,"id":"dfeb2761_c97097df","line":90,"updated":"2017-04-04 03:32:31.000000000","message":"I\u0027m not sure if we should be forcing rebalance here?  Do we really want uncommited changed in a builder going into the composite?\n\nWhat about a work flow where you never need/want/deploy region1.ring.gz - but only make changes to region1.builder and then call swift-ring-composer?","commit_id":"5fd2fd18ddc3e6bce13ee64abab67cee359f7e78"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"107dd7d1be7fb5582d4da6d4c1f098f79883867f","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def _print_error(msg):"},{"line_number":51,"context_line":"    _print_to_stderr(\u0027ERROR: \u0027 + msg)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def show(args):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7f231b9d_4bb4e5f2","line":51,"updated":"2017-06-19 22:26:59.000000000","message":"TypeError: cannot concatenate \u0027str\u0027 and \u0027exceptions.IOError\u0027 objects\n\n`bin/swift-ring-composer tmp/composed.builder show` note: the .builder doesn\u0027t exist","commit_id":"fdbb1d459bcfec94eec496b904c7ff4c39f8386c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07797bf68f55c630da1734e2f9c26d7f9d6220dd","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def _print_error(msg):"},{"line_number":51,"context_line":"    _print_to_stderr(\u0027ERROR: \u0027 + msg)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def show(args):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7f231b9d_78cacba1","line":51,"in_reply_to":"7f231b9d_4bb4e5f2","updated":"2017-06-20 10:24:43.000000000","message":"Done and added unit test for non-existent file","commit_id":"fdbb1d459bcfec94eec496b904c7ff4c39f8386c"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"107dd7d1be7fb5582d4da6d4c1f098f79883867f","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    else:"},{"line_number":79,"context_line":"        argv \u003d sys.argv"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    parser \u003d argparse.ArgumentParser(description\u003dWARNING + DESCRIPTION)"},{"line_number":82,"context_line":"    parser.add_argument("},{"line_number":83,"context_line":"        \u0027composite_builder_file\u0027,"},{"line_number":84,"context_line":"        metavar\u003d\u0027composite_builder_file\u0027, type\u003dstr,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7f231b9d_2b12c90a","line":81,"updated":"2017-06-19 22:26:59.000000000","message":"nit: on my machine, there isn\u0027t a \\n between these two. Weird, i know, but I\u0027m getting these two as one continuous paragraph.","commit_id":"fdbb1d459bcfec94eec496b904c7ff4c39f8386c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07797bf68f55c630da1734e2f9c26d7f9d6220dd","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    else:"},{"line_number":79,"context_line":"        argv \u003d sys.argv"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    parser \u003d argparse.ArgumentParser(description\u003dWARNING + DESCRIPTION)"},{"line_number":82,"context_line":"    parser.add_argument("},{"line_number":83,"context_line":"        \u0027composite_builder_file\u0027,"},{"line_number":84,"context_line":"        metavar\u003d\u0027composite_builder_file\u0027, type\u003dstr,"}],"source_content_type":"text/x-python","patch_set":10,"id":"7f231b9d_6a49d189","line":81,"in_reply_to":"7f231b9d_2b12c90a","updated":"2017-06-20 10:24:43.000000000","message":"It\u0027s same on my machine. It seems that argparse strips all line breaks - even explicit - from the description string.\n\nI\u0027ll print the warning separately to achieve the formatting.","commit_id":"fdbb1d459bcfec94eec496b904c7ff4c39f8386c"},{"author":{"_account_id":330,"name":"John Dickinson","email":"me@not.mn","username":"notmyname"},"change_message_id":"107dd7d1be7fb5582d4da6d4c1f098f79883867f","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        _print_to_stderr(WARNING)"},{"line_number":117,"context_line":"        exit(args.func(args))"},{"line_number":118,"context_line":"    except Exception as e:"},{"line_number":119,"context_line":"        _print_error(e)"},{"line_number":120,"context_line":"        exit(EXIT_ERROR)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7f231b9d_8b779d09","line":119,"updated":"2017-06-19 22:26:59.000000000","message":"I think this is supposed to be \"e.message\" to fix the error on line 51","commit_id":"fdbb1d459bcfec94eec496b904c7ff4c39f8386c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"07797bf68f55c630da1734e2f9c26d7f9d6220dd","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        _print_to_stderr(WARNING)"},{"line_number":117,"context_line":"        exit(args.func(args))"},{"line_number":118,"context_line":"    except Exception as e:"},{"line_number":119,"context_line":"        _print_error(e)"},{"line_number":120,"context_line":"        exit(EXIT_ERROR)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7f231b9d_f87edbad","line":119,"in_reply_to":"7f231b9d_8b779d09","updated":"2017-06-20 10:24:43.000000000","message":"Done but using str(e) -  IOError has empty message when constructed with \u003e1 arg. Also, TIL Exception.message is deprecated [1]\n\n  \u003e\u003e\u003e print(IOError(\u0027foo\u0027).message)\nfoo\n\u003e\u003e\u003e print(IOError(2, \u0027foo\u0027).message)\n\n\u003e\u003e\u003e print(IOError(2, \u0027foo\u0027))\n[Errno 2] foo\n\n\n[1] https://stackoverflow.com/questions/1272138/baseexception-message-deprecated-in-python-2-6","commit_id":"fdbb1d459bcfec94eec496b904c7ff4c39f8386c"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"a908dc0b0f035605ff8849768c8c7dc93fcd4a42","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        rd.save(args.output)"},{"line_number":68,"context_line":"        cb.save(args.composite_builder_file)"},{"line_number":69,"context_line":"    except (SwiftException, ValueError) as err:"},{"line_number":70,"context_line":"        _print_error(err.message)"},{"line_number":71,"context_line":"        return EXIT_ERROR"},{"line_number":72,"context_line":"    return EXIT_SUCCESS"},{"line_number":73,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"5f201791_5030e856","line":70,"range":{"start_line":70,"start_character":21,"end_line":70,"end_character":32},"updated":"2017-06-21 20:34:17.000000000","message":"this should really be str(err) - .message is deprecated","commit_id":"06e28fa67704548cfdac8ec5e4503f35b701be0e"}]}
