)]}'
{"setup.cfg":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"075445563d058b05836ba22057e52ecdb7a403a1","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":"[entry_points]"},{"line_number":75,"context_line":"console_scripts \u003d"},{"line_number":76,"context_line":"    swift-container-find-shard-ranges \u003d swift.cli.find_shard_ranges:main"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"paste.app_factory \u003d"},{"line_number":79,"context_line":"    proxy \u003d swift.proxy.server:app_factory"}],"source_content_type":"text/x-ttcn-cfg","patch_set":1,"id":"df7087c5_75e95a18","line":76,"updated":"2018-03-09 22:34:04.000000000","message":"*Might* be better to be consistent and use [files]scripts instead of [entry_points]console_scripts? I\u0027m not really clear on why we have the bin/swift-* shims -- I guess it probably predates the entry-point existing in pip or setuptools or pbr or wherever the hell that comes from?","commit_id":"d35cef9fad8f696ec816eed00d6ce282f2f9dea7"}],"swift/cli/find_shard_ranges.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"075445563d058b05836ba22057e52ecdb7a403a1","unresolved":false,"context_lines":[{"line_number":22,"context_line":"def main(args\u003dNone):"},{"line_number":23,"context_line":"    parser \u003d argparse.ArgumentParser(\u0027Find and display shard ranges\u0027)"},{"line_number":24,"context_line":"    parser.add_argument(\u0027container_db\u0027)"},{"line_number":25,"context_line":"    parser.add_argument(\u0027rows_per_shard\u0027, nargs\u003d\u0027?\u0027, type\u003dint, default\u003d500000)"},{"line_number":26,"context_line":"    args \u003d parser.parse_args(args)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    broker \u003d ContainerBroker(args.container_db)"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_95d50e46","line":25,"range":{"start_line":25,"start_character":71,"end_line":25,"end_character":77},"updated":"2018-03-09 22:34:04.000000000","message":"TODO: get default from [container-sharder]shard_container_size config value...","commit_id":"d35cef9fad8f696ec816eed00d6ce282f2f9dea7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"075445563d058b05836ba22057e52ecdb7a403a1","unresolved":false,"context_lines":[{"line_number":23,"context_line":"    parser \u003d argparse.ArgumentParser(\u0027Find and display shard ranges\u0027)"},{"line_number":24,"context_line":"    parser.add_argument(\u0027container_db\u0027)"},{"line_number":25,"context_line":"    parser.add_argument(\u0027rows_per_shard\u0027, nargs\u003d\u0027?\u0027, type\u003dint, default\u003d500000)"},{"line_number":26,"context_line":"    args \u003d parser.parse_args(args)"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    broker \u003d ContainerBroker(args.container_db)"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_15d81e7d","line":26,"range":{"start_line":26,"start_character":29,"end_line":26,"end_character":33},"updated":"2018-03-09 22:34:04.000000000","message":"Whoops...","commit_id":"d35cef9fad8f696ec816eed00d6ce282f2f9dea7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"075445563d058b05836ba22057e52ecdb7a403a1","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    ranges \u003d broker.find_shard_ranges(args.rows_per_shard)[0]"},{"line_number":32,"context_line":"    delta_t \u003d time.time() - start"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    print(json.dumps([dict(r) for r in ranges], sort_keys\u003dTrue, indent\u003d2))"},{"line_number":35,"context_line":"    print(\u0027Found %d ranges in %gs\u0027 % (len(ranges), delta_t), file\u003dsys.stderr)"},{"line_number":36,"context_line":"    return 0"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_f5dc8a75","line":34,"range":{"start_line":34,"start_character":22,"end_line":34,"end_character":29},"updated":"2018-03-09 22:34:04.000000000","message":"Not strictly necessary -- find_shard_ranges now returns a list of dicts, not ShardRanges.","commit_id":"d35cef9fad8f696ec816eed00d6ce282f2f9dea7"}],"swift/container/backend.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ff3329ab5dc233fc741124aec63f8903a7eccc26","unresolved":false,"context_lines":[{"line_number":2040,"context_line":"            found_ranges.append("},{"line_number":2041,"context_line":"                {\u0027index\u0027: index,"},{"line_number":2042,"context_line":"                 \u0027lower\u0027: str(last_shard_upper),"},{"line_number":2043,"context_line":"                 \u0027upper\u0027: str(next_shard_upper),"},{"line_number":2044,"context_line":"                 \u0027object_count\u0027: shard_size})"},{"line_number":2045,"context_line":""},{"line_number":2046,"context_line":"            if next_shard_upper \u003d\u003d own_shard_range.upper:"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_e7fdce3a","line":2043,"updated":"2018-03-09 09:39:46.000000000","message":"+1","commit_id":"d35cef9fad8f696ec816eed00d6ce282f2f9dea7"}],"test/unit/cli/test_find_shard_ranges.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ff3329ab5dc233fc741124aec63f8903a7eccc26","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class TestCliFindShardRanges(unittest.TestCase):"},{"line_number":30,"context_line":"    def setUp(self):"},{"line_number":31,"context_line":"        self.testdir \u003d os.path.join(mkdtemp(), \u0027tmp_test_cli_find_shards\u0027)"},{"line_number":32,"context_line":"        utils.mkdirs(self.testdir)"},{"line_number":33,"context_line":"        rmtree(self.testdir)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def tearDown(self):"},{"line_number":36,"context_line":"        rmtree(os.path.dirname(self.testdir))"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_8725f2ad","line":33,"range":{"start_line":31,"start_character":8,"end_line":33,"end_character":28},"updated":"2018-03-09 09:39:46.000000000","message":"This reminds me of the setup tricks in [1]. But I can\u0027t remember why it is necessary?\n\n[1] https://review.openstack.org/#/c/526499/","commit_id":"d35cef9fad8f696ec816eed00d6ce282f2f9dea7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"075445563d058b05836ba22057e52ecdb7a403a1","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"class TestCliFindShardRanges(unittest.TestCase):"},{"line_number":30,"context_line":"    def setUp(self):"},{"line_number":31,"context_line":"        self.testdir \u003d os.path.join(mkdtemp(), \u0027tmp_test_cli_find_shards\u0027)"},{"line_number":32,"context_line":"        utils.mkdirs(self.testdir)"},{"line_number":33,"context_line":"        rmtree(self.testdir)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def tearDown(self):"},{"line_number":36,"context_line":"        rmtree(os.path.dirname(self.testdir))"}],"source_content_type":"text/x-python","patch_set":1,"id":"df7087c5_5581b649","line":33,"range":{"start_line":31,"start_character":8,"end_line":33,"end_character":28},"in_reply_to":"df7087c5_8725f2ad","updated":"2018-03-09 22:34:04.000000000","message":"*shrug*\n\nI was mainly cribbing from test_info.py FWIW -- probably isn\u0027t strictly necessary.","commit_id":"d35cef9fad8f696ec816eed00d6ce282f2f9dea7"}]}
