)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"522babad764efc6fcfb567c56676baa805ce5cf7","unresolved":false,"context_lines":[{"line_number":28,"context_line":" * the native-string path from metadata *does* match the native-string"},{"line_number":29,"context_line":"   request path"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"then trust the path from the request. By contrast, we usually prefer the"},{"line_number":32,"context_line":"path from metadata in case there was a pipeline misconfiguration (see"},{"line_number":33,"context_line":"related bug)."},{"line_number":34,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"bf51134e_f2fccf0d","line":31,"updated":"2020-07-21 20:58:13.000000000","message":"still seems like a fairly strong heuristic - and we shouldn\u0027t need to do ANY of this with v3 keys.","commit_id":"454788b939370970ea66241ec2cb7e41142694fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d799ce7f100bf4833244cd1133282e37a6679830","unresolved":false,"context_lines":[{"line_number":42,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":43,"context_line":"When upgrading from Swift 2.20.0 or Swift 2.19.1 or earlier, set"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"    meta_version_to_write \u003d 1"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"in your keymaster\u0027s configuration. Regardless of prior Swift version, set"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9f560f44_6a111ab0","line":45,"updated":"2020-08-28 16:07:35.000000000","message":"this is actually pretty cool that we can do this!","commit_id":"7d429318ddb854a23cdecfe35721b1ecbe8bcccc"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d799ce7f100bf4833244cd1133282e37a6679830","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    meta_version_to_write \u003d 3"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"after upgrading all proxy servers."},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"When switching from Python 2 to Python 3, first upgrade Swift while on"},{"line_number":54,"context_line":"Python 2, then upgrade to Python 3."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9f560f44_8a10eeaa","line":51,"updated":"2020-08-28 16:07:35.000000000","message":"damn straight","commit_id":"7d429318ddb854a23cdecfe35721b1ecbe8bcccc"}],"swift/common/middleware/crypto/keymaster.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"522babad764efc6fcfb567c56676baa805ce5cf7","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        if key_id:"},{"line_number":78,"context_line":"            secret_id \u003d key_id.get(\u0027secret_id\u0027)"},{"line_number":79,"context_line":"            version \u003d key_id[\u0027v\u0027]"},{"line_number":80,"context_line":"            if version not in (\u00271\u0027, \u00272\u0027, \u00273\u0027):"},{"line_number":81,"context_line":"                raise ValueError(\u0027Unknown key_id version: %s\u0027 % version)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"            if version \u003d\u003d \u00271\u0027 and not key_id[\u0027path\u0027].startswith("}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_173e95d9","line":80,"updated":"2020-07-21 20:58:13.000000000","message":"woot!","commit_id":"454788b939370970ea66241ec2cb7e41142694fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"522babad764efc6fcfb567c56676baa805ce5cf7","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"            check_path \u003d ("},{"line_number":94,"context_line":"                self.account, self.container or key_cont, self.obj or key_obj)"},{"line_number":95,"context_line":"            if version in (\u00271\u0027, \u00272\u0027) and ("},{"line_number":96,"context_line":"                    key_acct, key_cont, key_obj) !\u003d check_path:"},{"line_number":97,"context_line":"                # Older py3 proxies may have written down crypto meta as WSGI"},{"line_number":98,"context_line":"                # strings; we still need to be able to read that"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_772271bc","line":95,"updated":"2020-07-21 20:58:13.000000000","message":"at least we can stop the bleeding","commit_id":"454788b939370970ea66241ec2cb7e41142694fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"522babad764efc6fcfb567c56676baa805ce5cf7","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                    pass"},{"line_number":111,"context_line":"                else:"},{"line_number":112,"context_line":"                    if check_path \u003d\u003d alt_path:"},{"line_number":113,"context_line":"                        # This object is affected by bug #1888037"},{"line_number":114,"context_line":"                        key_acct, key_cont, key_obj \u003d alt_path"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"            if (key_acct, key_cont, key_obj) !\u003d check_path:"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_575acd4f","line":113,"updated":"2020-07-21 20:58:13.000000000","message":":\u0027(","commit_id":"454788b939370970ea66241ec2cb7e41142694fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"522babad764efc6fcfb567c56676baa805ce5cf7","unresolved":false,"context_lines":[{"line_number":130,"context_line":"            # v1 and v2 had a bug on py3 where we\u0027d write the path in meta as"},{"line_number":131,"context_line":"            # a WSGI string (ie, as Latin-1 chars decoded from UTF-8 bytes)."},{"line_number":132,"context_line":"            # Bump versions to establish that we can trust the path."},{"line_number":133,"context_line":"            version \u003d \u00273\u0027"},{"line_number":134,"context_line":"            key_acct, key_cont, key_obj \u003d ("},{"line_number":135,"context_line":"                self.account, self.container, self.obj)"},{"line_number":136,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_f717a153","line":133,"updated":"2020-07-21 20:58:13.000000000","message":"yeehaw","commit_id":"454788b939370970ea66241ec2cb7e41142694fe"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"28650feb211a58d8705f3c72a6eac31109899e3b","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        if key_id:"},{"line_number":78,"context_line":"            secret_id \u003d key_id.get(\u0027secret_id\u0027)"},{"line_number":79,"context_line":"            version \u003d key_id[\u0027v\u0027]"},{"line_number":80,"context_line":"            if version not in (\u00271\u0027, \u00272\u0027, \u00273\u0027):"},{"line_number":81,"context_line":"                raise ValueError(\u0027Unknown key_id version: %s\u0027 % version)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"            if version \u003d\u003d \u00271\u0027 and not key_id[\u0027path\u0027].startswith("}],"source_content_type":"text/x-python","patch_set":3,"id":"bf51134e_8df8aa7c","line":80,"updated":"2020-07-23 16:09:21.000000000","message":"how do we expect old proxies to deal with v3 data?","commit_id":"802ec5ee83f7df06f688914714a943a39c3d67ed"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e29f650d21e523dde00f88f57344d671caa11c67","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        if key_id:"},{"line_number":78,"context_line":"            secret_id \u003d key_id.get(\u0027secret_id\u0027)"},{"line_number":79,"context_line":"            version \u003d key_id[\u0027v\u0027]"},{"line_number":80,"context_line":"            if version not in (\u00271\u0027, \u00272\u0027, \u00273\u0027):"},{"line_number":81,"context_line":"                raise ValueError(\u0027Unknown key_id version: %s\u0027 % version)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"            if version \u003d\u003d \u00271\u0027 and not key_id[\u0027path\u0027].startswith("}],"source_content_type":"text/x-python","patch_set":3,"id":"9f560f44_ab3ce1bf","line":80,"in_reply_to":"bf51134e_8df8aa7c","updated":"2020-07-24 19:09:42.000000000","message":"this code should parse to an int and only blow up on major version bumps","commit_id":"802ec5ee83f7df06f688914714a943a39c3d67ed"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e29f650d21e523dde00f88f57344d671caa11c67","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                    if six.PY2:"},{"line_number":101,"context_line":"                        alt_path \u003d tuple("},{"line_number":102,"context_line":"                            part.decode(\u0027utf-8\u0027).encode(\u0027latin1\u0027)"},{"line_number":103,"context_line":"                            for part in (key_acct, key_cont, key_obj))"},{"line_number":104,"context_line":"                    else:"},{"line_number":105,"context_line":"                        alt_path \u003d tuple("},{"line_number":106,"context_line":"                            part.encode(\u0027latin1\u0027).decode(\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f560f44_6088281f","line":103,"updated":"2020-07-24 19:09:42.000000000","message":"so this is py2 server reading old py3 data - but I can\u0027t think of any timeline where this is useful?  you started to upgrade to py3 on old swift and *stopped* and now you want to upgrade your py2 nodes first?\n\npy2 should only ever encounter the py2 \u00272\u0027 format (which is far as I know is exactly the same as the py2 \u00273\u0027 format)","commit_id":"802ec5ee83f7df06f688914714a943a39c3d67ed"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e29f650d21e523dde00f88f57344d671caa11c67","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                    else:"},{"line_number":105,"context_line":"                        alt_path \u003d tuple("},{"line_number":106,"context_line":"                            part.encode(\u0027latin1\u0027).decode(\u0027utf-8\u0027)"},{"line_number":107,"context_line":"                            for part in (key_acct, key_cont, key_obj))"},{"line_number":108,"context_line":"                except UnicodeError:"},{"line_number":109,"context_line":"                    # Well, it was worth a shot"},{"line_number":110,"context_line":"                    pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f560f44_a02080b2","line":107,"updated":"2020-07-24 19:09:42.000000000","message":"i believe this is for reading the old/bad py3 \u00272\u0027 format\n\nor is this what makes py3 able to read the py2 \u00272\u0027 format, because we definitely need that to work forever because that\u0027s the common case.","commit_id":"802ec5ee83f7df06f688914714a943a39c3d67ed"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"66f059de4a9bf130e3b64be5e7deeb5e0f1244eb","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                    else:"},{"line_number":105,"context_line":"                        alt_path \u003d tuple("},{"line_number":106,"context_line":"                            part.encode(\u0027latin1\u0027).decode(\u0027utf-8\u0027)"},{"line_number":107,"context_line":"                            for part in (key_acct, key_cont, key_obj))"},{"line_number":108,"context_line":"                except UnicodeError:"},{"line_number":109,"context_line":"                    # Well, it was worth a shot"},{"line_number":110,"context_line":"                    pass"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f560f44_46941ce9","line":107,"in_reply_to":"9f560f44_a02080b2","updated":"2020-07-24 20:30:35.000000000","message":"Yes, this is what lets py3 read the old/bad py3 \u00272\u0027 format.\n\nPy3 is able to read \u0026 write the good format because of the twin changes in __call__() and create_key().","commit_id":"802ec5ee83f7df06f688914714a943a39c3d67ed"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e29f650d21e523dde00f88f57344d671caa11c67","unresolved":false,"context_lines":[{"line_number":293,"context_line":"        req \u003d Request(env)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"        try:"},{"line_number":296,"context_line":"            parts \u003d [wsgi_to_str(part) for part in req.split_path(2, 4, True)]"},{"line_number":297,"context_line":"        except ValueError:"},{"line_number":298,"context_line":"            return self.app(env, start_response)"},{"line_number":299,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9f560f44_4b4c2576","line":296,"updated":"2020-07-24 19:09:42.000000000","message":"this is a noop on py2, so is this what forces py3 to write things in the different/correct (i.e. old py2 \u00272\u0027) encoding?","commit_id":"802ec5ee83f7df06f688914714a943a39c3d67ed"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d799ce7f100bf4833244cd1133282e37a6679830","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def _make_key_id(self, path, secret_id, version):"},{"line_number":55,"context_line":"        if version in (\u00271\u0027, \u00272\u0027):"},{"line_number":56,"context_line":"            path \u003d str_to_wsgi(path)"},{"line_number":57,"context_line":"        key_id \u003d {\u0027v\u0027: version, \u0027path\u0027: path}"},{"line_number":58,"context_line":"        if secret_id:"},{"line_number":59,"context_line":"            # stash secret_id so that decrypter can pass it back to get the"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_a557e5ca","line":56,"updated":"2020-08-28 16:07:35.000000000","message":"and only rollin\u0027 it back on the legacy","commit_id":"7d429318ddb854a23cdecfe35721b1ecbe8bcccc"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d799ce7f100bf4833244cd1133282e37a6679830","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                # Older py3 proxies may have written down crypto meta as WSGI"},{"line_number":102,"context_line":"                # strings; we still need to be able to read that"},{"line_number":103,"context_line":"                try:"},{"line_number":104,"context_line":"                    if six.PY2:"},{"line_number":105,"context_line":"                        alt_path \u003d tuple("},{"line_number":106,"context_line":"                            part.decode(\u0027utf-8\u0027).encode(\u0027latin1\u0027)"},{"line_number":107,"context_line":"                            for part in (key_acct, key_cont, key_obj))"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_c5e019fc","line":104,"updated":"2020-08-28 16:07:35.000000000","message":"I think I follow all this, but something bothers me in principle how the runtime environment doesn\u0027t influence the python version where the crypto got wrote down...\n\nbut I guess for v2 if the write/read python version *match* then the RHS of the AND keeps us out of here and this block let\u0027s py2 proxies read py3 v2 meta if you forgot to update your version to 3 before upgrading to py3?","commit_id":"7d429318ddb854a23cdecfe35721b1ecbe8bcccc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bcfcfe583334e8ed444a0caca1d2e9e14cf4574c","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                # Older py3 proxies may have written down crypto meta as WSGI"},{"line_number":102,"context_line":"                # strings; we still need to be able to read that"},{"line_number":103,"context_line":"                try:"},{"line_number":104,"context_line":"                    if six.PY2:"},{"line_number":105,"context_line":"                        alt_path \u003d tuple("},{"line_number":106,"context_line":"                            part.decode(\u0027utf-8\u0027).encode(\u0027latin1\u0027)"},{"line_number":107,"context_line":"                            for part in (key_acct, key_cont, key_obj))"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_b881c3fe","line":104,"in_reply_to":"9f560f44_c5e019fc","updated":"2020-08-28 22:32:05.000000000","message":"Yeah, really, this is all about how how alt_path needs to be a native string and that varies depending on which runtime we\u0027re currently using. Arguably we shouldn\u0027t really need the py2 branch here (when would anyone be running new swift on py2 when they were previously running old swift on py3??) but it seemed safest to include it.","commit_id":"7d429318ddb854a23cdecfe35721b1ecbe8bcccc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"888127760b520ebfb3f360a9a953ac0d9281f987","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                    pass"},{"line_number":115,"context_line":"                else:"},{"line_number":116,"context_line":"                    if check_path \u003d\u003d alt_path or ("},{"line_number":117,"context_line":"                            check_path[:2] \u003d\u003d alt_path[:2] and not self.obj):"},{"line_number":118,"context_line":"                        # This object is affected by bug #1888037"},{"line_number":119,"context_line":"                        key_acct, key_cont, key_obj \u003d alt_path"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_348d8431","line":117,"updated":"2020-07-30 05:06:22.000000000","message":"I\u0027m glad we changed the default -- there was a bug lurking here before.","commit_id":"7d429318ddb854a23cdecfe35721b1ecbe8bcccc"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d799ce7f100bf4833244cd1133282e37a6679830","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                    pass"},{"line_number":115,"context_line":"                else:"},{"line_number":116,"context_line":"                    if check_path \u003d\u003d alt_path or ("},{"line_number":117,"context_line":"                            check_path[:2] \u003d\u003d alt_path[:2] and not self.obj):"},{"line_number":118,"context_line":"                        # This object is affected by bug #1888037"},{"line_number":119,"context_line":"                        key_acct, key_cont, key_obj \u003d alt_path"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_85ce21b2","line":117,"in_reply_to":"9f560f44_348d8431","updated":"2020-08-28 16:07:35.000000000","message":"it looks like this is getting validated in test_encryption.py:TestCryptoPipelineChanges.test_crypto_UTF8_path","commit_id":"7d429318ddb854a23cdecfe35721b1ecbe8bcccc"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"bcfcfe583334e8ed444a0caca1d2e9e14cf4574c","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                    pass"},{"line_number":115,"context_line":"                else:"},{"line_number":116,"context_line":"                    if check_path \u003d\u003d alt_path or ("},{"line_number":117,"context_line":"                            check_path[:2] \u003d\u003d alt_path[:2] and not self.obj):"},{"line_number":118,"context_line":"                        # This object is affected by bug #1888037"},{"line_number":119,"context_line":"                        key_acct, key_cont, key_obj \u003d alt_path"},{"line_number":120,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_58918746","line":117,"in_reply_to":"9f560f44_85ce21b2","updated":"2020-08-28 22:32:05.000000000","message":"Probably -- I forget for sure which test popped, but IIRC it was something in the end-to-end test there, yeah.\n\nFWIW, I (just now) validated that we could have 1 as the default and tests would still pass with some minor (and expected) changes: http://paste.openstack.org/show/797254/","commit_id":"7d429318ddb854a23cdecfe35721b1ecbe8bcccc"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d799ce7f100bf4833244cd1133282e37a6679830","unresolved":false,"context_lines":[{"line_number":303,"context_line":"        req \u003d Request(env)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        try:"},{"line_number":306,"context_line":"            parts \u003d [wsgi_to_str(part) for part in req.split_path(2, 4, True)]"},{"line_number":307,"context_line":"        except ValueError:"},{"line_number":308,"context_line":"            return self.app(env, start_response)"},{"line_number":309,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f560f44_456249af","line":306,"updated":"2020-08-28 16:07:35.000000000","message":"I like that we\u0027re keeping it tight on the default","commit_id":"7d429318ddb854a23cdecfe35721b1ecbe8bcccc"}],"test/unit/common/middleware/crypto/test_keymaster.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"522babad764efc6fcfb567c56676baa805ce5cf7","unresolved":false,"context_lines":[{"line_number":608,"context_line":"            mangled_con_path \u003d (\u0027/a/%s\u0027 % container).encode("},{"line_number":609,"context_line":"                \u0027utf-8\u0027).decode(\u0027latin-1\u0027)"},{"line_number":610,"context_line":"            mangled_path \u003d (\u0027/a/%s/%s\u0027 % ("},{"line_number":611,"context_line":"                container, obj)).encode(\u0027utf-8\u0027).decode(\u0027latin-1\u0027)"},{"line_number":612,"context_line":"        context \u003d keymaster.KeyMasterContext(self.app, \u0027a\u0027, container, obj)"},{"line_number":613,"context_line":"        for version in (\u00271\u0027, \u00272\u0027):"},{"line_number":614,"context_line":"            with mock.patch.object(self.app, \u0027create_key\u0027, mock_create_key):"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_770b912a","line":611,"updated":"2020-07-21 20:58:13.000000000","message":"ugh","commit_id":"454788b939370970ea66241ec2cb7e41142694fe"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"5bd69c2e24f2eee4354e5d46b1f8c928177e2b45","unresolved":false,"context_lines":[{"line_number":646,"context_line":"            \u0027all_ids\u0027: ["},{"line_number":647,"context_line":"                {\u0027path\u0027: mangled_path, \u0027v\u0027: \u00273\u0027},"},{"line_number":648,"context_line":"                {\u0027path\u0027: mangled_path, \u0027secret_id\u0027: \u002722\u0027, \u0027v\u0027: \u00273\u0027}]}"},{"line_number":649,"context_line":"        self.maxDiff\u003dNone"},{"line_number":650,"context_line":"        self.assertEqual(expected_keys, keys)"},{"line_number":651,"context_line":"        self.assertEqual([(mangled_con_path, None), (mangled_path, None)], calls)"},{"line_number":652,"context_line":"        del calls[:]"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_e66ff2f7","line":649,"updated":"2020-07-22 02:09:17.000000000","message":"pep8: E225 missing whitespace around operator","commit_id":"454788b939370970ea66241ec2cb7e41142694fe"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"5bd69c2e24f2eee4354e5d46b1f8c928177e2b45","unresolved":false,"context_lines":[{"line_number":648,"context_line":"                {\u0027path\u0027: mangled_path, \u0027secret_id\u0027: \u002722\u0027, \u0027v\u0027: \u00273\u0027}]}"},{"line_number":649,"context_line":"        self.maxDiff\u003dNone"},{"line_number":650,"context_line":"        self.assertEqual(expected_keys, keys)"},{"line_number":651,"context_line":"        self.assertEqual([(mangled_con_path, None), (mangled_path, None)], calls)"},{"line_number":652,"context_line":"        del calls[:]"},{"line_number":653,"context_line":""},{"line_number":654,"context_line":"    @mock.patch(\u0027swift.common.middleware.crypto.keymaster.readconf\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"bf51134e_467fbeaa","line":651,"updated":"2020-07-22 02:09:17.000000000","message":"pep8: E501 line too long (81 \u003e 79 characters)","commit_id":"454788b939370970ea66241ec2cb7e41142694fe"}]}
