)]}'
{"oslo_rootwrap/daemon.py":[{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"54a6849311de9f1c51cfee0120c25634b09be4a8","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            stdout\u003dsubprocess.PIPE,"},{"line_number":55,"context_line":"            stderr\u003dsubprocess.PIPE)"},{"line_number":56,"context_line":"        if six.PY3 and isinstance(stdin, str):"},{"line_number":57,"context_line":"            stdin \u003d stdin.encode(encoding\u003d\u0027utf-8\u0027)"},{"line_number":58,"context_line":"        out, err \u003d obj.communicate(stdin)"},{"line_number":59,"context_line":"        if six.PY3:"},{"line_number":60,"context_line":"            if isinstance(out, bytes):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a1a9d01_b0b3eae8","line":57,"updated":"2015-10-05 09:13:05.000000000","message":"On Python 3, you should use the surrogateescape error handler: see the PEP 393.\n\nYou may use the locale encoding instead of UTF-8 by default. You may also make the encoding configurable.\n\nIf you use universal_newlines\u003dTrue to subprocess.Popen, Python encodes input and decodes output for you.","commit_id":"a562975736955182a8250dcd749a4fb0d8962943"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"54a6849311de9f1c51cfee0120c25634b09be4a8","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                try:"},{"line_number":62,"context_line":"                    out \u003d out.decode(encoding\u003d\u0027utf-8\u0027)"},{"line_number":63,"context_line":"                except UnicodeError:"},{"line_number":64,"context_line":"                    pass"},{"line_number":65,"context_line":"            if isinstance(err, bytes):"},{"line_number":66,"context_line":"                try:"},{"line_number":67,"context_line":"                    err \u003d err.decode(encoding\u003d\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a1a9d01_d0dd3e15","line":64,"updated":"2015-10-05 09:13:05.000000000","message":"Please don\u0027t ignore unicode errors. If you use surrogateescape, decode() *cannot* fail. encode() can fail with non-UTF encodings, but it\u0027s also a bad idea to ignore encode errors.","commit_id":"a562975736955182a8250dcd749a4fb0d8962943"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"9005b637fe3882244c7cc049a6d2db7ba02c32d2","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                try:"},{"line_number":62,"context_line":"                    out \u003d out.decode(encoding\u003d\u0027utf-8\u0027)"},{"line_number":63,"context_line":"                except UnicodeError:"},{"line_number":64,"context_line":"                    pass"},{"line_number":65,"context_line":"            if isinstance(err, bytes):"},{"line_number":66,"context_line":"                try:"},{"line_number":67,"context_line":"                    err \u003d err.decode(encoding\u003d\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_426f2e2b","line":64,"in_reply_to":"9a1a9d01_d0dd3e15","updated":"2015-10-07 12:00:00.000000000","message":"indeed if  an error is raised err/out is not decoded (so still a bytes)","commit_id":"a562975736955182a8250dcd749a4fb0d8962943"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"5d753c56cc1a2e9769e5c2922dc4ca5e83106b35","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            stdout\u003dsubprocess.PIPE,"},{"line_number":56,"context_line":"            stderr\u003dsubprocess.PIPE)"},{"line_number":57,"context_line":"        if six.PY3 and isinstance(stdin, str):"},{"line_number":58,"context_line":"            stdin \u003d stdin.encode(encoding\u003d\u0027utf-8\u0027)"},{"line_number":59,"context_line":"        out, err \u003d obj.communicate(stdin)"},{"line_number":60,"context_line":"        if six.PY3:"},{"line_number":61,"context_line":"            out \u003d out.decode(encoding\u003d\u0027utf-8\u0027, errors\u003d\u0027surrogateescape\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_7142016a","line":58,"updated":"2015-10-08 12:57:21.000000000","message":"Hum, it\u0027s better to also use surrogateescape here.","commit_id":"5a4dac6299561b04f67ca23bd3357d988503de97"},{"author":{"_account_id":8344,"name":"fumihiko kakuma","email":"kakuma@valinux.co.jp","username":"kakuma"},"change_message_id":"19742676247200970e3c86b27bafc28fa44961e1","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            stdout\u003dsubprocess.PIPE,"},{"line_number":56,"context_line":"            stderr\u003dsubprocess.PIPE)"},{"line_number":57,"context_line":"        if six.PY3 and isinstance(stdin, str):"},{"line_number":58,"context_line":"            stdin \u003d stdin.encode(encoding\u003d\u0027utf-8\u0027)"},{"line_number":59,"context_line":"        out, err \u003d obj.communicate(stdin)"},{"line_number":60,"context_line":"        if six.PY3:"},{"line_number":61,"context_line":"            out \u003d out.decode(encoding\u003d\u0027utf-8\u0027, errors\u003d\u0027surrogateescape\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_8512f307","line":58,"in_reply_to":"7a2fa921_7142016a","updated":"2015-10-08 14:03:45.000000000","message":"Oh, it\u0027s my mistake. Done.","commit_id":"5a4dac6299561b04f67ca23bd3357d988503de97"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"b1e4a98dd7d5f320d8e8d7cbcef72afdc1a654af","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            stdout\u003dsubprocess.PIPE,"},{"line_number":56,"context_line":"            stderr\u003dsubprocess.PIPE)"},{"line_number":57,"context_line":"        if six.PY3 and isinstance(stdin, str):"},{"line_number":58,"context_line":"            stdin \u003d stdin.encode(encoding\u003d\u0027utf-8\u0027, errors\u003d\u0027surrogateescape\u0027)"},{"line_number":59,"context_line":"        out, err \u003d obj.communicate(stdin)"},{"line_number":60,"context_line":"        if six.PY3:"},{"line_number":61,"context_line":"            out \u003d out.decode(encoding\u003d\u0027utf-8\u0027, errors\u003d\u0027surrogateescape\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a2fa921_00725149","line":58,"updated":"2015-10-08 14:18:46.000000000","message":"If we decide to use os.fsdecode() below, os.fsencode() should be used here. Except if you really want to always use UTF-8 for a good reason?\n\nNote: os.fsencode() already checks isinstance(obj, str) for you. bytes is accepted and returned unchanged.","commit_id":"78911fa47b84ed4c5292579f6be31b3f72593eeb"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"b1e4a98dd7d5f320d8e8d7cbcef72afdc1a654af","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        out, err \u003d obj.communicate(stdin)"},{"line_number":60,"context_line":"        if six.PY3:"},{"line_number":61,"context_line":"            out \u003d out.decode(encoding\u003d\u0027utf-8\u0027, errors\u003d\u0027surrogateescape\u0027)"},{"line_number":62,"context_line":"            err \u003d err.decode(encoding\u003d\u0027utf-8\u0027, errors\u003d\u0027surrogateescape\u0027)"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            out \u003d encodeutils.safe_decode(out, \u0027utf-8\u0027)"},{"line_number":65,"context_line":"            err \u003d encodeutils.safe_decode(err, \u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a2fa921_8012e107","line":62,"updated":"2015-10-08 14:18:46.000000000","message":"I read again oslo_concurrency.processutils.execute(): os.fsdecode() is used instead of UTF-8/surrogateescape.\n\nos.fsencode() uses the locale encoding which is UTF-8 in most cases, but it can be a different encoding (ex: ASCII). The locale encoding is preferred because it is used in various places in Python. It\u0027s wrong to decode from encoding A and encode to encoding B (it creates \"mojibake\").","commit_id":"78911fa47b84ed4c5292579f6be31b3f72593eeb"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"b1e4a98dd7d5f320d8e8d7cbcef72afdc1a654af","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            out \u003d out.decode(encoding\u003d\u0027utf-8\u0027, errors\u003d\u0027surrogateescape\u0027)"},{"line_number":62,"context_line":"            err \u003d err.decode(encoding\u003d\u0027utf-8\u0027, errors\u003d\u0027surrogateescape\u0027)"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            out \u003d encodeutils.safe_decode(out, \u0027utf-8\u0027)"},{"line_number":65,"context_line":"            err \u003d encodeutils.safe_decode(err, \u0027utf-8\u0027)"},{"line_number":66,"context_line":"        return obj.returncode, out, err"},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7a2fa921_e0e5d537","line":64,"updated":"2015-10-08 14:18:46.000000000","message":"Oh, now I remember what I did in oslo_concurrency.processutils. First I proposed a patch to decode stdout on Python 2 and Python 3. Problem: when a new version was released with my change, it broke many applications. If you are only concerned by Python 3, please leave Python 2 unchanged.","commit_id":"78911fa47b84ed4c5292579f6be31b3f72593eeb"},{"author":{"_account_id":9107,"name":"Victor Stinner","email":"vstinner@redhat.com","username":"haypo"},"change_message_id":"c67793bf269f0a6051e23ceb00e59ed96889255e","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            stdout\u003dsubprocess.PIPE,"},{"line_number":55,"context_line":"            stderr\u003dsubprocess.PIPE)"},{"line_number":56,"context_line":"        if six.PY3:"},{"line_number":57,"context_line":"            stdin \u003d os.fsencode(stdin)"},{"line_number":58,"context_line":"        out, err \u003d obj.communicate(stdin)"},{"line_number":59,"context_line":"        if six.PY3:"},{"line_number":60,"context_line":"            out \u003d os.fsdecode(out)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a2ca52d_92ea680e","line":57,"updated":"2015-10-15 11:07:07.000000000","message":"Oh, Yuriy Taraday is right: you must skip this line if stdin is None:\n\n\"if six.PY3 and stdin is not None:\"","commit_id":"e49519ee836fb04511e85db3e948971b67ae6b1f"},{"author":{"_account_id":8344,"name":"fumihiko kakuma","email":"kakuma@valinux.co.jp","username":"kakuma"},"change_message_id":"e2dd10d17b0df3cfb5e3e2acd7e20a7ebe2a19de","unresolved":false,"context_lines":[{"line_number":54,"context_line":"            stdout\u003dsubprocess.PIPE,"},{"line_number":55,"context_line":"            stderr\u003dsubprocess.PIPE)"},{"line_number":56,"context_line":"        if six.PY3:"},{"line_number":57,"context_line":"            stdin \u003d os.fsencode(stdin)"},{"line_number":58,"context_line":"        out, err \u003d obj.communicate(stdin)"},{"line_number":59,"context_line":"        if six.PY3:"},{"line_number":60,"context_line":"            out \u003d os.fsdecode(out)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a2ca52d_dc9d3367","line":57,"in_reply_to":"5a2ca52d_92ea680e","updated":"2015-10-15 22:06:41.000000000","message":"Oh, that\u0027s right.","commit_id":"e49519ee836fb04511e85db3e948971b67ae6b1f"}]}
