)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e83bca7c6d30ec4ae64a44d79f4e427348111456","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"100d6519_98908a07","updated":"2023-04-21 17:31:11.000000000","message":"yeah, I don\u0027t get it.","commit_id":"6542c8298b23d555d638eaf5f5ba5bab6efdf2ef"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"d4ba3aa2fe855e6b51fb84c108ddd06af0c42441","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"08540ea4_2adbb2d3","updated":"2023-05-15 07:02:16.000000000","message":"Been testing that the magic is missing in other python2 verions, even tried a few different data to pickle (just in case):\n\n    ((2, 6, 0), False)\n    ((2, 6, 1), False)\n    ((2, 6, 2), False)\n    ((2, 6, 3), False)\n    ((2, 6, 4), False)\n    ((2, 6, 5), False)\n    ((2, 6, 6), False)\n    ((2, 6, 7), False)\n    ((2, 6, 8), False)\n    ((2, 6, 9), False)\n    ((2, 7, 0), False)\n    ((2, 7, 1), False)\n    ((2, 7, 2), False)\n    ((2, 7, 3), False)\n    ((2, 7, 4), False)\n    ((2, 7, 5), False)\n    ((2, 7, 6), False)\n    ((2, 7, 7), False)\n    ((2, 7, 8), False)\n    ((2, 7, 9), False)\n    ((2, 7, 10), False)\n    ((2, 7, 11), False)\n    ((2, 7, 12), False)\n    ((2, 7, 13), False)\n    ((2, 7, 14), False)\n    ((2, 7, 15), False)\n    ((2, 7, 16), False)\n    ((2, 7, 17), False)\n    ((2, 7, 18), False)\n\nI think that covers that it isn\u0027t included in py2, or at least any py2\u0027s we need to care about.","commit_id":"780754096267851545f2aa97afb250064a2292e3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d86a345ef80593364f077aebda796f56935f3eac","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"61de1764_41f7edbc","updated":"2023-05-04 14:42:09.000000000","message":"I\u0027m feeling pretty good about this!","commit_id":"780754096267851545f2aa97afb250064a2292e3"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"99ba3ffdabce382e50ce7e281b7c3d77ffce9424","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"98c20b2b_42c86250","updated":"2023-05-09 05:07:57.000000000","message":"So the crux of this is we can (at least for the current py3 versions) detect metadata encoded in using py3 as it has an expected value b\u0027_codecs\\nencode\u0027 inside the pickle format. If it doesn\u0027t have it then we can safly say it was encoded using py2.\nKnowing that we can decode it the way it was decoded in py2 or py3. It doesn\u0027t unify how we encode it, just gives us the ability to read it (which is ok).","commit_id":"780754096267851545f2aa97afb250064a2292e3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"474ffe4f335b5ff408bfd74594e9580138b50d7c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"55108bd1_b8b22917","updated":"2023-05-02 21:43:02.000000000","message":"how many python\u0027s do you think we should spot check?  i should be able to get py3.8 pretty easily.","commit_id":"780754096267851545f2aa97afb250064a2292e3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"eb31adf878eb01ae1106122bb741474d2742ba13","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"3c2a3f64_ab81d68f","in_reply_to":"55108bd1_b8b22917","updated":"2023-05-02 23:11:07.000000000","message":"The more, the better -- but it may not be worth enshrining in tests unless there\u0027s a material difference.","commit_id":"780754096267851545f2aa97afb250064a2292e3"}],"swift/cli/info.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e83bca7c6d30ec4ae64a44d79f4e427348111456","unresolved":true,"context_lines":[{"line_number":539,"context_line":"            print(\"Invalid metadata\")"},{"line_number":540,"context_line":"            raise InfoSystemExit()"},{"line_number":541,"context_line":"        metadata \u003d {wsgi_to_str(k): v if k \u003d\u003d \u0027name\u0027 else wsgi_to_str(v)"},{"line_number":542,"context_line":"                    for k, v in metadata.items()}"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        etag \u003d metadata.pop(\u0027ETag\u0027, \u0027\u0027)"},{"line_number":545,"context_line":"        length \u003d metadata.pop(\u0027Content-Length\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"152027cf_ac8354cd","line":542,"updated":"2023-04-21 17:31:11.000000000","message":"i think i kind of forget what wsgi_to_str does, i\u0027m guessing some decoding of latin-1 bytes kind of stuff to py2-unicode/py3-str?","commit_id":"6542c8298b23d555d638eaf5f5ba5bab6efdf2ef"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d86a345ef80593364f077aebda796f56935f3eac","unresolved":true,"context_lines":[{"line_number":539,"context_line":"            print(\"Invalid metadata\")"},{"line_number":540,"context_line":"            raise InfoSystemExit()"},{"line_number":541,"context_line":"        metadata \u003d {wsgi_to_str(k): v if k \u003d\u003d \u0027name\u0027 else wsgi_to_str(v)"},{"line_number":542,"context_line":"                    for k, v in metadata.items()}"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        etag \u003d metadata.pop(\u0027ETag\u0027, \u0027\u0027)"},{"line_number":545,"context_line":"        length \u003d metadata.pop(\u0027Content-Length\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"1b64de35_abd8e70f","line":542,"in_reply_to":"152027cf_ac8354cd","updated":"2023-05-04 14:42:09.000000000","message":"i\u0027m unclear why name is a special case","commit_id":"6542c8298b23d555d638eaf5f5ba5bab6efdf2ef"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"c177b18a6f31270ad8d7230c74881fe1ed96a8ce","unresolved":true,"context_lines":[{"line_number":539,"context_line":"            print(\"Invalid metadata\")"},{"line_number":540,"context_line":"            raise InfoSystemExit()"},{"line_number":541,"context_line":"        metadata \u003d {wsgi_to_str(k): v if k \u003d\u003d \u0027name\u0027 else wsgi_to_str(v)"},{"line_number":542,"context_line":"                    for k, v in metadata.items()}"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        etag \u003d metadata.pop(\u0027ETag\u0027, \u0027\u0027)"},{"line_number":545,"context_line":"        length \u003d metadata.pop(\u0027Content-Length\u0027, \u0027\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"6659584d_5d7c7942","line":542,"in_reply_to":"1b64de35_abd8e70f","updated":"2023-05-04 16:32:11.000000000","message":"Because I actually remembered to `wsgi_to_str` it before writing it down in the initial py3 port. It takes some squinting to see it, but it all tracks back to https://github.com/openstack/swift/blob/2.31.1/swift/common/request_helpers.py#L226 (done in stein, before py3 support in train).","commit_id":"6542c8298b23d555d638eaf5f5ba5bab6efdf2ef"}],"swift/obj/diskfile.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e83bca7c6d30ec4ae64a44d79f4e427348111456","unresolved":true,"context_lines":[{"line_number":249,"context_line":"                \"stored checksum\u003d\u0027%s\u0027, computed\u003d\u0027%s\u0027\" % ("},{"line_number":250,"context_line":"                    fd, metadata_checksum, computed_checksum))"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    metadata_written_by_py3 \u003d (b\u0027_codecs\\nencode\u0027 in metadata[:32])"},{"line_number":253,"context_line":"    # strings are utf-8 encoded when written, but have not always been"},{"line_number":254,"context_line":"    # (see https://bugs.launchpad.net/swift/+bug/1678018) so encode them again"},{"line_number":255,"context_line":"    # when read"}],"source_content_type":"text/x-python","patch_set":2,"id":"3daa3cb5_219e154b","line":252,"updated":"2023-04-21 17:31:11.000000000","message":"probably do this *in* _decode with the comments?  why is this the right answer?","commit_id":"6542c8298b23d555d638eaf5f5ba5bab6efdf2ef"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"615cf38e4b7ff2f635d62e41651d78544673e84b","unresolved":true,"context_lines":[{"line_number":249,"context_line":"                \"stored checksum\u003d\u0027%s\u0027, computed\u003d\u0027%s\u0027\" % ("},{"line_number":250,"context_line":"                    fd, metadata_checksum, computed_checksum))"},{"line_number":251,"context_line":""},{"line_number":252,"context_line":"    metadata_written_by_py3 \u003d (b\u0027_codecs\\nencode\u0027 in metadata[:32])"},{"line_number":253,"context_line":"    # strings are utf-8 encoded when written, but have not always been"},{"line_number":254,"context_line":"    # (see https://bugs.launchpad.net/swift/+bug/1678018) so encode them again"},{"line_number":255,"context_line":"    # when read"}],"source_content_type":"text/x-python","patch_set":2,"id":"f0ee2d1d_f3531d7e","line":252,"in_reply_to":"3daa3cb5_219e154b","updated":"2023-04-24 16:26:49.000000000","message":"Because `_decode_metadata` takes the unpickled dict, not the xattr bytestring -- we could move all of this down the stack, but then it seems better named something like `_read_metadata`, which makes me wonder why we bothered to extract the method at all.","commit_id":"6542c8298b23d555d638eaf5f5ba5bab6efdf2ef"}],"test/unit/obj/test_diskfile.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"e83bca7c6d30ec4ae64a44d79f4e427348111456","unresolved":true,"context_lines":[{"line_number":598,"context_line":""},{"line_number":599,"context_line":"        # mock the read path to check the write path encoded persisted metadata"},{"line_number":600,"context_line":"        with mock.patch.object(diskfile, \u0027_decode_metadata\u0027, lambda x, _: x):"},{"line_number":601,"context_line":"            check_metadata(as_bytes, bytes)"},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        # TODO: replace this \"simulate\" crap with actual xattr values taken"},{"line_number":604,"context_line":"        # from on-disk files written by old versions"}],"source_content_type":"text/x-python","patch_set":2,"id":"8531e3dd_f4d280e7","line":601,"updated":"2023-04-21 17:31:11.000000000","message":"why is this test mocking out decode - if it wants the raw bytes why not just read them?","commit_id":"6542c8298b23d555d638eaf5f5ba5bab6efdf2ef"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"474ffe4f335b5ff408bfd74594e9580138b50d7c","unresolved":false,"context_lines":[{"line_number":598,"context_line":""},{"line_number":599,"context_line":"        # mock the read path to check the write path encoded persisted metadata"},{"line_number":600,"context_line":"        with mock.patch.object(diskfile, \u0027_decode_metadata\u0027, lambda x, _: x):"},{"line_number":601,"context_line":"            check_metadata(as_bytes, bytes)"},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        # TODO: replace this \"simulate\" crap with actual xattr values taken"},{"line_number":604,"context_line":"        # from on-disk files written by old versions"}],"source_content_type":"text/x-python","patch_set":2,"id":"e07e7a8d_5d3b9489","line":601,"in_reply_to":"798836b9_e68d3fb5","updated":"2023-05-02 21:43:02.000000000","message":"Done","commit_id":"6542c8298b23d555d638eaf5f5ba5bab6efdf2ef"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"615cf38e4b7ff2f635d62e41651d78544673e84b","unresolved":true,"context_lines":[{"line_number":598,"context_line":""},{"line_number":599,"context_line":"        # mock the read path to check the write path encoded persisted metadata"},{"line_number":600,"context_line":"        with mock.patch.object(diskfile, \u0027_decode_metadata\u0027, lambda x, _: x):"},{"line_number":601,"context_line":"            check_metadata(as_bytes, bytes)"},{"line_number":602,"context_line":""},{"line_number":603,"context_line":"        # TODO: replace this \"simulate\" crap with actual xattr values taken"},{"line_number":604,"context_line":"        # from on-disk files written by old versions"}],"source_content_type":"text/x-python","patch_set":2,"id":"798836b9_e68d3fb5","line":601,"in_reply_to":"8531e3dd_f4d280e7","updated":"2023-04-24 16:26:49.000000000","message":"It was expedient, I\u0027m assuming. I don\u0027t like it, either, though, hence my `TODO`","commit_id":"6542c8298b23d555d638eaf5f5ba5bab6efdf2ef"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e19cee17a55af7a205fa0fe1ff5a052fe62852a6","unresolved":true,"context_lines":[{"line_number":560,"context_line":"    def test_can_read_old_meta(self):"},{"line_number":561,"context_line":"        # outputs taken from `xattr -l \u003cdiskfile\u003e`"},{"line_number":562,"context_line":"        cases \u003d {"},{"line_number":563,"context_line":"            \u0027python_2.7.18_swift_2.13_replicated\u0027: \u0027\u0027\u0027"},{"line_number":564,"context_line":"0000   80 02 7D 71 01 28 55 0E 43 6F 6E 74 65 6E 74 2D    ..}q.(U.Content-"},{"line_number":565,"context_line":"0010   4C 65 6E 67 74 68 71 02 55 02 31 33 55 04 6E 61    Lengthq.U.13U.na"},{"line_number":566,"context_line":"0020   6D 65 71 03 55 12 2F 41 55 54 48 5F 74 65 73 74    meq.U./AUTH_test"}],"source_content_type":"text/x-python","patch_set":4,"id":"1707a714_84ef6dd5","line":563,"range":{"start_line":563,"start_character":20,"end_line":563,"end_character":26},"updated":"2023-05-02 17:56:34.000000000","message":"This set of test cases would be even better with some older versions of py27 included -- maybe even some ancient py26 xattrs!","commit_id":"230c9fc4d62189f8d3eb7980e9544fec549a07f1"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"e19cee17a55af7a205fa0fe1ff5a052fe62852a6","unresolved":true,"context_lines":[{"line_number":578,"context_line":"00E0   6C 69 63 61 74 69 6F 6E 2F 6F 63 74 65 74 2D 73    lication/octet-s"},{"line_number":579,"context_line":"00F0   74 72 65 61 6D 71 0B 75 2E                         treamq.u."},{"line_number":580,"context_line":"            \u0027\u0027\u0027,"},{"line_number":581,"context_line":"            \u0027python_2.7.18_swift_2.13_ec\u0027: \u0027\u0027\u0027"},{"line_number":582,"context_line":"0000   80 02 7D 71 01 28 55 0E 43 6F 6E 74 65 6E 74 2D    ..}q.(U.Content-"},{"line_number":583,"context_line":"0010   4C 65 6E 67 74 68 71 02 55 02 38 34 55 04 6E 61    Lengthq.U.84U.na"},{"line_number":584,"context_line":"0020   6D 65 71 03 55 12 2F 41 55 54 48 5F 74 65 73 74    meq.U./AUTH_test"}],"source_content_type":"text/x-python","patch_set":4,"id":"b29ddde4_d0ec3749","line":581,"range":{"start_line":581,"start_character":33,"end_line":581,"end_character":37},"updated":"2023-05-02 17:56:34.000000000","message":"See https://github.com/openstack/swift/commit/091157fc7f52acfeb24e87e26b7f142da9e50d6b for why 2.13 may be a reasonably interesting \"really old\" version.","commit_id":"230c9fc4d62189f8d3eb7980e9544fec549a07f1"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"474ffe4f335b5ff408bfd74594e9580138b50d7c","unresolved":true,"context_lines":[{"line_number":558,"context_line":"        self.assertEqual(part_dir, exp_dir)"},{"line_number":559,"context_line":""},{"line_number":560,"context_line":"    def test_can_read_old_meta(self):"},{"line_number":561,"context_line":"        # outputs taken from `xattr -l \u003cdiskfile\u003e`"},{"line_number":562,"context_line":"        cases \u003d {"},{"line_number":563,"context_line":"            \u0027python_2.7.18_swift_2.13_replicated\u0027: \u0027\u0027\u0027"},{"line_number":564,"context_line":"0000   80 02 7D 71 01 28 55 0E 43 6F 6E 74 65 6E 74 2D    ..}q.(U.Content-"}],"source_content_type":"text/x-python","patch_set":5,"id":"21e1d769_18e18ea5","line":561,"updated":"2023-05-02 21:43:02.000000000","message":"cool!\n\n\tvagrant@saio:~$ xattr -l /srv/node1/sdb1/objects/44/66b/b0017c435449ef132f7b49b0eb47b66b/1683063702.90060.data\n\tuser.swift.metadata_checksum: 02c7e1d185655f55fac56eb815a50a3f\n\tuser.swift.metadata:\n\t0000   80 02 7D 71 00 28 63 5F 63 6F 64 65 63 73 0A 65    ..}q.(c_codecs.e\n\t0010   6E 63 6F 64 65 0A 71 01 58 0B 00 00 00 58 2D 54    ncode.q.X....X-T\n\t0020   69 6D 65 73 74 61 6D 70 71 02 58 06 00 00 00 6C    imestampq.X....l\n\t0030   61 74 69 6E 31 71 03 86 71 04 52 71 05 68 01 58    atin1q..q.Rq.h.X\n\t0040   10 00 00 00 31 36 38 33 30 36 33 37 30 32 2E 39    ....1683063702.9\n\t0050   30 30 36 30 71 06 68 03 86 71 07 52 71 08 68 01    0060q.h..q.Rq.h.\n\t0060   58 0C 00 00 00 43 6F 6E 74 65 6E 74 2D 54 79 70    X....Content-Typ\n\t0070   65 71 09 68 03 86 71 0A 52 71 0B 68 01 58 18 00    eq.h..q.Rq.h.X..\n\t0080   00 00 61 70 70 6C 69 63 61 74 69 6F 6E 2F 6F 63    ..application/oc\n\t0090   74 65 74 2D 73 74 72 65 61 6D 71 0C 68 03 86 71    tet-streamq.h..q\n\t00A0   0D 52 71 0E 68 01 58 0E 00 00 00 43 6F 6E 74 65    .Rq.h.X....Conte\n\t00B0   6E 74 2D 4C 65 6E 67 74 68 71 0F 68 03 86 71 10    nt-Lengthq.h..q.\n\t00C0   52 71 11 68 01 58 08 00 00 00 32 30 39 37 31 35    Rq.h.X....209715\n\t00D0   32 30 71 12 68 03 86 71 13 52 71 14 68 01 58 04    20q.h..q.Rq.h.X.\n\t00E0   00 00 00 45 54 61 67 71 15 68 03 86 71 16 52 71    ...ETagq.h..q.Rq\n\t00F0   17 68 01 58 20 00 00 00 38 66 34 65 33 33 66 33    .h.X ...8f4e33f3\n\t0100   64 63 33 65 34 31 34 66 66 39 34 65 35 66 62 36    dc3e414ff94e5fb6\n\t0110   39 30 35 63 62 61 38 63 71 18 68 03 86 71 19 52    905cba8cq.h..q.R\n\t0120   71 1A 68 01 58 13 00 00 00 58 2D 4F 62 6A 65 63    q.h.X....X-Objec\n\t0130   74 2D 4D 65 74 61 2D 4D 74 69 6D 65 71 1B 68 03    t-Meta-Mtimeq.h.\n\t0140   86 71 1C 52 71 1D 68 01 58 11 00 00 00 31 36 38    .q.Rq.h.X....168\n\t0150   32 31 30 34 39 30 36 2E 33 33 39 39 35 32 71 1E    2104906.339952q.\n\t0160   68 03 86 71 1F 52 71 20 68 01 58 04 00 00 00 6E    h..q.Rq h.X....n\n\t0170   61 6D 65 71 21 68 03 86 71 22 52 71 23 68 01 58    ameq!h..q\"Rq#h.X\n\t0180   18 00 00 00 2F 41 55 54 48 5F 74 65 73 74 2F 74    ..../AUTH_test/t\n\t0190   65 73 74 2F 74 65 73 74 2E 62 69 67 71 24 68 03    est/test.bigq$h.\n\t01A0   86 71 25 52 71 26 75 2E                            .q%Rq\u0026u.","commit_id":"780754096267851545f2aa97afb250064a2292e3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"474ffe4f335b5ff408bfd74594e9580138b50d7c","unresolved":true,"context_lines":[{"line_number":634,"context_line":"            \u0027\u0027\u0027,"},{"line_number":635,"context_line":"            \u0027python_3.10.6_swift_2.23_replicated\u0027: \u0027\u0027\u0027"},{"line_number":636,"context_line":"0000   80 02 7D 71 00 28 63 5F 63 6F 64 65 63 73 0A 65    ..}q.(c_codecs.e"},{"line_number":637,"context_line":"0010   6E 63 6F 64 65 0A 71 01 58 0B 00 00 00 58 2D 54    ncode.q.X....X-T"},{"line_number":638,"context_line":"0020   69 6D 65 73 74 61 6D 70 71 02 58 06 00 00 00 6C    imestampq.X....l"},{"line_number":639,"context_line":"0030   61 74 69 6E 31 71 03 86 71 04 52 71 05 68 01 58    atin1q..q.Rq.h.X"},{"line_number":640,"context_line":"0040   10 00 00 00 31 36 38 32 39 36 33 30 31 37 2E 31    ....1682963017.1"}],"source_content_type":"text/x-python","patch_set":5,"id":"51059f27_2d80e0f9","line":637,"updated":"2023-05-02 21:43:02.000000000","message":"hrm... do other py3\u0027s have this codecs.encode too?","commit_id":"780754096267851545f2aa97afb250064a2292e3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d86a345ef80593364f077aebda796f56935f3eac","unresolved":true,"context_lines":[{"line_number":634,"context_line":"            \u0027\u0027\u0027,"},{"line_number":635,"context_line":"            \u0027python_3.10.6_swift_2.23_replicated\u0027: \u0027\u0027\u0027"},{"line_number":636,"context_line":"0000   80 02 7D 71 00 28 63 5F 63 6F 64 65 63 73 0A 65    ..}q.(c_codecs.e"},{"line_number":637,"context_line":"0010   6E 63 6F 64 65 0A 71 01 58 0B 00 00 00 58 2D 54    ncode.q.X....X-T"},{"line_number":638,"context_line":"0020   69 6D 65 73 74 61 6D 70 71 02 58 06 00 00 00 6C    imestampq.X....l"},{"line_number":639,"context_line":"0030   61 74 69 6E 31 71 03 86 71 04 52 71 05 68 01 58    atin1q..q.Rq.h.X"},{"line_number":640,"context_line":"0040   10 00 00 00 31 36 38 32 39 36 33 30 31 37 2E 31    ....1682963017.1"}],"source_content_type":"text/x-python","patch_set":5,"id":"83030c14_97d741d9","line":637,"in_reply_to":"20831818_399d3ecd","updated":"2023-05-04 14:42:09.000000000","message":"\u003e do a follow-up to hammer this out a little more (and maybe standardize on native strings coming out of read_metadata, instead of this crazy split-brain)\n\nthat sounds really good!","commit_id":"780754096267851545f2aa97afb250064a2292e3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"eb31adf878eb01ae1106122bb741474d2742ba13","unresolved":true,"context_lines":[{"line_number":634,"context_line":"            \u0027\u0027\u0027,"},{"line_number":635,"context_line":"            \u0027python_3.10.6_swift_2.23_replicated\u0027: \u0027\u0027\u0027"},{"line_number":636,"context_line":"0000   80 02 7D 71 00 28 63 5F 63 6F 64 65 63 73 0A 65    ..}q.(c_codecs.e"},{"line_number":637,"context_line":"0010   6E 63 6F 64 65 0A 71 01 58 0B 00 00 00 58 2D 54    ncode.q.X....X-T"},{"line_number":638,"context_line":"0020   69 6D 65 73 74 61 6D 70 71 02 58 06 00 00 00 6C    imestampq.X....l"},{"line_number":639,"context_line":"0030   61 74 69 6E 31 71 03 86 71 04 52 71 05 68 01 58    atin1q..q.Rq.h.X"},{"line_number":640,"context_line":"0040   10 00 00 00 31 36 38 32 39 36 33 30 31 37 2E 31    ....1682963017.1"}],"source_content_type":"text/x-python","patch_set":5,"id":"20831818_399d3ecd","line":637,"in_reply_to":"51059f27_2d80e0f9","updated":"2023-05-02 23:11:07.000000000","message":"Yes:\n```\nvagrant@saio:~/swift$ for n in 7 8 9 10 11; do python3.$n -c \u0027import pickle, sys; print(sys.version_info[:3], b\"_codecs\\nencode\" in pickle.dumps({b\"foo\": b\"bar\"}, protocol\u003d2))\u0027 ; done\n(3, 7, 16) True\n(3, 8, 16) True\n(3, 9, 16) True\n(3, 10, 6) True\n(3, 11, 2) True\n```\nDoesn\u0027t seem to have changed in more than a decade: https://github.com/python/cpython/blame/47770a1e91d096fd1c689eb0c78b0f9e76b43639/Lib/pickle.py#L788-L789\n\nDoesn\u0027t mean it\u0027ll always be there *in the future*, though 😕 So I may still do a follow-up to hammer this out a little more (and maybe standardize on native strings coming out of `read_metadata`, instead of this crazy split-brain).","commit_id":"780754096267851545f2aa97afb250064a2292e3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"474ffe4f335b5ff408bfd74594e9580138b50d7c","unresolved":true,"context_lines":[{"line_number":701,"context_line":"            \u0027\u0027\u0027,"},{"line_number":702,"context_line":"            \u0027python_3.10.6_swift_2.23_ec\u0027: \u0027\u0027\u0027"},{"line_number":703,"context_line":"0000   80 02 7D 71 00 28 63 5F 63 6F 64 65 63 73 0A 65    ..}q.(c_codecs.e"},{"line_number":704,"context_line":"0010   6E 63 6F 64 65 0A 71 01 58 0B 00 00 00 58 2D 54    ncode.q.X....X-T"},{"line_number":705,"context_line":"0020   69 6D 65 73 74 61 6D 70 71 02 58 06 00 00 00 6C    imestampq.X....l"},{"line_number":706,"context_line":"0030   61 74 69 6E 31 71 03 86 71 04 52 71 05 68 01 58    atin1q..q.Rq.h.X"},{"line_number":707,"context_line":"0040   10 00 00 00 31 36 38 32 39 36 32 39 35 35 2E 33    ....1682962955.3"}],"source_content_type":"text/x-python","patch_set":5,"id":"2b2a5c8b_e1b7f6b3","line":704,"updated":"2023-05-02 21:43:02.000000000","message":"i can see codecs.encode!","commit_id":"780754096267851545f2aa97afb250064a2292e3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"474ffe4f335b5ff408bfd74594e9580138b50d7c","unresolved":true,"context_lines":[{"line_number":761,"context_line":"        def raw_xattr(output):"},{"line_number":762,"context_line":"            return binascii.unhexlify(\u0027\u0027.join("},{"line_number":763,"context_line":"                line[7:55] for line in output.split(\u0027\\n\u0027)"},{"line_number":764,"context_line":"            ).replace(\u0027 \u0027, \u0027\u0027))"},{"line_number":765,"context_line":""},{"line_number":766,"context_line":"        path \u003d os.path.join(self.testdir, str(uuid.uuid4()))"},{"line_number":767,"context_line":"        for case, xattr_output in cases.items():"}],"source_content_type":"text/x-python","patch_set":5,"id":"7ca17be4_8ef63681","line":764,"updated":"2023-05-02 21:43:02.000000000","message":"that\u0027s kind dense\n\n\u003e\u003e\u003e \u00270320   71 42 68 03 86 71 43 52 71 44 68 01 58 04 00 00    qBh..qCRqDh.X...\u0027[7:55]\n\u002771 42 68 03 86 71 43 52 71 44 68 01 58 04 00 00 \u0027\n\nhttps://docs.python.org/3/library/binascii.html#binascii.unhexlify\n\n\u003e\u003e\u003e binascii.unhexlify(\u0027beef\u0027)\nb\u0027\\xbe\\xef\u0027\n\nit doesn\u0027t seem like sep is supported for unhexlify so .replace makes sense.","commit_id":"780754096267851545f2aa97afb250064a2292e3"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d86a345ef80593364f077aebda796f56935f3eac","unresolved":true,"context_lines":[{"line_number":761,"context_line":"        def raw_xattr(output):"},{"line_number":762,"context_line":"            return binascii.unhexlify(\u0027\u0027.join("},{"line_number":763,"context_line":"                line[7:55] for line in output.split(\u0027\\n\u0027)"},{"line_number":764,"context_line":"            ).replace(\u0027 \u0027, \u0027\u0027))"},{"line_number":765,"context_line":""},{"line_number":766,"context_line":"        path \u003d os.path.join(self.testdir, str(uuid.uuid4()))"},{"line_number":767,"context_line":"        for case, xattr_output in cases.items():"}],"source_content_type":"text/x-python","patch_set":5,"id":"cb18e073_a322fd0b","line":764,"in_reply_to":"3ead9fdd_300c1b2e","updated":"2023-05-04 14:42:09.000000000","message":"maybe a little better; you can at least sort of see it as columner data instead of arbitrary string splicing.\n\n... but it doesn\u0027t matter that much it\u0027s just tests.","commit_id":"780754096267851545f2aa97afb250064a2292e3"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"eb31adf878eb01ae1106122bb741474d2742ba13","unresolved":true,"context_lines":[{"line_number":761,"context_line":"        def raw_xattr(output):"},{"line_number":762,"context_line":"            return binascii.unhexlify(\u0027\u0027.join("},{"line_number":763,"context_line":"                line[7:55] for line in output.split(\u0027\\n\u0027)"},{"line_number":764,"context_line":"            ).replace(\u0027 \u0027, \u0027\u0027))"},{"line_number":765,"context_line":""},{"line_number":766,"context_line":"        path \u003d os.path.join(self.testdir, str(uuid.uuid4()))"},{"line_number":767,"context_line":"        for case, xattr_output in cases.items():"}],"source_content_type":"text/x-python","patch_set":5,"id":"3ead9fdd_300c1b2e","line":764,"in_reply_to":"7ca17be4_8ef63681","updated":"2023-05-02 23:11:07.000000000","message":"Better or worse?\n```\nline.split(\u0027   \u0027, 2)[1] for line in output.split(\u0027\\n\u0027) if line\n```","commit_id":"780754096267851545f2aa97afb250064a2292e3"},{"author":{"_account_id":7233,"name":"Matthew Oliver","email":"matt@oliver.net.au","username":"mattoliverau"},"change_message_id":"99ba3ffdabce382e50ce7e281b7c3d77ffce9424","unresolved":true,"context_lines":[{"line_number":761,"context_line":"        def raw_xattr(output):"},{"line_number":762,"context_line":"            return binascii.unhexlify(\u0027\u0027.join("},{"line_number":763,"context_line":"                line[7:55] for line in output.split(\u0027\\n\u0027)"},{"line_number":764,"context_line":"            ).replace(\u0027 \u0027, \u0027\u0027))"},{"line_number":765,"context_line":""},{"line_number":766,"context_line":"        path \u003d os.path.join(self.testdir, str(uuid.uuid4()))"},{"line_number":767,"context_line":"        for case, xattr_output in cases.items():"}],"source_content_type":"text/x-python","patch_set":5,"id":"8df86678_23b3b420","line":764,"in_reply_to":"cb18e073_a322fd0b","updated":"2023-05-09 05:07:57.000000000","message":"yeah probably doesn\u0027t matter so much because it\u0027s a test.. but we could so something like:\n\n    re_hex \u003d re.compile(r\u0027[ ]{2,5}([0-9A-F][0-9A-F ]*[0-9A-F])[ ]{2,5}\u0027)\n    ...\n    re_hex.search(line).groups()[0] for line in output.split(\u0027\\n\u0027) if line\n\nBut that\u0027s just to give another approach for no real reason :P","commit_id":"780754096267851545f2aa97afb250064a2292e3"}]}
