)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca31f03662fbee52b86882c07fb8865949f6d7de","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"py3: port gatekeeper"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"There were a couple of cleanups in swob as part of this. First, status"},{"line_number":10,"context_line":"lines are now unicode/str objects, not bytes (as PEP 3333"},{"line_number":11,"context_line":"wants). Second, _resp_body_property now works (only) with bytestrings"},{"line_number":12,"context_line":"from the app iter."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9f6a8fd7_a28d31d4","line":9,"range":{"start_line":9,"start_character":35,"end_line":9,"end_character":39},"updated":"2018-04-20 19:57:21.000000000","message":"So how long until we can port swob? ;-)","commit_id":"aa9e83b99d1a8ab9a5ddbf479c5a845e2c07bc1b"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"0f479902d2f82f80f705bc67a49dd61f0f5352e7","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"py3: port gatekeeper"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"There were a couple of cleanups in swob as part of this. First, status"},{"line_number":10,"context_line":"lines are now unicode/str objects, not bytes (as PEP 3333"},{"line_number":11,"context_line":"wants). Second, _resp_body_property now works (only) with bytestrings"},{"line_number":12,"context_line":"from the app iter."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9f6a8fd7_c54cef43","line":9,"range":{"start_line":9,"start_character":35,"end_line":9,"end_character":39},"in_reply_to":"9f6a8fd7_a28d31d4","updated":"2018-04-20 20:15:48.000000000","message":"Not Yet(tm) :)","commit_id":"aa9e83b99d1a8ab9a5ddbf479c5a845e2c07bc1b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca31f03662fbee52b86882c07fb8865949f6d7de","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"py3: port gatekeeper"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"There were a couple of cleanups in swob as part of this. First, status"},{"line_number":10,"context_line":"lines are now unicode/str objects, not bytes (as PEP 3333"},{"line_number":11,"context_line":"wants). Second, _resp_body_property now works (only) with bytestrings"},{"line_number":12,"context_line":"from the app iter."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"In gatekeeper, we now deal with dict.items() returning an object of"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9f6a8fd7_22eda18a","line":11,"range":{"start_line":9,"start_character":57,"end_line":11,"end_character":6},"updated":"2018-04-20 19:57:21.000000000","message":"This makes it sound like we\u0027re breaking from the PEP -- but we aren\u0027t, right? Maybe better as\n\n\u003e First, status lines are always native str objects (as PEP 3333 wants), rather than being encoded to bytes under py3.","commit_id":"aa9e83b99d1a8ab9a5ddbf479c5a845e2c07bc1b"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"0f479902d2f82f80f705bc67a49dd61f0f5352e7","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"py3: port gatekeeper"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"There were a couple of cleanups in swob as part of this. First, status"},{"line_number":10,"context_line":"lines are now unicode/str objects, not bytes (as PEP 3333"},{"line_number":11,"context_line":"wants). Second, _resp_body_property now works (only) with bytestrings"},{"line_number":12,"context_line":"from the app iter."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"In gatekeeper, we now deal with dict.items() returning an object of"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9f6a8fd7_e549f330","line":11,"range":{"start_line":9,"start_character":57,"end_line":11,"end_character":6},"in_reply_to":"9f6a8fd7_22eda18a","updated":"2018-04-20 20:15:48.000000000","message":"Done","commit_id":"aa9e83b99d1a8ab9a5ddbf479c5a845e2c07bc1b"}],"swift/common/middleware/gatekeeper.py":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca31f03662fbee52b86882c07fb8865949f6d7de","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        def gatekeeper_response(status, response_headers, exc_info\u003dNone):"},{"line_number":93,"context_line":"            def fixed_response_headers():"},{"line_number":94,"context_line":"                def relative_path(value):"},{"line_number":95,"context_line":"                    parsed \u003d urlsplit(v)"},{"line_number":96,"context_line":"                    new_path \u003d parsed.path"},{"line_number":97,"context_line":"                    if parsed.query:"},{"line_number":98,"context_line":"                        new_path +\u003d (\u0027?%s\u0027 % parsed.query)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_62ce392f","side":"PARENT","line":95,"updated":"2018-04-20 19:57:21.000000000","message":"Huh. That *never* worked, did it?","commit_id":"87dad294cc3c0e04d18f78a15c8ea213d7e0ac8d"},{"author":{"_account_id":2622,"name":"Samuel Merritt","email":"spam+launchpad@andcheese.org","username":"torgomatic"},"change_message_id":"0f479902d2f82f80f705bc67a49dd61f0f5352e7","unresolved":false,"context_lines":[{"line_number":92,"context_line":"        def gatekeeper_response(status, response_headers, exc_info\u003dNone):"},{"line_number":93,"context_line":"            def fixed_response_headers():"},{"line_number":94,"context_line":"                def relative_path(value):"},{"line_number":95,"context_line":"                    parsed \u003d urlsplit(v)"},{"line_number":96,"context_line":"                    new_path \u003d parsed.path"},{"line_number":97,"context_line":"                    if parsed.query:"},{"line_number":98,"context_line":"                        new_path +\u003d (\u0027?%s\u0027 % parsed.query)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9f6a8fd7_2544cb1a","side":"PARENT","line":95,"in_reply_to":"9f6a8fd7_62ce392f","updated":"2018-04-20 20:15:48.000000000","message":"Works in Python 2.\n\nDown in the list comprehension on line 105, there\u0027s variables \"k\" and \"v\" introduced. Those are in function scope for fixed_response_headers(), so relative_path() closes over them. Since the only thing we do with \"v\" is to pass it to relative_path, this just happens to work. It\u0027s janky, but correct.\n\nOn Python 3, list (and other) comprehension variables don\u0027t escape to function scope, so this breaks.","commit_id":"87dad294cc3c0e04d18f78a15c8ea213d7e0ac8d"}],"tox.ini":[{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"ca31f03662fbee52b86882c07fb8865949f6d7de","unresolved":false,"context_lines":[{"line_number":36,"context_line":"      test/unit/cli/test_relinker.py \\"},{"line_number":37,"context_line":"      test/unit/cli/test_ring_builder_analyzer.py \\"},{"line_number":38,"context_line":"      test/unit/cli/test_ringbuilder.py \\"},{"line_number":39,"context_line":"      test/unit/common/middleware/test_gatekeeper.py \\"},{"line_number":40,"context_line":"      test/unit/common/ring \\"},{"line_number":41,"context_line":"      test/unit/common/test_daemon.py \\"},{"line_number":42,"context_line":"      test/unit/common/test_exceptions.py \\"}],"source_content_type":"text/x-properties","patch_set":1,"id":"9f6a8fd7_029dfd08","line":39,"updated":"2018-04-20 19:57:21.000000000","message":"Whooo!","commit_id":"aa9e83b99d1a8ab9a5ddbf479c5a845e2c07bc1b"}]}
