)]}'
{"trove/common/auth.py":[{"author":{"_account_id":9664,"name":"amrith","email":"amrith.kumar@gmail.com","username":"amrith"},"change_message_id":"1a44a44978c574b8294659e0d444191c9794c611","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                      {\u0027tenant_id\u0027: tenant_id, \u0027request\u0027: request}))"},{"line_number":68,"context_line":"            return True"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        msg \u003d _(\"User with tenant id %s cannot access this resource.\")"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"        LOG.error(msg, tenant_id)"},{"line_number":73,"context_line":"        raise webob.exc.HTTPForbidden(msg)"}],"source_content_type":"text/x-python","patch_set":2,"id":"da36d5c6_a0a767bb","line":70,"updated":"2017-02-24 14:35:14.000000000","message":"oh?","commit_id":"8b4b899aaaf41b7f28e6da681cb1a75faf773f07"},{"author":{"_account_id":22694,"name":"jian.song","email":"jiansong19941206@gmail.com","username":"jiansong"},"change_message_id":"55bd9d6af8abb1ad084ee02bff565d50bd8a3266","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        match_for_tenant \u003d self.tenant_scoped_url.match(request.path_info)"},{"line_number":62,"context_line":"        if (match_for_tenant and"},{"line_number":63,"context_line":"                tenant_id \u003d\u003d match_for_tenant.group(\u0027tenant_id\u0027)):"},{"line_number":64,"context_line":"            LOG.debug(strutils.mask_password("},{"line_number":65,"context_line":"                      _(\"Authorized tenant \u0027%(tenant_id)s\u0027 request: \""},{"line_number":66,"context_line":"                        \"%(request)s\") %"},{"line_number":67,"context_line":"                      {\u0027tenant_id\u0027: tenant_id, \u0027request\u0027: request}))"},{"line_number":68,"context_line":"            return True"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        msg \u003d _("}],"source_content_type":"text/x-python","patch_set":4,"id":"ba2be162_75023d40","line":67,"range":{"start_line":64,"start_character":12,"end_line":67,"end_character":68},"updated":"2017-03-01 02:18:19.000000000","message":"This needs to be modified...","commit_id":"e0486468dd2f0b4c77560d9db87b3732c9b3d563"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"eb2d22eded9ac005dca276adc187f9ff1ce029b5","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        match_for_tenant \u003d self.tenant_scoped_url.match(request.path_info)"},{"line_number":62,"context_line":"        if (match_for_tenant and"},{"line_number":63,"context_line":"                tenant_id \u003d\u003d match_for_tenant.group(\u0027tenant_id\u0027)):"},{"line_number":64,"context_line":"            LOG.debug(strutils.mask_password("},{"line_number":65,"context_line":"                      _(\"Authorized tenant \u0027%(tenant_id)s\u0027 request: \""},{"line_number":66,"context_line":"                        \"%(request)s\") %"},{"line_number":67,"context_line":"                      {\u0027tenant_id\u0027: tenant_id, \u0027request\u0027: request}))"},{"line_number":68,"context_line":"            return True"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"        msg \u003d _("}],"source_content_type":"text/x-python","patch_set":4,"id":"ba2be162_eae71510","line":67,"range":{"start_line":64,"start_character":12,"end_line":67,"end_character":68},"in_reply_to":"ba2be162_75023d40","updated":"2017-03-01 13:25:59.000000000","message":"Actually not. I\u0027ve checked this. This is a call to LOG.debug which get a string. The string is produced by strutils.mask_password() method, which waits for a string. That string is produced by a format string + a dictionary.\n\nSo, LOG.debug() is called with an exact string, not a format string+dictionary combo.","commit_id":"e0486468dd2f0b4c77560d9db87b3732c9b3d563"}],"trove/common/utils.py":[{"author":{"_account_id":22694,"name":"jian.song","email":"jiansong19941206@gmail.com","username":"jiansong"},"change_message_id":"55bd9d6af8abb1ad084ee02bff565d50bd8a3266","unresolved":false,"context_lines":[{"line_number":299,"context_line":"            if recover_func is not None:"},{"line_number":300,"context_line":"                recover_func(func)"},{"line_number":301,"context_line":"            else:"},{"line_number":302,"context_line":"                LOG.debug(\"No recovery method defined for %(func)s\" % {"},{"line_number":303,"context_line":"                          \u0027func\u0027: func.__name__})"},{"line_number":304,"context_line":"            raise"},{"line_number":305,"context_line":"    return _decorator"},{"line_number":306,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"ba2be162_b593d5f9","line":303,"range":{"start_line":302,"start_character":15,"end_line":303,"end_character":49},"updated":"2017-03-01 02:18:19.000000000","message":"and this","commit_id":"e0486468dd2f0b4c77560d9db87b3732c9b3d563"}],"trove/tests/unittests/common/test_utils.py":[{"author":{"_account_id":22694,"name":"jian.song","email":"jiansong19941206@gmail.com","username":"jiansong"},"change_message_id":"b6be689f21e3ccbff3998956f3f944e7fa8e45cd","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                \u0027/usr/bin/foo\u0027, log_output_on_error\u003dTrue)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        utils.LOG.error.assert_called_with("},{"line_number":64,"context_line":"            u\"Command \u0027%(cmd)s\u0027 failed. %(description)s Exit code: \""},{"line_number":65,"context_line":"            u\"%(exit_code)s\\nstderr: %(stderr)s\\nstdout: %(stdout)s\","},{"line_number":66,"context_line":"            {\u0027description\u0027: \u0027test-desc\u0027, \u0027stderr\u0027: \u0027err\u0027, \u0027exit_code\u0027: 42,"},{"line_number":67,"context_line":"             \u0027stdout\u0027: \u0027out\u0027, \u0027cmd\u0027: \u0027test\u0027})"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test_unpack_singleton(self):"},{"line_number":70,"context_line":"        self.assertEqual([1, 2, 3], utils.unpack_singleton([1, 2, 3]))"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba2be162_15366103","line":67,"range":{"start_line":64,"start_character":11,"end_line":67,"end_character":45},"updated":"2017-03-01 02:20:44.000000000","message":"There is a question, what is the reason for the change here? I see that there is no mistake here...","commit_id":"e0486468dd2f0b4c77560d9db87b3732c9b3d563"},{"author":{"_account_id":18602,"name":"Gábor Antal","email":"antal@inf.u-szeged.hu","username":"antal"},"change_message_id":"df3e34a6696198a1fea0755b9bd31ebef1e70c23","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                \u0027/usr/bin/foo\u0027, log_output_on_error\u003dTrue)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        utils.LOG.error.assert_called_with("},{"line_number":64,"context_line":"            u\"Command \u0027%(cmd)s\u0027 failed. %(description)s Exit code: \""},{"line_number":65,"context_line":"            u\"%(exit_code)s\\nstderr: %(stderr)s\\nstdout: %(stdout)s\","},{"line_number":66,"context_line":"            {\u0027description\u0027: \u0027test-desc\u0027, \u0027stderr\u0027: \u0027err\u0027, \u0027exit_code\u0027: 42,"},{"line_number":67,"context_line":"             \u0027stdout\u0027: \u0027out\u0027, \u0027cmd\u0027: \u0027test\u0027})"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def test_unpack_singleton(self):"},{"line_number":70,"context_line":"        self.assertEqual([1, 2, 3], utils.unpack_singleton([1, 2, 3]))"}],"source_content_type":"text/x-python","patch_set":4,"id":"ba2be162_8bdb0aed","line":67,"range":{"start_line":64,"start_character":11,"end_line":67,"end_character":45},"in_reply_to":"ba2be162_15366103","updated":"2017-03-01 09:09:13.000000000","message":"The reason for changing this is the modified behavior of the logging call. Before this patch, it LOG.error was called with one parameter which was a string. Now it is called with a format string and a dictionary.","commit_id":"e0486468dd2f0b4c77560d9db87b3732c9b3d563"}]}
